@ashlr/hub 3.17.1 → 3.17.2

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 (932) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +12 -6
  3. package/dist/authority-surface.json +7 -7
  4. package/dist/build-identity.json +2 -2
  5. package/dist/core/knowledge/wiki/citations.d.ts +2 -0
  6. package/dist/core/knowledge/wiki/citations.js +13 -4
  7. package/dist/core/knowledge/wiki/citations.js.map +1 -1
  8. package/dist/core/knowledge/wiki/facts.d.ts +13 -0
  9. package/dist/core/knowledge/wiki/facts.js +46 -9
  10. package/dist/core/knowledge/wiki/facts.js.map +1 -1
  11. package/dist/core/knowledge/wiki/graph.d.ts +1 -1
  12. package/dist/core/knowledge/wiki/graph.js +54 -7
  13. package/dist/core/knowledge/wiki/graph.js.map +1 -1
  14. package/dist/core/knowledge/wiki/types.d.ts +20 -6
  15. package/dist/core/web/public/next/assets/ActionMenu-DmHRxr1Q.js +2 -0
  16. package/dist/core/web/public/next/assets/ActionMenu-DmHRxr1Q.js.map +1 -0
  17. package/dist/core/web/public/next/assets/Advanced-DmCUyCfm.js +2 -0
  18. package/dist/core/web/public/next/assets/Advanced-DmCUyCfm.js.map +1 -0
  19. package/dist/core/web/public/next/assets/AgentDetailScreen-l_rcOysR.js +2 -0
  20. package/dist/core/web/public/next/assets/AgentDetailScreen-l_rcOysR.js.map +1 -0
  21. package/dist/core/web/public/next/assets/AgentToolsSheet-CX08doSS.js +2 -0
  22. package/dist/core/web/public/next/assets/AgentToolsSheet-CX08doSS.js.map +1 -0
  23. package/dist/core/web/public/next/assets/AgentToolsStrip-CPS_iuTz.js +2 -0
  24. package/dist/core/web/public/next/assets/AgentToolsStrip-CPS_iuTz.js.map +1 -0
  25. package/dist/core/web/public/next/assets/AgentsScreen-D14Wm6WC.js +2 -0
  26. package/dist/core/web/public/next/assets/AgentsScreen-D14Wm6WC.js.map +1 -0
  27. package/dist/core/web/public/next/assets/AgentsSection-BIPpbKGT.js +3 -0
  28. package/dist/core/web/public/next/assets/AgentsSection-BIPpbKGT.js.map +1 -0
  29. package/dist/core/web/public/next/assets/App-CI3iqvqx.js +8 -0
  30. package/dist/core/web/public/next/assets/App-CI3iqvqx.js.map +1 -0
  31. package/dist/core/web/public/next/assets/AppsSection-B_Htu4Ha.js +2 -0
  32. package/dist/core/web/public/next/assets/AppsSection-B_Htu4Ha.js.map +1 -0
  33. package/dist/core/web/public/next/assets/AreaTrend-C8t1e_iz.js +2 -0
  34. package/dist/core/web/public/next/assets/AreaTrend-C8t1e_iz.js.map +1 -0
  35. package/dist/core/web/public/next/assets/AutomationsSection-CdU1kFGD.js +2 -0
  36. package/dist/core/web/public/next/assets/AutomationsSection-CdU1kFGD.js.map +1 -0
  37. package/dist/core/web/public/next/assets/AutonomyOffState-kEIQ45VE.js +3 -0
  38. package/dist/core/web/public/next/assets/AutonomyOffState-kEIQ45VE.js.map +1 -0
  39. package/dist/core/web/public/next/assets/AutonomySection-u1Bw9EWH.js +2 -0
  40. package/dist/core/web/public/next/assets/AutonomySection-u1Bw9EWH.js.map +1 -0
  41. package/dist/core/web/public/next/assets/AutonomyStatus-CLcACbD6.js +2 -0
  42. package/dist/core/web/public/next/assets/AutonomyStatus-CLcACbD6.js.map +1 -0
  43. package/dist/core/web/public/next/assets/BranchBar-_RoWU_JS.js +2 -0
  44. package/dist/core/web/public/next/assets/BranchBar-_RoWU_JS.js.map +1 -0
  45. package/dist/core/web/public/next/assets/BrowserPanel-DcZzLVJ0.js +7 -0
  46. package/dist/core/web/public/next/assets/BrowserPanel-DcZzLVJ0.js.map +1 -0
  47. package/dist/core/web/public/next/assets/BudgetControl-BDx4fvRS.js +2 -0
  48. package/dist/core/web/public/next/assets/BudgetControl-BDx4fvRS.js.map +1 -0
  49. package/dist/core/web/public/next/assets/Button-BKA5M-tJ.js +2 -0
  50. package/dist/core/web/public/next/assets/Button-BKA5M-tJ.js.map +1 -0
  51. package/dist/core/web/public/next/assets/CapacityStrip-DwWrB6l8.js +2 -0
  52. package/dist/core/web/public/next/assets/CapacityStrip-DwWrB6l8.js.map +1 -0
  53. package/dist/core/web/public/next/assets/ChangesPaneHost-jmWhj4z0.js +16 -0
  54. package/dist/core/web/public/next/assets/ChangesPaneHost-jmWhj4z0.js.map +1 -0
  55. package/dist/core/web/public/next/assets/ChartFrame-BqXHRCDs.js +2 -0
  56. package/dist/core/web/public/next/assets/ChartFrame-BqXHRCDs.js.map +1 -0
  57. package/dist/core/web/public/next/assets/ChatPanes-Cvee66BN.js +2 -0
  58. package/dist/core/web/public/next/assets/ChatPanes-Cvee66BN.js.map +1 -0
  59. package/dist/core/web/public/next/assets/ChatSection-DW87PAMm.js +3 -0
  60. package/dist/core/web/public/next/assets/ChatSection-DW87PAMm.js.map +1 -0
  61. package/dist/core/web/public/next/assets/ChecksPanel-C5hBYh2c.js +5 -0
  62. package/dist/core/web/public/next/assets/ChecksPanel-C5hBYh2c.js.map +1 -0
  63. package/dist/core/web/public/next/assets/CloudBudgetForm-d7_TF6P4.js +2 -0
  64. package/dist/core/web/public/next/assets/CloudBudgetForm-d7_TF6P4.js.map +1 -0
  65. package/dist/core/web/public/next/assets/CommandPalette-B8t8W8Qh.js +3 -0
  66. package/dist/core/web/public/next/assets/CommandPalette-B8t8W8Qh.js.map +1 -0
  67. package/dist/core/web/public/next/assets/CommandSection-BHCc65AZ.js +3 -0
  68. package/dist/core/web/public/next/assets/CommandSection-BHCc65AZ.js.map +1 -0
  69. package/dist/core/web/public/next/assets/CommandWorkflowForm-DtMTY_QW.js +9 -0
  70. package/dist/core/web/public/next/assets/CommandWorkflowForm-DtMTY_QW.js.map +1 -0
  71. package/dist/core/web/public/next/assets/CommandWorkflowPicker-L7d1Jdq6.js +3 -0
  72. package/dist/core/web/public/next/assets/CommandWorkflowPicker-L7d1Jdq6.js.map +1 -0
  73. package/dist/core/web/public/next/assets/CompareDialog-jR3SHebZ.js +4 -0
  74. package/dist/core/web/public/next/assets/CompareDialog-jR3SHebZ.js.map +1 -0
  75. package/dist/core/web/public/next/assets/ComputerControl-CtR9iyrl.js +2 -0
  76. package/dist/core/web/public/next/assets/ComputerControl-CtR9iyrl.js.map +1 -0
  77. package/dist/core/web/public/next/assets/ConfirmDialog-BLa9SQCD.js +2 -0
  78. package/dist/core/web/public/next/assets/ConfirmDialog-BLa9SQCD.js.map +1 -0
  79. package/dist/core/web/public/next/assets/DeleteChatDialog-C0_9RguO.js +2 -0
  80. package/dist/core/web/public/next/assets/DeleteChatDialog-C0_9RguO.js.map +1 -0
  81. package/dist/core/web/public/next/assets/DevinStopDialog-DY-VC_Bu.js +2 -0
  82. package/dist/core/web/public/next/assets/DevinStopDialog-DY-VC_Bu.js.map +1 -0
  83. package/dist/core/web/public/next/assets/Dialog-kQIBpFXz.js +2 -0
  84. package/dist/core/web/public/next/assets/Dialog-kQIBpFXz.js.map +1 -0
  85. package/dist/core/web/public/next/assets/DiffPane-DmsgpucH.js +2 -0
  86. package/dist/core/web/public/next/assets/DiffPane-DmsgpucH.js.map +1 -0
  87. package/dist/core/web/public/next/assets/DiffViewer-CwFSlxK-.js +2 -0
  88. package/dist/core/web/public/next/assets/DiffViewer-CwFSlxK-.js.map +1 -0
  89. package/dist/core/web/public/next/assets/DockHost-DBcYCg-w.js +2 -0
  90. package/dist/core/web/public/next/assets/DockHost-DBcYCg-w.js.map +1 -0
  91. package/dist/core/web/public/next/assets/EmptyState-CtcWT61K.js +2 -0
  92. package/dist/core/web/public/next/assets/EmptyState-CtcWT61K.js.map +1 -0
  93. package/dist/core/web/public/next/assets/Epistemic-Cu1zgz4Q.js +2 -0
  94. package/dist/core/web/public/next/assets/Epistemic-Cu1zgz4Q.js.map +1 -0
  95. package/dist/core/web/public/next/assets/EvidenceTimeline-DiJQpO-t.js +2 -0
  96. package/dist/core/web/public/next/assets/EvidenceTimeline-DiJQpO-t.js.map +1 -0
  97. package/dist/core/web/public/next/assets/FilesPane-Ce6RAzbo.js +2 -0
  98. package/dist/core/web/public/next/assets/FilesPane-Ce6RAzbo.js.map +1 -0
  99. package/dist/core/web/public/next/assets/FleetScreen-fubswj5A.js +2 -0
  100. package/dist/core/web/public/next/assets/FleetScreen-fubswj5A.js.map +1 -0
  101. package/dist/core/web/public/next/assets/FleetSection-DWxpkefM.js +5 -0
  102. package/dist/core/web/public/next/assets/FleetSection-DWxpkefM.js.map +1 -0
  103. package/dist/core/web/public/next/assets/Funnel-E6icZQgx.js +2 -0
  104. package/dist/core/web/public/next/assets/Funnel-E6icZQgx.js.map +1 -0
  105. package/dist/core/web/public/next/assets/GearTray-ODBhoI9j.js +2 -0
  106. package/dist/core/web/public/next/assets/GearTray-ODBhoI9j.js.map +1 -0
  107. package/dist/core/web/public/next/assets/GitDialogs-DjpWtBzX.js +2 -0
  108. package/dist/core/web/public/next/assets/GitDialogs-DjpWtBzX.js.map +1 -0
  109. package/dist/core/web/public/next/assets/GrowthSection-Cf50Ly0u.js +3 -0
  110. package/dist/core/web/public/next/assets/GrowthSection-Cf50Ly0u.js.map +1 -0
  111. package/dist/core/web/public/next/assets/HandoffDialog-DlUjSuxs.js +2 -0
  112. package/dist/core/web/public/next/assets/HandoffDialog-DlUjSuxs.js.map +1 -0
  113. package/dist/core/web/public/next/assets/HomeBody-DYnEbH-_.js +3 -0
  114. package/dist/core/web/public/next/assets/HomeBody-DYnEbH-_.js.map +1 -0
  115. package/dist/core/web/public/next/assets/HomeSeats-BDWMFY7Q.js +2 -0
  116. package/dist/core/web/public/next/assets/HomeSeats-BDWMFY7Q.js.map +1 -0
  117. package/dist/core/web/public/next/assets/Input-CJnHvtwe.js +2 -0
  118. package/dist/core/web/public/next/assets/Input-CJnHvtwe.js.map +1 -0
  119. package/dist/core/web/public/next/assets/LaunchDialog-DyX6d-h-.js +9 -0
  120. package/dist/core/web/public/next/assets/LaunchDialog-DyX6d-h-.js.map +1 -0
  121. package/dist/core/web/public/next/assets/LeaderCard-BDAKrxHa.js +2 -0
  122. package/dist/core/web/public/next/assets/LeaderCard-BDAKrxHa.js.map +1 -0
  123. package/dist/core/web/public/next/assets/LeaderConversation-DHI2fjhw.js +3 -0
  124. package/dist/core/web/public/next/assets/LeaderConversation-DHI2fjhw.js.map +1 -0
  125. package/dist/core/web/public/next/assets/LeaderScreen-_PwOiKas.js +2 -0
  126. package/dist/core/web/public/next/assets/LeaderScreen-_PwOiKas.js.map +1 -0
  127. package/dist/core/web/public/next/assets/LessonsPanel-Sh5Hx51J.js +2 -0
  128. package/dist/core/web/public/next/assets/LessonsPanel-Sh5Hx51J.js.map +1 -0
  129. package/dist/core/web/public/next/assets/LiveTimer-CdTqqC-y.js +2 -0
  130. package/dist/core/web/public/next/assets/LiveTimer-CdTqqC-y.js.map +1 -0
  131. package/dist/core/web/public/next/assets/LocalSeatBadge-bCbEkJgv.js +2 -0
  132. package/dist/core/web/public/next/assets/LocalSeatBadge-bCbEkJgv.js.map +1 -0
  133. package/dist/core/web/public/next/assets/MatrixHeatmap-BB22t9cL.js +2 -0
  134. package/dist/core/web/public/next/assets/MatrixHeatmap-BB22t9cL.js.map +1 -0
  135. package/dist/core/web/public/next/assets/McpSection-BpV1z4P5.js +2 -0
  136. package/dist/core/web/public/next/assets/McpSection-BpV1z4P5.js.map +1 -0
  137. package/dist/core/web/public/next/assets/MessageMarkdown-B_EEMPZ6.js +3 -0
  138. package/dist/core/web/public/next/assets/MessageMarkdown-B_EEMPZ6.js.map +1 -0
  139. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-B6bFE970.js +72 -0
  140. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-B6bFE970.js.map +1 -0
  141. package/dist/core/web/public/next/assets/Meter-Cm15WZWf.js +2 -0
  142. package/dist/core/web/public/next/assets/Meter-Cm15WZWf.js.map +1 -0
  143. package/dist/core/web/public/next/assets/MicButton-33E5Ppnu.js +2 -0
  144. package/dist/core/web/public/next/assets/MicButton-33E5Ppnu.js.map +1 -0
  145. package/dist/core/web/public/next/assets/MindSection-GBqYaZLx.js +3 -0
  146. package/dist/core/web/public/next/assets/MindSection-GBqYaZLx.js.map +1 -0
  147. package/dist/core/web/public/next/assets/MobileComposer-DrSwZPIn.js +2 -0
  148. package/dist/core/web/public/next/assets/MobileComposer-DrSwZPIn.js.map +1 -0
  149. package/dist/core/web/public/next/assets/MobileGuardSheet-BnAxk-ae.js +2 -0
  150. package/dist/core/web/public/next/assets/MobileGuardSheet-BnAxk-ae.js.map +1 -0
  151. package/dist/core/web/public/next/assets/MobileRuntime-Cusn1BWx.js +3 -0
  152. package/dist/core/web/public/next/assets/MobileRuntime-Cusn1BWx.js.map +1 -0
  153. package/dist/core/web/public/next/assets/MoreScreen-Cu0xtG6f.js +2 -0
  154. package/dist/core/web/public/next/assets/MoreScreen-Cu0xtG6f.js.map +1 -0
  155. package/dist/core/web/public/next/assets/MultiModelBar-_qyTHa1F.js +7 -0
  156. package/dist/core/web/public/next/assets/MultiModelBar-_qyTHa1F.js.map +1 -0
  157. package/dist/core/web/public/next/assets/MutationTokenDialog-uyP-k0p1.js +2 -0
  158. package/dist/core/web/public/next/assets/MutationTokenDialog-uyP-k0p1.js.map +1 -0
  159. package/dist/core/web/public/next/assets/NeedsYouDrawer-X_RbeWMF.js +3 -0
  160. package/dist/core/web/public/next/assets/NeedsYouDrawer-X_RbeWMF.js.map +1 -0
  161. package/dist/core/web/public/next/assets/NeedsYouList-B1SUdYu6.js +2 -0
  162. package/dist/core/web/public/next/assets/NeedsYouList-B1SUdYu6.js.map +1 -0
  163. package/dist/core/web/public/next/assets/NeedsYouScreen-DpSxoqCc.js +2 -0
  164. package/dist/core/web/public/next/assets/NeedsYouScreen-DpSxoqCc.js.map +1 -0
  165. package/dist/core/web/public/next/assets/NewAgentScreen-BoVhP7uR.js +2 -0
  166. package/dist/core/web/public/next/assets/NewAgentScreen-BoVhP7uR.js.map +1 -0
  167. package/dist/core/web/public/next/assets/NewChatDialog-Ch_TBnim.js +4 -0
  168. package/dist/core/web/public/next/assets/NewChatDialog-Ch_TBnim.js.map +1 -0
  169. package/dist/core/web/public/next/assets/OnboardingFlow-D5eqnjr0.js +3 -0
  170. package/dist/core/web/public/next/assets/OnboardingFlow-D5eqnjr0.js.map +1 -0
  171. package/dist/core/web/public/next/assets/OnboardingGate-Dzx97k2x.js +3 -0
  172. package/dist/core/web/public/next/assets/OnboardingGate-Dzx97k2x.js.map +1 -0
  173. package/dist/core/web/public/next/assets/PlaybooksSection-D2oX2sL3.js +9 -0
  174. package/dist/core/web/public/next/assets/PlaybooksSection-D2oX2sL3.js.map +1 -0
  175. package/dist/core/web/public/next/assets/PreviewPane-AxOJgJQm.js +2 -0
  176. package/dist/core/web/public/next/assets/PreviewPane-AxOJgJQm.js.map +1 -0
  177. package/dist/core/web/public/next/assets/ProviderLogo-CDw9LZmh.js +2 -0
  178. package/dist/core/web/public/next/assets/ProviderLogo-CDw9LZmh.js.map +1 -0
  179. package/dist/core/web/public/next/assets/RailStatus-DW2ceuC0.js +2 -0
  180. package/dist/core/web/public/next/assets/RailStatus-DW2ceuC0.js.map +1 -0
  181. package/dist/core/web/public/next/assets/ReasoningPane-C9jRpr8d.js +2 -0
  182. package/dist/core/web/public/next/assets/ReasoningPane-C9jRpr8d.js.map +1 -0
  183. package/dist/core/web/public/next/assets/ReasoningSheet-uc3BnfVA.js +2 -0
  184. package/dist/core/web/public/next/assets/ReasoningSheet-uc3BnfVA.js.map +1 -0
  185. package/dist/core/web/public/next/assets/RefreshIndicator-Di6IeZNh.js +2 -0
  186. package/dist/core/web/public/next/assets/RefreshIndicator-Di6IeZNh.js.map +1 -0
  187. package/dist/core/web/public/next/assets/RemoteMobileApp-H0YSq55U.js +2 -0
  188. package/dist/core/web/public/next/assets/RemoteMobileApp-H0YSq55U.js.map +1 -0
  189. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CHDEHAnq.js +7 -0
  190. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CHDEHAnq.js.map +1 -0
  191. package/dist/core/web/public/next/assets/ResourcesChrome-DIle5rXp.js +3 -0
  192. package/dist/core/web/public/next/assets/ResourcesChrome-DIle5rXp.js.map +1 -0
  193. package/dist/core/web/public/next/assets/ResourcesDrawer-DbTLNuGQ.js +3 -0
  194. package/dist/core/web/public/next/assets/ResourcesDrawer-DbTLNuGQ.js.map +1 -0
  195. package/dist/core/web/public/next/assets/RouteErrorBoundary-CbAyWP7h.js +2 -0
  196. package/dist/core/web/public/next/assets/RouteErrorBoundary-CbAyWP7h.js.map +1 -0
  197. package/dist/core/web/public/next/assets/RunInCloudAction-HD1AX0SJ.js +2 -0
  198. package/dist/core/web/public/next/assets/RunInCloudAction-HD1AX0SJ.js.map +1 -0
  199. package/dist/core/web/public/next/assets/RunInDevinAction-BkzQlbO3.js +2 -0
  200. package/dist/core/web/public/next/assets/RunInDevinAction-BkzQlbO3.js.map +1 -0
  201. package/dist/core/web/public/next/assets/ScreenHost-BPtOP6LJ.js +3 -0
  202. package/dist/core/web/public/next/assets/ScreenHost-BPtOP6LJ.js.map +1 -0
  203. package/dist/core/web/public/next/assets/SeatSelector-D8EZXz9a.js +3 -0
  204. package/dist/core/web/public/next/assets/SeatSelector-D8EZXz9a.js.map +1 -0
  205. package/dist/core/web/public/next/assets/Segmented-pAErxjR4.js +2 -0
  206. package/dist/core/web/public/next/assets/Segmented-pAErxjR4.js.map +1 -0
  207. package/dist/core/web/public/next/assets/Select-Css6V7wH.js +2 -0
  208. package/dist/core/web/public/next/assets/Select-Css6V7wH.js.map +1 -0
  209. package/dist/core/web/public/next/assets/SessionGate-DgvYLkfM.js +2 -0
  210. package/dist/core/web/public/next/assets/SessionGate-DgvYLkfM.js.map +1 -0
  211. package/dist/core/web/public/next/assets/SessionInsightChip-DwPsk2Kl.js +2 -0
  212. package/dist/core/web/public/next/assets/SessionInsightChip-DwPsk2Kl.js.map +1 -0
  213. package/dist/core/web/public/next/assets/SessionSearch-CHpNzY8i.js +2 -0
  214. package/dist/core/web/public/next/assets/SessionSearch-CHpNzY8i.js.map +1 -0
  215. package/dist/core/web/public/next/assets/SettingsSection-p79CGbgs.js +2 -0
  216. package/dist/core/web/public/next/assets/SettingsSection-p79CGbgs.js.map +1 -0
  217. package/dist/core/web/public/next/assets/SetupChecklist-1gybss1n.js +2 -0
  218. package/dist/core/web/public/next/assets/SetupChecklist-1gybss1n.js.map +1 -0
  219. package/dist/core/web/public/next/assets/ShadowDecisions-NL2qNt90.js +3 -0
  220. package/dist/core/web/public/next/assets/ShadowDecisions-NL2qNt90.js.map +1 -0
  221. package/dist/core/web/public/next/assets/Sheet-1ENtyVoT.js +2 -0
  222. package/dist/core/web/public/next/assets/Sheet-1ENtyVoT.js.map +1 -0
  223. package/dist/core/web/public/next/assets/ShortcutsOverlay-Beq9s8p4.js +2 -0
  224. package/dist/core/web/public/next/assets/ShortcutsOverlay-Beq9s8p4.js.map +1 -0
  225. package/dist/core/web/public/next/assets/Sidebar-BuMV-ulX.js +3 -0
  226. package/dist/core/web/public/next/assets/Sidebar-BuMV-ulX.js.map +1 -0
  227. package/dist/core/web/public/next/assets/SkipToContent-DxOcfOLL.js +2 -0
  228. package/dist/core/web/public/next/assets/SkipToContent-DxOcfOLL.js.map +1 -0
  229. package/dist/core/web/public/next/assets/Slider-DY1bch2c.js +2 -0
  230. package/dist/core/web/public/next/assets/Slider-DY1bch2c.js.map +1 -0
  231. package/dist/core/web/public/next/assets/SourcesPane-D1RA-tY4.js +2 -0
  232. package/dist/core/web/public/next/assets/SourcesPane-D1RA-tY4.js.map +1 -0
  233. package/dist/core/web/public/next/assets/SourcesPanel-WitD82Au.js +2 -0
  234. package/dist/core/web/public/next/assets/SourcesPanel-WitD82Au.js.map +1 -0
  235. package/dist/core/web/public/next/assets/StatTile-BE2HnwNG.js +2 -0
  236. package/dist/core/web/public/next/assets/StatTile-BE2HnwNG.js.map +1 -0
  237. package/dist/core/web/public/next/assets/StatusBadge-RjXOZERa.js +2 -0
  238. package/dist/core/web/public/next/assets/StatusBadge-RjXOZERa.js.map +1 -0
  239. package/dist/core/web/public/next/assets/StepBand-iT1eplJ_.js +2 -0
  240. package/dist/core/web/public/next/assets/StepBand-iT1eplJ_.js.map +1 -0
  241. package/dist/core/web/public/next/assets/Surface-B1n3X1cF.js +2 -0
  242. package/dist/core/web/public/next/assets/Surface-B1n3X1cF.js.map +1 -0
  243. package/dist/core/web/public/next/assets/Swimlane-B2q7tuCp.js +2 -0
  244. package/dist/core/web/public/next/assets/Swimlane-B2q7tuCp.js.map +1 -0
  245. package/dist/core/web/public/next/assets/Switch-B6Jn8y6M.js +2 -0
  246. package/dist/core/web/public/next/assets/Switch-B6Jn8y6M.js.map +1 -0
  247. package/dist/core/web/public/next/assets/Tag-ils_o3n7.js +2 -0
  248. package/dist/core/web/public/next/assets/Tag-ils_o3n7.js.map +1 -0
  249. package/dist/core/web/public/next/assets/TerminalPane-BhQiOFqe.js +26 -0
  250. package/dist/core/web/public/next/assets/TerminalPane-BhQiOFqe.js.map +1 -0
  251. package/dist/core/web/public/next/assets/TerminalPane-D2L17_-J.js +3 -0
  252. package/dist/core/web/public/next/assets/TerminalPane-D2L17_-J.js.map +1 -0
  253. package/dist/core/web/public/next/assets/ThinkingBlock-DgBPlHBO.js +2 -0
  254. package/dist/core/web/public/next/assets/ThinkingBlock-DgBPlHBO.js.map +1 -0
  255. package/dist/core/web/public/next/assets/Transcript-DZ96MnR7.css +1 -0
  256. package/dist/core/web/public/next/assets/Transcript.module-DD0MFIIy.js +2 -0
  257. package/dist/core/web/public/next/assets/Transcript.module-DD0MFIIy.js.map +1 -0
  258. package/dist/core/web/public/next/assets/UniverseConsoleApp-CJXF3bKW.js +2 -0
  259. package/dist/core/web/public/next/assets/UniverseConsoleApp-CJXF3bKW.js.map +1 -0
  260. package/dist/core/web/public/next/assets/UniverseView-Cbfp6Daj.js +9 -0
  261. package/dist/core/web/public/next/assets/UniverseView-Cbfp6Daj.js.map +1 -0
  262. package/dist/core/web/public/next/assets/UsageSection-DHbdb-S3.js +3 -0
  263. package/dist/core/web/public/next/assets/UsageSection-DHbdb-S3.js.map +1 -0
  264. package/dist/core/web/public/next/assets/UsePlaybookAction-B3on-MuD.js +2 -0
  265. package/dist/core/web/public/next/assets/UsePlaybookAction-B3on-MuD.js.map +1 -0
  266. package/dist/core/web/public/next/assets/VerseConsoleApp-CyRa9lh1.js +3 -0
  267. package/dist/core/web/public/next/assets/VerseConsoleApp-CyRa9lh1.js.map +1 -0
  268. package/dist/core/web/public/next/assets/VerseMobileApp-DdL64BfN.js +3 -0
  269. package/dist/core/web/public/next/assets/VerseMobileApp-DdL64BfN.js.map +1 -0
  270. package/dist/core/web/public/next/assets/VerseShared-8n7hxr-e.js +2 -0
  271. package/dist/core/web/public/next/assets/VerseShared-8n7hxr-e.js.map +1 -0
  272. package/dist/core/web/public/next/assets/VoiceHud-BXfe23my.js +2 -0
  273. package/dist/core/web/public/next/assets/VoiceHud-BXfe23my.js.map +1 -0
  274. package/dist/core/web/public/next/assets/VoiceInput-D191210j.js +2 -0
  275. package/dist/core/web/public/next/assets/VoiceInput-D191210j.js.map +1 -0
  276. package/dist/core/web/public/next/assets/WikiSection-D-aTEDA2.css +1 -0
  277. package/dist/core/web/public/next/assets/WikiSection-DFvGhkF6.js +2 -0
  278. package/dist/core/web/public/next/assets/WikiSection-DFvGhkF6.js.map +1 -0
  279. package/dist/core/web/public/next/assets/Workspace-Bcz74TPB.js +6 -0
  280. package/dist/core/web/public/next/assets/Workspace-Bcz74TPB.js.map +1 -0
  281. package/dist/core/web/public/next/assets/actions-C0D3tGtQ.js +2 -0
  282. package/dist/core/web/public/next/assets/actions-C0D3tGtQ.js.map +1 -0
  283. package/dist/core/web/public/next/assets/agent-tools-client-Mgwa14ux.js +2 -0
  284. package/dist/core/web/public/next/assets/agent-tools-client-Mgwa14ux.js.map +1 -0
  285. package/dist/core/web/public/next/assets/agents-focus-D2fGa_4z.js +2 -0
  286. package/dist/core/web/public/next/assets/agents-focus-D2fGa_4z.js.map +1 -0
  287. package/dist/core/web/public/next/assets/app-version-DINpmCFl.js +2 -0
  288. package/dist/core/web/public/next/assets/app-version-DINpmCFl.js.map +1 -0
  289. package/dist/core/web/public/next/assets/apps-model-BuxJ4qXU.js +2 -0
  290. package/dist/core/web/public/next/assets/apps-model-BuxJ4qXU.js.map +1 -0
  291. package/dist/core/web/public/next/assets/ask-seat-Dcpk0CIF.js +2 -0
  292. package/dist/core/web/public/next/assets/ask-seat-Dcpk0CIF.js.map +1 -0
  293. package/dist/core/web/public/next/assets/authority-model-DiQlAl6i.js +2 -0
  294. package/dist/core/web/public/next/assets/authority-model-DiQlAl6i.js.map +1 -0
  295. package/dist/core/web/public/next/assets/automations-focus-Drncwmjo.js +2 -0
  296. package/dist/core/web/public/next/assets/automations-focus-Drncwmjo.js.map +1 -0
  297. package/dist/core/web/public/next/assets/budget-queries-Bq8E10-x.js +2 -0
  298. package/dist/core/web/public/next/assets/budget-queries-Bq8E10-x.js.map +1 -0
  299. package/dist/core/web/public/next/assets/capacity-strip-model-w-CrM5cb.js +2 -0
  300. package/dist/core/web/public/next/assets/capacity-strip-model-w-CrM5cb.js.map +1 -0
  301. package/dist/core/web/public/next/assets/charts-Df70a5lC.js +2 -0
  302. package/dist/core/web/public/next/assets/charts-Df70a5lC.js.map +1 -0
  303. package/dist/core/web/public/next/assets/chat-pane-data-DTU9zx7p.js +2 -0
  304. package/dist/core/web/public/next/assets/chat-pane-data-DTU9zx7p.js.map +1 -0
  305. package/dist/core/web/public/next/assets/checkpoint-queries-CnVckizB.js +2 -0
  306. package/dist/core/web/public/next/assets/checkpoint-queries-CnVckizB.js.map +1 -0
  307. package/dist/core/web/public/next/assets/cloud-queries-CcwKDQQR.js +2 -0
  308. package/dist/core/web/public/next/assets/cloud-queries-CcwKDQQR.js.map +1 -0
  309. package/dist/core/web/public/next/assets/command-catalog-BVXehx9p.js +2 -0
  310. package/dist/core/web/public/next/assets/command-catalog-BVXehx9p.js.map +1 -0
  311. package/dist/core/web/public/next/assets/composer-queries-kl4Qu4ov.js +2 -0
  312. package/dist/core/web/public/next/assets/composer-queries-kl4Qu4ov.js.map +1 -0
  313. package/dist/core/web/public/next/assets/connectivity-BPumEJvI.js +2 -0
  314. package/dist/core/web/public/next/assets/connectivity-BPumEJvI.js.map +1 -0
  315. package/dist/core/web/public/next/assets/context-queries-D9KmusOQ.js +2 -0
  316. package/dist/core/web/public/next/assets/context-queries-D9KmusOQ.js.map +1 -0
  317. package/dist/core/web/public/next/assets/control-queries-CWyOtMUt.js +2 -0
  318. package/dist/core/web/public/next/assets/control-queries-CWyOtMUt.js.map +1 -0
  319. package/dist/core/web/public/next/assets/copy-setup-BZ1iT71M.js +2 -0
  320. package/dist/core/web/public/next/assets/copy-setup-BZ1iT71M.js.map +1 -0
  321. package/dist/core/web/public/next/assets/deep-link-DS0fbWVh.js +2 -0
  322. package/dist/core/web/public/next/assets/deep-link-DS0fbWVh.js.map +1 -0
  323. package/dist/core/web/public/next/assets/device-permissions-D09Bt0Pq.js +2 -0
  324. package/dist/core/web/public/next/assets/device-permissions-D09Bt0Pq.js.map +1 -0
  325. package/dist/core/web/public/next/assets/devin-queries-DURIM9b4.js +2 -0
  326. package/dist/core/web/public/next/assets/devin-queries-DURIM9b4.js.map +1 -0
  327. package/dist/core/web/public/next/assets/dock-icons-CgxRg9PW.js +2 -0
  328. package/dist/core/web/public/next/assets/dock-icons-CgxRg9PW.js.map +1 -0
  329. package/dist/core/web/public/next/assets/dock-panes-k9k0Nb7F.js +2 -0
  330. package/dist/core/web/public/next/assets/dock-panes-k9k0Nb7F.js.map +1 -0
  331. package/dist/core/web/public/next/assets/fleet-control-queries-B5itt_Zs.js +2 -0
  332. package/dist/core/web/public/next/assets/fleet-control-queries-B5itt_Zs.js.map +1 -0
  333. package/dist/core/web/public/next/assets/fleet-queries-BfG7HzPg.js +2 -0
  334. package/dist/core/web/public/next/assets/fleet-queries-BfG7HzPg.js.map +1 -0
  335. package/dist/core/web/public/next/assets/fleet-state-C3cbNM2V.js +3 -0
  336. package/dist/core/web/public/next/assets/fleet-state-C3cbNM2V.js.map +1 -0
  337. package/dist/core/web/public/next/assets/focus-trap-BZrKstmG.js +2 -0
  338. package/dist/core/web/public/next/assets/focus-trap-BZrKstmG.js.map +1 -0
  339. package/dist/core/web/public/next/assets/git-model-Cifb_Fej.js +5 -0
  340. package/dist/core/web/public/next/assets/git-model-Cifb_Fej.js.map +1 -0
  341. package/dist/core/web/public/next/assets/global-7hs7NyAO.js +3 -0
  342. package/dist/core/web/public/next/assets/global-7hs7NyAO.js.map +1 -0
  343. package/dist/core/web/public/next/assets/guarded-action-B436fLZM.js +3 -0
  344. package/dist/core/web/public/next/assets/guarded-action-B436fLZM.js.map +1 -0
  345. package/dist/core/web/public/next/assets/guarded-runners-BKW2AzKm.js +2 -0
  346. package/dist/core/web/public/next/assets/guarded-runners-BKW2AzKm.js.map +1 -0
  347. package/dist/core/web/public/next/assets/health-queries-BIrXejEb.js +2 -0
  348. package/dist/core/web/public/next/assets/health-queries-BIrXejEb.js.map +1 -0
  349. package/dist/core/web/public/next/assets/icons-D-25SVjm.js +2 -0
  350. package/dist/core/web/public/next/assets/icons-D-25SVjm.js.map +1 -0
  351. package/dist/core/web/public/next/assets/index-BMfejJ9u.js +11 -0
  352. package/dist/core/web/public/next/assets/index-BMfejJ9u.js.map +1 -0
  353. package/dist/core/web/public/next/assets/jev-queries-C0e3k0w_.js +2 -0
  354. package/dist/core/web/public/next/assets/jev-queries-C0e3k0w_.js.map +1 -0
  355. package/dist/core/web/public/next/assets/ladder-queries-D0IO6okB.js +2 -0
  356. package/dist/core/web/public/next/assets/ladder-queries-D0IO6okB.js.map +1 -0
  357. package/dist/core/web/public/next/assets/leader-focus-By_cVWdr.js +2 -0
  358. package/dist/core/web/public/next/assets/leader-focus-By_cVWdr.js.map +1 -0
  359. package/dist/core/web/public/next/assets/live-model-D9KHB4SV.js +2 -0
  360. package/dist/core/web/public/next/assets/live-model-D9KHB4SV.js.map +1 -0
  361. package/dist/core/web/public/next/assets/mobile-actions-B2vI7Rp-.js +2 -0
  362. package/dist/core/web/public/next/assets/mobile-actions-B2vI7Rp-.js.map +1 -0
  363. package/dist/core/web/public/next/assets/mobile-toast-BiBjw1hY.js +2 -0
  364. package/dist/core/web/public/next/assets/mobile-toast-BiBjw1hY.js.map +1 -0
  365. package/dist/core/web/public/next/assets/multimodel-flows-D4rRL-nu.js +7 -0
  366. package/dist/core/web/public/next/assets/multimodel-flows-D4rRL-nu.js.map +1 -0
  367. package/dist/core/web/public/next/assets/multimodel-queries-B3ZY2aWQ.js +2 -0
  368. package/dist/core/web/public/next/assets/multimodel-queries-B3ZY2aWQ.js.map +1 -0
  369. package/dist/core/web/public/next/assets/mutations-MOivZTO7.js +2 -0
  370. package/dist/core/web/public/next/assets/mutations-MOivZTO7.js.map +1 -0
  371. package/dist/core/web/public/next/assets/nav-BlWTsG_5.js +2 -0
  372. package/dist/core/web/public/next/assets/nav-BlWTsG_5.js.map +1 -0
  373. package/dist/core/web/public/next/assets/needs-you-actions-BzoGPu4Q.js +2 -0
  374. package/dist/core/web/public/next/assets/needs-you-actions-BzoGPu4Q.js.map +1 -0
  375. package/dist/core/web/public/next/assets/needs-you-model-BOm7eJaQ.js +2 -0
  376. package/dist/core/web/public/next/assets/needs-you-model-BOm7eJaQ.js.map +1 -0
  377. package/dist/core/web/public/next/assets/open-terminal-CAuSMTFo.js +2 -0
  378. package/dist/core/web/public/next/assets/open-terminal-CAuSMTFo.js.map +1 -0
  379. package/dist/core/web/public/next/assets/open-terminal-request-D3jNbBOp.js +2 -0
  380. package/dist/core/web/public/next/assets/open-terminal-request-D3jNbBOp.js.map +1 -0
  381. package/dist/core/web/public/next/assets/overnight-queries-DpCYfw0d.js +2 -0
  382. package/dist/core/web/public/next/assets/overnight-queries-DpCYfw0d.js.map +1 -0
  383. package/dist/core/web/public/next/assets/palette-handoff-Hqp9I68R.js +2 -0
  384. package/dist/core/web/public/next/assets/palette-handoff-Hqp9I68R.js.map +1 -0
  385. package/dist/core/web/public/next/assets/panes-AG63rhpM.js +3 -0
  386. package/dist/core/web/public/next/assets/panes-AG63rhpM.js.map +1 -0
  387. package/dist/core/web/public/next/assets/path-display-Dv94FG1y.js +2 -0
  388. package/dist/core/web/public/next/assets/path-display-Dv94FG1y.js.map +1 -0
  389. package/dist/core/web/public/next/assets/playbook-composer-BxEtjsIW.js +2 -0
  390. package/dist/core/web/public/next/assets/playbook-composer-BxEtjsIW.js.map +1 -0
  391. package/dist/core/web/public/next/assets/playbook-focus-BB1SYpsW.js +2 -0
  392. package/dist/core/web/public/next/assets/playbook-focus-BB1SYpsW.js.map +1 -0
  393. package/dist/core/web/public/next/assets/playbooks-queries-DtWLQrwZ.js +2 -0
  394. package/dist/core/web/public/next/assets/playbooks-queries-DtWLQrwZ.js.map +1 -0
  395. package/dist/core/web/public/next/assets/preloaded-D89lETD0.js +2 -0
  396. package/dist/core/web/public/next/assets/preloaded-D89lETD0.js.map +1 -0
  397. package/dist/core/web/public/next/assets/primitives-DXJl-rSe.js +1 -0
  398. package/dist/core/web/public/next/assets/pwa-CFctEg6F.js +2 -0
  399. package/dist/core/web/public/next/assets/pwa-CFctEg6F.js.map +1 -0
  400. package/dist/core/web/public/next/assets/queries-BLmYe69g.js +2 -0
  401. package/dist/core/web/public/next/assets/queries-BLmYe69g.js.map +1 -0
  402. package/dist/core/web/public/next/assets/reasoning-pref-D4t6eFBc.js +2 -0
  403. package/dist/core/web/public/next/assets/reasoning-pref-D4t6eFBc.js.map +1 -0
  404. package/dist/core/web/public/next/assets/remote-session-BdCVlRRZ.js +3 -0
  405. package/dist/core/web/public/next/assets/remote-session-BdCVlRRZ.js.map +1 -0
  406. package/dist/core/web/public/next/assets/resolved-store-B1xwZl7x.js +2 -0
  407. package/dist/core/web/public/next/assets/resolved-store-B1xwZl7x.js.map +1 -0
  408. package/dist/core/web/public/next/assets/resources-queries-BaSf2hP1.js +2 -0
  409. package/dist/core/web/public/next/assets/resources-queries-BaSf2hP1.js.map +1 -0
  410. package/dist/core/web/public/next/assets/reveal-anchor-zUWG9d5W.js +2 -0
  411. package/dist/core/web/public/next/assets/reveal-anchor-zUWG9d5W.js.map +1 -0
  412. package/dist/core/web/public/next/assets/sheet-PQfgBlM5.js +2 -0
  413. package/dist/core/web/public/next/assets/sheet-PQfgBlM5.js.map +1 -0
  414. package/dist/core/web/public/next/assets/slots-DJafWFZK.js +3 -0
  415. package/dist/core/web/public/next/assets/slots-DJafWFZK.js.map +1 -0
  416. package/dist/core/web/public/next/assets/sources-queries-BcB711fd.js +4 -0
  417. package/dist/core/web/public/next/assets/sources-queries-BcB711fd.js.map +1 -0
  418. package/dist/core/web/public/next/assets/sse-Cp2z2nU_.js +2 -0
  419. package/dist/core/web/public/next/assets/sse-Cp2z2nU_.js.map +1 -0
  420. package/dist/core/web/public/next/assets/stub-panes.module-blrN0yxn.js +3 -0
  421. package/dist/core/web/public/next/assets/stub-panes.module-blrN0yxn.js.map +1 -0
  422. package/dist/core/web/public/next/assets/surface-data-D-fFBmZZ.js +2 -0
  423. package/dist/core/web/public/next/assets/surface-data-D-fFBmZZ.js.map +1 -0
  424. package/dist/core/web/public/next/assets/surface-prefetch-Q1iAxBuz.js +2 -0
  425. package/dist/core/web/public/next/assets/surface-prefetch-Q1iAxBuz.js.map +1 -0
  426. package/dist/core/web/public/next/assets/tasks-model-Larlwtqy.js +2 -0
  427. package/dist/core/web/public/next/assets/tasks-model-Larlwtqy.js.map +1 -0
  428. package/dist/core/web/public/next/assets/terminal-client-kp1CT3x-.js +2 -0
  429. package/dist/core/web/public/next/assets/terminal-client-kp1CT3x-.js.map +1 -0
  430. package/dist/core/web/public/next/assets/terminal-icons-BxToOayr.js +2 -0
  431. package/dist/core/web/public/next/assets/terminal-icons-BxToOayr.js.map +1 -0
  432. package/dist/core/web/public/next/assets/terminal-view-CSxX-xjM.js +6 -0
  433. package/dist/core/web/public/next/assets/terminal-view-CSxX-xjM.js.map +1 -0
  434. package/dist/core/web/public/next/assets/thread-data-bh8JfvXs.js +2 -0
  435. package/dist/core/web/public/next/assets/thread-data-bh8JfvXs.js.map +1 -0
  436. package/dist/core/web/public/next/assets/tool-semantics-xF0Fw2Ck.js +8 -0
  437. package/dist/core/web/public/next/assets/tool-semantics-xF0Fw2Ck.js.map +1 -0
  438. package/dist/core/web/public/next/assets/turn-files-fJGOtf4K.js +2 -0
  439. package/dist/core/web/public/next/assets/turn-files-fJGOtf4K.js.map +1 -0
  440. package/dist/core/web/public/next/assets/ui-parts-C9HJZZ3G.js +2 -0
  441. package/dist/core/web/public/next/assets/ui-parts-C9HJZZ3G.js.map +1 -0
  442. package/dist/core/web/public/next/assets/usage-queries-7aq_WIzn.js +2 -0
  443. package/dist/core/web/public/next/assets/usage-queries-7aq_WIzn.js.map +1 -0
  444. package/dist/core/web/public/next/assets/use-chat-activity-C1AfctzC.js +2 -0
  445. package/dist/core/web/public/next/assets/use-chat-activity-C1AfctzC.js.map +1 -0
  446. package/dist/core/web/public/next/assets/use-guarded-action-DtO48djT.js +2 -0
  447. package/dist/core/web/public/next/assets/use-guarded-action-DtO48djT.js.map +1 -0
  448. package/dist/core/web/public/next/assets/use-ticker-C_3x5IxG.js +2 -0
  449. package/dist/core/web/public/next/assets/use-ticker-C_3x5IxG.js.map +1 -0
  450. package/dist/core/web/public/next/assets/use-token-gate-CVck1ObW.js +2 -0
  451. package/dist/core/web/public/next/assets/use-token-gate-CVck1ObW.js.map +1 -0
  452. package/dist/core/web/public/next/assets/useAutoSeat-DEuUBq8A.js +2 -0
  453. package/dist/core/web/public/next/assets/useAutoSeat-DEuUBq8A.js.map +1 -0
  454. package/dist/core/web/public/next/assets/useOnboarding-4DaPslDU.js +2 -0
  455. package/dist/core/web/public/next/assets/useOnboarding-4DaPslDU.js.map +1 -0
  456. package/dist/core/web/public/next/assets/useSeatHealth-BztO2ijd.js +2 -0
  457. package/dist/core/web/public/next/assets/useSeatHealth-BztO2ijd.js.map +1 -0
  458. package/dist/core/web/public/next/assets/useSeatsRefresh-DrYcVtb0.js +2 -0
  459. package/dist/core/web/public/next/assets/useSeatsRefresh-DrYcVtb0.js.map +1 -0
  460. package/dist/core/web/public/next/assets/useVerseSession-8gkt9BrB.js +2 -0
  461. package/dist/core/web/public/next/assets/useVerseSession-8gkt9BrB.js.map +1 -0
  462. package/dist/core/web/public/next/assets/useVerseTranscript-8DMWuHY_.js +2 -0
  463. package/dist/core/web/public/next/assets/useVerseTranscript-8DMWuHY_.js.map +1 -0
  464. package/dist/core/web/public/next/assets/verse-bootstrap-query-CarqaoBI.js +2 -0
  465. package/dist/core/web/public/next/assets/verse-bootstrap-query-CarqaoBI.js.map +1 -0
  466. package/dist/core/web/public/next/assets/verse-icons-CqAqHAJV.js +2 -0
  467. package/dist/core/web/public/next/assets/verse-icons-CqAqHAJV.js.map +1 -0
  468. package/dist/core/web/public/next/assets/warmup-D7Q3XM98.js +3 -0
  469. package/dist/core/web/public/next/assets/warmup-D7Q3XM98.js.map +1 -0
  470. package/dist/core/web/public/next/assets/wiki-focus-cER8-UuY.js +2 -0
  471. package/dist/core/web/public/next/assets/wiki-focus-cER8-UuY.js.map +1 -0
  472. package/dist/core/web/public/next/index.html +1 -1
  473. package/dist/release-dependency-inventory.json +1 -1
  474. package/docs/QUICKSTART.md +7 -7
  475. package/package.json +2 -2
  476. package/dist/core/web/public/next/assets/ActionMenu--8HwMEm-.js +0 -2
  477. package/dist/core/web/public/next/assets/ActionMenu--8HwMEm-.js.map +0 -1
  478. package/dist/core/web/public/next/assets/Advanced-CI3lDlNx.js +0 -2
  479. package/dist/core/web/public/next/assets/Advanced-CI3lDlNx.js.map +0 -1
  480. package/dist/core/web/public/next/assets/AgentDetailScreen-DR9Mt6p3.js +0 -2
  481. package/dist/core/web/public/next/assets/AgentDetailScreen-DR9Mt6p3.js.map +0 -1
  482. package/dist/core/web/public/next/assets/AgentToolsSheet-B9NRMObI.js +0 -2
  483. package/dist/core/web/public/next/assets/AgentToolsSheet-B9NRMObI.js.map +0 -1
  484. package/dist/core/web/public/next/assets/AgentToolsStrip-Di-IPkGx.js +0 -2
  485. package/dist/core/web/public/next/assets/AgentToolsStrip-Di-IPkGx.js.map +0 -1
  486. package/dist/core/web/public/next/assets/AgentsScreen-nWyL2bRO.js +0 -2
  487. package/dist/core/web/public/next/assets/AgentsScreen-nWyL2bRO.js.map +0 -1
  488. package/dist/core/web/public/next/assets/AgentsSection-C0_0UI3x.js +0 -3
  489. package/dist/core/web/public/next/assets/AgentsSection-C0_0UI3x.js.map +0 -1
  490. package/dist/core/web/public/next/assets/App-CilLfKCx.js +0 -8
  491. package/dist/core/web/public/next/assets/App-CilLfKCx.js.map +0 -1
  492. package/dist/core/web/public/next/assets/AppsSection-CfSTk7HH.js +0 -2
  493. package/dist/core/web/public/next/assets/AppsSection-CfSTk7HH.js.map +0 -1
  494. package/dist/core/web/public/next/assets/AreaTrend-CxOhY1UF.js +0 -2
  495. package/dist/core/web/public/next/assets/AreaTrend-CxOhY1UF.js.map +0 -1
  496. package/dist/core/web/public/next/assets/AutomationsSection-DuW15eMu.js +0 -2
  497. package/dist/core/web/public/next/assets/AutomationsSection-DuW15eMu.js.map +0 -1
  498. package/dist/core/web/public/next/assets/AutonomyOffState-CcBeGaDE.js +0 -3
  499. package/dist/core/web/public/next/assets/AutonomyOffState-CcBeGaDE.js.map +0 -1
  500. package/dist/core/web/public/next/assets/AutonomySection-DhPlr1lu.js +0 -2
  501. package/dist/core/web/public/next/assets/AutonomySection-DhPlr1lu.js.map +0 -1
  502. package/dist/core/web/public/next/assets/AutonomyStatus-BjcxejFk.js +0 -2
  503. package/dist/core/web/public/next/assets/AutonomyStatus-BjcxejFk.js.map +0 -1
  504. package/dist/core/web/public/next/assets/BranchBar-CnUx6S00.js +0 -2
  505. package/dist/core/web/public/next/assets/BranchBar-CnUx6S00.js.map +0 -1
  506. package/dist/core/web/public/next/assets/BrowserPanel-BGT_M1U1.js +0 -7
  507. package/dist/core/web/public/next/assets/BrowserPanel-BGT_M1U1.js.map +0 -1
  508. package/dist/core/web/public/next/assets/BudgetControl-BrNZT9Zl.js +0 -2
  509. package/dist/core/web/public/next/assets/BudgetControl-BrNZT9Zl.js.map +0 -1
  510. package/dist/core/web/public/next/assets/Button-BiWLAmtW.js +0 -2
  511. package/dist/core/web/public/next/assets/Button-BiWLAmtW.js.map +0 -1
  512. package/dist/core/web/public/next/assets/CapacityStrip-DOgdqmgX.js +0 -2
  513. package/dist/core/web/public/next/assets/CapacityStrip-DOgdqmgX.js.map +0 -1
  514. package/dist/core/web/public/next/assets/ChangesPaneHost-B8Q4Pyuy.js +0 -16
  515. package/dist/core/web/public/next/assets/ChangesPaneHost-B8Q4Pyuy.js.map +0 -1
  516. package/dist/core/web/public/next/assets/ChartFrame-167_NcWd.js +0 -2
  517. package/dist/core/web/public/next/assets/ChartFrame-167_NcWd.js.map +0 -1
  518. package/dist/core/web/public/next/assets/ChatPanes-DfvfHTCR.js +0 -2
  519. package/dist/core/web/public/next/assets/ChatPanes-DfvfHTCR.js.map +0 -1
  520. package/dist/core/web/public/next/assets/ChatSection-DYWOyKNd.js +0 -3
  521. package/dist/core/web/public/next/assets/ChatSection-DYWOyKNd.js.map +0 -1
  522. package/dist/core/web/public/next/assets/ChecksPanel-_yhpFLzc.js +0 -5
  523. package/dist/core/web/public/next/assets/ChecksPanel-_yhpFLzc.js.map +0 -1
  524. package/dist/core/web/public/next/assets/CloudBudgetForm-CpA4WRlB.js +0 -2
  525. package/dist/core/web/public/next/assets/CloudBudgetForm-CpA4WRlB.js.map +0 -1
  526. package/dist/core/web/public/next/assets/CommandPalette-CggT1MRe.js +0 -3
  527. package/dist/core/web/public/next/assets/CommandPalette-CggT1MRe.js.map +0 -1
  528. package/dist/core/web/public/next/assets/CommandSection-BT6spVer.js +0 -3
  529. package/dist/core/web/public/next/assets/CommandSection-BT6spVer.js.map +0 -1
  530. package/dist/core/web/public/next/assets/CommandWorkflowForm-D0UA0Tgb.js +0 -9
  531. package/dist/core/web/public/next/assets/CommandWorkflowForm-D0UA0Tgb.js.map +0 -1
  532. package/dist/core/web/public/next/assets/CommandWorkflowPicker-DnhAyun2.js +0 -3
  533. package/dist/core/web/public/next/assets/CommandWorkflowPicker-DnhAyun2.js.map +0 -1
  534. package/dist/core/web/public/next/assets/CompareDialog-D_k5fpTZ.js +0 -4
  535. package/dist/core/web/public/next/assets/CompareDialog-D_k5fpTZ.js.map +0 -1
  536. package/dist/core/web/public/next/assets/ComputerControl-DehWe5qQ.js +0 -2
  537. package/dist/core/web/public/next/assets/ComputerControl-DehWe5qQ.js.map +0 -1
  538. package/dist/core/web/public/next/assets/ConfirmDialog-CZhofva3.js +0 -2
  539. package/dist/core/web/public/next/assets/ConfirmDialog-CZhofva3.js.map +0 -1
  540. package/dist/core/web/public/next/assets/DeleteChatDialog-C3pjjZ_M.js +0 -2
  541. package/dist/core/web/public/next/assets/DeleteChatDialog-C3pjjZ_M.js.map +0 -1
  542. package/dist/core/web/public/next/assets/DevinStopDialog-DAruALIH.js +0 -2
  543. package/dist/core/web/public/next/assets/DevinStopDialog-DAruALIH.js.map +0 -1
  544. package/dist/core/web/public/next/assets/Dialog-CH48_F95.js +0 -2
  545. package/dist/core/web/public/next/assets/Dialog-CH48_F95.js.map +0 -1
  546. package/dist/core/web/public/next/assets/DiffPane-CnW8cKzV.js +0 -2
  547. package/dist/core/web/public/next/assets/DiffPane-CnW8cKzV.js.map +0 -1
  548. package/dist/core/web/public/next/assets/DiffViewer-C33LbmiF.js +0 -2
  549. package/dist/core/web/public/next/assets/DiffViewer-C33LbmiF.js.map +0 -1
  550. package/dist/core/web/public/next/assets/DockHost-D7EdSe5a.js +0 -2
  551. package/dist/core/web/public/next/assets/DockHost-D7EdSe5a.js.map +0 -1
  552. package/dist/core/web/public/next/assets/EmptyState-7g6XvSCX.js +0 -2
  553. package/dist/core/web/public/next/assets/EmptyState-7g6XvSCX.js.map +0 -1
  554. package/dist/core/web/public/next/assets/Epistemic-CCymco01.js +0 -2
  555. package/dist/core/web/public/next/assets/Epistemic-CCymco01.js.map +0 -1
  556. package/dist/core/web/public/next/assets/EvidenceTimeline-BFb9JIYV.js +0 -2
  557. package/dist/core/web/public/next/assets/EvidenceTimeline-BFb9JIYV.js.map +0 -1
  558. package/dist/core/web/public/next/assets/FilesPane-iRh6nDlh.js +0 -2
  559. package/dist/core/web/public/next/assets/FilesPane-iRh6nDlh.js.map +0 -1
  560. package/dist/core/web/public/next/assets/FleetScreen-_GPa48bL.js +0 -2
  561. package/dist/core/web/public/next/assets/FleetScreen-_GPa48bL.js.map +0 -1
  562. package/dist/core/web/public/next/assets/FleetSection-Bon8yQlk.js +0 -5
  563. package/dist/core/web/public/next/assets/FleetSection-Bon8yQlk.js.map +0 -1
  564. package/dist/core/web/public/next/assets/Funnel-BVKqU0yd.js +0 -2
  565. package/dist/core/web/public/next/assets/Funnel-BVKqU0yd.js.map +0 -1
  566. package/dist/core/web/public/next/assets/GearTray-DqiVGoID.js +0 -2
  567. package/dist/core/web/public/next/assets/GearTray-DqiVGoID.js.map +0 -1
  568. package/dist/core/web/public/next/assets/GitDialogs-Da1EB6vD.js +0 -2
  569. package/dist/core/web/public/next/assets/GitDialogs-Da1EB6vD.js.map +0 -1
  570. package/dist/core/web/public/next/assets/GrowthSection-jz_5brSm.js +0 -3
  571. package/dist/core/web/public/next/assets/GrowthSection-jz_5brSm.js.map +0 -1
  572. package/dist/core/web/public/next/assets/HandoffDialog-Ciy556L3.js +0 -2
  573. package/dist/core/web/public/next/assets/HandoffDialog-Ciy556L3.js.map +0 -1
  574. package/dist/core/web/public/next/assets/HomeBody-CAZjhdMC.js +0 -3
  575. package/dist/core/web/public/next/assets/HomeBody-CAZjhdMC.js.map +0 -1
  576. package/dist/core/web/public/next/assets/HomeSeats-Bhmc1sIJ.js +0 -2
  577. package/dist/core/web/public/next/assets/HomeSeats-Bhmc1sIJ.js.map +0 -1
  578. package/dist/core/web/public/next/assets/Input-VOFXiCWT.js +0 -2
  579. package/dist/core/web/public/next/assets/Input-VOFXiCWT.js.map +0 -1
  580. package/dist/core/web/public/next/assets/LaunchDialog-ByJkKheq.js +0 -9
  581. package/dist/core/web/public/next/assets/LaunchDialog-ByJkKheq.js.map +0 -1
  582. package/dist/core/web/public/next/assets/LeaderCard-Dam6IfzD.js +0 -2
  583. package/dist/core/web/public/next/assets/LeaderCard-Dam6IfzD.js.map +0 -1
  584. package/dist/core/web/public/next/assets/LeaderConversation-DduNJP6H.js +0 -3
  585. package/dist/core/web/public/next/assets/LeaderConversation-DduNJP6H.js.map +0 -1
  586. package/dist/core/web/public/next/assets/LeaderScreen-_3YeG61Z.js +0 -2
  587. package/dist/core/web/public/next/assets/LeaderScreen-_3YeG61Z.js.map +0 -1
  588. package/dist/core/web/public/next/assets/LessonsPanel-CbEleQtG.js +0 -2
  589. package/dist/core/web/public/next/assets/LessonsPanel-CbEleQtG.js.map +0 -1
  590. package/dist/core/web/public/next/assets/LiveTimer-DMKMewTd.js +0 -2
  591. package/dist/core/web/public/next/assets/LiveTimer-DMKMewTd.js.map +0 -1
  592. package/dist/core/web/public/next/assets/LocalSeatBadge-Dk5OYc6Y.js +0 -2
  593. package/dist/core/web/public/next/assets/LocalSeatBadge-Dk5OYc6Y.js.map +0 -1
  594. package/dist/core/web/public/next/assets/MatrixHeatmap-1ksZeI4v.js +0 -2
  595. package/dist/core/web/public/next/assets/MatrixHeatmap-1ksZeI4v.js.map +0 -1
  596. package/dist/core/web/public/next/assets/McpSection-CeIjaqve.js +0 -2
  597. package/dist/core/web/public/next/assets/McpSection-CeIjaqve.js.map +0 -1
  598. package/dist/core/web/public/next/assets/MessageMarkdown-BpTPmenE.js +0 -3
  599. package/dist/core/web/public/next/assets/MessageMarkdown-BpTPmenE.js.map +0 -1
  600. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-BeSS9Pdl.js +0 -72
  601. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-BeSS9Pdl.js.map +0 -1
  602. package/dist/core/web/public/next/assets/Meter-CqaHFpQN.js +0 -2
  603. package/dist/core/web/public/next/assets/Meter-CqaHFpQN.js.map +0 -1
  604. package/dist/core/web/public/next/assets/MicButton-DYO5NOwU.js +0 -2
  605. package/dist/core/web/public/next/assets/MicButton-DYO5NOwU.js.map +0 -1
  606. package/dist/core/web/public/next/assets/MindSection-CQ9_IS2g.js +0 -3
  607. package/dist/core/web/public/next/assets/MindSection-CQ9_IS2g.js.map +0 -1
  608. package/dist/core/web/public/next/assets/MobileComposer-BK-mI_X6.js +0 -2
  609. package/dist/core/web/public/next/assets/MobileComposer-BK-mI_X6.js.map +0 -1
  610. package/dist/core/web/public/next/assets/MobileGuardSheet-B7P3q2I3.js +0 -2
  611. package/dist/core/web/public/next/assets/MobileGuardSheet-B7P3q2I3.js.map +0 -1
  612. package/dist/core/web/public/next/assets/MobileRuntime-PLoWSQGn.js +0 -3
  613. package/dist/core/web/public/next/assets/MobileRuntime-PLoWSQGn.js.map +0 -1
  614. package/dist/core/web/public/next/assets/MoreScreen-DLfPso-M.js +0 -2
  615. package/dist/core/web/public/next/assets/MoreScreen-DLfPso-M.js.map +0 -1
  616. package/dist/core/web/public/next/assets/MultiModelBar-Mrm1444h.js +0 -7
  617. package/dist/core/web/public/next/assets/MultiModelBar-Mrm1444h.js.map +0 -1
  618. package/dist/core/web/public/next/assets/MutationTokenDialog-ChtiRDO6.js +0 -2
  619. package/dist/core/web/public/next/assets/MutationTokenDialog-ChtiRDO6.js.map +0 -1
  620. package/dist/core/web/public/next/assets/NeedsYouDrawer-BMccNeTi.js +0 -3
  621. package/dist/core/web/public/next/assets/NeedsYouDrawer-BMccNeTi.js.map +0 -1
  622. package/dist/core/web/public/next/assets/NeedsYouList-J39veXX_.js +0 -2
  623. package/dist/core/web/public/next/assets/NeedsYouList-J39veXX_.js.map +0 -1
  624. package/dist/core/web/public/next/assets/NeedsYouScreen-C4uPKnl5.js +0 -2
  625. package/dist/core/web/public/next/assets/NeedsYouScreen-C4uPKnl5.js.map +0 -1
  626. package/dist/core/web/public/next/assets/NewAgentScreen-ME05-nh6.js +0 -2
  627. package/dist/core/web/public/next/assets/NewAgentScreen-ME05-nh6.js.map +0 -1
  628. package/dist/core/web/public/next/assets/NewChatDialog-Bl3XJx7p.js +0 -4
  629. package/dist/core/web/public/next/assets/NewChatDialog-Bl3XJx7p.js.map +0 -1
  630. package/dist/core/web/public/next/assets/OnboardingFlow-9Dfw74WI.js +0 -3
  631. package/dist/core/web/public/next/assets/OnboardingFlow-9Dfw74WI.js.map +0 -1
  632. package/dist/core/web/public/next/assets/OnboardingGate-DmWHBqkN.js +0 -3
  633. package/dist/core/web/public/next/assets/OnboardingGate-DmWHBqkN.js.map +0 -1
  634. package/dist/core/web/public/next/assets/PlaybooksSection-Bmmw9ea2.js +0 -9
  635. package/dist/core/web/public/next/assets/PlaybooksSection-Bmmw9ea2.js.map +0 -1
  636. package/dist/core/web/public/next/assets/PreviewPane-B3V-S2wt.js +0 -2
  637. package/dist/core/web/public/next/assets/PreviewPane-B3V-S2wt.js.map +0 -1
  638. package/dist/core/web/public/next/assets/ProviderLogo-C1Ap7oXI.js +0 -2
  639. package/dist/core/web/public/next/assets/ProviderLogo-C1Ap7oXI.js.map +0 -1
  640. package/dist/core/web/public/next/assets/RailStatus-D8G4G_Vd.js +0 -2
  641. package/dist/core/web/public/next/assets/RailStatus-D8G4G_Vd.js.map +0 -1
  642. package/dist/core/web/public/next/assets/ReasoningPane-Ch4eEqfN.js +0 -2
  643. package/dist/core/web/public/next/assets/ReasoningPane-Ch4eEqfN.js.map +0 -1
  644. package/dist/core/web/public/next/assets/ReasoningSheet-zW3qNqGs.js +0 -2
  645. package/dist/core/web/public/next/assets/ReasoningSheet-zW3qNqGs.js.map +0 -1
  646. package/dist/core/web/public/next/assets/RefreshIndicator-5WVbQPUt.js +0 -2
  647. package/dist/core/web/public/next/assets/RefreshIndicator-5WVbQPUt.js.map +0 -1
  648. package/dist/core/web/public/next/assets/RemoteMobileApp-Bb_ls1jo.js +0 -2
  649. package/dist/core/web/public/next/assets/RemoteMobileApp-Bb_ls1jo.js.map +0 -1
  650. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-DjqkkBOW.js +0 -7
  651. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-DjqkkBOW.js.map +0 -1
  652. package/dist/core/web/public/next/assets/ResourcesChrome-Dg2-MDWW.js +0 -3
  653. package/dist/core/web/public/next/assets/ResourcesChrome-Dg2-MDWW.js.map +0 -1
  654. package/dist/core/web/public/next/assets/ResourcesDrawer-DbDOCW04.js +0 -3
  655. package/dist/core/web/public/next/assets/ResourcesDrawer-DbDOCW04.js.map +0 -1
  656. package/dist/core/web/public/next/assets/RouteErrorBoundary-DvarlJu6.js +0 -2
  657. package/dist/core/web/public/next/assets/RouteErrorBoundary-DvarlJu6.js.map +0 -1
  658. package/dist/core/web/public/next/assets/RunInCloudAction-pqIPQwgD.js +0 -2
  659. package/dist/core/web/public/next/assets/RunInCloudAction-pqIPQwgD.js.map +0 -1
  660. package/dist/core/web/public/next/assets/RunInDevinAction-D1zIEZEQ.js +0 -2
  661. package/dist/core/web/public/next/assets/RunInDevinAction-D1zIEZEQ.js.map +0 -1
  662. package/dist/core/web/public/next/assets/ScreenHost-B4MLcKr9.js +0 -3
  663. package/dist/core/web/public/next/assets/ScreenHost-B4MLcKr9.js.map +0 -1
  664. package/dist/core/web/public/next/assets/SeatSelector-BknWe_wy.js +0 -3
  665. package/dist/core/web/public/next/assets/SeatSelector-BknWe_wy.js.map +0 -1
  666. package/dist/core/web/public/next/assets/Segmented-wjds-ulG.js +0 -2
  667. package/dist/core/web/public/next/assets/Segmented-wjds-ulG.js.map +0 -1
  668. package/dist/core/web/public/next/assets/Select-B5GTnXoL.js +0 -2
  669. package/dist/core/web/public/next/assets/Select-B5GTnXoL.js.map +0 -1
  670. package/dist/core/web/public/next/assets/SessionGate-B3FUSg4M.js +0 -2
  671. package/dist/core/web/public/next/assets/SessionGate-B3FUSg4M.js.map +0 -1
  672. package/dist/core/web/public/next/assets/SessionInsightChip-C4wouctG.js +0 -2
  673. package/dist/core/web/public/next/assets/SessionInsightChip-C4wouctG.js.map +0 -1
  674. package/dist/core/web/public/next/assets/SessionSearch-B-2yHMw6.js +0 -2
  675. package/dist/core/web/public/next/assets/SessionSearch-B-2yHMw6.js.map +0 -1
  676. package/dist/core/web/public/next/assets/SettingsSection-D8v6WRFJ.js +0 -2
  677. package/dist/core/web/public/next/assets/SettingsSection-D8v6WRFJ.js.map +0 -1
  678. package/dist/core/web/public/next/assets/SetupChecklist-63CBlXs1.js +0 -2
  679. package/dist/core/web/public/next/assets/SetupChecklist-63CBlXs1.js.map +0 -1
  680. package/dist/core/web/public/next/assets/ShadowDecisions-eybo7qqr.js +0 -3
  681. package/dist/core/web/public/next/assets/ShadowDecisions-eybo7qqr.js.map +0 -1
  682. package/dist/core/web/public/next/assets/Sheet-BrHMpj4g.js +0 -2
  683. package/dist/core/web/public/next/assets/Sheet-BrHMpj4g.js.map +0 -1
  684. package/dist/core/web/public/next/assets/ShortcutsOverlay-C-ED7Euh.js +0 -2
  685. package/dist/core/web/public/next/assets/ShortcutsOverlay-C-ED7Euh.js.map +0 -1
  686. package/dist/core/web/public/next/assets/Sidebar-Dyn6lGvZ.js +0 -3
  687. package/dist/core/web/public/next/assets/Sidebar-Dyn6lGvZ.js.map +0 -1
  688. package/dist/core/web/public/next/assets/SkipToContent-DTxWH085.js +0 -2
  689. package/dist/core/web/public/next/assets/SkipToContent-DTxWH085.js.map +0 -1
  690. package/dist/core/web/public/next/assets/Slider-DwEchMza.js +0 -2
  691. package/dist/core/web/public/next/assets/Slider-DwEchMza.js.map +0 -1
  692. package/dist/core/web/public/next/assets/SourcesPane-BWVWIGt1.js +0 -2
  693. package/dist/core/web/public/next/assets/SourcesPane-BWVWIGt1.js.map +0 -1
  694. package/dist/core/web/public/next/assets/SourcesPanel-DfYLq-I7.js +0 -2
  695. package/dist/core/web/public/next/assets/SourcesPanel-DfYLq-I7.js.map +0 -1
  696. package/dist/core/web/public/next/assets/StatTile-BThhgW4d.js +0 -2
  697. package/dist/core/web/public/next/assets/StatTile-BThhgW4d.js.map +0 -1
  698. package/dist/core/web/public/next/assets/StatusBadge-BkY2iVa1.js +0 -2
  699. package/dist/core/web/public/next/assets/StatusBadge-BkY2iVa1.js.map +0 -1
  700. package/dist/core/web/public/next/assets/StepBand-0bqINoll.js +0 -2
  701. package/dist/core/web/public/next/assets/StepBand-0bqINoll.js.map +0 -1
  702. package/dist/core/web/public/next/assets/Surface-DGE1hA8U.js +0 -2
  703. package/dist/core/web/public/next/assets/Surface-DGE1hA8U.js.map +0 -1
  704. package/dist/core/web/public/next/assets/Swimlane-DqSkrO7I.js +0 -2
  705. package/dist/core/web/public/next/assets/Swimlane-DqSkrO7I.js.map +0 -1
  706. package/dist/core/web/public/next/assets/Switch-DzbwFVJF.js +0 -2
  707. package/dist/core/web/public/next/assets/Switch-DzbwFVJF.js.map +0 -1
  708. package/dist/core/web/public/next/assets/Tag-NKPvC6WH.js +0 -2
  709. package/dist/core/web/public/next/assets/Tag-NKPvC6WH.js.map +0 -1
  710. package/dist/core/web/public/next/assets/TerminalPane-B6GVYldA.js +0 -26
  711. package/dist/core/web/public/next/assets/TerminalPane-B6GVYldA.js.map +0 -1
  712. package/dist/core/web/public/next/assets/TerminalPane-C9CCjTDB.js +0 -3
  713. package/dist/core/web/public/next/assets/TerminalPane-C9CCjTDB.js.map +0 -1
  714. package/dist/core/web/public/next/assets/ThinkingBlock-D1tflrrI.js +0 -2
  715. package/dist/core/web/public/next/assets/ThinkingBlock-D1tflrrI.js.map +0 -1
  716. package/dist/core/web/public/next/assets/Transcript-DLeoLRca.css +0 -1
  717. package/dist/core/web/public/next/assets/Transcript.module-CzROOZJo.js +0 -2
  718. package/dist/core/web/public/next/assets/Transcript.module-CzROOZJo.js.map +0 -1
  719. package/dist/core/web/public/next/assets/UniverseConsoleApp-DDCdtE8A.js +0 -2
  720. package/dist/core/web/public/next/assets/UniverseConsoleApp-DDCdtE8A.js.map +0 -1
  721. package/dist/core/web/public/next/assets/UniverseView-BbBO21O2.js +0 -9
  722. package/dist/core/web/public/next/assets/UniverseView-BbBO21O2.js.map +0 -1
  723. package/dist/core/web/public/next/assets/UsageSection-BuPJIMcf.js +0 -3
  724. package/dist/core/web/public/next/assets/UsageSection-BuPJIMcf.js.map +0 -1
  725. package/dist/core/web/public/next/assets/UsePlaybookAction-BOGWdnK7.js +0 -2
  726. package/dist/core/web/public/next/assets/UsePlaybookAction-BOGWdnK7.js.map +0 -1
  727. package/dist/core/web/public/next/assets/VerseConsoleApp-wPGkVkCc.js +0 -3
  728. package/dist/core/web/public/next/assets/VerseConsoleApp-wPGkVkCc.js.map +0 -1
  729. package/dist/core/web/public/next/assets/VerseMobileApp-C86LA4dg.js +0 -3
  730. package/dist/core/web/public/next/assets/VerseMobileApp-C86LA4dg.js.map +0 -1
  731. package/dist/core/web/public/next/assets/VerseShared-CCeoBq-8.js +0 -2
  732. package/dist/core/web/public/next/assets/VerseShared-CCeoBq-8.js.map +0 -1
  733. package/dist/core/web/public/next/assets/VoiceHud-BSuRemsd.js +0 -2
  734. package/dist/core/web/public/next/assets/VoiceHud-BSuRemsd.js.map +0 -1
  735. package/dist/core/web/public/next/assets/VoiceInput-CSSoqpN8.js +0 -2
  736. package/dist/core/web/public/next/assets/VoiceInput-CSSoqpN8.js.map +0 -1
  737. package/dist/core/web/public/next/assets/WikiSection-BBWGCTA8.js +0 -2
  738. package/dist/core/web/public/next/assets/WikiSection-BBWGCTA8.js.map +0 -1
  739. package/dist/core/web/public/next/assets/WikiSection-BV3l3wGW.css +0 -1
  740. package/dist/core/web/public/next/assets/Workspace-BLAINcPl.js +0 -6
  741. package/dist/core/web/public/next/assets/Workspace-BLAINcPl.js.map +0 -1
  742. package/dist/core/web/public/next/assets/actions-DW8372S_.js +0 -2
  743. package/dist/core/web/public/next/assets/actions-DW8372S_.js.map +0 -1
  744. package/dist/core/web/public/next/assets/agent-tools-client-DOdeIAlB.js +0 -2
  745. package/dist/core/web/public/next/assets/agent-tools-client-DOdeIAlB.js.map +0 -1
  746. package/dist/core/web/public/next/assets/agents-focus-CPywc_la.js +0 -2
  747. package/dist/core/web/public/next/assets/agents-focus-CPywc_la.js.map +0 -1
  748. package/dist/core/web/public/next/assets/app-version-CAMoNgqJ.js +0 -2
  749. package/dist/core/web/public/next/assets/app-version-CAMoNgqJ.js.map +0 -1
  750. package/dist/core/web/public/next/assets/apps-model-ozrnE6z2.js +0 -2
  751. package/dist/core/web/public/next/assets/apps-model-ozrnE6z2.js.map +0 -1
  752. package/dist/core/web/public/next/assets/ask-seat-C24LQctL.js +0 -2
  753. package/dist/core/web/public/next/assets/ask-seat-C24LQctL.js.map +0 -1
  754. package/dist/core/web/public/next/assets/authority-model-C924ixlm.js +0 -2
  755. package/dist/core/web/public/next/assets/authority-model-C924ixlm.js.map +0 -1
  756. package/dist/core/web/public/next/assets/automations-focus-GzNObBH4.js +0 -2
  757. package/dist/core/web/public/next/assets/automations-focus-GzNObBH4.js.map +0 -1
  758. package/dist/core/web/public/next/assets/budget-queries-wnFwZf0d.js +0 -2
  759. package/dist/core/web/public/next/assets/budget-queries-wnFwZf0d.js.map +0 -1
  760. package/dist/core/web/public/next/assets/capacity-strip-model-DGqnhrIN.js +0 -2
  761. package/dist/core/web/public/next/assets/capacity-strip-model-DGqnhrIN.js.map +0 -1
  762. package/dist/core/web/public/next/assets/charts-DVzJTfES.js +0 -2
  763. package/dist/core/web/public/next/assets/charts-DVzJTfES.js.map +0 -1
  764. package/dist/core/web/public/next/assets/chat-pane-data-R55DITMC.js +0 -2
  765. package/dist/core/web/public/next/assets/chat-pane-data-R55DITMC.js.map +0 -1
  766. package/dist/core/web/public/next/assets/checkpoint-queries-CK9Sc-ew.js +0 -2
  767. package/dist/core/web/public/next/assets/checkpoint-queries-CK9Sc-ew.js.map +0 -1
  768. package/dist/core/web/public/next/assets/cloud-queries-C99COqh-.js +0 -2
  769. package/dist/core/web/public/next/assets/cloud-queries-C99COqh-.js.map +0 -1
  770. package/dist/core/web/public/next/assets/command-catalog-Crgyl-5F.js +0 -2
  771. package/dist/core/web/public/next/assets/command-catalog-Crgyl-5F.js.map +0 -1
  772. package/dist/core/web/public/next/assets/composer-queries-QT9sqpYt.js +0 -2
  773. package/dist/core/web/public/next/assets/composer-queries-QT9sqpYt.js.map +0 -1
  774. package/dist/core/web/public/next/assets/connectivity-Ow2TCpN2.js +0 -2
  775. package/dist/core/web/public/next/assets/connectivity-Ow2TCpN2.js.map +0 -1
  776. package/dist/core/web/public/next/assets/context-queries-CBHkEGWm.js +0 -2
  777. package/dist/core/web/public/next/assets/context-queries-CBHkEGWm.js.map +0 -1
  778. package/dist/core/web/public/next/assets/control-queries-DpgKLZZ7.js +0 -2
  779. package/dist/core/web/public/next/assets/control-queries-DpgKLZZ7.js.map +0 -1
  780. package/dist/core/web/public/next/assets/copy-setup-Pv9zazKp.js +0 -2
  781. package/dist/core/web/public/next/assets/copy-setup-Pv9zazKp.js.map +0 -1
  782. package/dist/core/web/public/next/assets/deep-link-RA_9gxr7.js +0 -2
  783. package/dist/core/web/public/next/assets/deep-link-RA_9gxr7.js.map +0 -1
  784. package/dist/core/web/public/next/assets/device-permissions-CFtizlNI.js +0 -2
  785. package/dist/core/web/public/next/assets/device-permissions-CFtizlNI.js.map +0 -1
  786. package/dist/core/web/public/next/assets/devin-queries-BdMbRO0X.js +0 -2
  787. package/dist/core/web/public/next/assets/devin-queries-BdMbRO0X.js.map +0 -1
  788. package/dist/core/web/public/next/assets/dock-icons-DAcSkY79.js +0 -2
  789. package/dist/core/web/public/next/assets/dock-icons-DAcSkY79.js.map +0 -1
  790. package/dist/core/web/public/next/assets/dock-panes-CypuAb32.js +0 -2
  791. package/dist/core/web/public/next/assets/dock-panes-CypuAb32.js.map +0 -1
  792. package/dist/core/web/public/next/assets/fleet-control-queries-CyY4rlLL.js +0 -2
  793. package/dist/core/web/public/next/assets/fleet-control-queries-CyY4rlLL.js.map +0 -1
  794. package/dist/core/web/public/next/assets/fleet-queries-DhvGhRVd.js +0 -2
  795. package/dist/core/web/public/next/assets/fleet-queries-DhvGhRVd.js.map +0 -1
  796. package/dist/core/web/public/next/assets/fleet-state-BXHCR9Z4.js +0 -3
  797. package/dist/core/web/public/next/assets/fleet-state-BXHCR9Z4.js.map +0 -1
  798. package/dist/core/web/public/next/assets/focus-trap-DGVye4KY.js +0 -2
  799. package/dist/core/web/public/next/assets/focus-trap-DGVye4KY.js.map +0 -1
  800. package/dist/core/web/public/next/assets/git-model-CRJidacH.js +0 -5
  801. package/dist/core/web/public/next/assets/git-model-CRJidacH.js.map +0 -1
  802. package/dist/core/web/public/next/assets/global-BCRR2nnJ.js +0 -3
  803. package/dist/core/web/public/next/assets/global-BCRR2nnJ.js.map +0 -1
  804. package/dist/core/web/public/next/assets/guarded-action-BRMXmbT_.js +0 -3
  805. package/dist/core/web/public/next/assets/guarded-action-BRMXmbT_.js.map +0 -1
  806. package/dist/core/web/public/next/assets/guarded-runners-SV5FL41J.js +0 -2
  807. package/dist/core/web/public/next/assets/guarded-runners-SV5FL41J.js.map +0 -1
  808. package/dist/core/web/public/next/assets/health-queries-ulCgM_N-.js +0 -2
  809. package/dist/core/web/public/next/assets/health-queries-ulCgM_N-.js.map +0 -1
  810. package/dist/core/web/public/next/assets/icons-pcszdls_.js +0 -2
  811. package/dist/core/web/public/next/assets/icons-pcszdls_.js.map +0 -1
  812. package/dist/core/web/public/next/assets/index-BUjFkE-k.js +0 -11
  813. package/dist/core/web/public/next/assets/index-BUjFkE-k.js.map +0 -1
  814. package/dist/core/web/public/next/assets/jev-queries-D95PmN18.js +0 -2
  815. package/dist/core/web/public/next/assets/jev-queries-D95PmN18.js.map +0 -1
  816. package/dist/core/web/public/next/assets/ladder-queries-DVdVMFWD.js +0 -2
  817. package/dist/core/web/public/next/assets/ladder-queries-DVdVMFWD.js.map +0 -1
  818. package/dist/core/web/public/next/assets/leader-focus-DphhDqye.js +0 -2
  819. package/dist/core/web/public/next/assets/leader-focus-DphhDqye.js.map +0 -1
  820. package/dist/core/web/public/next/assets/live-model--0BepHTm.js +0 -2
  821. package/dist/core/web/public/next/assets/live-model--0BepHTm.js.map +0 -1
  822. package/dist/core/web/public/next/assets/mobile-actions-IXVvyQlh.js +0 -2
  823. package/dist/core/web/public/next/assets/mobile-actions-IXVvyQlh.js.map +0 -1
  824. package/dist/core/web/public/next/assets/mobile-toast-CVOwWiN4.js +0 -2
  825. package/dist/core/web/public/next/assets/mobile-toast-CVOwWiN4.js.map +0 -1
  826. package/dist/core/web/public/next/assets/multimodel-flows-DOil0riK.js +0 -7
  827. package/dist/core/web/public/next/assets/multimodel-flows-DOil0riK.js.map +0 -1
  828. package/dist/core/web/public/next/assets/multimodel-queries-C1J-1wBB.js +0 -2
  829. package/dist/core/web/public/next/assets/multimodel-queries-C1J-1wBB.js.map +0 -1
  830. package/dist/core/web/public/next/assets/mutations-CrmfkCt7.js +0 -2
  831. package/dist/core/web/public/next/assets/mutations-CrmfkCt7.js.map +0 -1
  832. package/dist/core/web/public/next/assets/nav-DNtYaPGH.js +0 -2
  833. package/dist/core/web/public/next/assets/nav-DNtYaPGH.js.map +0 -1
  834. package/dist/core/web/public/next/assets/needs-you-actions-prN6find.js +0 -2
  835. package/dist/core/web/public/next/assets/needs-you-actions-prN6find.js.map +0 -1
  836. package/dist/core/web/public/next/assets/needs-you-model-BEf5boxE.js +0 -2
  837. package/dist/core/web/public/next/assets/needs-you-model-BEf5boxE.js.map +0 -1
  838. package/dist/core/web/public/next/assets/open-terminal-CjBhPrPf.js +0 -2
  839. package/dist/core/web/public/next/assets/open-terminal-CjBhPrPf.js.map +0 -1
  840. package/dist/core/web/public/next/assets/open-terminal-request-C8oTi9ly.js +0 -2
  841. package/dist/core/web/public/next/assets/open-terminal-request-C8oTi9ly.js.map +0 -1
  842. package/dist/core/web/public/next/assets/overnight-queries-NwxEwM2i.js +0 -2
  843. package/dist/core/web/public/next/assets/overnight-queries-NwxEwM2i.js.map +0 -1
  844. package/dist/core/web/public/next/assets/palette-handoff-CCG7uhBI.js +0 -2
  845. package/dist/core/web/public/next/assets/palette-handoff-CCG7uhBI.js.map +0 -1
  846. package/dist/core/web/public/next/assets/panes-DLEh22yn.js +0 -3
  847. package/dist/core/web/public/next/assets/panes-DLEh22yn.js.map +0 -1
  848. package/dist/core/web/public/next/assets/path-display-BmDNXLma.js +0 -2
  849. package/dist/core/web/public/next/assets/path-display-BmDNXLma.js.map +0 -1
  850. package/dist/core/web/public/next/assets/playbook-composer-7rJp3twC.js +0 -2
  851. package/dist/core/web/public/next/assets/playbook-composer-7rJp3twC.js.map +0 -1
  852. package/dist/core/web/public/next/assets/playbook-focus-B8E3WzHV.js +0 -2
  853. package/dist/core/web/public/next/assets/playbook-focus-B8E3WzHV.js.map +0 -1
  854. package/dist/core/web/public/next/assets/playbooks-queries-DQjEIQgH.js +0 -2
  855. package/dist/core/web/public/next/assets/playbooks-queries-DQjEIQgH.js.map +0 -1
  856. package/dist/core/web/public/next/assets/preloaded-BDy_vwqB.js +0 -2
  857. package/dist/core/web/public/next/assets/preloaded-BDy_vwqB.js.map +0 -1
  858. package/dist/core/web/public/next/assets/primitives-C8-XVQKs.js +0 -1
  859. package/dist/core/web/public/next/assets/pwa-1cEjML6y.js +0 -2
  860. package/dist/core/web/public/next/assets/pwa-1cEjML6y.js.map +0 -1
  861. package/dist/core/web/public/next/assets/queries-CHY928bU.js +0 -2
  862. package/dist/core/web/public/next/assets/queries-CHY928bU.js.map +0 -1
  863. package/dist/core/web/public/next/assets/reasoning-pref-ChmBKsuV.js +0 -2
  864. package/dist/core/web/public/next/assets/reasoning-pref-ChmBKsuV.js.map +0 -1
  865. package/dist/core/web/public/next/assets/remote-session-CSFrRCnT.js +0 -3
  866. package/dist/core/web/public/next/assets/remote-session-CSFrRCnT.js.map +0 -1
  867. package/dist/core/web/public/next/assets/resolved-store-Cw27MfQ4.js +0 -2
  868. package/dist/core/web/public/next/assets/resolved-store-Cw27MfQ4.js.map +0 -1
  869. package/dist/core/web/public/next/assets/resources-queries-DyW4RSn1.js +0 -2
  870. package/dist/core/web/public/next/assets/resources-queries-DyW4RSn1.js.map +0 -1
  871. package/dist/core/web/public/next/assets/reveal-anchor-CL5ms09_.js +0 -2
  872. package/dist/core/web/public/next/assets/reveal-anchor-CL5ms09_.js.map +0 -1
  873. package/dist/core/web/public/next/assets/sheet-Jmql93Ca.js +0 -2
  874. package/dist/core/web/public/next/assets/sheet-Jmql93Ca.js.map +0 -1
  875. package/dist/core/web/public/next/assets/slots-DEG36YxT.js +0 -3
  876. package/dist/core/web/public/next/assets/slots-DEG36YxT.js.map +0 -1
  877. package/dist/core/web/public/next/assets/sources-queries-CI0UlBGE.js +0 -4
  878. package/dist/core/web/public/next/assets/sources-queries-CI0UlBGE.js.map +0 -1
  879. package/dist/core/web/public/next/assets/sse-CEyzXNma.js +0 -2
  880. package/dist/core/web/public/next/assets/sse-CEyzXNma.js.map +0 -1
  881. package/dist/core/web/public/next/assets/stub-panes.module-aBfJsf41.js +0 -3
  882. package/dist/core/web/public/next/assets/stub-panes.module-aBfJsf41.js.map +0 -1
  883. package/dist/core/web/public/next/assets/surface-data-CLlkcEWM.js +0 -2
  884. package/dist/core/web/public/next/assets/surface-data-CLlkcEWM.js.map +0 -1
  885. package/dist/core/web/public/next/assets/surface-prefetch-DcKPZWEe.js +0 -2
  886. package/dist/core/web/public/next/assets/surface-prefetch-DcKPZWEe.js.map +0 -1
  887. package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js +0 -2
  888. package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js.map +0 -1
  889. package/dist/core/web/public/next/assets/terminal-client-CagF1uyM.js +0 -2
  890. package/dist/core/web/public/next/assets/terminal-client-CagF1uyM.js.map +0 -1
  891. package/dist/core/web/public/next/assets/terminal-icons-D5DaYLkC.js +0 -2
  892. package/dist/core/web/public/next/assets/terminal-icons-D5DaYLkC.js.map +0 -1
  893. package/dist/core/web/public/next/assets/terminal-view-Crd7CW9-.js +0 -6
  894. package/dist/core/web/public/next/assets/terminal-view-Crd7CW9-.js.map +0 -1
  895. package/dist/core/web/public/next/assets/thread-data-Bom_qVem.js +0 -2
  896. package/dist/core/web/public/next/assets/thread-data-Bom_qVem.js.map +0 -1
  897. package/dist/core/web/public/next/assets/tool-semantics-DtFU7rvB.js +0 -8
  898. package/dist/core/web/public/next/assets/tool-semantics-DtFU7rvB.js.map +0 -1
  899. package/dist/core/web/public/next/assets/turn-files-BW0SiN39.js +0 -2
  900. package/dist/core/web/public/next/assets/turn-files-BW0SiN39.js.map +0 -1
  901. package/dist/core/web/public/next/assets/ui-parts-CLEc9rZw.js +0 -2
  902. package/dist/core/web/public/next/assets/ui-parts-CLEc9rZw.js.map +0 -1
  903. package/dist/core/web/public/next/assets/usage-queries-BCactyVH.js +0 -2
  904. package/dist/core/web/public/next/assets/usage-queries-BCactyVH.js.map +0 -1
  905. package/dist/core/web/public/next/assets/use-chat-activity-CeNZP1eV.js +0 -2
  906. package/dist/core/web/public/next/assets/use-chat-activity-CeNZP1eV.js.map +0 -1
  907. package/dist/core/web/public/next/assets/use-guarded-action-CvddzFZw.js +0 -2
  908. package/dist/core/web/public/next/assets/use-guarded-action-CvddzFZw.js.map +0 -1
  909. package/dist/core/web/public/next/assets/use-ticker-Dn8tdiFx.js +0 -2
  910. package/dist/core/web/public/next/assets/use-ticker-Dn8tdiFx.js.map +0 -1
  911. package/dist/core/web/public/next/assets/use-token-gate-D0I1qsuh.js +0 -2
  912. package/dist/core/web/public/next/assets/use-token-gate-D0I1qsuh.js.map +0 -1
  913. package/dist/core/web/public/next/assets/useAutoSeat-X5wQjKpa.js +0 -2
  914. package/dist/core/web/public/next/assets/useAutoSeat-X5wQjKpa.js.map +0 -1
  915. package/dist/core/web/public/next/assets/useOnboarding-BKfkTSl4.js +0 -2
  916. package/dist/core/web/public/next/assets/useOnboarding-BKfkTSl4.js.map +0 -1
  917. package/dist/core/web/public/next/assets/useSeatHealth-Ttzd6QkW.js +0 -2
  918. package/dist/core/web/public/next/assets/useSeatHealth-Ttzd6QkW.js.map +0 -1
  919. package/dist/core/web/public/next/assets/useSeatsRefresh-B7TYzh9s.js +0 -2
  920. package/dist/core/web/public/next/assets/useSeatsRefresh-B7TYzh9s.js.map +0 -1
  921. package/dist/core/web/public/next/assets/useVerseSession-BBmZY9hu.js +0 -2
  922. package/dist/core/web/public/next/assets/useVerseSession-BBmZY9hu.js.map +0 -1
  923. package/dist/core/web/public/next/assets/useVerseTranscript-Bn_paarS.js +0 -2
  924. package/dist/core/web/public/next/assets/useVerseTranscript-Bn_paarS.js.map +0 -1
  925. package/dist/core/web/public/next/assets/verse-bootstrap-query-B-jTQ8nR.js +0 -2
  926. package/dist/core/web/public/next/assets/verse-bootstrap-query-B-jTQ8nR.js.map +0 -1
  927. package/dist/core/web/public/next/assets/verse-icons-B64ZcDtc.js +0 -2
  928. package/dist/core/web/public/next/assets/verse-icons-B64ZcDtc.js.map +0 -1
  929. package/dist/core/web/public/next/assets/warmup-CgTjYA0L.js +0 -3
  930. package/dist/core/web/public/next/assets/warmup-CgTjYA0L.js.map +0 -1
  931. package/dist/core/web/public/next/assets/wiki-focus-BZQpEuzJ.js +0 -2
  932. package/dist/core/web/public/next/assets/wiki-focus-BZQpEuzJ.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/panes/pane-registry.ts","../../../../../../src/web-ui/routes/verse/agents/checks.pane.tsx","../../../../../../src/web-ui/routes/verse/reasoning/reasoning.pane.tsx","../../../../../../src/web-ui/routes/verse/terminal/terminal.pane.tsx","../../../../../../src/web-ui/routes/verse/browser/register.ts","../../../../../../src/web-ui/routes/verse/changes/register.ts","../../../../../../src/web-ui/routes/verse/panes/builtin/SlotPanes.tsx","../../../../../../src/web-ui/routes/verse/panes/builtin-panes.tsx","../../../../../../src/web-ui/routes/verse/panes/register-adapter.ts","../../../../../../src/web-ui/routes/verse/panes/index.ts"],"sourcesContent":["/**\n * routes/verse/panes/pane-registry.ts — THE PANE REGISTRY: how anything\n * becomes a tab in the chat's panel area (the dock), without touching the\n * layout. See ./README.md for the guide; this file is the contract.\n *\n * registerPane({\n * id: 'reasoning',\n * title: 'Reasoning',\n * icon: ReasoningGlyph,\n * component: lazy(() => import('./ReasoningPane.js').then((m) => ({ default: m.ReasoningPane }))),\n * shortcut: 'mod+shift+y', // or `command:` for a catalog key\n * when: ({ session }) => session !== null,\n * });\n *\n * WHAT THE DOCK DOES WITH A PANE. It lists it in \"+ Add a pane\", the split\n * menu and (with `toggle`) the chat header; opens it on its key; renders its\n * component inside an error boundary and a Suspense boundary (so a lazy\n * component is its own chunk and a crash says so without taking the chat\n * down); keeps it MOUNTED while its tab is open (hidden, with\n * `visible: false`, when another tab is on top — stop timers then); and\n * remembers which panes each chat had open.\n *\n * REPLACING a pane. Registering an id that already exists REPLACES it (the\n * newest registration wins) and inherits what it did not say — its catalog\n * command, header toggle and order — so a unit swapping the stub Reasoning\n * pane for the real one writes only what changed. The returned function\n * unregisters that one registration, and the previous definition comes back.\n *\n * KEYS. A pane's chord is either a catalog command's (`command:`, for the\n * first-party panes — the palette and the shortcuts overlay list those) or\n * its own `shortcut:`. An own shortcut must use mod (Cmd/Ctrl) or ctrl, and is REFUSED\n * (with a console warning; the pane still registers, keyless) when it\n * collides with a catalog key live in the chat, a system chord, or another\n * pane's key. A pane can never steal a key.\n *\n * Framework-light: React only for types and the one subscription hook. This\n * module (and the panes it registers) load just after the chat's first\n * paint — never on it (VerseApp.first-paint.test.ts).\n */\nimport { createElement, lazy, useState, useSyncExternalStore, type ComponentType } from 'react';\nimport type { VerseEvent, VerseSession } from '../../../data/api-types.js';\nimport {\n COMMAND_KEYS,\n SCOPE_LAYERS,\n SYSTEM_RESERVED_CHORDS,\n chordId,\n chordMatches,\n detectKeyPlatform,\n formatChord,\n parseChord,\n type KeyChord,\n type KeyedCommandId,\n type KeyEventLike,\n type KeyPlatform,\n} from '../shell/command-keys.js';\nimport { PANE_ID_RE, type DockPresentation } from '../shell/dock-catalog.js';\nimport type { DiffPaneRequest, PreviewOpenRequest, TerminalOpenRequest, TurnFileChange } from '../shell/slots.js';\n\n// ===========================================================================\n// The contract\n// ===========================================================================\n\n/** The one-shot requests other parts of the chat aim at panes (\"Run in terminal\", a ± count, a dev server). */\nexport interface PaneRequests {\n terminal: TerminalOpenRequest | null;\n preview: PreviewOpenRequest | null;\n diff: (DiffPaneRequest & { nonce: number }) | null;\n}\n\n/** What a pane may ask of the workbench. Every call is safe at any time (a no-op when it cannot apply). */\nexport interface PaneHost {\n /** Put `text` in the composer, as its own paragraph (Terminal's \"Send selection to chat\"). */\n sendToChat(text: string): void;\n /** Draft `text` into the composer (\"Add to message\": `path:line: note`). */\n addToMessage(text: string): void;\n /** Open (and show) another pane by id. */\n openPane(id: string): void;\n /** Close this or another pane's tab. */\n closePane(id: string): void;\n /** Open the Terminal pane with a request (a tab at a root; a command PASTED, never run). */\n openTerminal(request: Omit<TerminalOpenRequest, 'nonce'>): void;\n /** The same, with Terminal as the lower half of a split under the pane on top. */\n openTerminalBelow(request: Omit<TerminalOpenRequest, 'nonce'>): void;\n /** Open the Changes pane at a root and scope (optionally one file). */\n openDiff(request: DiffPaneRequest): void;\n /** Switch the chat surface to another chat. */\n openSession(sessionId: string): void;\n}\n\n/**\n * The props every pane component receives. Stable: fields are only ever\n * ADDED. A pane that needs the live transcript subscribes itself\n * (`useVerseTranscript(sessionId)`), so a streamed token re-renders that\n * pane, not the dock.\n */\nexport interface PaneProps {\n /** This pane's id (one component may serve several registrations). */\n paneId: string;\n /** The open chat. Never null for a pane with `needsSession` (the default): the dock shows the empty state instead. */\n sessionId: string | null;\n session: VerseSession | null;\n /** The chat's folders, primary first. */\n roots: readonly string[];\n /** The chat's raw event log (what the transcript is built from). */\n events: readonly VerseEvent[];\n /** Files the chat's latest turn touched. */\n turnFiles: readonly TurnFileChange[];\n /** False while another tab is on top (or the panel is closed with the tab kept): stop timers, skip work. */\n visible: boolean;\n /** How the panel is drawn right now — a pane may choose a denser layout in `bottom`. */\n presentation: DockPresentation;\n requests: PaneRequests;\n host: PaneHost;\n}\n\n/** What `when` sees — enough to decide whether a pane applies to the chat that is open. */\nexport interface PaneContext {\n sessionId: string | null;\n session: VerseSession | null;\n roots: readonly string[];\n}\n\n/** A 16px line glyph (currentColor), like dock/dock-icons.tsx. */\nexport type PaneIcon = ComponentType<{ size?: number }>;\n\nexport interface PaneDefinition {\n /** Stable id: lower-case letters, numbers and dashes (`browser`, `test-runner`). Persisted in layouts. */\n id: string;\n /** Tab label and menu name: one or two words. */\n title: string;\n icon: PaneIcon;\n /** Usually `lazy(() => import(…))`, so the pane's code is its own chunk and loads on first open. */\n component: ComponentType<PaneProps>;\n /** Your own chord, as the key table writes it: 'mod+shift+y', 'ctrl+alt+p'. Refused on any collision. */\n shortcut?: string;\n /** First-party: the catalog command whose key opens this pane (its chord then comes from the catalog). */\n command?: KeyedCommandId;\n /** Whether the pane applies right now (e.g. only for a chat with a web seat). False hides its tab and menu entry. */\n when?: (context: PaneContext) => boolean;\n /** Needs an open chat (default true): without one the dock shows \"Open a chat to use …\" instead. */\n needsSession?: boolean;\n /** Menu / header order, ascending (first-party panes use 10…80; default 100). */\n order?: number;\n /** One sentence: what the pane is for. The empty state and the \"+\" menu teach with it. */\n description?: string;\n /** Show a toggle for it in the chat header (keep it to the few everyone uses). */\n toggle?: boolean;\n}\n\n/** A pane as the registry holds it: defaults applied, the chord resolved and vetted. */\nexport interface RegisteredPane {\n readonly id: string;\n readonly title: string;\n readonly icon: PaneIcon;\n readonly component: ComponentType<PaneProps>;\n readonly command: KeyedCommandId | null;\n /** The pane's OWN chord (not a catalog command's), after the collision check; null = none or refused. */\n readonly shortcut: KeyChord | null;\n readonly when: ((context: PaneContext) => boolean) | null;\n readonly needsSession: boolean;\n readonly order: number;\n readonly description: string | null;\n readonly toggle: boolean;\n}\n\n// ===========================================================================\n// Validation\n// ===========================================================================\n\n/** Every chord that is live while a pane's key would be (the composer layer: composer + chat + global). */\nfunction catalogChords(): Map<string, string> {\n const live = SCOPE_LAYERS.composer;\n const out = new Map<string, string>();\n for (const [id, spec] of Object.entries(COMMAND_KEYS)) {\n if (!live.includes(spec.scope)) continue;\n for (const chord of spec.keys) out.set(chordId(chord), id);\n }\n return out;\n}\n\nconst RESERVED = new Set(SYSTEM_RESERVED_CHORDS.map(chordId));\n\n/**\n * Why `text` cannot be pane `paneId`'s own shortcut, or null when it can.\n * Exported for tests and for units that want to check a chord up front.\n */\nexport function shortcutProblem(text: string, paneId: string, panes: Iterable<RegisteredPane> = listPanes()): string | null {\n let chord: KeyChord;\n try {\n chord = parseChord(text.trim().toLowerCase());\n } catch {\n return `\"${text}\" is not a chord`;\n }\n const modifiers = text.toLowerCase().split('+').slice(0, -1);\n if (!chord.key || modifiers.some((m) => !['mod', 'ctrl', 'shift', 'alt'].includes(m))) return `\"${text}\" is not a chord`;\n if (!chord.mod && !chord.ctrl) return `\"${text}\" needs mod or ctrl — a bare key would eat typing`;\n const id = chordId(chord);\n if (RESERVED.has(id)) return `\"${text}\" belongs to the system`;\n const owner = catalogChords().get(id);\n if (owner) return `\"${text}\" is already ${owner}`;\n for (const pane of panes) {\n if (pane.id === paneId) continue;\n if (pane.shortcut && chordId(pane.shortcut) === id) return `\"${text}\" is already the ${pane.title} pane's`;\n const command = pane.command ? COMMAND_KEYS[pane.command]?.keys[0] : undefined;\n if (command && chordId(command) === id) return `\"${text}\" is already the ${pane.title} pane's`;\n }\n return null;\n}\n\n/** Problems that make a definition unregistrable (an empty list = fine). */\nexport function definitionProblems(def: PaneDefinition): string[] {\n const problems: string[] = [];\n if (typeof def !== 'object' || def === null) return ['a pane definition must be an object'];\n if (typeof def.id !== 'string' || !PANE_ID_RE.test(def.id)) problems.push(`id \"${String(def.id)}\" must be lower-case letters, numbers and dashes`);\n if (typeof def.title !== 'string' || def.title.trim() === '') problems.push('title is required');\n const isComponent = (c: unknown) => typeof c === 'function' || (typeof c === 'object' && c !== null);\n if (!isComponent(def.component)) problems.push('component must be a React component (lazy() is fine)');\n if (!isComponent(def.icon)) problems.push('icon must be a React component');\n if (def.command !== undefined && !COMMAND_KEYS[def.command]) problems.push(`command \"${def.command}\" has no key in shell/command-keys.ts`);\n return problems;\n}\n\n// ===========================================================================\n// The registry\n// ===========================================================================\n\n/** Each id's registrations, oldest first; the LAST is the active one. */\n/** One registration. `builtin` ones sit UNDER every other registration of their id, whatever the load order. */\ninterface Layer {\n def: PaneDefinition;\n builtin: boolean;\n}\n\n/** Each id's registrations, bottom first; the effective pane folds them upward. */\nconst stacks = new Map<string, Layer[]>();\n/** Ids in first-registration order (the tie-break for equal `order`s). */\nconst firstSeen: string[] = [];\nlet effective = new Map<string, RegisteredPane>();\nlet snapshot: readonly RegisteredPane[] = [];\nconst listeners = new Set<() => void>();\nconst warned = new Set<string>();\n\nfunction warn(message: string): void {\n if (warned.has(message)) return;\n warned.add(message);\n if (typeof console !== 'undefined') console.warn(`[verse panes] ${message}`);\n}\n\nconst normalizeChordText = (text: string) => text.trim().toLowerCase();\n\n/**\n * Fold one id's layers: each registration inherits what it leaves unsaid\n * (command, toggle, order, needsSession, description) from the one below.\n * The own shortcut is vetted against the catalog and the panes resolved so\n * far — `resolved`, in first-registration order, so the older pane keeps a\n * contested key.\n */\nfunction fold(layers: readonly Layer[], resolved: Iterable<RegisteredPane>): RegisteredPane {\n let below = null as RegisteredPane | null;\n for (const { def } of layers) {\n const command: KeyedCommandId | null = def.command ?? below?.command ?? null;\n let shortcut: KeyChord | null = below?.shortcut ?? null;\n if (def.shortcut !== undefined) {\n const commandChord = command ? COMMAND_KEYS[command]?.keys[0] : undefined;\n if (commandChord && chordId(parseChord(normalizeChordText(def.shortcut))) === chordId(commandChord)) {\n shortcut = null; // the catalog already serves this key for this pane\n } else if (command) {\n warn(`pane \"${def.id}\": shortcut \"${def.shortcut}\" ignored — it opens with ${command}'s key`);\n shortcut = null;\n } else {\n const problem = shortcutProblem(def.shortcut, def.id, resolved);\n if (problem) warn(`pane \"${def.id}\": shortcut refused — ${problem}`);\n shortcut = problem ? null : parseChord(normalizeChordText(def.shortcut));\n }\n }\n below = Object.freeze({\n id: def.id,\n title: def.title.trim(),\n icon: def.icon,\n component: def.component,\n command,\n shortcut,\n when: def.when ?? null,\n needsSession: def.needsSession ?? below?.needsSession ?? true,\n order: def.order ?? below?.order ?? 100,\n description: def.description ?? below?.description ?? null,\n toggle: def.toggle ?? below?.toggle ?? false,\n });\n }\n return below!;\n}\n\nfunction publish(): void {\n const next = new Map<string, RegisteredPane>();\n for (const id of firstSeen) {\n const layers = stacks.get(id);\n if (layers && layers.length > 0) next.set(id, fold(layers, next.values()));\n }\n effective = next;\n // Order, then first registration: a stable menu no matter which module loaded first.\n snapshot = Object.freeze([...next.values()].sort((a, b) => a.order - b.order || firstSeen.indexOf(a.id) - firstSeen.indexOf(b.id)));\n for (const listener of [...listeners]) listener();\n}\n\nfunction addLayer(def: PaneDefinition, builtin: boolean): () => void {\n const problems = definitionProblems(def);\n if (problems.length > 0) {\n warn(`pane \"${String((def as Partial<PaneDefinition> | null)?.id)}\" not registered: ${problems.join('; ')}`);\n return () => undefined;\n }\n const layer: Layer = { def, builtin };\n const stack = stacks.get(def.id) ?? [];\n if (builtin) {\n // Under every non-builtin registration: a unit's replacement wins even if its module evaluated first.\n const firstOther = stack.findIndex((l) => !l.builtin);\n stack.splice(firstOther === -1 ? stack.length : firstOther, 0, layer);\n } else {\n stack.push(layer);\n }\n stacks.set(def.id, stack);\n if (!firstSeen.includes(def.id)) firstSeen.push(def.id);\n publish();\n return () => {\n const current = stacks.get(def.id);\n const index = current?.indexOf(layer) ?? -1;\n if (!current || index === -1) return;\n current.splice(index, 1);\n if (current.length === 0) stacks.delete(def.id);\n publish();\n };\n}\n\n/**\n * Add a pane — or replace the one with the same id. Returns a function that\n * removes THIS registration (the previous one, if any, comes back).\n *\n * Never throws: a malformed definition is reported on the console and\n * ignored, so one unit's mistake cannot take the other panes down.\n */\nexport function registerPane(def: PaneDefinition): () => void {\n return addLayer(def, false);\n}\n\n/**\n * The workbench's own panes (builtin-panes.tsx). Always UNDER any other\n * registration of the same id, so a unit's `registerPane` replaces the\n * first-party stub no matter which module evaluated first.\n */\nexport function registerBuiltinPane(def: PaneDefinition): () => void {\n return addLayer(def, true);\n}\n\n/** Every registered pane, in menu order (applicability NOT checked — see panesFor). */\nexport function listPanes(): readonly RegisteredPane[] {\n return snapshot;\n}\n\n/** The effective registration for `id`, or null. */\nexport function getPane(id: string): RegisteredPane | null {\n return effective.get(id) ?? null;\n}\n\n/** Does `pane` apply in `context`? A `when` that throws counts as no (and says so once). */\nexport function paneApplies(pane: RegisteredPane, context: PaneContext): boolean {\n if (!pane.when) return true;\n try {\n return pane.when(context) === true;\n } catch (err) {\n warn(`pane \"${pane.id}\": when() threw — ${(err as Error)?.message ?? String(err)}`);\n return false;\n }\n}\n\n/** The panes that apply in `context`, in menu order. */\nexport function panesFor(context: PaneContext): RegisteredPane[] {\n return snapshot.filter((pane) => paneApplies(pane, context));\n}\n\n/** Is `id` registered, and does it apply in `context`? */\nexport function isPaneAvailable(id: string, context: PaneContext): boolean {\n const pane = getPane(id);\n return pane !== null && paneApplies(pane, context);\n}\n\n/** The chord that opens `pane` — its catalog command's, else its own — or null. */\nexport function paneChord(pane: RegisteredPane): KeyChord | null {\n if (pane.command) return COMMAND_KEYS[pane.command]?.keys[0] ?? null;\n return pane.shortcut;\n}\n\n/** `paneChord`, printed for this platform (\"⇧⌘Y\" / \"Ctrl+Shift+Y\"). */\nexport function paneChordLabel(pane: RegisteredPane, platform: KeyPlatform = detectKeyPlatform()): string | null {\n const chord = paneChord(pane);\n return chord ? formatChord(chord, platform) : null;\n}\n\n/**\n * The pane whose OWN shortcut `event` presses, or null. Catalog-command\n * chords are not matched here — the catalog's key handling runs those.\n */\nexport function matchPaneShortcut(event: KeyEventLike, platform: KeyPlatform = detectKeyPlatform()): RegisteredPane | null {\n for (const pane of snapshot) {\n if (pane.shortcut && chordMatches(event, pane.shortcut, platform)) return pane;\n }\n return null;\n}\n\nexport function subscribePanes(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/** Every registered pane, re-rendering when one is added, replaced or removed. */\nexport function usePanes(): readonly RegisteredPane[] {\n return useSyncExternalStore(subscribePanes, listPanes, listPanes);\n}\n\n// ===========================================================================\n// lazyPane — a pane component that is its own chunk, without the flash\n// ===========================================================================\n\n/** A pane component whose code loads on first use; `preload()` fetches it ahead of time. */\nexport type LazyPaneComponent = ComponentType<PaneProps> & { preload: () => Promise<unknown> };\n\n/**\n * Like `React.lazy`, for panes — and preferred to it:\n * - once the chunk is in, a NEW mount renders the pane in the same frame\n * (React.lazy suspends every fresh wrapper once, which flashes the\n * skeleton when a second tab of an already-loaded chunk opens);\n * - the dock calls `preload()` when it opens, so a tab's first click\n * usually finds its code already here;\n * - a failed download is not cached: \"Try again\" really tries again.\n *\n * component: lazyPane(() => import('./ReasoningPane.js').then((m) => m.ReasoningPane))\n */\nexport function lazyPane(load: () => Promise<ComponentType<PaneProps>>): LazyPaneComponent {\n let loaded: ComponentType<PaneProps> | null = null;\n let pending: Promise<ComponentType<PaneProps>> | null = null;\n const preload = (): Promise<ComponentType<PaneProps>> => {\n pending ??= load().then((c) => (loaded = c), (err: unknown) => { pending = null; throw err; });\n return pending;\n };\n function LazyPane(props: PaneProps) {\n // Chosen once per mount: swapping the component type later would remount the pane and drop its state.\n const [Ready] = useState<ComponentType<PaneProps> | null>(() => loaded);\n const [Deferred] = useState(() => lazy(() => preload().then((c) => ({ default: c }))));\n return createElement(Ready ?? Deferred, props);\n }\n return Object.assign(LazyPane, { preload });\n}\n\n/** Fetch the code of every registered pane that can be preloaded (the dock calls this when it opens). */\nexport function preloadPanes(panes: readonly RegisteredPane[] = snapshot): void {\n for (const pane of panes) {\n const preload = (pane.component as Partial<LazyPaneComponent>).preload;\n if (typeof preload === 'function') void preload().catch(() => undefined);\n }\n}\n\n/** `preloadPanes` for just these ids (the chat surface warms the tabs a chat is likely to open). */\nexport function preloadPaneIds(ids: readonly string[]): void {\n preloadPanes(ids.map((id) => getPane(id)).filter((p): p is RegisteredPane => p !== null));\n}\n\n/** Test seam: forget every registration (builtin-panes' `registerBuiltinPanes()` puts the first-party ones back). */\nexport function resetPaneRegistry(): void {\n stacks.clear();\n firstSeen.length = 0;\n warned.clear();\n publish();\n}\n","/**\n * routes/verse/agents/checks.pane.tsx — the chat dock's \"Checks\" pane: the\n * open chat's git status, PR, CI, review comments, Auto-fix CI and\n * Auto-merge (3.16 agents). Only the registration lives here — panes/index.ts\n * imports every `*.pane.tsx` eagerly after first paint — and the body is its\n * own lazy chunk (ChecksPanel.tsx).\n */\nimport type { PaneProps } from '../panes/pane-registry.js';\nimport { lazyPane, registerPane } from '../panes/pane-registry.js';\n\nfunction ChecksGlyph({ size = 16 }: { size?: number }) {\n return (\n <svg viewBox=\"0 0 16 16\" width={size} height={size} fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M3 4.5 4.5 6 7 3.5M3 10.5 4.5 12 7 9.5M9 5h4.5M9 11h4.5\" />\n </svg>\n );\n}\n\nregisterPane({\n id: 'checks',\n title: 'Checks',\n icon: ChecksGlyph,\n order: 55,\n description: 'Git status, the PR, each CI check and review comments — with Auto-fix CI and Auto-merge for an agent.',\n component: lazyPane(() =>\n import('./ChecksPanel.js').then((m) => function ChecksPane(props: PaneProps) {\n return <m.ChecksDockPane sessionId={props.sessionId} visible={props.visible} host={props.host} />;\n }),\n ),\n});\n","/**\n * routes/verse/reasoning/reasoning.pane.tsx — the Sources and Reasoning\n * panes, registered with the workbench pane registry (panes/README.md).\n *\n * Same ids as the first-party stubs, so these REPLACE them and inherit their\n * keys (⇧⌘S Sources, ⇧⌘Y Reasoning), order and catalog commands. Only the\n * registration lives here — panes/index.ts imports every `*.pane.tsx` eagerly\n * after first paint — and each body is its own lazy chunk.\n */\nimport { ReasoningGlyph, SourcesGlyph } from '../dock/dock-icons.js';\nimport { lazyPane, registerPane } from '../panes/pane-registry.js';\n\nregisterPane({\n id: 'sources',\n title: 'Sources',\n icon: SourcesGlyph,\n description: 'Every file, page, search and doc this chat drew on — numbered, with the turns that cited each.',\n component: lazyPane(() => import('./dock-panes.js').then((m) => m.SourcesDockPane)),\n});\n\nregisterPane({\n id: 'reasoning',\n title: 'Reasoning',\n icon: ReasoningGlyph,\n description: \"The model's reasoning, turn by turn, with what each turn did.\",\n component: lazyPane(() => import('./dock-panes.js').then((m) => m.ReasoningDockPane)),\n});\n","/**\n * terminal/terminal.pane.tsx — the 3.15 Terminal's registration in the pane\n * registry (panes/README.md). panes/index.ts discovers every `*.pane.tsx`\n * under routes/verse and imports it (after first paint).\n *\n * Id `terminal` REPLACES the first-party stub and inherits what this leaves\n * unsaid: the ⌃` key (dock.terminal), the header toggle, the first place in\n * the panel, `needsSession` (without a chat the dock says \"Open a chat to use\n * Terminal\") and the stub's description. ⌃⇧` (a new tab) and every\n * `requests.terminal` — Run in terminal, Apps [Launch ▸], a dev-server Start —\n * reach the panel as before.\n *\n * TINY ON PURPOSE: a registration and a lazy import. The panel — xterm, its\n * addons, the block view — is its own chunk, loaded when the pane first shows\n * (terminal-lazy.test.ts).\n *\n * 3.15: it also serves ⌘K \"Generate command…\" and \"Search terminal history…\"\n * (catalog ids terminal.generate / terminal.history) — here rather than in\n * ChatSection, so the chat's first paint carries none of it. Both go to Chat\n * and ask the panel for its prompt; the panel does the rest (nothing runs).\n */\nimport { requestTerminal } from '../dock/dock-store.js';\nimport { TerminalGlyph } from '../dock/dock-icons.js';\nimport { lazyPane, registerPane } from '../panes/pane-registry.js';\nimport { registerCommandHandler } from '../shell/command-bus.js';\nimport { getVerseUiState, setVerseSection } from '../verse-ui-store.js';\n\nexport const TERMINAL_PANE_ID = 'terminal';\n\nregisterPane({\n id: TERMINAL_PANE_ID,\n title: 'Terminal',\n icon: TerminalGlyph,\n component: lazyPane(() => import('./TerminalPane.js').then((m) => m.TerminalRegistryPane)),\n});\n\nfunction openTerminalPrompt(request: { assist: true } | { history: true }): void {\n if (getVerseUiState().section !== 'chat') setVerseSection('chat');\n requestTerminal(request);\n}\nregisterCommandHandler('terminal.generate', () => openTerminalPrompt({ assist: true }));\nregisterCommandHandler('terminal.history', () => openTerminalPrompt({ history: true }));\n","/**\n * routes/verse/browser/register.ts — the Browser pane's registration for the\n * workbench pane registry (routes/verse/panes/**, landing separately).\n *\n * This file is deliberately tiny and import-free apart from a LAZY import:\n * the registry can list the pane (id, label, command, where it docks) on\n * first paint without pulling the pane's code — BrowserPanel and everything\n * behind it (Button, icons, the token dialog) load only when it is opened\n * (VerseApp.first-paint.test.ts keeps those out of the first-paint graph).\n *\n * Until the registry lands, a host mounts it with:\n * const Browser = lazy(BROWSER_PANE.load);\n * <Suspense fallback={null}><Browser sessionId={id} visible={shown} /></Suspense>\n */\nimport type { ComponentType } from 'react';\nimport type { BrowserPanelProps } from './BrowserPanel.js';\n\nexport interface VersePaneRegistration<P> {\n /** Stable id (layout persistence, commands). */\n id: string;\n label: string;\n /** Command palette id that opens the pane. */\n commandId: string;\n /** Palette search words. */\n keywords: readonly string[];\n /** Where the pane prefers to dock when first opened. */\n defaultSlot: 'dock' | 'side' | 'main';\n /** Needs a chat to be useful (it still browses without one). */\n chatScoped: boolean;\n load: () => Promise<{ default: ComponentType<P> }>;\n}\n\nexport type { BrowserPanelProps };\n\nexport const BROWSER_PANE: VersePaneRegistration<BrowserPanelProps> = {\n id: 'browser',\n label: 'Browser',\n commandId: 'pane.browser',\n keywords: ['browser', 'web', 'preview', 'localhost', 'devtools', 'console', 'screenshot'],\n defaultSlot: 'dock',\n chatScoped: true,\n load: () => import('./BrowserPanel.js').then((m) => ({ default: m.BrowserPanel })),\n};\n","/**\n * routes/verse/changes/register.ts — the Changes pane's registration for the\n * workbench pane registry (routes/verse/panes/README.md, \"a self-describing\n * register.ts\"). panes/index.ts discovers this file; register-adapter.ts maps\n * the id `changes` onto the first-party `diff` pane and REPLACES it, keeping\n * its key (⇧⌘D), order, icon and header toggle.\n *\n * Import-free apart from a LAZY import, so listing the pane costs nothing on\n * first paint: ChangesPaneHost and everything behind it (the checkpoint\n * client, the diff grid, the git dialogs) is its own chunk, loaded when the\n * pane opens.\n */\nimport type { ComponentType } from 'react';\nimport type { PaneProps } from '../panes/pane-registry.js';\n\nexport const CHANGES_PANE: {\n id: string;\n label: string;\n commandId: string;\n keywords: readonly string[];\n defaultSlot: 'dock';\n chatScoped: boolean;\n description: string;\n load: () => Promise<{ default: ComponentType<PaneProps> }>;\n} = {\n id: 'changes',\n label: 'Changes',\n commandId: 'dock.diff',\n keywords: ['changes', 'diff', 'review', 'checkpoint', 'undo', 'rewind', 'revert', 'git'],\n defaultSlot: 'dock',\n chatScoped: true,\n description: 'What each turn changed, reviewed hunk by hunk, with Undo turn — plus the uncommitted and branch diff.',\n load: () => import('./ChangesPaneHost.js').then((m) => ({ default: m.ChangesPaneHost })),\n};\n","/**\n * routes/verse/panes/builtin/SlotPanes.tsx — the first-party Terminal,\n * Browser and Changes panes: thin adapters from PaneProps to the C0 slot\n * each renders through (shell/slots.tsx), so xterm, the page preview and the\n * diff viewer stay in their owners' lazy chunks.\n *\n * A unit replacing one of these (the Terminal, Browser or Harness agent)\n * registers its own component under the same id — see ../README.md — and\n * this adapter simply stops being used.\n */\nimport type { PaneProps } from '../pane-registry.js';\nimport { DiffPaneSlot, PreviewPaneSlot, TerminalPaneSlot } from '../../shell/slots.js';\n\nexport function TerminalPaneBody({ sessionId, roots, requests, host, visible }: PaneProps) {\n return <TerminalPaneSlot sessionId={sessionId ?? ''} roots={roots} request={requests.terminal} onSendToChat={host.sendToChat} visible={visible} />;\n}\n\nexport function BrowserPaneBody({ sessionId, roots, requests, host, visible }: PaneProps) {\n // Dev-server Start: Terminal opens BELOW the browser, so the page appears\n // on top when its port answers (SPEC-310C acceptance step 3).\n return <PreviewPaneSlot sessionId={sessionId ?? ''} roots={roots} request={requests.preview} visible={visible} onOpenTerminal={host.openTerminalBelow} />;\n}\n\nexport function ChangesPaneBody({ sessionId, roots, requests, turnFiles, host, visible }: PaneProps) {\n return <DiffPaneSlot sessionId={sessionId ?? ''} roots={roots} request={requests.diff} turnFiles={turnFiles} onAddToMessage={host.addToMessage} visible={visible} />;\n}\n","/**\n * routes/verse/panes/builtin-panes.tsx — the workbench's first-party panes,\n * registered UNDER any unit's registration of the same id (so a unit's\n * `registerPane({ id: 'reasoning', … })` replaces the stub whatever the\n * module order). Metadata comes from shell/dock-catalog.ts DOCK_PANES;\n * bodies are lazy, so each loads the first time its tab opens.\n *\n * id title key body\n * terminal Terminal ⌃` C4's TerminalPane through its slot\n * browser Browser ⇧⌘B C4's PreviewPane through its slot\n * diff Changes ⇧⌘D C5's DiffPane through its slot\n * files Files ⇧⌘O stub: folders + files read / changed\n * sources Sources ⇧⌘S stub: pages, searches, files read\n * reasoning Reasoning ⇧⌘Y stub: the chat's thinking, by turn\n * tasks Tasks — this turn's calls + other running chats\n * context Context — usage, roots, memory, handoff\n */\nimport type { ComponentType } from 'react';\nimport {\n ContextGlyph,\n FilesGlyph,\n PreviewGlyph,\n ReasoningGlyph,\n ReviewGlyph,\n SourcesGlyph,\n TasksGlyph,\n TerminalGlyph,\n} from '../dock/dock-icons.js';\nimport { DOCK_PANES, type BuiltinPaneId } from '../shell/dock-catalog.js';\nimport { isSlotAvailable } from '../shell/slots.js';\nimport { BrowserPaneBody, ChangesPaneBody, TerminalPaneBody } from './builtin/SlotPanes.js';\nimport { lazyPane, registerBuiltinPane, type PaneDefinition, type PaneIcon, type PaneProps } from './pane-registry.js';\n\ntype Body = ComponentType<PaneProps>;\n\nconst TasksBody = lazyPane(() => import('./builtin/ChatPanes.js').then((m) => m.TasksPaneBody));\nconst ContextBody = lazyPane(() => import('./builtin/ChatPanes.js').then((m) => m.ContextPaneBody));\nconst FilesBody = lazyPane(() => import('./builtin/FilesPane.js').then((m) => m.FilesPane));\nconst SourcesBody = lazyPane(() => import('./builtin/SourcesPane.js').then((m) => m.SourcesPane));\nconst ReasoningBody = lazyPane(() => import('./builtin/ReasoningPane.js').then((m) => m.ReasoningPane));\n\ninterface BuiltinExtras {\n icon: PaneIcon;\n component: Body;\n description: string;\n order: number;\n toggle?: boolean;\n needsSession?: boolean;\n when?: PaneDefinition['when'];\n}\n\n/** A slot pane exists once its owner's file is in the build (shell/slots.tsx). */\nconst slotLanded = (slot: Parameters<typeof isSlotAvailable>[0]) => () => isSlotAvailable(slot);\n\nconst EXTRAS: Readonly<Record<BuiltinPaneId, BuiltinExtras>> = {\n terminal: {\n icon: TerminalGlyph, component: TerminalPaneBody, order: 10, toggle: true, when: slotLanded('terminal-pane'),\n description: \"A shell in this chat's folders. Commands the chat suggests paste here — you press Enter.\",\n },\n browser: {\n icon: PreviewGlyph, component: BrowserPaneBody, order: 20, toggle: true, when: slotLanded('preview-pane'),\n description: 'Your dev server or a page the chat made, live beside the conversation.',\n },\n diff: {\n icon: ReviewGlyph, component: ChangesPaneBody, order: 30, toggle: true, when: slotLanded('diff-pane'),\n description: 'What changed — this turn, uncommitted, or the whole branch — with notes you can send back.',\n },\n files: {\n icon: FilesGlyph, component: FilesBody, order: 40,\n description: \"The chat's folders, and every file it has read or changed.\",\n },\n sources: {\n icon: SourcesGlyph, component: SourcesBody, order: 50,\n description: 'The pages, searches and files an answer rests on.',\n },\n reasoning: {\n icon: ReasoningGlyph, component: ReasoningBody, order: 60,\n description: \"The model's thinking, turn by turn, beside the answer.\",\n },\n tasks: {\n icon: TasksGlyph, component: TasksBody, order: 70, needsSession: false,\n description: \"This turn's tool calls, and every other chat that is running.\",\n },\n context: {\n icon: ContextGlyph, component: ContextBody, order: 80, needsSession: false,\n description: \"How full this chat's context is, its folders, memory and handoff.\",\n },\n};\n\nlet disposers: Array<() => void> = [];\n\n/** Register (or re-register, after a registry reset) every first-party pane. Idempotent. */\nexport function registerBuiltinPanes(): void {\n for (const dispose of disposers) dispose();\n disposers = DOCK_PANES.map((meta) => {\n const extra = EXTRAS[meta.id];\n return registerBuiltinPane({\n id: meta.id,\n title: meta.label,\n ...(meta.commandId ? { command: meta.commandId } : {}),\n ...extra,\n });\n });\n}\n\nregisterBuiltinPanes();\n","/**\n * routes/verse/panes/register-adapter.ts — panes that describe themselves\n * in a unit's `register.ts` (the shape the Browser, Terminal, Reasoning +\n * Sources and Changes units ship while the registry was landing):\n *\n * export const BROWSER_PANE = {\n * id: 'browser', label: 'Browser', commandId: 'pane.browser',\n * keywords: […], defaultSlot: 'dock', chatScoped: true,\n * load: () => import('./BrowserPanel.js').then((m) => ({ default: m.BrowserPanel })),\n * };\n *\n * panes/index.ts discovers every `routes/verse/<unit>/register.ts` and hands\n * its exports here. Each export of that shape becomes a registered pane —\n * REPLACING the first-party one with the same id (so it keeps that pane's\n * key, order and header toggle) — and anything else in the file is ignored.\n *\n * The unit's component gets the full PaneProps. Components written against\n * the smaller `{ sessionId, visible }` contract simply ignore the rest; they\n * are handed `sessionId: null` when no chat is open (these panes accept it),\n * so `needsSession` is false for them.\n */\nimport type { ComponentType } from 'react';\nimport { PanelRightGlyph } from '../dock/dock-icons.js';\nimport { PANE_ID_RE } from '../shell/dock-catalog.js';\nimport { getPane, lazyPane, registerPane, type PaneIcon, type PaneProps } from './pane-registry.js';\n\n/** The self-description a unit's `register.ts` exports. */\nexport interface UnitPaneRegistration {\n id: string;\n label: string;\n commandId?: string;\n keywords?: readonly string[];\n defaultSlot?: 'dock' | 'side' | 'main';\n chatScoped?: boolean;\n /** Optional: a 16px glyph; the first-party pane's icon (or a generic panel glyph) otherwise. */\n icon?: PaneIcon;\n /** Optional: its own chord ('mod+alt+t'); vetted like any pane shortcut. */\n shortcut?: string;\n description?: string;\n load: () => Promise<{ default: ComponentType<never> }>;\n}\n\n/** Ids a unit may use for a first-party pane under another name. */\nconst ID_ALIASES: Readonly<Record<string, string>> = { changes: 'diff', review: 'diff', preview: 'browser' };\n\nexport function isUnitPaneRegistration(value: unknown): value is UnitPaneRegistration {\n if (value === null || typeof value !== 'object') return false;\n const v = value as Record<string, unknown>;\n return typeof v['id'] === 'string' && PANE_ID_RE.test(v['id']) && typeof v['label'] === 'string' && v['label'].trim() !== ''\n && typeof v['load'] === 'function';\n}\n\n/**\n * Register every pane the given modules describe. Returns the ids registered\n * (for tests) — duplicates across modules: the later module wins, like any\n * replacement.\n */\nexport function registerUnitPanes(modules: Record<string, unknown>): string[] {\n const ids: string[] = [];\n for (const path of Object.keys(modules).sort()) {\n const mod = modules[path];\n if (mod === null || typeof mod !== 'object') continue;\n for (const value of Object.values(mod as Record<string, unknown>)) {\n if (!isUnitPaneRegistration(value)) continue;\n const id = ID_ALIASES[value.id] ?? value.id;\n const existing = getPane(id);\n const load = value.load;\n registerPane({\n id,\n title: value.label.trim(),\n icon: value.icon ?? existing?.icon ?? PanelRightGlyph,\n component: lazyPane(() => load().then((m) => m.default as unknown as ComponentType<PaneProps>)),\n needsSession: false,\n ...(value.shortcut ? { shortcut: value.shortcut } : {}),\n ...(value.description ? { description: value.description } : {}),\n });\n ids.push(id);\n }\n }\n return ids;\n}\n","/**\n * routes/verse/panes/index.ts — the pane system's entry: the registry API,\n * the first-party panes, and every other unit's panes, DISCOVERED.\n *\n * DISCOVERY. Any file named `*.pane.ts` / `*.pane.tsx` under routes/verse/\n * is imported here (eagerly — it only registers; its component stays a\n * `lazy()` import of its own chunk). So a unit adds a pane by adding ONE\n * file in its own directory, e.g. routes/verse/reasoning/reasoning.pane.tsx:\n *\n * import { lazyPane, registerPane } from '../panes/pane-registry.js';\n * registerPane({ id: 'reasoning', title: 'Reasoning', icon: ReasoningGlyph,\n * component: lazyPane(() => import('./ReasoningPane.js').then((m) => m.ReasoningPane)) });\n *\n * Load order does not matter: first-party panes always sit under a unit's\n * registration of the same id (pane-registry.ts registerBuiltinPane).\n *\n * The chat loads this module just after first paint (preloaded), never on\n * it — keep `*.pane.tsx` files to a registration and a lazy import.\n */\nimport './builtin-panes.js';\nimport { registerUnitPanes } from './register-adapter.js';\n\n/**\n * Every `*.pane.ts(x)` under routes/verse — keyed by path, evaluated for\n * their registrations. Exported so the registry test can check discovery.\n */\nexport const DISCOVERED_PANE_MODULES: Record<string, unknown> = import.meta.glob(['../**/*.pane.ts', '../**/*.pane.tsx'], { eager: true });\n\n/**\n * Every unit's `register.ts` (routes/verse/<unit>/register.ts) — the\n * self-describing form (`export const BROWSER_PANE = { id, label, load, … }`)\n * units shipped while the registry was landing. Each such export becomes a\n * registered pane (register-adapter.ts); a unit whose file has not landed is\n * simply an absent key. Registered AFTER the first-party panes (this body\n * runs once every import above has evaluated), so they replace the stubs.\n */\nexport const UNIT_PANE_MODULES: Record<string, unknown> = import.meta.glob('../*/register.ts', { eager: true });\nexport const UNIT_PANE_IDS: readonly string[] = registerUnitPanes(UNIT_PANE_MODULES);\n\nexport * from './pane-registry.js';\nexport { isUnitPaneRegistration, registerUnitPanes, type UnitPaneRegistration } from './register-adapter.js';\nexport { registerBuiltinPanes } from './builtin-panes.js';\n"],"file":"panes-AG63rhpM.js"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-BMfejJ9u.js";import{o as n}from"./tool-semantics-xF0Fw2Ck.js";var r=e(t(),1),i=[],a=(0,r.createContext)(i);function o(e){return e}function s(e){return e.replace(/\\/g,`/`).replace(/\/+$/,``).replace(/^\/private(?=\/(?:tmp|var|etc)(?:\/|$))/,``).replace(/^[A-Z](?=:)/,e=>e.toLowerCase())}function c(e,t=i){let n=s(e),r=``;for(let e of t){let t=s(e);t.length>r.length&&!/^(?:[a-z]:)?$/.test(t)&&(n===t||n.startsWith(`${t}/`))&&(r=t)}let a=e.replace(/[\\/]+$/,``);if(r){let e=n.length-r.length-1;return e>0?a.slice(a.length-e):a.slice(Math.max(a.lastIndexOf(`/`),a.lastIndexOf(`\\`))+1)}if(!/^(?:[\\/]|[A-Za-z]:[\\/])/.test(e))return e.replace(/^\.[\\/]/,``);let o=e.includes(`/`)?`/`:`\\`,c=e.replace(/^[A-Za-z]:/,``).split(/[\\/]/).filter(Boolean);return c.length>4?`…${o}${c.slice(-3).join(o)}`:e}function l(e){let t=typeof e==`object`&&e?e:null;return t&&typeof t.command!=`string`&&typeof t.cmd!=`string`?n(t)[0]??null:null}function u(){let e=(0,r.useContext)(a);return(0,r.useCallback)(t=>c(t,e),[e])}export{u as a,l as i,o as n,c as r,a as t};
2
+ //# sourceMappingURL=path-display-Dv94FG1y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-display-Dv94FG1y.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/path-display.ts"],"sourcesContent":["/**\n * routes/verse/chat/path-display.ts — how a file path READS in the chat.\n *\n * Tool payloads carry whatever path the CLI used, and that is usually\n * absolute: `/private/tmp/…/scratchpad/e2e-proj-39/math.ts` for a file the\n * operator knows as `math.ts`. Shown raw, the one part that identifies the\n * file is what the row's ellipsis clips. So every path the transcript draws\n * goes through `displayPath`:\n *\n * 1. relative to the chat's roots (the longest root that contains it wins —\n * a worktree nested in its repo is its own root). Paths and roots are\n * compared as `keyOf`s, so `\\` vs `/`, a trailing separator, macOS's\n * `/private/tmp` for `/tmp` and `c:` for `C:` all still match; the rest\n * is sliced out of the ORIGINAL path, in the CLI's own separators;\n * 2. otherwise as the hub sent it when it is relative or `~/…`;\n * 3. otherwise, when it is long, its last three segments behind `…/`.\n *\n * HOME. The hub rewrites the operator's OWN home to `~` on every payload\n * (sanitizePublicJson) and is the only side that knows which home that is —\n * so a `~/…` path or root already says it, and matches as-is. Nothing here\n * guesses a home from `/Users/<x>`, `/home/<x>` or `C:\\Users\\<x>`: one that\n * reaches the browser is another account's or /Users/Shared, and drawing it\n * as `~` (or as in-project, via a `~` root) passes it off as the operator's.\n *\n * Display only. The full path stays in the tooltip and is never rewritten in\n * anything handed back to a tool, a search or a jump anchor. (It is in the\n * chat's first-paint chunk, hence the terse body.)\n */\nimport { createContext, useCallback, useContext } from 'react';\nimport { pathsIn } from './tool-semantics.js';\n\nconst NO_ROOTS: readonly string[] = [];\n\n/** The chat's roots, primary first (Workspace provides them; Transcript can override). */\nexport const PathRootsContext = createContext<readonly string[]>(NO_ROOTS);\n\n/**\n * A path as the operator's home reads: unchanged. The hub already spelled\n * that home `~`; any other `/Users/<x>` is someone else's (see HOME above).\n * Kept as the one seam home display goes through (SessionRoots uses it).\n */\nexport function abbreviateHome(path: string): string {\n return path;\n}\n\n/**\n * One folder's comparable form: `/` separators, no trailing one, the\n * `/private` alias folded (/tmp, /var and /etc are symlinks into it and roots\n * are not realpath'd), a lower-case drive letter. Only the fold changes the\n * length, and only at the head — so a matched tail maps back onto the original.\n */\nfunction keyOf(path: string): string {\n return path.replace(/\\\\/g, '/').replace(/\\/+$/, '')\n .replace(/^\\/private(?=\\/(?:tmp|var|etc)(?:\\/|$))/, '')\n .replace(/^[A-Z](?=:)/, (d) => d.toLowerCase());\n}\n\n/** What the transcript draws for `path`; the full path belongs in the tooltip. */\nexport function displayPath(path: string, roots: readonly string[] = NO_ROOTS): string {\n const key = keyOf(path);\n let root = '';\n for (const raw of roots) {\n const r = keyOf(raw);\n // A bare `/`, `C:` or `\\\\` root would claim every path on the machine.\n if (r.length > root.length && !/^(?:[a-z]:)?$/.test(r) && (key === r || key.startsWith(`${r}/`))) root = r;\n }\n const own = path.replace(/[\\\\/]+$/, '');\n // Inside a root: the rest of the path, or — for the root itself — its name.\n if (root) {\n const rest = key.length - root.length - 1;\n return rest > 0 ? own.slice(own.length - rest) : own.slice(Math.max(own.lastIndexOf('/'), own.lastIndexOf('\\\\')) + 1);\n }\n if (!/^(?:[\\\\/]|[A-Za-z]:[\\\\/])/.test(path)) return path.replace(/^\\.[\\\\/]/, '');\n const sep = path.includes('/') ? '/' : '\\\\';\n const parts = path.replace(/^[A-Za-z]:/, '').split(/[\\\\/]/).filter(Boolean);\n return parts.length > 4 ? `…${sep}${parts.slice(-3).join(sep)}` : path;\n}\n\n/**\n * The file a tool call names, when it runs no command — a shell call keeps\n * its command line verbatim (rewriting a command is not display).\n */\nexport function inputPath(input: unknown): string | null {\n const rec = input !== null && typeof input === 'object' ? input as Record<string, unknown> : null;\n return rec && typeof rec.command !== 'string' && typeof rec.cmd !== 'string' ? pathsIn(rec)[0] ?? null : null;\n}\n\n/** `displayPath` bound to the roots in context. */\nexport function useDisplayPath(): (path: string) => string {\n const roots = useContext(PathRootsContext);\n return useCallback((path: string) => displayPath(path, roots), [roots]);\n}\n"],"mappings":"2JA+BM,EAA8B,CAAC,EAGxB,GAAA,EAAmB,EAAA,cAAA,CAAiC,CAAQ,EAOzE,SAAgB,EAAe,EAAsB,CACnD,OAAO,CACT,CAQA,SAAS,EAAM,EAAsB,CACnC,OAAO,EAAK,QAAQ,MAAO,GAAG,CAAC,CAAC,QAAQ,OAAQ,EAAE,CAAC,CAChD,QAAQ,0CAA2C,EAAE,CAAC,CACtD,QAAQ,cAAgB,GAAM,EAAE,YAAY,CAAC,CAClD,CAGA,SAAgB,EAAY,EAAc,EAA2B,EAAkB,CACrF,IAAM,EAAM,EAAM,CAAI,EAClB,EAAO,GACX,IAAK,IAAM,KAAO,EAAO,CACvB,IAAM,EAAI,EAAM,CAAG,EAEf,EAAE,OAAS,EAAK,QAAU,CAAC,gBAAgB,KAAK,CAAC,IAAM,IAAQ,GAAK,EAAI,WAAW,GAAG,EAAE,EAAE,KAAI,EAAO,EAC3G,CACA,IAAM,EAAM,EAAK,QAAQ,UAAW,EAAE,EAEtC,GAAI,EAAM,CACR,IAAM,EAAO,EAAI,OAAS,EAAK,OAAS,EACxC,OAAO,EAAO,EAAI,EAAI,MAAM,EAAI,OAAS,CAAI,EAAI,EAAI,MAAM,KAAK,IAAI,EAAI,YAAY,GAAG,EAAG,EAAI,YAAY,IAAI,CAAC,EAAI,CAAC,CACtH,CACA,GAAI,CAAC,4BAA4B,KAAK,CAAI,EAAG,OAAO,EAAK,QAAQ,WAAY,EAAE,EAC/E,IAAM,EAAM,EAAK,SAAS,GAAG,EAAI,IAAM,KACjC,EAAQ,EAAK,QAAQ,aAAc,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,OAAO,OAAO,EAC1E,OAAO,EAAM,OAAS,EAAI,IAAI,IAAM,EAAM,MAAM,EAAE,CAAC,CAAC,KAAK,CAAG,IAAM,CACpE,CAMA,SAAgB,EAAU,EAA+B,CACvD,IAAM,EAAwB,OAAO,GAAU,UAAnC,EAA8C,EAAmC,KAC7F,OAAO,GAAO,OAAO,EAAI,SAAY,UAAY,OAAO,EAAI,KAAQ,SAAW,EAAQ,CAAG,CAAC,CAAC,IAAM,KAAO,IAC3G,CAGA,SAAgB,GAA2C,CACzD,IAAM,GAAA,EAAQ,EAAA,WAAA,CAAW,CAAgB,EACzC,OAAA,EAAO,EAAA,YAAA,CAAa,GAAiB,EAAY,EAAM,CAAK,EAAG,CAAC,CAAK,CAAC,CACxE"}
@@ -0,0 +1,2 @@
1
+ import{I as e}from"./VerseConsoleApp-CyRa9lh1.js";import{n as t}from"./composer-draft-DB025_AW.js";var n=/(^|\s)![a-z0-9][a-z0-9-]{1,47}(?:@v?\d{1,6})?(?=\s|$)/g;function r(e,t){let r=e.replace(n,(e,t)=>t).replace(/^\s+/,``);return r?`${t} ${r}`:`${t} `}function i(e,t){let n=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,`value`)?.set;n?n.call(e,t):e.value=t,e.dispatchEvent(new Event(`input`,{bubbles:!0})),e.focus();let r=e.value.length;try{e.setSelectionRange(r,r)}catch{}}function a(e,n){let a=t(n);return!a||a.disabled?!1:(i(a,r(a.value,e)),!0)}async function o(t,n={}){e(`chat`);let r=Date.now()+(n.waitMs??3e3);for(;;){if(a(t,n.root))return!0;if(Date.now()>=r)return!1;await new Promise(e=>setTimeout(e,60))}}export{a as n,o as t};
2
+ //# sourceMappingURL=playbook-composer-BxEtjsIW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-composer-BxEtjsIW.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/playbooks/playbook-composer.ts"],"sourcesContent":["/**\n * routes/verse/playbooks/playbook-composer.ts — put a playbook's `!macro`\n * into the chat composer (never send it).\n *\n * A playbook reaches a task through its text: `!fix-bug` in the message is\n * resolved by whichever lane runs it (the chat itself on any seat, Run in\n * cloud, Run in Devin, a fleet goal). So \"Use playbook…\" and \"Run…\" only\n * WRITE the macro at the front of the draft — the operator still describes\n * the task and picks the lane.\n *\n * Like cloud/composer-draft.ts, this goes through the box itself (native\n * setter + `input` event), which React's controlled textarea treats as the\n * operator's own edit, so draft persistence sees it too.\n */\nimport { findComposerBox } from '../cloud/composer-draft.js';\nimport { setVerseSection } from '../verse-ui-store.js';\n\n/** `!name` tokens anywhere in prose (the server's rule, simplified: whitespace or start before `!`). */\nconst MACRO_TOKEN = /(^|\\s)![a-z0-9][a-z0-9-]{1,47}(?:@v?\\d{1,6})?(?=\\s|$)/g;\n\n/**\n * The draft with `macro` at its front. A draft that already names a\n * playbook has that one replaced (one playbook per task); an empty draft\n * becomes `!macro ` ready for the task text. Pure.\n */\nexport function withMacro(draft: string, macro: string): string {\n const stripped = draft.replace(MACRO_TOKEN, (_m, lead: string) => lead).replace(/^\\s+/, '');\n return stripped ? `${macro} ${stripped}` : `${macro} `;\n}\n\nfunction write(box: HTMLTextAreaElement, value: string): void {\n const setter = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value')?.set;\n if (setter) setter.call(box, value);\n else box.value = value;\n box.dispatchEvent(new Event('input', { bubbles: true }));\n box.focus();\n const end = box.value.length;\n try {\n box.setSelectionRange(end, end);\n } catch {\n /* a hidden box has no selection; the text is in either way */\n }\n}\n\n/** Write the macro into the composer on screen. False when there is no usable box. */\nexport function putMacroInComposerNow(macro: string, root?: ParentNode): boolean {\n const box = findComposerBox(root);\n if (!box || box.disabled) return false;\n write(box, withMacro(box.value, macro));\n return true;\n}\n\n/**\n * Go to Chat and write the macro once its composer is mounted (the Chat\n * section may be a chunk that is still loading). False when no chat composer\n * appeared in time — the caller says so (open a chat first).\n */\nexport async function putMacroInComposer(macro: string, opts: { waitMs?: number; root?: ParentNode } = {}): Promise<boolean> {\n setVerseSection('chat');\n const deadline = Date.now() + (opts.waitMs ?? 3_000);\n for (;;) {\n if (putMacroInComposerNow(macro, opts.root)) return true;\n if (Date.now() >= deadline) return false;\n await new Promise((resolve) => setTimeout(resolve, 60));\n }\n}\n"],"mappings":"mGAkBA,IAAM,EAAc,yDAOpB,SAAgB,EAAU,EAAe,EAAuB,CAC9D,IAAM,EAAW,EAAM,QAAQ,GAAc,EAAI,IAAiB,CAAI,CAAC,CAAC,QAAQ,OAAQ,EAAE,EAC1F,OAAO,EAAW,GAAG,EAAM,GAAG,IAAa,GAAG,EAAM,EACtD,CAEA,SAAS,EAAM,EAA0B,EAAqB,CAC5D,IAAM,EAAS,OAAO,yBAAyB,oBAAoB,UAAW,OAAO,CAAC,EAAE,IACpF,EAAQ,EAAO,KAAK,EAAK,CAAK,EAC7B,EAAI,MAAQ,EACjB,EAAI,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAK,CAAC,CAAC,EACvD,EAAI,MAAM,EACV,IAAM,EAAM,EAAI,MAAM,OACtB,GAAI,CACF,EAAI,kBAAkB,EAAK,CAAG,CAChC,MAAQ,CAER,CACF,CAGA,SAAgB,EAAsB,EAAe,EAA4B,CAC/E,IAAM,EAAM,EAAgB,CAAI,EAGhC,MAFI,CAAC,GAAO,EAAI,SAAiB,IACjC,EAAM,EAAK,EAAU,EAAI,MAAO,CAAK,CAAC,EAC/B,GACT,CAOA,eAAsB,EAAmB,EAAe,EAA+C,CAAC,EAAqB,CAC3H,EAAgB,MAAM,EACtB,IAAM,EAAW,KAAK,IAAI,GAAK,EAAK,QAAU,KAC9C,OAAS,CACP,GAAI,EAAsB,EAAO,EAAK,IAAI,EAAG,MAAO,GACpD,GAAI,KAAK,IAAI,GAAK,EAAU,MAAO,GACnC,MAAM,IAAI,QAAS,GAAY,WAAW,EAAS,EAAE,CAAC,CACxD,CACF"}
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./rolldown-runtime-hePW80VL.js";import{I as t}from"./VerseConsoleApp-CyRa9lh1.js";var n=e({REQUEST_TTL_MS:()=>r,getPlaybookFocus:()=>l,isPlaybookFocusLive:()=>u,requestPlaybookFocus:()=>c,subscribePlaybookFocus:()=>f,takePlaybookFocus:()=>d}),r=2e4,i=null,a=0,o=new Set;function s(){for(let e of[...o])e()}function c(e){a+=1,i={...e,seq:a,at:Date.now()},t(`playbooks`),s()}function l(){return i}function u(e,t=Date.now()){return t-e.at<=r}function d(e){i?.seq===e&&(i=null,s())}function f(e){return o.add(e),()=>o.delete(e)}export{d as a,f as i,u as n,n as r,l as t};
2
+ //# sourceMappingURL=playbook-focus-BB1SYpsW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-focus-BB1SYpsW.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/playbooks/playbook-focus.ts"],"sourcesContent":["/**\n * routes/verse/playbooks/playbook-focus.ts — ⌘K \"Run playbook…\" → the lazily\n * mounted Playbooks section, in \"choose one to run\" mode (the same shape as\n * wiki/wiki-focus.ts). A request waits (up to REQUEST_TTL_MS) until the\n * section mounts and takes it. Tiny and framework-free.\n */\nimport { setVerseSection } from '../verse-ui-store.js';\n\n/**\n * `run`: ⌘K \"Run playbook…\" — pick any playbook to run.\n * `workflows`: ⌘K \"Run command workflow…\" when no terminal panel served it —\n * the list narrows to command workflows (kind: command).\n */\nexport type PlaybookFocusTarget = { kind: 'run' } | { kind: 'workflows' };\nexport type PlaybookFocusRequest = PlaybookFocusTarget & { seq: number; at: number };\n\nexport const REQUEST_TTL_MS = 20_000;\n\nlet current: PlaybookFocusRequest | null = null;\nlet seq = 0;\nconst listeners = new Set<() => void>();\n\nfunction emit(): void {\n for (const l of [...listeners]) l();\n}\n\nexport function requestPlaybookFocus(target: PlaybookFocusTarget): void {\n seq += 1;\n current = { ...target, seq, at: Date.now() };\n setVerseSection('playbooks');\n emit();\n}\n\nexport function getPlaybookFocus(): PlaybookFocusRequest | null {\n return current;\n}\n\nexport function isPlaybookFocusLive(request: PlaybookFocusRequest, now: number = Date.now()): boolean {\n return now - request.at <= REQUEST_TTL_MS;\n}\n\n/** Clear request `requestSeq` (only that one — a newer ask survives). */\nexport function takePlaybookFocus(requestSeq: number): void {\n if (current?.seq !== requestSeq) return;\n current = null;\n emit();\n}\n\nexport function subscribePlaybookFocus(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/** Test hygiene. */\nexport function resetPlaybookFocus(): void {\n current = null;\n emit();\n}\n"],"mappings":"sQAgBa,EAAiB,IAE1B,EAAuC,KACvC,EAAM,EACJ,EAAY,IAAI,IAEtB,SAAS,GAAa,CACpB,IAAK,IAAM,IAAK,CAAC,GAAG,CAAS,EAAG,EAAE,CACpC,CAEA,SAAgB,EAAqB,EAAmC,CACtE,GAAO,EACP,EAAU,CAAE,GAAG,EAAQ,MAAK,GAAI,KAAK,IAAI,CAAE,EAC3C,EAAgB,WAAW,EAC3B,EAAK,CACP,CAEA,SAAgB,GAAgD,CAC9D,OAAO,CACT,CAEA,SAAgB,EAAoB,EAA+B,EAAc,KAAK,IAAI,EAAY,CACpG,OAAO,EAAM,EAAQ,IAAM,CAC7B,CAGA,SAAgB,EAAkB,EAA0B,CACtD,GAAS,MAAQ,IACrB,EAAU,KACV,EAAK,EACP,CAEA,SAAgB,EAAuB,EAAkC,CAEvE,OADA,EAAU,IAAI,CAAQ,MACT,EAAU,OAAO,CAAQ,CACxC"}
@@ -0,0 +1,2 @@
1
+ import{C as e,M as t,V as n,a as r,i,t as a}from"./global-7hs7NyAO.js";import{r as o}from"./VerseShared-8n7hxr-e.js";var s=`/api/verse/playbooks`,c=[`Outcome`,`Procedure`,`Specifications`,`Advice`,`Forbidden actions`,`Required from user`],l=[`Outcome`,`Procedure`],u=[`agent`,`command`],d=`Command`,f=/^[a-z0-9][a-z0-9-]{1,47}$/,p=/^![a-z0-9][a-z0-9-]{1,47}$/,m=12288;function h(e){return e?.kind===`command`?`command`:`agent`}var g=`verse-playbooks`,_=(e,t)=>`verse-playbook:${e}:${t??`latest`}`;function v(e){if(!e||typeof e!=`object`)return null;let t=e.playbooks;return Array.isArray(t)?t:null}var y={key:g,fetch:async e=>{try{let t=v(await i(s,e));return t?{value:t,available:!0,reason:null}:{value:null,available:!0,reason:`Unrecognized response — update Ashlr.`}}catch(e){if(e instanceof a&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{value:null,available:!1,reason:e instanceof a&&e.status===404?`Playbooks are not in this build yet.`:`Playbooks could not be read.`}}}};function b(e,t){let n=t===null?``:`?version=${t}`;return{key:_(e,t),fetch:t=>i(`${s}/${encodeURIComponent(e)}${n}`,t)}}async function x(i){let a=e();if(!a)throw new o;let c=await r(s,i,a);return t(),c.ok&&(n(g),n(_(c.playbook.meta.id,null))),c}export{f as a,m as c,h as d,d as i,c as l,y as n,u as o,x as r,p as s,b as t,l as u};
2
+ //# sourceMappingURL=playbooks-queries-DtWLQrwZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbooks-queries-DtWLQrwZ.js","names":[],"sources":["../../../../../../src/core/playbooks/types.ts","../../../../../../src/web-ui/routes/verse/playbooks/playbooks-queries.ts"],"sourcesContent":["/**\n * Versioned playbooks — the vocabulary (3.15).\n *\n * A PLAYBOOK is a reusable, versioned task template every lane can run under:\n * fleet goals, the cloud lane, the Devin lane, the Leader's work.dispatch and\n * the interactive \"Run in cloud / Run in Devin\". Modelled on Devin playbooks:\n * a markdown body with fixed sections (Outcome, Procedure, Specifications,\n * Advice, Forbidden actions, Required from user) under a small front-matter\n * (id, name, `!macro`, where it applies, done-when checks, default budget).\n *\n * Versions are IMMUTABLE: an edit writes v<N+1>; v<N> is never rewritten, so\n * a task that ran under `fix-issue@v3` can always be traced to the exact text\n * it was given, and retros attribute outcomes per version.\n *\n * Guidance only: a playbook changes what the brief SAYS, never a route, gate,\n * budget cap or authority. A task with no playbook gets a byte-identical prompt.\n *\n * BROWSER-SAFE: the Playbooks view imports this — type-only imports, plain consts.\n */\nimport type { TaskKind } from '../learn/retro/types.js';\nimport type { CommandParam } from './command-template.js';\n\nexport type { TaskKind, CommandParam };\n\nexport const VERSE_PLAYBOOKS_PATH = '/api/verse/playbooks';\n\n/** The body sections, in render order. Headings are `## <name>` (case-insensitive). */\nexport const PLAYBOOK_SECTIONS = [\n 'Outcome',\n 'Procedure',\n 'Specifications',\n 'Advice',\n 'Forbidden actions',\n 'Required from user',\n] as const;\nexport type PlaybookSectionName = (typeof PLAYBOOK_SECTIONS)[number];\n\n/** A playbook without these is rejected: an engine needs a goal and a way there. */\nexport const REQUIRED_PLAYBOOK_SECTIONS: readonly PlaybookSectionName[] = ['Outcome', 'Procedure'];\n\n/**\n * What a playbook is (the `kind` front-matter key):\n * agent guidance an engine follows — every playbook before this key\n * existed, and the default when it is absent.\n * command a COMMAND WORKFLOW: a shell command template with\n * `{{param:default}}` holes (command-template.ts). The operator\n * fills a form and the command is pasted at a terminal prompt —\n * never run, never sent to an engine. No lane resolves one: not\n * by `!macro`, not explicitly, not by auto-match (resolve.ts).\n */\nexport const PLAYBOOK_KINDS = ['agent', 'command'] as const;\nexport type PlaybookKind = (typeof PLAYBOOK_KINDS)[number];\n\n/** A command workflow's body: the `## Command` code block and its holes. */\nexport interface PlaybookCommandSpec {\n /** The command template, exactly as in the code block (no trailing newline). */\n template: string;\n /** Distinct `{{name[:default]}}` holes, in first-appearance order. */\n params: CommandParam[];\n}\n\n/** The one section of a `kind: command` playbook (its code block is the template). */\nexport const COMMAND_SECTION = 'Command';\n\n/** Ids are path segments: lowercase, digits, dashes; 2–48 chars. */\nexport const PLAYBOOK_ID_PATTERN = /^[a-z0-9][a-z0-9-]{1,47}$/;\n/** Macros are `!` + an id-shaped name. */\nexport const PLAYBOOK_MACRO_PATTERN = /^![a-z0-9][a-z0-9-]{1,47}$/;\n\n/** A playbook's markdown source never exceeds this (UTF-8 bytes). */\nexport const PLAYBOOK_MAX_BYTES = 12 * 1024;\n/** The rendered block injected into a prompt never exceeds this (Devin's AGENTS.md cap). */\nexport const PLAYBOOK_INJECT_CAP_BYTES = 16 * 1024;\n\nexport interface PlaybookBudget {\n /** Default spend ceiling for one run, in USD; null = the lane's own default. */\n usd: number | null;\n /** Default wall-clock ceiling for one run, in minutes; null = the lane's own default. */\n minutes: number | null;\n}\n\n/** Front-matter. */\nexport interface PlaybookMeta {\n id: string;\n name: string;\n /** `!fix-bug`. Defaults to `!<id>`. */\n macro: string;\n /** One line for lists and the ⌘K palette. */\n description: string;\n /** Where it applies. Empty lists mean \"any\". */\n appliesTo: {\n /** GitHub `owner/name`, case-insensitive. */\n repos: string[];\n /** Repo-relative globs (`src/**`, `*.md`). */\n globs: string[];\n };\n /** Task kinds it is written for; [] = any. */\n taskKinds: TaskKind[];\n /** Checks the engine must see pass before it calls the task done. */\n doneWhen: string[];\n budget: PlaybookBudget;\n /**\n * Auto-match: attach this playbook to tasks that did not name one when the\n * task's kind (and repo / globs) match. Off by default — a playbook reaches\n * a task only when asked for, until Mason turns this on.\n */\n auto: boolean;\n /**\n * `agent` or `command` (see PLAYBOOK_KINDS). The parser always sets it;\n * absent (a record from an older build, a hand-built meta) means `agent`.\n */\n kind?: PlaybookKind;\n /** kind `command` only: the template and its holes. */\n command?: PlaybookCommandSpec;\n}\n\n/** A playbook's kind; absent ⇒ `agent` (every playbook written before 3.15's command workflows). Pure. */\nexport function playbookKindOf(meta: { kind?: PlaybookKind } | null | undefined): PlaybookKind {\n return meta?.kind === 'command' ? 'command' : 'agent';\n}\n\nexport type PlaybookSections = Partial<Record<PlaybookSectionName, string>>;\n\n/** A parsed, validated playbook version. */\nexport interface PlaybookV1 {\n v: 1;\n meta: PlaybookMeta;\n sections: PlaybookSections;\n version: number;\n /** First 12 hex of sha256(source) — pins the exact text a task ran under. */\n sha: string;\n /** The canonical markdown stored on disk. */\n source: string;\n createdAt: string;\n /** Shipped with ashlr and never edited on this machine (v1 lives in code). */\n builtin: boolean;\n}\n\n/** What a task / proposal / retro records: the exact playbook version it ran under. */\nexport interface PlaybookRef {\n id: string;\n version: number;\n sha: string;\n}\n\n/** How a playbook reached a task. */\nexport type PlaybookMatch = 'explicit' | 'macro' | 'auto';\n\nexport interface PlaybookVersionInfo {\n version: number;\n sha: string;\n createdAt: string;\n /** Optional change note written with the edit. */\n note: string | null;\n /** Who wrote this version (`mason`, `leader`, `cli`, `ashlr` for a built-in); null = not recorded. */\n author: string | null;\n}\n\n/** One row of the playbook list. */\nexport interface PlaybookSummary {\n id: string;\n name: string;\n macro: string;\n description: string;\n taskKinds: TaskKind[];\n auto: boolean;\n latest: number;\n builtin: boolean;\n updatedAt: string;\n /** `agent` | `command`; absent (an older server) ⇒ `agent`. */\n kind?: PlaybookKind;\n /** kind `command` only: the template and its holes, so a picker fills without a second read. */\n command?: PlaybookCommandSpec;\n}\n\n/** Outcomes per version, counted from retros that carry this playbook. */\nexport interface PlaybookOutcomeCounts {\n merged: number;\n /** gate-refused, owner-laned, closed, vetoed. */\n refused: number;\n reverted: number;\n /** verify-failed, failed, expired. */\n failed: number;\n total: number;\n}\n\nexport interface PlaybookValidationIssue {\n field: string;\n message: string;\n}\n\nexport type PlaybookParseResult =\n | { ok: true; meta: PlaybookMeta; sections: PlaybookSections; warnings: PlaybookValidationIssue[] }\n | { ok: false; errors: PlaybookValidationIssue[] };\n\n// ---------------------------------------------------------------------------\n// Verse contract\n// ---------------------------------------------------------------------------\n\n/** GET /api/verse/playbooks */\nexport interface PlaybooksListResponse {\n v: 1;\n playbooks: PlaybookSummary[];\n}\n\n/** GET /api/verse/playbooks/<id>[?version=N] */\nexport interface PlaybookDetailResponse {\n v: 1;\n playbook: PlaybookV1;\n /**\n * Rendered as an engine sees it. A command workflow never reaches an\n * engine: for one this is its command block and parameters, for reading.\n */\n rendered: string;\n versions: (PlaybookVersionInfo & { outcomes: PlaybookOutcomeCounts })[];\n}\n\n/** POST /api/verse/playbooks — create (id must be new) or edit (id exists ⇒ v<N+1>). */\nexport interface PlaybookSaveRequest {\n source: string;\n /** Edit guard: the version the editor started from; a newer latest refuses the save. */\n baseVersion?: number;\n note?: string;\n}\n\nexport type PlaybookSaveResponse =\n | { ok: true; playbook: PlaybookV1 }\n | { ok: false; errors: PlaybookValidationIssue[] };\n\nexport function formatPlaybookRef(ref: Pick<PlaybookRef, 'id' | 'version'>): string {\n return `${ref.id}@v${ref.version}`;\n}\n\n/** Parse `id@vN` / `id@N` / `id`. null when malformed. Pure. */\nexport function parsePlaybookRefText(text: string): { id: string; version: number | null } | null {\n const m = /^([a-z0-9][a-z0-9-]{1,47})(?:@v?(\\d{1,6}))?$/.exec(text.trim().replace(/^!/, ''));\n if (!m) return null;\n return { id: m[1]!, version: m[2] ? Number(m[2]) : null };\n}\n\n/** Is this a well-formed PlaybookRef? (Records are read back from disk.) */\nexport function isPlaybookRef(value: unknown): value is PlaybookRef {\n if (!value || typeof value !== 'object') return false;\n const r = value as Record<string, unknown>;\n return typeof r['id'] === 'string' && PLAYBOOK_ID_PATTERN.test(r['id'])\n && typeof r['version'] === 'number' && Number.isInteger(r['version']) && r['version'] >= 1\n && typeof r['sha'] === 'string' && /^[0-9a-f]{12}$/.test(r['sha']);\n}\n","/**\n * routes/verse/playbooks/playbooks-queries.ts — the reads and the one write\n * behind the Playbooks section (core/verse/playbooks-api.ts).\n *\n * GET /api/verse/playbooks → PlaybooksListResponse\n * GET /api/verse/playbooks/<id>[?version=N] → PlaybookDetailResponse\n * POST /api/verse/playbooks → PlaybookSaveResponse (a NEW version)\n *\n * The list read is optional (an older server has no route: the composer's\n * `!` menu and the ⋯ sheet then say so instead of failing). Writes pull the\n * held mutation token, touch the hold, and invalidate what they change.\n */\nimport {\n VERSE_PLAYBOOKS_PATH,\n type PlaybookDetailResponse,\n type PlaybookSaveRequest,\n type PlaybookSaveResponse,\n type PlaybooksListResponse,\n type PlaybookSummary,\n} from '../../../../core/playbooks/types.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\n\nexport const PLAYBOOKS_KEY = 'verse-playbooks';\nconst detailKeyOf = (id: string, version: number | null) => `verse-playbook:${id}:${version ?? 'latest'}`;\n\n/** The list, or why there is none. `value: null` ⇒ `reason` says why. */\nexport interface PlaybooksRead {\n value: PlaybookSummary[] | null;\n available: boolean;\n reason: string | null;\n}\n\nfunction narrowList(raw: unknown): PlaybookSummary[] | null {\n if (!raw || typeof raw !== 'object') return null;\n const rows = (raw as { playbooks?: unknown }).playbooks;\n return Array.isArray(rows) ? (rows as PlaybookSummary[]) : null;\n}\n\n/**\n * The list as an optional read: a 404 (no route in this build) or an\n * unreachable server resolves with a reason instead of throwing. Kept free\n * of the command surface's helpers: the composer's `!` menu imports this,\n * and the composer is on the chat's first paint.\n */\nexport const playbooksQuery: QueryDef<PlaybooksRead> = {\n key: PLAYBOOKS_KEY,\n fetch: async (signal) => {\n try {\n const value = narrowList(await apiGet<unknown>(VERSE_PLAYBOOKS_PATH, signal));\n return value ? { value, available: true, reason: null } : { value: null, available: true, reason: 'Unrecognized response — update Ashlr.' };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n const missing = err instanceof ApiError && err.status === 404;\n return { value: null, available: false, reason: missing ? 'Playbooks are not in this build yet.' : 'Playbooks could not be read.' };\n }\n },\n};\n\nexport function playbookDetailQuery(id: string, version: number | null): QueryDef<PlaybookDetailResponse> {\n const suffix = version === null ? '' : `?version=${version}`;\n return {\n key: detailKeyOf(id, version),\n fetch: (signal) => apiGet<PlaybookDetailResponse>(`${VERSE_PLAYBOOKS_PATH}/${encodeURIComponent(id)}${suffix}`, signal),\n };\n}\n\n/** Save = create (new id) or a new version (existing id). Never rewrites a version. */\nexport async function savePlaybookSource(request: PlaybookSaveRequest): Promise<PlaybookSaveResponse> {\n const token = getMutationToken();\n if (!token) throw new VerseMutationLockedError();\n const res = await apiPost<PlaybookSaveResponse>(VERSE_PLAYBOOKS_PATH, request, token);\n touchMutationHold();\n if (res.ok) {\n invalidate(PLAYBOOKS_KEY);\n invalidate(detailKeyOf(res.playbook.meta.id, null));\n }\n return res;\n}\n\nexport type { PlaybooksListResponse };\n"],"mappings":"qHAwBA,IAAa,EAAuB,uBAGvB,EAAoB,CAC/B,UACA,YACA,iBACA,SACA,oBACA,oBACF,EAIa,EAA6D,CAAC,UAAW,WAAW,EAYpF,EAAiB,CAAC,QAAS,SAAS,EAYpC,EAAkB,UAGlB,EAAsB,4BAEtB,EAAyB,6BAGzB,EAAqB,MA+ClC,SAAgB,EAAe,EAAgE,CAC7F,OAAO,GAAM,OAAS,UAAY,UAAY,OAChD,CC7FA,IAAa,EAAgB,kBACvB,GAAe,EAAY,IAA2B,kBAAkB,EAAG,GAAG,GAAW,WAS/F,SAAS,EAAW,EAAwC,CAC1D,GAAI,CAAC,GAAO,OAAO,GAAQ,SAAU,OAAO,KAC5C,IAAM,EAAQ,EAAgC,UAC9C,OAAO,MAAM,QAAQ,CAAI,EAAK,EAA6B,IAC7D,CAQA,IAAa,EAA0C,CACrD,IAAK,EACL,MAAO,KAAO,IAAW,CACvB,GAAI,CACF,IAAM,EAAQ,EAAW,MAAM,EAAgB,EAAsB,CAAM,CAAC,EAC5E,OAAO,EAAQ,CAAE,QAAO,UAAW,GAAM,OAAQ,IAAK,EAAI,CAAE,MAAO,KAAM,UAAW,GAAM,OAAQ,uCAAwC,CAC5I,OAAS,EAAK,CAEZ,GADI,aAAe,GAAY,EAAI,SAAW,KAC1C,aAAe,cAAgB,EAAI,OAAS,aAAc,MAAM,EAEpE,MAAO,CAAE,MAAO,KAAM,UAAW,GAAO,OADxB,aAAe,GAAY,EAAI,SAAW,IACA,uCAAyC,8BAA+B,CACpI,CACF,CACF,EAEA,SAAgB,EAAoB,EAAY,EAA0D,CACxG,IAAM,EAAS,IAAY,KAAO,GAAK,YAAY,IACnD,MAAO,CACL,IAAK,EAAY,EAAI,CAAO,EAC5B,MAAQ,GAAW,EAA+B,GAAG,EAAqB,GAAG,mBAAmB,CAAE,IAAI,IAAU,CAAM,CACxH,CACF,CAGA,eAAsB,EAAmB,EAA6D,CACpG,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EACtB,IAAM,EAAM,MAAM,EAA8B,EAAsB,EAAS,CAAK,EAMpF,OALA,EAAkB,EACd,EAAI,KACN,EAAW,CAAa,EACxB,EAAW,EAAY,EAAI,SAAS,KAAK,GAAI,IAAI,CAAC,GAE7C,CACT"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BMfejJ9u.js";var r=e(n(),1),i=t();function a(e){let t=null,n=null,a=()=>(n??=e().then(e=>t=e,e=>{throw n=null,e}),n),o=(0,r.lazy)(()=>a().then(e=>({default:e})));function s(e){let[n]=(0,r.useState)(()=>t);return n?(0,i.jsx)(n,{...e}):(0,i.jsx)(o,{...e})}return typeof window<`u`&&a().catch(()=>void 0),{Slot:s,ready:a}}function o(e){let t=null,n=null,i=()=>(n??=e().then(e=>t=e,e=>{throw n=null,e}),n);function a(){let[e,n]=(0,r.useState)(()=>({current:t}));return(0,r.useEffect)(()=>{if(e.current)return;let t=!0;return i().then(e=>{t&&n({current:e})},()=>void 0),()=>{t=!1}},[e]),e.current}return typeof window<`u`&&i().catch(()=>void 0),{ready:i,useLoaded:a}}export{o as n,a as t};
2
+ //# sourceMappingURL=preloaded-D89lETD0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preloaded-D89lETD0.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/preloaded.tsx"],"sourcesContent":["/**\n * routes/verse/shell/preloaded.tsx — chunks that start downloading when the\n * module DECLARING them evaluates, and render synchronously once they are in.\n *\n * Moved out of sections/ChatSection.tsx so the shell (guarded-action.tsx)\n * can keep its dialogs off the chat first-paint path the same way the Chat\n * section keeps its workspace, chat list and dialogs off it. A preloaded\n * dialog that has landed mounts in the same render that opens it, exactly as\n * a static import would; one opened in the few milliseconds before its chunk\n * lands shows a moment later.\n */\nimport { lazy, useEffect, useState, type ComponentType } from 'react';\n\n/**\n * A component in its own chunk whose download starts the moment the module\n * declaring it evaluates — not when React first renders it — so it streams in\n * parallel with the chat's first paint instead of after it.\n *\n * WHY (SPEC-310A §1: chat first-paint critical JS ≤ 350 KB, measured by\n * scripts/check-first-paint-budget.mjs). React + react-dom alone are ~220 KB\n * of that; the chat list, the transcript, the composer and the markdown\n * renderer were another ~290 KB in this chunk. The section's frame (its\n * grid, the banners, every mutation and key handler) paints from this chunk;\n * the workspace and the chat list paint a beat later from theirs, over\n * skeletons in their own shape so nothing jumps.\n *\n * Once the module is in, every later mount renders it synchronously (no\n * Suspense flash when you come back to Chat). Which of the two a mount uses\n * is fixed for that mount's life: swapping the lazy wrapper for the loaded\n * component mid-life would remount the subtree and drop its state — the\n * composer's draft, the transcript's scroll.\n */\nexport function preloadedLazy<P extends object>(load: () => Promise<ComponentType<P>>): { Slot: ComponentType<P>; ready: () => Promise<ComponentType<P>> } {\n let loaded: ComponentType<P> | null = null;\n let pending: Promise<ComponentType<P>> | null = null;\n const ready = (): Promise<ComponentType<P>> => {\n // A failed download is not cached: the next mount (or retry) asks again.\n pending ??= load().then((c) => (loaded = c), (err: unknown) => { pending = null; throw err; });\n return pending;\n };\n const Lazy = lazy(() => ready().then((c) => ({ default: c })));\n function Slot(props: P) {\n const [Ready] = useState<ComponentType<P> | null>(() => loaded);\n return Ready ? <Ready {...props} /> : <Lazy {...props} />;\n }\n if (typeof window !== 'undefined') void ready().catch(() => undefined);\n return { Slot, ready };\n}\n\n/**\n * A module (not a component) on the same terms as preloadedLazy: fetched when\n * the declaring module evaluates, read synchronously once in. useLoaded() re-renders\n * its caller once, when it lands; a failed load leaves it null (the values it\n * would have computed stay empty) and is retried on the next mount.\n */\nexport function preloadedModule<M>(load: () => Promise<M>): { ready: () => Promise<M>; useLoaded: () => M | null } {\n let loaded: M | null = null;\n let pending: Promise<M> | null = null;\n const ready = (): Promise<M> => {\n pending ??= load().then((m) => (loaded = m), (err: unknown) => { pending = null; throw err; });\n return pending;\n };\n function useLoaded(): M | null {\n const [mod, setMod] = useState<{ current: M | null }>(() => ({ current: loaded }));\n useEffect(() => {\n if (mod.current) return undefined;\n let live = true;\n ready().then((m) => { if (live) setMod({ current: m }); }, () => undefined);\n return () => { live = false; };\n }, [mod]);\n return mod.current;\n }\n if (typeof window !== 'undefined') void ready().catch(() => undefined);\n return { ready, useLoaded };\n}\n"],"mappings":"uHAgCA,SAAgB,EAAgC,EAA2G,CACzJ,IAAI,EAAkC,KAClC,EAA4C,KAC1C,OAEJ,IAAY,EAAK,CAAC,CAAC,KAAM,GAAO,EAAS,EAAK,GAAiB,CAAkB,KAAhB,GAAU,KAAY,CAAK,CAAC,EACtF,GAEH,GAAA,EAAO,EAAA,KAAA,KAAW,EAAM,CAAC,CAAC,KAAM,IAAO,CAAE,QAAS,CAAE,EAAE,CAAC,EAC7D,SAAS,EAAK,EAAU,CACtB,GAAM,CAAC,IAAA,EAAS,EAAA,SAAA,KAAwC,CAAM,EAC9D,OAAO,GAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,GAAI,CAAQ,CAAA,GAAI,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAI,CAAQ,CAAA,CAC1D,CAEA,OADI,OAAO,OAAW,KAAa,EAAW,CAAC,CAAC,UAAY,IAAA,EAAS,EAC9D,CAAE,OAAM,OAAM,CACvB,CAQA,SAAgB,EAAmB,EAAgF,CACjH,IAAI,EAAmB,KACnB,EAA6B,KAC3B,OACJ,IAAY,EAAK,CAAC,CAAC,KAAM,GAAO,EAAS,EAAK,GAAiB,CAAkB,KAAhB,GAAU,KAAY,CAAK,CAAC,EACtF,GAET,SAAS,GAAsB,CAC7B,GAAM,CAAC,EAAK,IAAA,EAAU,EAAA,SAAA,MAAuC,CAAE,QAAS,CAAO,EAAE,EAOjF,OANA,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,EAAI,QAAS,OACjB,IAAI,EAAO,GAEX,OADA,EAAM,CAAC,CAAC,KAAM,GAAM,CAAM,GAAM,EAAO,CAAE,QAAS,CAAE,CAAC,CAAG,MAAS,IAAA,EAAS,MAC7D,CAAE,EAAO,EAAO,CAC/B,EAAG,CAAC,CAAG,CAAC,EACD,EAAI,OACb,CAEA,OADI,OAAO,OAAW,KAAa,EAAW,CAAC,CAAC,UAAY,IAAA,EAAS,EAC9D,CAAE,QAAO,WAAU,CAC5B"}
@@ -0,0 +1 @@
1
+ import"./focus-trap-BZrKstmG.js";import"./Dialog-kQIBpFXz.js";import"./Epistemic-Cu1zgz4Q.js";import"./StatusBadge-RjXOZERa.js";import"./RouteErrorBoundary-CbAyWP7h.js";import"./RefreshIndicator-Di6IeZNh.js";import"./SkipToContent-DxOcfOLL.js";import"./VerseConsoleApp-CyRa9lh1.js";import"./Segmented-pAErxjR4.js";import"./Tag-ils_o3n7.js";import"./Button-BKA5M-tJ.js";import"./EmptyState-CtcWT61K.js";import"./Meter-Cm15WZWf.js";import"./Sheet-1ENtyVoT.js";import"./Switch-B6Jn8y6M.js";import"./Slider-DY1bch2c.js";import"./Select-Css6V7wH.js";import"./Input-CJnHvtwe.js";
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./index-BMfejJ9u.js";var t=`${e}sw.js`,n=e,r=`/next/verse-m/`,i=`${r}manifest.webmanifest`,a=`${r}apple-touch-icon.png`,o=Object.freeze({light:`rgb(250 250 250)`,dark:`rgb(11 11 13)`}),s=`width=device-width, initial-scale=1, viewport-fit=cover`;function c(e,t,n,r){let i=e.head.querySelector(t);i||(i=n(),e.head.append(i));for(let[e,t]of Object.entries(r))i.setAttribute(e,t)}function l(e,t,n,r={}){c(e,`meta[name="${t}"]${r.media?`[media="${r.media}"]`:``}`,()=>e.createElement(`meta`),{name:t,content:n,...r})}function u(e,t,n){c(e,`link[rel="${t}"]`,()=>e.createElement(`link`),{rel:t,href:n})}function d(e=document){e.head&&(e.title=`Ashlr Verse`,l(e,`viewport`,s),u(e,`manifest`,i),u(e,`apple-touch-icon`,a),l(e,`apple-mobile-web-app-capable`,`yes`),l(e,`mobile-web-app-capable`,`yes`),l(e,`apple-mobile-web-app-status-bar-style`,`black-translucent`),l(e,`apple-mobile-web-app-title`,`Verse`),l(e,`theme-color`,o.light,{media:`(prefers-color-scheme: light)`}),l(e,`theme-color`,o.dark,{media:`(prefers-color-scheme: dark)`}),l(e,`format-detection`,`telephone=no`))}async function f(e=typeof navigator>`u`?void 0:navigator){let r=e?.serviceWorker;if(!r||typeof r.register!=`function`)return`unsupported`;try{return await r.register(t,{scope:n,type:`classic`,updateViaCache:`none`}),`registered`}catch{return`failed`}}function p(e=window){return e.navigator.standalone===!0||typeof e.matchMedia==`function`&&e.matchMedia(`(display-mode: standalone)`).matches}function m(e=navigator,t=window){return e.standalone===!0&&`serviceWorker`in e&&`PushManager`in t&&`Notification`in t}async function h(e){if(!m())throw Error(`Notifications require Verse installed on an iPhone Home Screen with Web Push support.`);if(Notification.permission===`denied`)throw Error(`Notifications are blocked in this phone’s settings.`);if((Notification.permission===`granted`?`granted`:await Notification.requestPermission())!==`granted`)throw Error(`Notification permission was not granted.`);let t=e.replace(/-/g,`+`).replace(/_/g,`/`),n=atob(t.padEnd(Math.ceil(t.length/4)*4,`=`)),r=new Uint8Array(n.length);for(let e=0;e<n.length;e+=1)r[e]=n.charCodeAt(e);let i=await navigator.serviceWorker.ready;return await i.pushManager.getSubscription()??i.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:r})}export{h as enableRemotePush,d as installMobileHead,p as isStandalone,f as registerMobileServiceWorker,m as supportsIphoneHomeScreenPush};
2
+ //# sourceMappingURL=pwa-CFctEg6F.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pwa-CFctEg6F.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/pwa.ts"],"sourcesContent":["/**\n * routes/verse/mobile/pwa.ts — what makes /verse/m installable and launch\n * like an app: the head tags iOS and Android read, and the service worker.\n *\n * WHY THE HEAD IS WRITTEN AT RUNTIME: index.html is shared by every console.\n * A manifest link or `viewport-fit=cover` there would make the desktop Verse,\n * Universe and Resources pages installable, and let the workbench draw under\n * a phone's notch without the safe-area padding only this app has. So the\n * phone app adds them when it mounts — iOS reads them when \"Add to Home\n * Screen\" is tapped, which is always after that.\n *\n * WHY THE WORKER LIVES AT /verse/m/sw.js: a worker controls only paths under\n * its own script's directory (core/web/static.ts maps the path to the built\n * file in next/verse-m/). What it caches is in public/verse-m/sw.js: the app\n * shell and hashed assets — never an /api/ response, so no read data is left\n * on the phone.\n */\nimport { VERSE_MOBILE_PATH } from '../../../app/console-mode.js';\n\nexport const VERSE_MOBILE_SW_URL = `${VERSE_MOBILE_PATH}sw.js`;\nexport const VERSE_MOBILE_SW_SCOPE = VERSE_MOBILE_PATH;\n\n/**\n * Built by Vite from src/web-ui/public/verse-m/ into /next/verse-m/ (the\n * build's base). Literal, like the manifest's own icon paths, so the two can\n * never disagree.\n */\nconst ASSET_BASE = '/next/verse-m/';\nexport const VERSE_MOBILE_MANIFEST_HREF = `${ASSET_BASE}manifest.webmanifest`;\nexport const VERSE_MOBILE_TOUCH_ICON_HREF = `${ASSET_BASE}apple-touch-icon.png`;\n\n/** The canvas colour of each theme (design/tokens.css --bg-canvas), for the status bar. */\nexport const THEME_COLORS = Object.freeze({ light: 'rgb(250 250 250)', dark: 'rgb(11 11 13)' });\n\nconst VIEWPORT = 'width=device-width, initial-scale=1, viewport-fit=cover';\n\nfunction upsert(doc: Document, selector: string, create: () => HTMLElement, attrs: Record<string, string>): void {\n let el = doc.head.querySelector<HTMLElement>(selector);\n if (!el) {\n el = create();\n doc.head.append(el);\n }\n for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, v);\n}\n\nfunction meta(doc: Document, name: string, content: string, extra: Record<string, string> = {}): void {\n const media = extra.media ? `[media=\"${extra.media}\"]` : '';\n upsert(doc, `meta[name=\"${name}\"]${media}`, () => doc.createElement('meta'), { name, content, ...extra });\n}\n\nfunction link(doc: Document, rel: string, href: string): void {\n upsert(doc, `link[rel=\"${rel}\"]`, () => doc.createElement('link'), { rel, href });\n}\n\n/** Idempotent: safe to call on every mount. */\nexport function installMobileHead(doc: Document = document): void {\n if (!doc.head) return;\n doc.title = 'Ashlr Verse';\n meta(doc, 'viewport', VIEWPORT);\n link(doc, 'manifest', VERSE_MOBILE_MANIFEST_HREF);\n link(doc, 'apple-touch-icon', VERSE_MOBILE_TOUCH_ICON_HREF);\n meta(doc, 'apple-mobile-web-app-capable', 'yes');\n meta(doc, 'mobile-web-app-capable', 'yes');\n // Content runs under the status bar; the shell pads by env(safe-area-inset-top).\n meta(doc, 'apple-mobile-web-app-status-bar-style', 'black-translucent');\n meta(doc, 'apple-mobile-web-app-title', 'Verse');\n meta(doc, 'theme-color', THEME_COLORS.light, { media: '(prefers-color-scheme: light)' });\n meta(doc, 'theme-color', THEME_COLORS.dark, { media: '(prefers-color-scheme: dark)' });\n // Phone numbers and dates in agent output are not links to dial.\n meta(doc, 'format-detection', 'telephone=no');\n}\n\nexport type ServiceWorkerOutcome = 'registered' | 'unsupported' | 'failed';\n\n/**\n * Register the shell cache. Never throws and never blocks the app: a phone\n * with no worker (private mode, an http:// tunnel that is not localhost) is\n * the same app minus the offline screen.\n */\nexport async function registerMobileServiceWorker(\n nav: Pick<Navigator, 'serviceWorker'> | undefined = typeof navigator === 'undefined' ? undefined : navigator,\n): Promise<ServiceWorkerOutcome> {\n const container = nav?.serviceWorker;\n if (!container || typeof container.register !== 'function') return 'unsupported';\n try {\n await container.register(VERSE_MOBILE_SW_URL, { scope: VERSE_MOBILE_SW_SCOPE, type: 'classic', updateViaCache: 'none' });\n return 'registered';\n } catch {\n return 'failed';\n }\n}\n\n/** Whether the app is running from the home screen (no browser chrome). */\nexport function isStandalone(win: Window = window): boolean {\n const iosStandalone = (win.navigator as Navigator & { standalone?: boolean }).standalone === true;\n return iosStandalone || (typeof win.matchMedia === 'function' && win.matchMedia('(display-mode: standalone)').matches);\n}\n\n/** This gateway's push sender accepts Apple Web Push subscriptions only. */\nexport function supportsIphoneHomeScreenPush(\n nav: Navigator = navigator,\n win: Window = window,\n): boolean {\n return (nav as Navigator & { standalone?: boolean }).standalone === true\n && 'serviceWorker' in nav && 'PushManager' in win && 'Notification' in win;\n}\n\n/** Only called from an explicit tap after the paired gateway advertises push. */\nexport async function enableRemotePush(publicKey: string): Promise<PushSubscription> {\n if (!supportsIphoneHomeScreenPush()) {\n throw new Error('Notifications require Verse installed on an iPhone Home Screen with Web Push support.');\n }\n if (Notification.permission === 'denied') throw new Error('Notifications are blocked in this phone’s settings.');\n const permission = Notification.permission === 'granted' ? 'granted' : await Notification.requestPermission();\n if (permission !== 'granted') throw new Error('Notification permission was not granted.');\n const normalized = publicKey.replace(/-/g, '+').replace(/_/g, '/');\n const decoded = atob(normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '='));\n const key = new Uint8Array(decoded.length);\n for (let i = 0; i < decoded.length; i += 1) key[i] = decoded.charCodeAt(i);\n const registration = await navigator.serviceWorker.ready;\n const existing = await registration.pushManager.getSubscription();\n return existing ?? registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: key });\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{i as e}from"./global-7hs7NyAO.js";var t={key:`dashboard-snapshot`,fetch:t=>e(`/api/snapshot`,t)},n={key:`control-snapshot`,fetch:t=>e(`/api/control`,t)},r={key:`agent-os-snapshot`,fetch:t=>e(`/api/agent-os`,t)},i={key:`universe-overview`,fetch:t=>e(`/api/universe`,t)};function a(t){return{key:`universe-graph-${t}`,fetch:n=>e(`/api/universe/graph?universeId=${encodeURIComponent(t)}`,n)}}var o={key:`runs`,fetch:t=>e(`/api/runs`,t)};function s(t){return{key:`run-detail-${t}`,fetch:n=>e(`/api/run/${encodeURIComponent(t)}`,n)}}var c={key:`swarms`,fetch:t=>e(`/api/swarms`,t)};function l(t){return{key:`swarm-detail-${t}`,fetch:n=>e(`/api/swarm/${encodeURIComponent(t)}`,n)}}var u={key:`daemon`,fetch:t=>e(`/api/daemon-observation`,t)},d={key:`fleet`,fetch:t=>e(`/api/fleet`,t)},f={key:`fleet-activity`,fetch:t=>e(`/api/fleet-activity`,t)},p={key:`goals`,fetch:t=>e(`/api/goals`,t)},m={key:`vision-mission`,fetch:t=>e(`/api/vision/mission`,t)},h={key:`inbox`,fetch:t=>e(`/api/inbox`,t)};function g(t={}){let n=new URLSearchParams;t.status!==void 0&&n.set(`status`,t.status),t.since!==void 0&&n.set(`since`,t.since),t.limit!==void 0&&n.set(`limit`,String(t.limit));let r=n.toString();return{key:`inbox-list:${t.status??`pending`}:${t.since??``}:${t.limit??``}`,fetch:t=>e(`/api/inbox${r?`?${r}`:``}`,t)}}function _(t){return{key:`proposal-detail-${t}`,fetch:n=>e(`/api/inbox/${encodeURIComponent(t)}`,n)}}var v={key:`control-logs-observation`,fetch:t=>e(`/api/logs-observation?tail=200`,t)};function y(t){return{key:`pulse-${t}`,fetch:n=>e(`/api/pulse?window=${t}`,n)}}function b(e){return typeof e==`object`&&!!e&&`entry`in e&&`score`in e}function x(t){let n=t.trim();return{key:n?`genome-search-${n}`:`genome-list`,fetch:t=>e(n?`/api/genome?q=${encodeURIComponent(n)}`:`/api/genome`,t)}}function S(t){return{key:`models-${t}`,fetch:n=>e(`/api/models?window=${t}`,n)}}var C={key:`portfolio`,fetch:t=>e(`/api/portfolio`,t)};export{m as C,i as S,s as _,t as a,c as b,x as c,h as d,b as f,y as g,_ as h,u as i,p as l,C as m,v as n,f as o,S as p,n as r,d as s,r as t,g as u,o as v,a as x,l as y};
2
+ //# sourceMappingURL=queries-BLmYe69g.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries-BLmYe69g.js","names":[],"sources":["../../../../../../src/web-ui/data/queries.ts"],"sourcesContent":["/**\n * data/queries.ts — one typed accessor per backend resource. Each pairs a\n * stable cache key (also the SSE invalidation target — see sse.ts's\n * EVENT_TO_CACHE_KEYS) with the exact GET call and response type. Views\n * never call apiGet directly; they call these through useQuery (hooks.ts)\n * so caching, de-dupe, and SSE-driven refresh are automatic.\n */\nimport { apiGet } from './client.js';\nimport type { UniverseGraph } from '../../core/universe/graph-types.js';\nimport type {\n AgentOsSnapshotResponse,\n UniverseOverview,\n ControlLogEntry,\n ControlSnapshot,\n DashboardSnapshot,\n DecisionEntry,\n FleetActivitySnapshot,\n FleetStatus,\n Proposal,\n ProposalStatus,\n PublicDaemonObservation,\n RunState,\n SwarmRun,\n ActivityRollup,\n GenomeEntry,\n RecallHit,\n PortfolioSummary,\n ModelStatsReadResult,\n} from './api-types.js';\nimport type { SourceQuality } from './api-types.js';\n\nexport interface QueryDef<T> {\n key: string;\n fetch: (signal?: AbortSignal) => Promise<T>;\n}\n\nexport const dashboardSnapshotQuery: QueryDef<DashboardSnapshot> = {\n key: 'dashboard-snapshot',\n fetch: (signal) => apiGet<DashboardSnapshot>('/api/snapshot', signal),\n};\n\nexport const controlSnapshotQuery: QueryDef<ControlSnapshot> = {\n key: 'control-snapshot',\n fetch: (signal) => apiGet<ControlSnapshot>('/api/control', signal),\n};\n\nexport const agentOsSnapshotQuery: QueryDef<AgentOsSnapshotResponse> = {\n key: 'agent-os-snapshot',\n fetch: (signal) => apiGet<AgentOsSnapshotResponse>('/api/agent-os', signal),\n};\n\nexport const universeOverviewQuery: QueryDef<UniverseOverview> = {\n key: 'universe-overview',\n fetch: (signal) => apiGet<UniverseOverview>('/api/universe', signal),\n};\n\n/** Read only on demand; never invalidate this alongside the overview poll. */\nexport function universeGraphQuery(universeId: string): QueryDef<UniverseGraph> {\n return {\n key: `universe-graph-${universeId}`,\n fetch: (signal) => apiGet<UniverseGraph>(`/api/universe/graph?universeId=${encodeURIComponent(universeId)}`, signal),\n };\n}\n\n// NOTE: there is no standalone GET /api/visibility route — VisibilitySnapshot\n// is an optional field on DashboardSnapshot (`.visibility`), populated by\n// buildSnapshot() server-side. Read it off dashboardSnapshotQuery's data\n// rather than issuing a second request for it.\n\n/**\n * GET /api/runs returns the bare array (see src/core/web/api.ts:1121-1125,\n * `listRuns({limit:200})` -> `RunState[]`) — NOT `{runs: [...]}`. The prior\n * `RunSummary`/`runsQuery` pair here was speculative and didn't match the\n * real response shape; it was unused (FleetDashboardView reads its compact\n * run summaries off `DashboardSnapshot['runs']` instead, a different,\n * deliberately-thin shape). Replaced with the real, fully-typed contract.\n */\nexport const runsQuery: QueryDef<RunState[]> = {\n key: 'runs',\n fetch: (signal) => apiGet<RunState[]>('/api/runs', signal),\n};\n\nexport function runDetailQuery(id: string): QueryDef<RunState> {\n return {\n key: `run-detail-${id}`,\n fetch: (signal) => apiGet<RunState>(`/api/run/${encodeURIComponent(id)}`, signal),\n };\n}\n\nexport const swarmsQuery: QueryDef<SwarmRun[]> = {\n key: 'swarms',\n fetch: (signal) => apiGet<SwarmRun[]>('/api/swarms', signal),\n};\n\nexport function swarmDetailQuery(id: string): QueryDef<SwarmRun> {\n return {\n key: `swarm-detail-${id}`,\n fetch: (signal) => apiGet<SwarmRun>(`/api/swarm/${encodeURIComponent(id)}`, signal),\n };\n}\n\n/**\n * Same PublicDaemonObservation the backend embeds at ControlSnapshot.daemonObservation\n * — fetched standalone here because /control/daemon renders a fuller detail page\n * than DaemonPanel's dashboard-compact view and wants the raw observation\n * (including `ticks`) independent of whether the rest of /api/control succeeds.\n * Cache key 'daemon' deliberately matches sse.ts's existing (previously orphaned)\n * `daemon` / `daemon-observation` -> ['daemon'] mapping so this now actually\n * live-updates.\n */\nexport const daemonObservationQuery: QueryDef<PublicDaemonObservation> = {\n key: 'daemon',\n fetch: (signal) => apiGet<PublicDaemonObservation>('/api/daemon-observation', signal),\n};\n\nexport const fleetStatusQuery: QueryDef<FleetStatus> = {\n key: 'fleet',\n fetch: (signal) => apiGet<FleetStatus>('/api/fleet', signal),\n};\n\nexport const fleetActivityQuery: QueryDef<FleetActivitySnapshot> = {\n key: 'fleet-activity',\n fetch: (signal) => apiGet<FleetActivitySnapshot>('/api/fleet-activity', signal),\n};\n\n/**\n * GET /api/goals returns a bare array of ad-hoc per-goal projections built\n * inline in src/core/web/api.ts (`path === '/api/goals'`, ~line 1654) — there\n * is no exported backend type for this shape (unlike every other resource\n * here), so this interface is hand-written to match that handler exactly\n * rather than re-exported. Keep it in sync with api.ts if that handler's\n * shape changes.\n */\nexport interface GoalMilestoneSummary {\n title: string;\n status: string;\n order: number;\n}\n\nexport interface GoalSummary {\n id: string;\n objective: string;\n status: string;\n milestones: GoalMilestoneSummary[];\n progress: {\n fractionDone: number;\n counts: Record<string, number>;\n nextActionableId: string | null;\n };\n}\n\nexport const goalsQuery: QueryDef<GoalSummary[]> = {\n key: 'goals',\n fetch: (signal) => apiGet<GoalSummary[]>('/api/goals', signal),\n};\n\n/**\n * GET /api/vision/mission — buildVisionMissionSnapshot() in src/core/web/api.ts\n * is itself typed `Promise<Record<string, unknown>>` on the backend (no\n * exported interface to import), so this is a narrow hand-written contract\n * covering only the fields the Goals view actually reads: top-level `state`\n * (mirrors the SourceQuality.sourceState vocabulary) and the per-source\n * epistemic breakdown under `sources`. `briefing`/`preview`/`shadow` are\n * deliberately left as `unknown` — the view does not render briefing prose.\n */\nexport interface VisionMissionSourceStatus {\n sourceState: 'healthy' | 'degraded' | 'missing' | 'unknown';\n sourcePresent?: boolean;\n complete: boolean;\n reason?: string;\n}\n\nexport interface VisionMissionSnapshot {\n schemaVersion: number;\n state: string;\n authority: string;\n briefing: unknown;\n sources: {\n briefing: VisionMissionSourceStatus | null;\n goals: VisionMissionSourceStatus | null;\n enrollment: VisionMissionSourceStatus | null;\n proposals: VisionMissionSourceStatus | null;\n };\n}\n\nexport const visionMissionQuery: QueryDef<VisionMissionSnapshot> = {\n key: 'vision-mission',\n fetch: (signal) => apiGet<VisionMissionSnapshot>('/api/vision/mission', signal),\n};\n\nexport interface InboxProposal {\n id: string;\n title: string;\n kind: string;\n repo: string;\n origin: string;\n createdAt: string;\n}\n\nexport const inboxQuery: QueryDef<{ pending: number; proposals: InboxProposal[] }> = {\n key: 'inbox',\n fetch: (signal) => apiGet('/api/inbox', signal),\n};\n\n/**\n * `?status=&since=&limit=` view over GET /api/inbox (src/core/web/api.ts\n * INBOX_STATUS_QUERY_VALUES) — the history surface `inboxQuery` above never\n * had: it's hardcoded pending-only. `status: undefined` = server default\n * (pending); `'all'` = every status. Keyed per filter combo so switching\n * status/since/limit doesn't fight over one cache entry, and so sse.ts can\n * sweep every live combo (`invalidatePrefix('inbox-list:')`) on the 'inbox'\n * SSE event without knowing which combos are mounted.\n */\nexport type InboxHistoryStatus = ProposalStatus | 'all';\n\nexport interface InboxListFilters {\n status?: InboxHistoryStatus;\n /** ISO timestamp or YYYY-MM-DD, passed straight through to the server. */\n since?: string;\n limit?: number;\n}\n\nexport interface InboxListResponse {\n pending: number;\n total: number;\n /**\n * Full `Proposal[]`, not the narrow `InboxProposal` shape above — the\n * server has always sent full sanitized Proposal records here\n * (`listProposals()`); `InboxProposal` just under-typed it for the\n * original pending-badge use case. The history view needs `status` and\n * `decisionReason` per row (triage: \"why was this rejected\") without an\n * N+1 decisions-ledger read per row, and both live directly on Proposal.\n */\n proposals: Proposal[];\n /** True when more rows matched than were returned (hit the server cap). */\n truncated: boolean;\n filters: { status: InboxHistoryStatus; since: string | null; limit: number | null };\n}\n\nexport function inboxListQuery(filters: InboxListFilters = {}): QueryDef<InboxListResponse> {\n const params = new URLSearchParams();\n if (filters.status !== undefined) params.set('status', filters.status);\n if (filters.since !== undefined) params.set('since', filters.since);\n if (filters.limit !== undefined) params.set('limit', String(filters.limit));\n const qs = params.toString();\n return {\n key: `inbox-list:${filters.status ?? 'pending'}:${filters.since ?? ''}:${filters.limit ?? ''}`,\n fetch: (signal) => apiGet<InboxListResponse>(`/api/inbox${qs ? `?${qs}` : ''}`, signal),\n };\n}\n\n/**\n * Evidence behind a judge's verdict for one proposal — joined server-side\n * (src/core/web/api.ts GET /api/inbox/:id) from the decisions ledger, which\n * is the ONLY place `judgeReasonCode` lives (Proposal itself never carries\n * it). `judge-parse-failure`/`judge-network-failure` are infra failures,\n * never a considered `judge-review` — render them distinctly, never folded\n * together. When the ledger read is degraded or no row matches this\n * proposal, `sourceQuality` says so; render \"unknown\" via <Epistemic/>\n * rather than treating an empty `decisions` array as \"never judged\".\n */\nexport interface InboxDecisionEvidence {\n sourceQuality: SourceQuality;\n decisions: DecisionEntry[];\n}\n\n/**\n * GET /api/inbox/:id — full proposal detail including diff/taste/verdict\n * (src/core/web/api.ts:1240-1255, `loadProposal(id)`) plus `decisionEvidence`\n * (readDecisionsDetailed({proposalId}), added alongside the inbox history\n * view). Used by the work journal's \"why did it do that\" drill-in (M416) —\n * `/api/inbox` only ever returns pending proposals, but a decided\n * proposal's id (surfaced via fleet-activity's recentMerges/recentActions,\n * or via inboxListQuery's history view) still resolves here as long as its\n * on-disk record hasn't been pruned.\n */\nexport function proposalDetailQuery(id: string): QueryDef<Proposal & { decisionEvidence: InboxDecisionEvidence }> {\n return {\n key: `proposal-detail-${id}`,\n fetch: (signal) =>\n apiGet<Proposal & { decisionEvidence: InboxDecisionEvidence }>(`/api/inbox/${encodeURIComponent(id)}`, signal),\n };\n}\n\n/**\n * GET /api/logs-observation?tail=200 — the provenance-bearing sibling of\n * GET /api/logs (src/core/web/api.ts:~1543-1560): same daemon tick/merge\n * log, plus `sourceQuality` so a degraded/incomplete log can be rendered\n * honestly via <Epistemic/> instead of silently showing a truncated or\n * stale list as complete. `entries` is `null` when the source itself is not\n * healthy+complete (server-side contract, not a client guess). Used by the\n * work journal (M416) as one of several merged history sources — NOT a\n * substitute for full on-disk history: this is capped at 200 entries\n * server-side and only carries daemon tick/merge/info/dispatch events, not\n * raw run stdout or the ~672 historical proposals living only on disk.\n */\nexport interface ControlLogsObservation {\n entries: ControlLogEntry[] | null;\n sourceQuality: SourceQuality;\n}\n\nexport const controlLogsObservationQuery: QueryDef<ControlLogsObservation> = {\n key: 'control-logs-observation',\n fetch: (signal) => apiGet<ControlLogsObservation>('/api/logs-observation?tail=200', signal),\n};\n\n// ---------------------------------------------------------------------------\n// Intelligence + Portfolio (charts/dataviz work)\n// ---------------------------------------------------------------------------\n\nexport type PulseWindow = '1d' | '7d' | '30d';\n\n/** GET /api/pulse?window= — buildRollup() (src/core/observability/rollup.ts).\n * Parameterized like runDetailQuery/swarmDetailQuery above: a distinct cache\n * key per window so switching windows doesn't fight over one cache entry. */\nexport function pulseQuery(window: PulseWindow): QueryDef<ActivityRollup> {\n return {\n key: `pulse-${window}`,\n fetch: (signal) => apiGet<ActivityRollup>(`/api/pulse?window=${window}`, signal),\n };\n}\n\n/**\n * GET /api/genome[?q=] — src/core/web/api.ts:1189-1201. Two response shapes\n * depending on `q`: empty/absent `q` returns `GenomeEntry[]` (list mode,\n * `loadGenome()`); a non-empty `q` returns `RecallHit[]` (query mode,\n * `recall()`, `{entry, score, method}`). Use `isRecallHit` to discriminate —\n * the view can't know which shape it got from the type alone since both are\n * arrays. Keyed per query string so a debounced search doesn't stomp the\n * browse-mode cache entry.\n */\nexport type GenomeResult = GenomeEntry[] | RecallHit[];\n\nexport function isRecallHit(item: GenomeEntry | RecallHit): item is RecallHit {\n return typeof item === 'object' && item !== null && 'entry' in item && 'score' in item;\n}\n\nexport function genomeQuery(q: string): QueryDef<GenomeResult> {\n const trimmed = q.trim();\n return {\n key: trimmed ? `genome-search-${trimmed}` : 'genome-list',\n fetch: (signal) =>\n apiGet<GenomeResult>(trimmed ? `/api/genome?q=${encodeURIComponent(trimmed)}` : '/api/genome', signal),\n };\n}\n\nexport type ModelStatsWindow = '7d' | '30d' | 'all';\n\n/** GET /api/models?window= — computeModelStatsDetailed() joined per-model\n * economics (src/core/fleet/model-stats.ts). NOTE: a second, dead\n * `/api/models` handler later in api.ts's if-chain (local-model provider\n * probe off ControlSnapshot.models) is unreachable — this one always wins\n * since route matching is first-match. */\nexport function modelsQuery(window: ModelStatsWindow): QueryDef<ModelStatsReadResult & { window: ModelStatsWindow }> {\n return {\n key: `models-${window}`,\n fetch: (signal) => apiGet(`/api/models?window=${window}`, signal),\n };\n}\n\n/**\n * GET /api/portfolio — src/core/web/api.ts:1105-1109. Returns\n * `DashboardSnapshot.portfolio ?? null`: `null` on an older producer or\n * empty enrollment, not an error — render that as an honest \"not available\"\n * state, never as a zeroed chart.\n */\nexport const portfolioQuery: QueryDef<PortfolioSummary | null> = {\n key: 'portfolio',\n fetch: (signal) => apiGet<PortfolioSummary | null>('/api/portfolio', signal),\n};\n"],"mappings":"yCAoCA,IAAa,EAAsD,CACjE,IAAK,qBACL,MAAQ,GAAW,EAA0B,gBAAiB,CAAM,CACtE,EAEa,EAAkD,CAC7D,IAAK,mBACL,MAAQ,GAAW,EAAwB,eAAgB,CAAM,CACnE,EAEa,EAA0D,CACrE,IAAK,oBACL,MAAQ,GAAW,EAAgC,gBAAiB,CAAM,CAC5E,EAEa,EAAoD,CAC/D,IAAK,oBACL,MAAQ,GAAW,EAAyB,gBAAiB,CAAM,CACrE,EAGA,SAAgB,EAAmB,EAA6C,CAC9E,MAAO,CACL,IAAK,kBAAkB,IACvB,MAAQ,GAAW,EAAsB,kCAAkC,mBAAmB,CAAU,IAAK,CAAM,CACrH,CACF,CAeA,IAAa,EAAkC,CAC7C,IAAK,OACL,MAAQ,GAAW,EAAmB,YAAa,CAAM,CAC3D,EAEA,SAAgB,EAAe,EAAgC,CAC7D,MAAO,CACL,IAAK,cAAc,IACnB,MAAQ,GAAW,EAAiB,YAAY,mBAAmB,CAAE,IAAK,CAAM,CAClF,CACF,CAEA,IAAa,EAAoC,CAC/C,IAAK,SACL,MAAQ,GAAW,EAAmB,cAAe,CAAM,CAC7D,EAEA,SAAgB,EAAiB,EAAgC,CAC/D,MAAO,CACL,IAAK,gBAAgB,IACrB,MAAQ,GAAW,EAAiB,cAAc,mBAAmB,CAAE,IAAK,CAAM,CACpF,CACF,CAWA,IAAa,EAA4D,CACvE,IAAK,SACL,MAAQ,GAAW,EAAgC,0BAA2B,CAAM,CACtF,EAEa,EAA0C,CACrD,IAAK,QACL,MAAQ,GAAW,EAAoB,aAAc,CAAM,CAC7D,EAEa,EAAsD,CACjE,IAAK,iBACL,MAAQ,GAAW,EAA8B,sBAAuB,CAAM,CAChF,EA4Ba,EAAsC,CACjD,IAAK,QACL,MAAQ,GAAW,EAAsB,aAAc,CAAM,CAC/D,EA+Ba,EAAsD,CACjE,IAAK,iBACL,MAAQ,GAAW,EAA8B,sBAAuB,CAAM,CAChF,EAWa,EAAwE,CACnF,IAAK,QACL,MAAQ,GAAW,EAAO,aAAc,CAAM,CAChD,EAqCA,SAAgB,EAAe,EAA4B,CAAC,EAAgC,CAC1F,IAAM,EAAS,IAAI,gBACf,EAAQ,SAAW,IAAA,IAAW,EAAO,IAAI,SAAU,EAAQ,MAAM,EACjE,EAAQ,QAAU,IAAA,IAAW,EAAO,IAAI,QAAS,EAAQ,KAAK,EAC9D,EAAQ,QAAU,IAAA,IAAW,EAAO,IAAI,QAAS,OAAO,EAAQ,KAAK,CAAC,EAC1E,IAAM,EAAK,EAAO,SAAS,EAC3B,MAAO,CACL,IAAK,cAAc,EAAQ,QAAU,UAAU,GAAG,EAAQ,OAAS,GAAG,GAAG,EAAQ,OAAS,KAC1F,MAAQ,GAAW,EAA0B,aAAa,EAAK,IAAI,IAAO,KAAM,CAAM,CACxF,CACF,CA2BA,SAAgB,EAAoB,EAA8E,CAChH,MAAO,CACL,IAAK,mBAAmB,IACxB,MAAQ,GACN,EAA+D,cAAc,mBAAmB,CAAE,IAAK,CAAM,CACjH,CACF,CAmBA,IAAa,EAAgE,CAC3E,IAAK,2BACL,MAAQ,GAAW,EAA+B,iCAAkC,CAAM,CAC5F,EAWA,SAAgB,EAAW,EAA+C,CACxE,MAAO,CACL,IAAK,SAAS,IACd,MAAQ,GAAW,EAAuB,qBAAqB,IAAU,CAAM,CACjF,CACF,CAaA,SAAgB,EAAY,EAAkD,CAC5E,OAAO,OAAO,GAAS,YAAY,GAAiB,UAAW,GAAQ,UAAW,CACpF,CAEA,SAAgB,EAAY,EAAmC,CAC7D,IAAM,EAAU,EAAE,KAAK,EACvB,MAAO,CACL,IAAK,EAAU,iBAAiB,IAAY,cAC5C,MAAQ,GACN,EAAqB,EAAU,iBAAiB,mBAAmB,CAAO,IAAM,cAAe,CAAM,CACzG,CACF,CASA,SAAgB,EAAY,EAAyF,CACnH,MAAO,CACL,IAAK,UAAU,IACf,MAAQ,GAAW,EAAO,sBAAsB,IAAU,CAAM,CAClE,CACF,CAQA,IAAa,EAAoD,CAC/D,IAAK,YACL,MAAQ,GAAW,EAAgC,iBAAkB,CAAM,CAC7E"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-BMfejJ9u.js";var n=e(t(),1),r=[`collapsed`,`expanded`,`hidden`],i={collapsed:`Collapsed`,expanded:`Expanded`,hidden:`Hidden`},a=`ashlr.verse.reasoning.v1`,o=`collapsed`;function s(e){return typeof e==`string`&&r.includes(e)}function c(){try{let e=localStorage.getItem(a);return s(e)?e:o}catch{return o}}var l=null,u=new Set;function d(){return l===null&&(l=c()),l}function f(e){if(s(e)&&e!==d()){l=e;try{localStorage.setItem(a,e)}catch{}for(let e of[...u])e()}}function p(e){return u.add(e),()=>u.delete(e)}function m(){return(0,n.useSyncExternalStore)(p,d,d)}export{m as i,i as n,f as r,r as t};
2
+ //# sourceMappingURL=reasoning-pref-D4t6eFBc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning-pref-D4t6eFBc.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/reasoning-pref.ts"],"sourcesContent":["/**\n * routes/verse/chat/reasoning-pref.ts — how the transcript shows the model's\n * reasoning (SPEC-310C §2 \"Settings offers Expanded, Collapsed or Hidden\";\n * unit C2 owns the behaviour, C1's Settings ▸ Chat panel renders the control).\n *\n * collapsed (default) a block streams in a three-line window while the\n * model thinks, then folds to \"Thought 12s · ~1.8k tok ▸\";\n * expanded the same stream, but a finished block stays open;\n * hidden no reasoning in the transcript at all — the live status line\n * still says \"Thinking · 12s\", so a long think is never mistaken\n * for a hang.\n *\n * A per-device preference, so it lives in this browser's storage under its\n * own key (the precedent of resources-collapse / chat-panel-sizing: display\n * preferences that are not part of the shell's v3 blob). Framework-free store\n * + one hook; every read and write is try/catch'd because storage can be\n * absent (private window, blocked site data).\n */\nimport { useSyncExternalStore } from 'react';\n\nexport const REASONING_DISPLAYS = ['collapsed', 'expanded', 'hidden'] as const;\nexport type ReasoningDisplay = (typeof REASONING_DISPLAYS)[number];\n\nexport const REASONING_DISPLAY_LABEL: Readonly<Record<ReasoningDisplay, string>> = {\n collapsed: 'Collapsed',\n expanded: 'Expanded',\n hidden: 'Hidden',\n};\n\nexport const REASONING_DISPLAY_KEY = 'ashlr.verse.reasoning.v1';\nexport const DEFAULT_REASONING_DISPLAY: ReasoningDisplay = 'collapsed';\n\nexport function isReasoningDisplay(value: unknown): value is ReasoningDisplay {\n return typeof value === 'string' && (REASONING_DISPLAYS as readonly string[]).includes(value);\n}\n\nfunction read(): ReasoningDisplay {\n try {\n const raw = localStorage.getItem(REASONING_DISPLAY_KEY);\n return isReasoningDisplay(raw) ? raw : DEFAULT_REASONING_DISPLAY;\n } catch {\n return DEFAULT_REASONING_DISPLAY;\n }\n}\n\nlet current: ReasoningDisplay | null = null;\nconst listeners = new Set<() => void>();\n\nexport function getReasoningDisplay(): ReasoningDisplay {\n if (current === null) current = read();\n return current;\n}\n\nexport function setReasoningDisplay(next: ReasoningDisplay): void {\n if (!isReasoningDisplay(next) || next === getReasoningDisplay()) return;\n current = next;\n try {\n localStorage.setItem(REASONING_DISPLAY_KEY, next);\n } catch {\n /* the choice still holds for this page */\n }\n for (const listener of [...listeners]) listener();\n}\n\nexport function subscribeReasoningDisplay(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/** Test seam: forget the in-memory value so the next read re-reads storage. */\nexport function resetReasoningDisplay(): void {\n current = null;\n for (const listener of [...listeners]) listener();\n}\n\nexport function useReasoningDisplay(): ReasoningDisplay {\n return useSyncExternalStore(subscribeReasoningDisplay, getReasoningDisplay, getReasoningDisplay);\n}\n"],"mappings":"0GAoBa,EAAqB,CAAC,YAAa,WAAY,QAAQ,EAGvD,EAAsE,CACjF,UAAW,YACX,SAAU,WACV,OAAQ,QACV,EAEa,EAAwB,2BACxB,EAA8C,YAE3D,SAAgB,EAAmB,EAA2C,CAC5E,OAAO,OAAO,GAAU,UAAa,EAAyC,SAAS,CAAK,CAC9F,CAEA,SAAS,GAAyB,CAChC,GAAI,CACF,IAAM,EAAM,aAAa,QAAQ,CAAqB,EACtD,OAAO,EAAmB,CAAG,EAAI,EAAM,CACzC,MAAQ,CACN,OAAO,CACT,CACF,CAEA,IAAI,EAAmC,KACjC,EAAY,IAAI,IAEtB,SAAgB,GAAwC,CAEtD,OADI,IAAY,OAAM,EAAU,EAAK,GAC9B,CACT,CAEA,SAAgB,EAAoB,EAA8B,CAC5D,GAAC,EAAmB,CAAI,GAAK,IAAS,EAAoB,EAC9D,GAAU,EACV,GAAI,CACF,aAAa,QAAQ,EAAuB,CAAI,CAClD,MAAQ,CAER,CACA,IAAK,IAAM,IAAY,CAAC,GAAG,CAAS,EAAG,EAAS,CANtC,CAOZ,CAEA,SAAgB,EAA0B,EAAkC,CAE1E,OADA,EAAU,IAAI,CAAQ,MACT,EAAU,OAAO,CAAQ,CACxC,CAQA,SAAgB,GAAwC,CACtD,OAAA,EAAO,EAAA,qBAAA,CAAqB,EAA2B,EAAqB,CAAmB,CACjG"}
@@ -0,0 +1,3 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/global-1SED_aTT.css"])))=>i.map(i=>d[i]);
2
+ import{t as e}from"./index-BMfejJ9u.js";import{t}from"./global-7hs7NyAO.js";var n=class extends Error{status;constructor(e,t=null){super(e),this.status=t,this.name=`RemoteClientError`}},r=null,i=0;function a(e){if(e!==void 0&&e!==i)throw new n(`The phone session changed. Try again.`)}function o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function s(e){if(!o(e)||typeof e.authenticated!=`boolean`||typeof e.csrfToken!=`string`||e.csrfToken.length<16||e.csrfToken.length>256||!o(e.capabilities)||e.capabilities.writes!==!0&&e.capabilities.writes!==!1)throw new n(`The phone session answer was incomplete. Nothing was sent.`);if(!e.authenticated)return{authenticated:!1,csrfToken:e.csrfToken,capabilities:{writes:!1,pairing:e.capabilities.pairing===!0,push:e.capabilities.push===!0}};let t=e.scopes;if(typeof e.deviceId!=`string`||!e.deviceId||typeof e.label!=`string`||!o(t)||t.read!==!0||typeof t.act!=`boolean`||typeof e.expiresAt!=`number`||!Number.isFinite(e.expiresAt)||e.expiresAt<=Date.now())throw new n(`The paired device session could not be verified. Nothing was sent.`);return{authenticated:!0,csrfToken:e.csrfToken,capabilities:{writes:e.capabilities.writes===!0,pairing:e.capabilities.pairing===!0,push:e.capabilities.push===!0},deviceId:e.deviceId,label:e.label,scopes:{read:!0,act:t.act},expiresAt:e.expiresAt}}async function c(t,s){if(a(s),t.type===`opaqueredirect`||t.status>=300&&t.status<400||t.headers.get(`content-type`)?.includes(`text/html`))throw r=null,i+=1,(await e(async()=>{let{reportSessionExpired:e}=await import(`./global-7hs7NyAO.js`).then(e=>e.v);return{reportSessionExpired:e}},__vite__mapDeps([0]))).reportSessionExpired(),new n(`Cloudflare Access sign-in expired. Reload this page to sign in again.`,401);if(t.status===401)throw r=null,i+=1,(await e(async()=>{let{reportSessionExpired:e}=await import(`./global-7hs7NyAO.js`).then(e=>e.v);return{reportSessionExpired:e}},__vite__mapDeps([0]))).reportSessionExpired(),new n(`Phone sign-in expired. Reload to sign in again.`,401);let c;try{c=await t.json()}catch{throw new n(`The phone gateway did not return JSON.`,t.status)}if(a(s),!t.ok)throw new n(o(c)&&typeof c.error==`string`?c.error.slice(0,240):`The phone gateway refused the request.`,t.status);return c}async function l(e,t){return c(await fetch(e,{method:`GET`,credentials:`same-origin`,cache:`no-store`,redirect:`manual`}),t)}async function u(n,a){let o=i,s=await fetch(n,{method:`GET`,credentials:`same-origin`,cache:`no-store`,redirect:`manual`,signal:a});if(s.type===`opaqueredirect`||s.status>=300&&s.status<400||s.headers.get(`content-type`)?.includes(`text/html`))throw o===i&&(r=null,i+=1,(await e(async()=>{let{reportSessionExpired:e}=await import(`./global-7hs7NyAO.js`).then(e=>e.v);return{reportSessionExpired:e}},__vite__mapDeps([0]))).reportSessionExpired()),new t(`Cloudflare Access sign-in expired. Reload to sign in again.`,401,n);if(s.status===401)throw o===i&&(r=null,i+=1,(await e(async()=>{let{reportSessionExpired:e}=await import(`./global-7hs7NyAO.js`).then(e=>e.v);return{reportSessionExpired:e}},__vite__mapDeps([0]))).reportSessionExpired()),new t(`Phone session expired.`,401,n);if(!s.ok){let e=null,r=null;try{let t=await s.json();typeof t.error==`string`&&(e=t.error),typeof t.code==`string`&&(r=t.code)}catch{}throw new t(`GET ${n} failed (HTTP ${s.status}).`,s.status,n,e,r)}return await s.json()}async function d(e,t,o,s){let l=o??i;a(l);let u=s??r?.csrfToken;if(!u)throw new n(`Connect this phone to the gateway before continuing.`);let d=await fetch(e,{method:`POST`,credentials:`same-origin`,cache:`no-store`,redirect:`manual`,headers:{"Content-Type":`application/json`,"x-ashlr-remote-csrf":u},body:JSON.stringify(t??{})});return d.status===204?(a(l),null):c(d,l)}async function f(e,t){let i=t??r?.csrfToken;if(!i)throw new n(`Connect this phone to the gateway before continuing.`);let a=await fetch(e,{method:`DELETE`,credentials:`same-origin`,cache:`no-store`,redirect:`manual`,headers:{"x-ashlr-remote-csrf":i}});if(a.status!==204)throw new n(`The Mac could not remove this phone’s push subscription.`,a.status)}async function p(){let e=++i;try{let t=s(await l(`/remote/session`,e));return a(e),r=t,t}catch(t){throw e===i&&(r=null),t}}function m(){return r?.authenticated===!0&&r.scopes?.act===!0&&r.capabilities.writes&&typeof r.expiresAt==`number`&&Date.now()+5e3<r.expiresAt}function h(){return r}function g(e){if(!o(e)||typeof e.challengeId!=`string`||!e.challengeId||!o(e.options)||typeof e.options.challenge!=`string`)throw new n(`The passkey challenge was incomplete. Nothing was sent.`);return{challengeId:e.challengeId,options:e.options}}async function _(t,r){let i=await d(`/remote/pair/claim`,{code:t.trim(),label:r.trim()});if(!o(i)||typeof i.pendingId!=`string`||!i.pendingId||!o(i.options)||typeof i.options.challenge!=`string`)throw new n(`The pairing challenge was incomplete. Nothing was sent.`);let{startRegistration:a}=await e(async()=>{let{startRegistration:e}=await import(`./esm-BFCrCNMJ.js`);return{startRegistration:e}},[]),s=await a({optionsJSON:i.options}),c=await d(`/remote/pair/complete`,{pendingId:i.pendingId,response:s});if(!o(c)||c.pendingApproval!==!0)throw new n(`Pairing still needs approval on your Mac.`);return{pendingId:i.pendingId}}async function v(e){let t=await l(`/remote/pair/status?pendingId=${encodeURIComponent(e)}`);if(!o(t)||t.state!==`pending`&&t.state!==`approved`&&t.state!==`denied`)throw new n(`The pairing status was incomplete.`);if(t.state===`approved`){if(typeof t.deviceId!=`string`||!t.deviceId)throw new n(`The approved device ID was missing.`);return{state:`approved`,deviceId:t.deviceId}}return{state:t.state}}async function y(t){let o=++i,c=g(await d(`/remote/auth/begin`,{deviceId:t},o)),{startAuthentication:l}=await e(async()=>{let{startAuthentication:e}=await import(`./esm-BFCrCNMJ.js`);return{startAuthentication:e}},[]),u=await l({optionsJSON:c.options}),f=s(await d(`/remote/auth/finish`,{challengeId:c.challengeId,response:u},o));if(a(o),!f.authenticated||f.deviceId!==t)throw new n(`The passkey sign-in did not complete.`);return r=f,f}async function b(){let e=r,t=++i;r=null;try{if(e?.authenticated&&e.capabilities.push)try{await f(`/remote/push/subscribe`,e.csrfToken)}catch{}await d(`/remote/logout`,{},void 0,e?.csrfToken)}finally{t===i&&(r=null)}}async function x(e){if(r?.authenticated!==!0||r.capabilities.push!==!0)throw new n(`Phone notifications are not enabled by this gateway.`);await d(`/remote/push/subscribe`,e.toJSON())}async function S(){if(r?.authenticated!==!0||r.capabilities.push!==!0)throw new n(`Phone notifications are not enabled by this gateway.`);let e=await l(`/remote/push/config`);if(!o(e)||typeof e.publicKey!=`string`||!/^[A-Za-z0-9_-]{80,120}$/.test(e.publicKey))throw new n(`The gateway push key is unavailable.`);return e.publicKey}async function C(t,i,a){if(!m())throw new n(r?.authenticated&&typeof r.expiresAt==`number`&&r.expiresAt<=Date.now()+5e3?`The phone session is refreshing. No action was sent.`:`This gateway is read-only. No action was sent.`);if(t===`POST`&&w(i))return await d(i,a);let o={method:t,path:i,body:JSON.stringify(a??{})},s=g(await d(`/remote/step-up/begin`,o)),{startAuthentication:c}=await e(async()=>{let{startAuthentication:e}=await import(`./esm-BFCrCNMJ.js`);return{startAuthentication:e}},[]),l=await c({optionsJSON:s.options});return await d(`/remote/step-up/finish`,{...o,challengeId:s.challengeId,response:l})}function w(e){return e===`/api/verse/activity/seen`||e===`/api/verse/sessions`||e===`/api/verse/leader/thread`||e===`/api/verse/leader/directives`||/^\/api\/verse\/sessions\/[^/?#]+\/turns$/.test(e)||/^\/api\/verse\/queue\/[^/?#]+$/.test(e)||/^\/api\/verse\/leader\/questions\/[^/?#]+\/answer$/.test(e)||/^\/api\/verse\/(cloud|devin)\/tasks\/[^/?#]+\/dismiss$/.test(e)}export{n as RemoteClientError,y as authenticateRemoteDevice,_ as claimRemotePairing,h as currentRemoteSession,b as logoutRemoteDevice,p as probeRemoteSession,u as remoteApiGet,C as remoteMutate,v as remotePairStatus,S as remotePushPublicKey,x as subscribeRemotePush};
3
+ //# sourceMappingURL=remote-session-BdCVlRRZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":";4EAiBA,IAAa,EAAb,cAAuC,KAAM,CACL,OAAtC,YAAY,EAAiB,EAAiC,KAAM,CAClE,MAAM,CAAO,EADuB,cAEpC,KAAK,KAAO,mBACd,CACF,EAEI,EAAgC,KAEhC,EAAkB,EAEtB,SAAS,EAAc,EAAoC,CACzD,GAAI,IAAa,QAAa,IAAa,EACzC,MAAM,IAAI,EAAkB,uCAAuC,CAEvE,CAEA,SAAS,EAAO,EAAkD,CAChE,OAAyB,OAAO,GAAU,YAAnC,GAA+C,CAAC,MAAM,QAAQ,CAAK,CAC5E,CAEA,SAAS,EAAa,EAA+B,CACnD,GAAI,CAAC,EAAO,CAAK,GAAK,OAAO,EAAM,eAAkB,WAChD,OAAO,EAAM,WAAc,UAAY,EAAM,UAAU,OAAS,IAAM,EAAM,UAAU,OAAS,KAC/F,CAAC,EAAO,EAAM,YAAY,GAAK,EAAM,aAAa,SAAW,IAAQ,EAAM,aAAa,SAAW,GACtG,MAAM,IAAI,EAAkB,4DAA4D,EAE1F,GAAI,CAAC,EAAM,cAAe,MAAO,CAC/B,cAAe,GAAO,UAAW,EAAM,UACvC,aAAc,CAAE,OAAQ,GAAO,QAAS,EAAM,aAAa,UAAY,GAAM,KAAM,EAAM,aAAa,OAAS,EAAK,CACtH,EACA,IAAM,EAAS,EAAM,OACrB,GAAI,OAAO,EAAM,UAAa,UAAY,CAAC,EAAM,UAAY,OAAO,EAAM,OAAU,UAC/E,CAAC,EAAO,CAAM,GAAK,EAAO,OAAS,IAAQ,OAAO,EAAO,KAAQ,WACjE,OAAO,EAAM,WAAc,UAAY,CAAC,OAAO,SAAS,EAAM,SAAS,GAAK,EAAM,WAAa,KAAK,IAAI,EAC3G,MAAM,IAAI,EAAkB,oEAAoE,EAElG,MAAO,CACL,cAAe,GAAM,UAAW,EAAM,UACtC,aAAc,CAAE,OAAQ,EAAM,aAAa,SAAW,GAAM,QAAS,EAAM,aAAa,UAAY,GAAM,KAAM,EAAM,aAAa,OAAS,EAAK,EACjJ,SAAU,EAAM,SAAU,MAAO,EAAM,MAAO,OAAQ,CAAE,KAAM,GAAM,IAAK,EAAO,GAAI,EAAG,UAAW,EAAM,SAC1G,CACF,CAEA,eAAe,EAAa,EAAe,EAAqC,CAE9E,GADA,EAAc,CAAQ,EAClB,EAAI,OAAS,kBAAoB,EAAI,QAAU,KAAO,EAAI,OAAS,KAClE,EAAI,QAAQ,IAAI,cAAc,CAAC,EAAE,SAAS,WAAW,EAIxD,KAHA,GAAU,KACV,GAAmB,GACnB,kBAAC,kCAAM,OAAO,mEAAoB,8CAAqB,EACjD,IAAI,EAAkB,wEAAyE,GAAG,EAE1G,GAAI,EAAI,SAAW,IAIjB,KAHA,GAAU,KACV,GAAmB,GACnB,kBAAC,kCAAM,OAAO,mEAAoB,8CAAqB,EACjD,IAAI,EAAkB,kDAAmD,GAAG,EAEpF,IAAI,EACJ,GAAI,CAAE,EAAQ,MAAM,EAAI,KAAK,CAAG,MAAQ,CAAE,MAAM,IAAI,EAAkB,yCAA0C,EAAI,MAAM,CAAG,CAE7H,GADA,EAAc,CAAQ,EAClB,CAAC,EAAI,GAEP,MAAM,IAAI,EADM,EAAO,CAAK,GAAK,OAAO,EAAM,OAAU,SAAW,EAAM,MAAM,MAAM,EAAG,GAAG,EAAI,yCAC1D,EAAI,MAAM,EAEjD,OAAO,CACT,CAEA,eAAe,EAAU,EAAc,EAAqC,CAE1E,OAAO,EAAa,MADF,MAAM,EAAM,CAAE,OAAQ,MAAO,YAAa,cAAe,MAAO,WAAY,SAAU,QAAS,CAAC,EACzF,CAAQ,CACnC,CAGA,eAAsB,EAAgB,EAAc,EAAkC,CACpF,IAAM,EAAW,EACX,EAAM,MAAM,MAAM,EAAM,CAAE,OAAQ,MAAO,YAAa,cAAe,MAAO,WAAY,SAAU,SAAU,QAAO,CAAC,EAC1H,GAAI,EAAI,OAAS,kBAAoB,EAAI,QAAU,KAAO,EAAI,OAAS,KAClE,EAAI,QAAQ,IAAI,cAAc,CAAC,EAAE,SAAS,WAAW,EAMxD,MALI,IAAa,IACf,EAAU,KACV,GAAmB,GACnB,kBAAC,kCAAM,OAAO,mEAAoB,8CAAqB,GAEnD,IAAI,EAAS,8DAA+D,IAAK,CAAI,EAE7F,GAAI,EAAI,SAAW,IAMjB,MALI,IAAa,IACf,EAAU,KACV,GAAmB,GACnB,kBAAC,kCAAM,OAAO,mEAAoB,8CAAqB,GAEnD,IAAI,EAAS,yBAA0B,IAAK,CAAI,EAExD,GAAI,CAAC,EAAI,GAAI,CACX,IAAI,EAAwB,KACxB,EAAsB,KAC1B,GAAI,CACF,IAAM,EAAQ,MAAM,EAAI,KAAK,EACzB,OAAO,EAAM,OAAU,WAAU,EAAS,EAAM,OAChD,OAAO,EAAM,MAAS,WAAU,EAAO,EAAM,KACnD,MAAQ,CAA2B,CACnC,MAAM,IAAI,EAAS,OAAO,EAAK,gBAAgB,EAAI,OAAO,IAAK,EAAI,OAAQ,EAAM,EAAQ,CAAI,CAC/F,CACA,OAAO,MAAM,EAAI,KAAK,CACxB,CAEA,eAAe,EAAW,EAAc,EAAe,EAAmB,EAAyC,CACjH,IAAM,EAAW,GAAY,EAC7B,EAAc,CAAQ,EACtB,IAAM,EAAO,GAAgB,GAAS,UACtC,GAAI,CAAC,EAAM,MAAM,IAAI,EAAkB,sDAAsD,EAC7F,IAAM,EAAM,MAAM,MAAM,EAAM,CAC5B,OAAQ,OAAQ,YAAa,cAAe,MAAO,WAAY,SAAU,SACzE,QAAS,CAAE,eAAgB,mBAAoB,sBAAuB,CAAK,EAC3E,KAAM,KAAK,UAAU,GAAQ,CAAC,CAAC,CACjC,CAAC,EAED,OADI,EAAI,SAAW,KAAO,EAAc,CAAQ,EAAU,MACnD,EAAa,EAAK,CAAQ,CACnC,CAEA,eAAe,EAAa,EAAc,EAAsC,CAC9E,IAAM,EAAO,GAAgB,GAAS,UACtC,GAAI,CAAC,EAAM,MAAM,IAAI,EAAkB,sDAAsD,EAC7F,IAAM,EAAM,MAAM,MAAM,EAAM,CAC5B,OAAQ,SAAU,YAAa,cAAe,MAAO,WAAY,SAAU,SAC3E,QAAS,CAAE,sBAAuB,CAAK,CACzC,CAAC,EACD,GAAI,EAAI,SAAW,IAAK,MAAM,IAAI,EAAkB,2DAA4D,EAAI,MAAM,CAC5H,CAGA,eAAsB,GAA6C,CACjE,IAAM,EAAW,EAAE,EACnB,GAAI,CACF,IAAM,EAAO,EAAa,MAAM,EAAU,kBAAmB,CAAQ,CAAC,EAGtE,OAFA,EAAc,CAAQ,EACtB,EAAU,EACH,CACT,OAAS,EAAO,CAEd,MADI,IAAa,IAAiB,EAAU,MACtC,CACR,CACF,CAEA,SAAgB,GAA0B,CACxC,OAAO,GAAS,gBAAkB,IAAQ,EAAQ,QAAQ,MAAQ,IAAQ,EAAQ,aAAa,QAC1F,OAAO,EAAQ,WAAc,UAAY,KAAK,IAAI,EAAI,IAAQ,EAAQ,SAC7E,CAEA,SAAgB,GAA6C,CAAE,OAAO,CAAS,CAI/E,SAAS,EAAU,EAAyF,CAC1G,GAAI,CAAC,EAAO,CAAK,GAAK,OAAO,EAAM,aAAgB,UAAY,CAAC,EAAM,aAAe,CAAC,EAAO,EAAM,OAAO,GACrG,OAAO,EAAM,QAAQ,WAAc,SACtC,MAAM,IAAI,EAAkB,yDAAyD,EAEvF,MAAO,CAAE,YAAa,EAAM,YAAa,QAAS,EAAM,OAA4D,CACtH,CAEA,eAAsB,EAAmB,EAAc,EAA+C,CACpG,IAAM,EAAU,MAAM,EAAW,qBAAsB,CAAE,KAAM,EAAK,KAAK,EAAG,MAAO,EAAM,KAAK,CAAE,CAAC,EACjG,GAAI,CAAC,EAAO,CAAO,GAAK,OAAO,EAAQ,WAAc,UAAY,CAAC,EAAQ,WAAa,CAAC,EAAO,EAAQ,OAAO,GACzG,OAAO,EAAQ,QAAQ,WAAc,SACxC,MAAM,IAAI,EAAkB,yDAAyD,EAEvF,GAAM,CAAE,uCAAF,IAAE,qBAAsB,MAAM,OAAO,sDACrC,EAAW,MAAM,EAAkB,CAAE,YAAa,EAAQ,OAA6D,CAAC,EACxH,EAAY,MAAM,EAAW,wBAAyB,CAAE,UAAW,EAAQ,UAAW,UAAS,CAAC,EACtG,GAAI,CAAC,EAAO,CAAS,GAAK,EAAU,kBAAoB,GACtD,MAAM,IAAI,EAAkB,2CAA2C,EAEzE,MAAO,CAAE,UAAW,EAAQ,SAAU,CACxC,CAEA,eAAsB,EAAiB,EAA6F,CAClI,IAAM,EAAQ,MAAM,EAAU,iCAAiC,mBAAmB,CAAS,GAAG,EAC9F,GAAI,CAAC,EAAO,CAAK,GAAK,EAAM,QAAU,WAAa,EAAM,QAAU,YAAc,EAAM,QAAU,SAC/F,MAAM,IAAI,EAAkB,oCAAoC,EAElE,GAAI,EAAM,QAAU,WAAY,CAC9B,GAAI,OAAO,EAAM,UAAa,UAAY,CAAC,EAAM,SAAU,MAAM,IAAI,EAAkB,qCAAqC,EAC5H,MAAO,CAAE,MAAO,WAAY,SAAU,EAAM,QAAS,CACvD,CACA,MAAO,CAAE,MAAO,EAAM,KAAM,CAC9B,CAEA,eAAsB,EAAyB,EAA0C,CACvF,IAAM,EAAW,EAAE,EACb,EAAU,EAAU,MAAM,EAAW,qBAAsB,CAAE,UAAS,EAAG,CAAQ,CAAC,EAClF,CAAE,yCAAF,IAAE,uBAAwB,MAAM,OAAO,wDACvC,EAAW,MAAM,EAAoB,CAAE,YAAa,EAAQ,OAAQ,CAAC,EACrE,EAAO,EAAa,MAAM,EAAW,sBAAuB,CAAE,YAAa,EAAQ,YAAa,UAAS,EAAG,CAAQ,CAAC,EAE3H,GADA,EAAc,CAAQ,EAClB,CAAC,EAAK,eAAiB,EAAK,WAAa,EAAU,MAAM,IAAI,EAAkB,uCAAuC,EAE1H,MADA,GAAU,EACH,CACT,CAEA,eAAsB,GAAoC,CACxD,IAAM,EAAW,EACX,EAAW,EAAE,EACnB,EAAU,KACV,GAAI,CAIF,GAAI,GAAU,eAAiB,EAAS,aAAa,KACnD,GAAI,CAAE,MAAM,EAAa,yBAA0B,EAAS,SAAS,CAAG,MAClE,CAAyD,CAEjE,MAAM,EAAW,iBAAkB,CAAC,EAAG,OAAW,GAAU,SAAS,CACvE,QAAU,CAIJ,IAAa,IAAiB,EAAU,KAC9C,CACF,CAGA,eAAsB,EAAoB,EAA+C,CACvF,GAAI,GAAS,gBAAkB,IAAQ,EAAQ,aAAa,OAAS,GACnE,MAAM,IAAI,EAAkB,sDAAsD,EAEpF,MAAM,EAAW,yBAA0B,EAAa,OAAO,CAAC,CAClE,CAEA,eAAsB,GAAuC,CAC3D,GAAI,GAAS,gBAAkB,IAAQ,EAAQ,aAAa,OAAS,GACnE,MAAM,IAAI,EAAkB,sDAAsD,EAEpF,IAAM,EAAQ,MAAM,EAAU,qBAAqB,EACnD,GAAI,CAAC,EAAO,CAAK,GAAK,OAAO,EAAM,WAAc,UAAY,CAAC,0BAA0B,KAAK,EAAM,SAAS,EAC1G,MAAM,IAAI,EAAkB,sCAAsC,EAEpE,OAAO,EAAM,SACf,CAGA,eAAsB,EAAgB,EAA2B,EAAc,EAA2B,CACxG,GAAI,CAAC,EAAe,EAAG,MAAM,IAAI,EAAkB,GAAS,eAAiB,OAAO,EAAQ,WAAc,UACrG,EAAQ,WAAa,KAAK,IAAI,EAAI,IACnC,uDACA,gDAAgD,EACpD,GAAI,IAAW,QAAU,EAAgB,CAAI,EAAG,OAAO,MAAM,EAAW,EAAM,CAAI,EAElF,IAAM,EAAY,CAAE,SAAQ,OAAM,KADpB,KAAK,UAAU,GAAQ,CAAC,CACE,CAAM,EACxC,EAAU,EAAU,MAAM,EAAW,wBAAyB,CAAS,CAAC,EACxE,CAAE,yCAAF,IAAE,uBAAwB,MAAM,OAAO,wDACvC,EAAW,MAAM,EAAoB,CAAE,YAAa,EAAQ,OAAQ,CAAC,EAE3E,OAAO,MADc,EAAW,yBAA0B,CAAE,GAAG,EAAW,YAAa,EAAQ,YAAa,UAAS,CAAC,CAExH,CAGA,SAAgB,EAAgB,EAAuB,CACrD,OAAO,IAAS,4BACX,IAAS,uBACT,IAAS,4BACT,IAAS,gCACT,2CAA2C,KAAK,CAAI,GACpD,iCAAiC,KAAK,CAAI,GAC1C,qDAAqD,KAAK,CAAI,GAC9D,yDAAyD,KAAK,CAAI,CACzE","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/data/remote-session.ts"],"sourcesContent":["/** Cookie-bound phone session. No Hub read or mutation token enters this module. */\nimport type {\n PublicKeyCredentialCreationOptionsJSON,\n PublicKeyCredentialRequestOptionsJSON,\n} from '@simplewebauthn/browser';\nimport { ApiError } from './client.js';\n\nexport interface RemoteSession {\n authenticated: boolean;\n csrfToken: string;\n capabilities: { writes: boolean; pairing: boolean; push: boolean };\n deviceId?: string;\n label?: string;\n scopes?: { read: boolean; act: boolean };\n expiresAt?: number;\n}\n\nexport class RemoteClientError extends Error {\n constructor(message: string, readonly status: number | null = null) {\n super(message);\n this.name = 'RemoteClientError';\n }\n}\n\nlet session: RemoteSession | null = null;\n// Superseded checks and passkey requests cannot restore a signed-out session.\nlet sessionRevision = 0;\n\nfunction assertCurrent(revision: number | undefined): void {\n if (revision !== undefined && revision !== sessionRevision) {\n throw new RemoteClientError('The phone session changed. Try again.');\n }\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction parseSession(value: unknown): RemoteSession {\n if (!record(value) || typeof value.authenticated !== 'boolean'\n || typeof value.csrfToken !== 'string' || value.csrfToken.length < 16 || value.csrfToken.length > 256\n || !record(value.capabilities) || value.capabilities.writes !== true && value.capabilities.writes !== false) {\n throw new RemoteClientError('The phone session answer was incomplete. Nothing was sent.');\n }\n if (!value.authenticated) return {\n authenticated: false, csrfToken: value.csrfToken,\n capabilities: { writes: false, pairing: value.capabilities.pairing === true, push: value.capabilities.push === true },\n };\n const scopes = value.scopes;\n if (typeof value.deviceId !== 'string' || !value.deviceId || typeof value.label !== 'string'\n || !record(scopes) || scopes.read !== true || typeof scopes.act !== 'boolean'\n || typeof value.expiresAt !== 'number' || !Number.isFinite(value.expiresAt) || value.expiresAt <= Date.now()) {\n throw new RemoteClientError('The paired device session could not be verified. Nothing was sent.');\n }\n return {\n authenticated: true, csrfToken: value.csrfToken,\n capabilities: { writes: value.capabilities.writes === true, pairing: value.capabilities.pairing === true, push: value.capabilities.push === true },\n deviceId: value.deviceId, label: value.label, scopes: { read: true, act: scopes.act }, expiresAt: value.expiresAt,\n };\n}\n\nasync function jsonResponse(res: Response, revision?: number): Promise<unknown> {\n assertCurrent(revision);\n if (res.type === 'opaqueredirect' || res.status >= 300 && res.status < 400\n || res.headers.get('content-type')?.includes('text/html')) {\n session = null;\n sessionRevision += 1;\n (await import('./auth-store.js')).reportSessionExpired();\n throw new RemoteClientError('Cloudflare Access sign-in expired. Reload this page to sign in again.', 401);\n }\n if (res.status === 401) {\n session = null;\n sessionRevision += 1;\n (await import('./auth-store.js')).reportSessionExpired();\n throw new RemoteClientError('Phone sign-in expired. Reload to sign in again.', 401);\n }\n let value: unknown;\n try { value = await res.json(); } catch { throw new RemoteClientError('The phone gateway did not return JSON.', res.status); }\n assertCurrent(revision);\n if (!res.ok) {\n const message = record(value) && typeof value.error === 'string' ? value.error.slice(0, 240) : 'The phone gateway refused the request.';\n throw new RemoteClientError(message, res.status);\n }\n return value;\n}\n\nasync function remoteGet(path: string, revision?: number): Promise<unknown> {\n const res = await fetch(path, { method: 'GET', credentials: 'same-origin', cache: 'no-store', redirect: 'manual' });\n return jsonResponse(res, revision);\n}\n\n/** Remote API reads use only the paired cookie; Access HTML/redirect locks UI. */\nexport async function remoteApiGet<T>(path: string, signal?: AbortSignal): Promise<T> {\n const revision = sessionRevision;\n const res = await fetch(path, { method: 'GET', credentials: 'same-origin', cache: 'no-store', redirect: 'manual', signal });\n if (res.type === 'opaqueredirect' || res.status >= 300 && res.status < 400\n || res.headers.get('content-type')?.includes('text/html')) {\n if (revision === sessionRevision) {\n session = null;\n sessionRevision += 1;\n (await import('./auth-store.js')).reportSessionExpired();\n }\n throw new ApiError('Cloudflare Access sign-in expired. Reload to sign in again.', 401, path);\n }\n if (res.status === 401) {\n if (revision === sessionRevision) {\n session = null;\n sessionRevision += 1;\n (await import('./auth-store.js')).reportSessionExpired();\n }\n throw new ApiError('Phone session expired.', 401, path);\n }\n if (!res.ok) {\n let detail: string | null = null;\n let code: string | null = null;\n try {\n const value = await res.json() as { error?: unknown; code?: unknown };\n if (typeof value.error === 'string') detail = value.error;\n if (typeof value.code === 'string') code = value.code;\n } catch { /* a non-JSON refusal */ }\n throw new ApiError(`GET ${path} failed (HTTP ${res.status}).`, res.status, path, detail, code);\n }\n return await res.json() as T;\n}\n\nasync function remotePost(path: string, body: unknown, revision?: number, csrfOverride?: string): Promise<unknown> {\n const expected = revision ?? sessionRevision;\n assertCurrent(expected);\n const csrf = csrfOverride ?? session?.csrfToken;\n if (!csrf) throw new RemoteClientError('Connect this phone to the gateway before continuing.');\n const res = await fetch(path, {\n method: 'POST', credentials: 'same-origin', cache: 'no-store', redirect: 'manual',\n headers: { 'Content-Type': 'application/json', 'x-ashlr-remote-csrf': csrf },\n body: JSON.stringify(body ?? {}),\n });\n if (res.status === 204) { assertCurrent(expected); return null; }\n return jsonResponse(res, expected);\n}\n\nasync function remoteDelete(path: string, csrfOverride?: string): Promise<void> {\n const csrf = csrfOverride ?? session?.csrfToken;\n if (!csrf) throw new RemoteClientError('Connect this phone to the gateway before continuing.');\n const res = await fetch(path, {\n method: 'DELETE', credentials: 'same-origin', cache: 'no-store', redirect: 'manual',\n headers: { 'x-ashlr-remote-csrf': csrf },\n });\n if (res.status !== 204) throw new RemoteClientError('The Mac could not remove this phone’s push subscription.', res.status);\n}\n\n/** A fresh cookie and CSRF token come from the gateway, never browser storage. */\nexport async function probeRemoteSession(): Promise<RemoteSession> {\n const revision = ++sessionRevision;\n try {\n const next = parseSession(await remoteGet('/remote/session', revision));\n assertCurrent(revision);\n session = next;\n return next;\n } catch (error) {\n if (revision === sessionRevision) session = null;\n throw error;\n }\n}\n\nexport function canRemoteWrite(): boolean {\n return session?.authenticated === true && session.scopes?.act === true && session.capabilities.writes\n && typeof session.expiresAt === 'number' && Date.now() + 5_000 < session.expiresAt;\n}\n\nexport function currentRemoteSession(): RemoteSession | null { return session; }\n\nexport function clearRemoteSessionForTest(): void { session = null; sessionRevision += 1; }\n\nfunction challenge(value: unknown): { challengeId: string; options: PublicKeyCredentialRequestOptionsJSON } {\n if (!record(value) || typeof value.challengeId !== 'string' || !value.challengeId || !record(value.options)\n || typeof value.options.challenge !== 'string') {\n throw new RemoteClientError('The passkey challenge was incomplete. Nothing was sent.');\n }\n return { challengeId: value.challengeId, options: value.options as unknown as PublicKeyCredentialRequestOptionsJSON };\n}\n\nexport async function claimRemotePairing(code: string, label: string): Promise<{ pendingId: string }> {\n const started = await remotePost('/remote/pair/claim', { code: code.trim(), label: label.trim() });\n if (!record(started) || typeof started.pendingId !== 'string' || !started.pendingId || !record(started.options)\n || typeof started.options.challenge !== 'string') {\n throw new RemoteClientError('The pairing challenge was incomplete. Nothing was sent.');\n }\n const { startRegistration } = await import('@simplewebauthn/browser');\n const response = await startRegistration({ optionsJSON: started.options as unknown as PublicKeyCredentialCreationOptionsJSON });\n const completed = await remotePost('/remote/pair/complete', { pendingId: started.pendingId, response });\n if (!record(completed) || completed.pendingApproval !== true) {\n throw new RemoteClientError('Pairing still needs approval on your Mac.');\n }\n return { pendingId: started.pendingId };\n}\n\nexport async function remotePairStatus(pendingId: string): Promise<{ state: 'pending' | 'approved' | 'denied'; deviceId?: string }> {\n const value = await remoteGet(`/remote/pair/status?pendingId=${encodeURIComponent(pendingId)}`);\n if (!record(value) || value.state !== 'pending' && value.state !== 'approved' && value.state !== 'denied') {\n throw new RemoteClientError('The pairing status was incomplete.');\n }\n if (value.state === 'approved') {\n if (typeof value.deviceId !== 'string' || !value.deviceId) throw new RemoteClientError('The approved device ID was missing.');\n return { state: 'approved', deviceId: value.deviceId };\n }\n return { state: value.state };\n}\n\nexport async function authenticateRemoteDevice(deviceId: string): Promise<RemoteSession> {\n const revision = ++sessionRevision;\n const started = challenge(await remotePost('/remote/auth/begin', { deviceId }, revision));\n const { startAuthentication } = await import('@simplewebauthn/browser');\n const response = await startAuthentication({ optionsJSON: started.options });\n const next = parseSession(await remotePost('/remote/auth/finish', { challengeId: started.challengeId, response }, revision));\n assertCurrent(revision);\n if (!next.authenticated || next.deviceId !== deviceId) throw new RemoteClientError('The passkey sign-in did not complete.');\n session = next;\n return next;\n}\n\nexport async function logoutRemoteDevice(): Promise<void> {\n const previous = session;\n const revision = ++sessionRevision;\n session = null;\n try {\n // Stop this device's generic alerts before dropping the cookie. Failure\n // must not prevent sign-out; Mac-side device revocation is the authority\n // when a lost or offline phone cannot complete either request.\n if (previous?.authenticated && previous.capabilities.push) {\n try { await remoteDelete('/remote/push/subscribe', previous.csrfToken); }\n catch { /* continue with logout even if push is unavailable */ }\n }\n await remotePost('/remote/logout', {}, undefined, previous?.csrfToken);\n } finally {\n // The server may be offline, but this page must immediately lose its\n // in-memory session and act capability. The HttpOnly cookie is only\n // cleared by a successful server response or by Mac-side revocation.\n if (revision === sessionRevision) session = null;\n }\n}\n\n/** Push is dormant until the gateway explicitly advertises and mounts it. */\nexport async function subscribeRemotePush(subscription: PushSubscription): Promise<void> {\n if (session?.authenticated !== true || session.capabilities.push !== true) {\n throw new RemoteClientError('Phone notifications are not enabled by this gateway.');\n }\n await remotePost('/remote/push/subscribe', subscription.toJSON());\n}\n\nexport async function remotePushPublicKey(): Promise<string> {\n if (session?.authenticated !== true || session.capabilities.push !== true) {\n throw new RemoteClientError('Phone notifications are not enabled by this gateway.');\n }\n const value = await remoteGet('/remote/push/config');\n if (!record(value) || typeof value.publicKey !== 'string' || !/^[A-Za-z0-9_-]{80,120}$/.test(value.publicKey)) {\n throw new RemoteClientError('The gateway push key is unavailable.');\n }\n return value.publicKey;\n}\n\n/** A server capability enables this later; stage 3 returns writes:false. */\nexport async function remoteMutate<T>(method: 'POST' | 'DELETE', path: string, body: unknown): Promise<T> {\n if (!canRemoteWrite()) throw new RemoteClientError(session?.authenticated && typeof session.expiresAt === 'number'\n && session.expiresAt <= Date.now() + 5_000\n ? 'The phone session is refreshing. No action was sent.'\n : 'This gateway is read-only. No action was sent.');\n if (method === 'POST' && directCsrfWrite(path)) return await remotePost(path, body) as T;\n const bytes = JSON.stringify(body ?? {});\n const operation = { method, path, body: bytes };\n const started = challenge(await remotePost('/remote/step-up/begin', operation));\n const { startAuthentication } = await import('@simplewebauthn/browser');\n const response = await startAuthentication({ optionsJSON: started.options });\n const result = await remotePost('/remote/step-up/finish', { ...operation, challengeId: started.challengeId, response });\n return result as T;\n}\n\n/** Mirrors only gateway routes classified low-risk; unknown paths step up. */\nexport function directCsrfWrite(path: string): boolean {\n return path === '/api/verse/activity/seen'\n || path === '/api/verse/sessions'\n || path === '/api/verse/leader/thread'\n || path === '/api/verse/leader/directives'\n || /^\\/api\\/verse\\/sessions\\/[^/?#]+\\/turns$/.test(path)\n || /^\\/api\\/verse\\/queue\\/[^/?#]+$/.test(path)\n || /^\\/api\\/verse\\/leader\\/questions\\/[^/?#]+\\/answer$/.test(path)\n || /^\\/api\\/verse\\/(cloud|devin)\\/tasks\\/[^/?#]+\\/dismiss$/.test(path);\n}\n"],"file":"remote-session-BdCVlRRZ.js"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-BMfejJ9u.js";var n=e(t(),1),r=new Map,i=new Set;function a(){for(let e of[...i])e()}function o(e,t=Date.now()){r=new Map(r).set(e,t),a()}function s(e,t=Date.now()){let n=!1,i=new Map(r);for(let[r,a]of i)(!e.has(r)||t-a>6e4)&&(i.delete(r),n=!0);n&&(r=i,a())}function c(){return(0,n.useSyncExternalStore)(e=>(i.add(e),()=>i.delete(e)),()=>r,()=>r)}export{s as n,c as r,o as t};
2
+ //# sourceMappingURL=resolved-store-B1xwZl7x.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolved-store-B1xwZl7x.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/resolved-store.ts"],"sourcesContent":["/**\n * routes/verse/shell/resolved-store.ts — which Needs-you items were just\n * acted on, so every list hides them at once (optimistic) until a poll no\n * longer lists them, or 60 s pass.\n *\n * Split out of needs-you-actions.ts, which re-exports all of it, so a\n * surface that only COUNTS what is waiting (the phone app's tab badge, at\n * first paint) does not download the action runner and the row model.\n */\nimport { useSyncExternalStore } from 'react';\n\n/** How long an acted-on item stays hidden while the server catches up. */\nexport const RESOLVED_HIDE_MS = 60_000;\n\nlet resolved = new Map<string, number>();\nconst listeners = new Set<() => void>();\n\nfunction emit(): void {\n for (const l of [...listeners]) l();\n}\n\nexport function markResolved(id: string, at: number = Date.now()): void {\n resolved = new Map(resolved).set(id, at);\n emit();\n}\n\n/** Drop marks the server has caught up with (the id is gone) or that are too old. */\nexport function pruneResolved(liveIds: ReadonlySet<string>, now: number = Date.now()): void {\n let changed = false;\n const next = new Map(resolved);\n for (const [id, at] of next) {\n if (!liveIds.has(id) || now - at > RESOLVED_HIDE_MS) {\n next.delete(id);\n changed = true;\n }\n }\n if (changed) {\n resolved = next;\n emit();\n }\n}\n\nexport function useResolvedIds(): ReadonlyMap<string, number> {\n return useSyncExternalStore(\n (l) => {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n () => resolved,\n () => resolved,\n );\n}\n\nexport function resetResolvedForTest(): void {\n resolved = new Map();\n emit();\n}\n"],"mappings":"0GAcI,EAAW,IAAI,IACb,EAAY,IAAI,IAEtB,SAAS,GAAa,CACpB,IAAK,IAAM,IAAK,CAAC,GAAG,CAAS,EAAG,EAAE,CACpC,CAEA,SAAgB,EAAa,EAAY,EAAa,KAAK,IAAI,EAAS,CACtE,EAAW,IAAI,IAAI,CAAQ,CAAC,CAAC,IAAI,EAAI,CAAE,EACvC,EAAK,CACP,CAGA,SAAgB,EAAc,EAA8B,EAAc,KAAK,IAAI,EAAS,CAC1F,IAAI,EAAU,GACR,EAAO,IAAI,IAAI,CAAQ,EAC7B,IAAK,GAAM,CAAC,EAAI,KAAO,GACjB,CAAC,EAAQ,IAAI,CAAE,GAAK,EAAM,EAAA,OAC5B,EAAK,OAAO,CAAE,EACd,EAAU,IAGV,IACF,EAAW,EACX,EAAK,EAET,CAEA,SAAgB,GAA8C,CAC5D,OAAA,EAAO,EAAA,qBAAA,CACJ,IACC,EAAU,IAAI,CAAC,MACF,EAAU,OAAO,CAAC,OAE3B,MACA,CACR,CACF"}
@@ -0,0 +1,2 @@
1
+ import{i as e,t}from"./global-7hs7NyAO.js";import{H as n,R as r,V as i,s as a}from"./verse-model-DAOz9LrY.js";import{n as o,t as s}from"./capacity-strip-model-w-CrM5cb.js";import{l as c,t as l}from"./types-IYKrYLku.js";import{o as u}from"./local-model-C9xNi9fN.js";var d=`/api/verse/budget/readiness`,f=new Set([`spent`,`signed-out`,`unavailable`]),p=[[`usable`,`usable`],[`low`,`running low`],[`spent`,`spent`],[`signed-out`,`signed out`],[`unavailable`,`unavailable`]];function m(e,t){let n=e.filter(e=>e.kind===`subscription`).map(e=>s(e,{healthRead:t.healthRead,...t.now===void 0?{}:{now:t.now}}).kind),r=new Map;for(let e of n)r.set(e,(r.get(e)??0)+1);let i=p.filter(([e])=>r.has(e)).map(([e,t])=>`${r.get(e)} ${t}`).join(` · `),a=`unknown`;return n.some(e=>f.has(e))?a=`alert`:n.includes(`low`)?a=`tight`:n.includes(`usable`)&&(a=`ok`),{tone:a,spoken:i||(n.length===0?`no accounts connected`:`not read yet`)}}function h(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function g(e){return typeof e==`number`&&Number.isFinite(e)?e:null}function _(e){return typeof e==`string`&&e.trim().length>0?e.trim():null}var v=`An estimate from the sessions Verse launched — the real balance is on claude.ai.`;function y(e){let t=h(e),n=h(t?.budget);if(!t||!n)return null;let r=g(n.creditsTotalUsd),i=g(n.estimatedSpentUsd),a=g(n.estimatedRemainingUsd);if(r===null||i===null&&a===null)return null;let o=Math.max(0,a??r-(i??0)),s=h(t.seat),c=h(n.canLaunch),u=_(n.balanceUrl),d=h(n.budget);return{totalUsd:r,spentUsd:i??Math.max(0,r-o),remainingUsd:o,remainingPercent:r>0?Math.max(0,Math.min(100,o/r*100)):0,running:Math.max(0,g(n.running)??0),sessionsToday:Math.max(0,g(n.sessionsToday)??0),maxSessionsPerDay:g(d?.maxSessionsPerDay),seatReady:s?.ready!==!1,seatReason:_(s?.reason),canLaunch:c?.ok!==!1,canLaunchReason:_(c?.reason),estimateNote:_(n.estimateNote)??v,balanceUrl:u!==null&&u.startsWith(`https://claude.ai/`)?u:l}}function b(e){let t=Math.max(0,e);return t>=100||Number.isInteger(t)?`$${Math.round(t)}`:`$${t.toFixed(2)}`}var x={"llama-server":`llama-server`,ollama:`Ollama`,vllm:`vLLM`,unknown:`Serving runtime`},S={running:`Running`,starting:`Starting…`,stopping:`Stopping…`,stopped:`Stopped`,unknown:`State not reported`};function C(e){if(!e)return null;let t=[];e.model&&t.push(u(e.model)),e.contextTokens!==null&&t.push(`${a(e.contextTokens)} context per agent`),e.slotsTotal!==null&&e.slotsTotal>0&&t.push(e.slotsBusy===null?`${e.slotsTotal} slots`:`${e.slotsBusy} of ${e.slotsTotal} slots busy`);let n=e.state;return{name:x[e.kind]??x.unknown,state:n,word:S[n]??S.unknown,tone:n===`running`?`success`:n===`starting`||n===`stopping`?`warning`:`neutral`,detail:t.length>0?t.join(` · `):null,canStart:e.supervised&&n===`stopped`,canStop:e.supervised&&n===`running`,managedElsewhere:!e.supervised}}function w(e){let t=e.configuredContext,n=e.nativeContext;return t!==null&&e.contextTruncated&&n!==null?`${a(t)} of ${a(n)} context`:t===null?n===null?null:`${a(n)} context`:`${a(t)} context`}function T(e){if(typeof e!=`string`)return``;try{let t=new URL(e);return t.port?`:${t.port}`:t.host}catch{return``}}function E(e){let t=Array.isArray(e.models)?e.models:[],n=0;for(let e of t){let t=h(e);(t?.state===`loaded`||t?.loaded===!0)&&(n+=1)}return{installed:t.length,loaded:n}}function D(e,t,n){let r=h(n);if(!r)return null;let i=T(r.baseUrl);if(r.reachable!==!0)return{id:e,name:t,tone:`neutral`,word:`Not running`,detail:i?`nothing answering on ${i}`:`nothing answering`};let{installed:a,loaded:o}=E(r),s=r.stale===!0?` · last known`:``;return{id:e,name:t,tone:o>0?`success`:`neutral`,word:`Answering`,detail:`${a} installed · ${o>0?`${o} loaded`:`none loaded`}${s}`}}function O(e){let t=h(e);if(!t)return null;let n=T(t.baseUrl),r=t.status,i=t.reason,a=`llama-server`;if(r===`ok`){let e=typeof t.modelCount==`number`?t.modelCount:null,n=typeof t.slots==`number`?t.slots:null;return{id:`llama-server`,name:a,tone:`success`,word:`Answering`,detail:[e===null?`serving`:`${e} model${e===1?``:`s`} served`,n===null?null:`${n} slots`].filter(e=>e!==null).join(` · `)}}return r===`loading`?{id:`llama-server`,name:a,tone:`warning`,word:`Loading…`,detail:`mapping weights on ${n}`}:r===`error`?{id:`llama-server`,name:a,tone:`danger`,word:`Error`,detail:`answering on ${n} with an error`}:i===`llama-server-timeout`?{id:`llama-server`,name:a,tone:`danger`,word:`Not answering`,detail:`listening on ${n} but not answering — restart it`}:{id:`llama-server`,name:a,tone:`neutral`,word:`Not running`,detail:n?`nothing answering on ${n}`:`nothing answering`}}function k(e){let t=h(e);return t?[D(`ollama`,`Ollama`,t.ollama),D(`lmstudio`,`LM Studio`,t.lmStudio),O(t.llamaServer)].filter(e=>e!==null):[]}function A(e,t=3){let n=[...new Set(e.filter(e=>e.trim().length>0))];if(n.length===0)return null;let r=n.slice(0,t).join(`, `);return n.length>t?`${r} +${n.length-t} more`:r}function j(e){let t=e.models.filter(e=>!e.unavailableReason);return t.length>0?t:e.models.slice(0,1)}function M(e){let t=j(e),n=t[0]?.id??null;return{tier:i(e.engine,n),basis:e.costBasis??r(e.engine,{modelId:n}),models:t.map(e=>e.label),reserve:null}}function N(e){if(e.length===0)return null;let t=e.map(M);return{tier:t.reduce((e,t)=>n(t.tier)<n(e)?t.tier:e,t[0].tier),basis:t[0].basis,models:t.flatMap(e=>e.models),reserve:null}}function P(e){return[...new Set(e.map(e=>M(e).basis))]}function F(e){return[`elite`,`fast`,`free`].map(t=>({tier:t,entries:e.filter(e=>e.tier===t).sort((e,t)=>e.statusRank-t.statusRank||e.marginal-t.marginal||e.index-t.index)})).filter(e=>e.entries.length>0)}function I(e){return o(e===null?`not-checked`:e?`usable`:`unavailable`)}var L={key:`verse-resources-cloud`,fetch:async n=>{try{return{available:!0,credits:y(await e(c,n))}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{available:!1,credits:null}}}},R=`verse-resources-readiness`;function z(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.v===1&&Array.isArray(t.resources)&&typeof t.autonomy==`object`&&t.autonomy!==null}var B={key:R,fetch:async n=>{try{let t=await e(d,n);return{available:!0,value:z(t)?t:null}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{available:!1,value:null}}}},V={cloud:6e4,local:3e4,runtime:15e3,readiness:3e4};export{b as a,N as c,I as d,C as f,P as i,w as l,m,L as n,F as o,M as p,B as r,k as s,V as t,A as u};
2
+ //# sourceMappingURL=resources-queries-BaSf2hP1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources-queries-BaSf2hP1.js","names":[],"sources":["../../../../../../src/core/routing/readiness-types.ts","../../../../../../src/web-ui/routes/verse/resources/resources-model.ts","../../../../../../src/web-ui/routes/verse/resources/resources-queries.ts"],"sourcesContent":["/**\n * Per-resource readiness — the wire contract for `GET /api/verse/budget/readiness`\n * (3.14, \"every account ready for chat and the fleet\").\n *\n * One row per resource Mason can spend — each paid account, the local\n * runtimes as ONE resource, and the Claude cloud lane — answering the two\n * questions the Resources drawer (⌘.) exists for:\n *\n * Chat can a NEW chat run on it right now (the session engine's own\n * admission gate, core/verse/seat-readiness.ts)?\n * Fleet would the AUTONOMOUS fleet use it right now — under the installed\n * standing grant, its current rollout stage, the budget mode, the\n * Leader's directives and the capacity snapshot the daemon routes on\n * (~/.ashlr/routing/capacity.json)?\n *\n * Every \"not ready\" carries one plain sentence and, when one exists, the ONE\n * fix: a Verse action (reconnect / check again) or a literal command to run.\n * A command is never a secret and never names a private path beyond `~`.\n *\n * BROWSER-SAFE: type-only imports and constants. The web bundle imports it.\n */\n\nexport const VERSE_RESOURCE_READINESS_PATH = '/api/verse/budget/readiness';\n\nexport type ReadinessFixKind = 'reconnect' | 'check-again' | 'command';\n\nexport interface ReadinessFix {\n kind: ReadinessFixKind;\n /** Button / chip label: \"Reconnect\", \"Check again\", \"Set up the Claude seat\". */\n label: string;\n /** `command` only: the exact line to run in a terminal. */\n command?: string;\n /** `reconnect` / `check-again` only: the seat the action targets. */\n seatId?: string;\n}\n\n/** `ok` ready · `warn` usable with a caveat · `off` intentionally not used · `blocked` needs a fix. */\nexport type ReadinessTone = 'ok' | 'warn' | 'off' | 'blocked';\n\nexport interface ReadinessVerdict {\n ready: boolean;\n tone: ReadinessTone;\n /** Two or three words: \"Ready\", \"Signed out\", \"Not in this stage\". */\n word: string;\n /** One plain sentence (may be empty when `word` says it all). */\n detail: string;\n fix: ReadinessFix | null;\n}\n\nexport interface FleetReadinessVerdict extends ReadinessVerdict {\n /** The grant's roles for this seat (\"producer\", \"judge\", \"leader\"); empty when not granted. */\n roles: string[];\n /** Percent of the binding window kept for Mason; null when not applicable (local, cloud, not granted). */\n reservePercent: number | null;\n}\n\nexport interface ResourceReading {\n /** `live` = a current reading · `last` = only an expired one (see `at`) · `none` = never read here. */\n state: 'live' | 'last' | 'none';\n /** ISO instant of the reading (current or last); null when none. */\n at: string | null;\n /** Plain sentence on WHY there is no live reading; null when live. */\n note: string | null;\n}\n\nexport interface ResourceReadinessRow {\n /** Account id (codex-personal, claude, …), `local`, or `cloud`. */\n id: string;\n label: string;\n /** 3.15: `devin` for the Devin card (built from core/devin's own verdicts). */\n engine: 'claude' | 'codex' | 'grok' | 'local' | 'devin';\n kind: 'subscription' | 'local' | 'cloud';\n reading: ResourceReading;\n chat: ReadinessVerdict;\n fleet: FleetReadinessVerdict;\n}\n\nexport interface ResourceReadinessResponse {\n v: 1;\n checkedAt: string;\n /** Standing autonomy as the fleet sees it. */\n autonomy: {\n active: boolean;\n /** Current rollout stage id (\"shadow\"), when a grant is active. */\n stage: string | null;\n /** \"Stage 1 of 8 · shadow\" or why autonomy is off. */\n detail: string;\n };\n /** When the fleet's capacity snapshot was published; null when there is none. */\n capacitySnapshotAt: string | null;\n resources: ResourceReadinessRow[];\n}\n","/**\n * routes/verse/resources/resources-model.ts — what the Resources drawer says,\n * projected from reads other units already own (unit 3.11 C6). Pure: no\n * React, no I/O.\n *\n * Nothing about a seat is worded here. Every account line comes from C6's\n * capacity projection (usage/capacity-strip-model.ts: `accountStatus`,\n * `orderAccountRows`), so the drawer, Apps & Accounts and the rail ring can\n * never describe one seat two ways. What IS new here:\n *\n * - the edge handle's one-dot summary across the paid accounts;\n * - the cloud lane's overview (GET /api/verse/cloud), narrowed field by\n * field — the route is landing in parallel, so a missing or drifted body\n * reads as \"not available yet\", never as a crash or a zero;\n * - short sentences for the serving runtime and each local model's context.\n */\nimport { CLOUD_BALANCE_URL, type CloudOverviewResponse } from '../../../../core/cloud/types.js';\nimport { costBasisOf, seatTier, tierRank, type CostBasis, type ResourceTier } from '../../../../core/routing/tiers.js';\nimport type { ServingRuntimeSnapshot, VerseSeat } from '../../../data/api-types.js';\nimport { accountStatus, accountStatusRank, type AccountStatusKind, type CapacityRow } from '../usage/capacity-strip-model.js';\nimport { modelNameInText, type LocalModelRow } from '../usage/local-model.js';\nimport { formatContextWindow } from '../verse-model.js';\n\n// ---------------------------------------------------------------------------\n// The handle's dot\n// ---------------------------------------------------------------------------\n\n/**\n * ok every account read is usable, none tight\n * tight something is running low (or usable only on credits)\n * alert something is spent, signed out or unavailable\n * unknown nothing has been read yet — no dot at all (never \"all good\")\n */\nexport type ResourcesTone = 'ok' | 'tight' | 'alert' | 'unknown';\n\nexport interface ResourcesSummary {\n tone: ResourcesTone;\n /** Appended to the handle's accessible name and tooltip: \"2 usable · 1 spent\". */\n spoken: string;\n}\n\nconst ALERT_KINDS: ReadonlySet<AccountStatusKind> = new Set(['spent', 'signed-out', 'unavailable']);\n\nconst COUNT_WORDS: ReadonlyArray<[AccountStatusKind, string]> = [\n ['usable', 'usable'],\n ['low', 'running low'],\n ['spent', 'spent'],\n ['signed-out', 'signed out'],\n ['unavailable', 'unavailable'],\n];\n\n/** The paid accounts, reduced to one tone and one sentence. Local seats have no quota to run out of. */\nexport function summarizeResources(rows: readonly CapacityRow[], opts: { healthRead: boolean; now?: number }): ResourcesSummary {\n const kinds = rows\n .filter((r) => r.kind === 'subscription')\n .map((r) => accountStatus(r, { healthRead: opts.healthRead, ...(opts.now !== undefined ? { now: opts.now } : {}) }).kind);\n const counts = new Map<AccountStatusKind, number>();\n for (const k of kinds) counts.set(k, (counts.get(k) ?? 0) + 1);\n const spoken = COUNT_WORDS.filter(([k]) => counts.has(k))\n .map(([k, word]) => `${counts.get(k)} ${word}`)\n .join(' · ');\n let tone: ResourcesTone = 'unknown';\n if (kinds.some((k) => ALERT_KINDS.has(k))) tone = 'alert';\n else if (kinds.includes('low')) tone = 'tight';\n else if (kinds.includes('usable')) tone = 'ok';\n return { tone, spoken: spoken || (kinds.length === 0 ? 'no accounts connected' : 'not read yet') };\n}\n\nexport const TONE_WORD: Readonly<Record<ResourcesTone, string>> = {\n ok: 'all usable',\n tight: 'running low',\n alert: 'needs attention',\n unknown: 'not read yet',\n};\n\n// ---------------------------------------------------------------------------\n// Cloud credits\n// ---------------------------------------------------------------------------\n\nexport interface CloudCreditsView {\n totalUsd: number;\n spentUsd: number;\n remainingUsd: number;\n /** 0–100, remaining of total. */\n remainingPercent: number;\n running: number;\n sessionsToday: number;\n maxSessionsPerDay: number | null;\n seatReady: boolean;\n seatReason: string | null;\n canLaunch: boolean;\n canLaunchReason: string | null;\n estimateNote: string;\n /** Always https://claude.ai/… — anything else falls back to the frozen constant. */\n balanceUrl: string;\n}\n\nfunction rec(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? (value as Record<string, unknown>) : null;\n}\n\nfunction num(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null;\n}\n\nfunction text(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null;\n}\n\nconst DEFAULT_ESTIMATE_NOTE = 'An estimate from the sessions Verse launched — the real balance is on claude.ai.';\n\n/** Narrow a GET /api/verse/cloud body; null when it is not one. */\nexport function projectCloudCredits(raw: unknown): CloudCreditsView | null {\n const root = rec(raw) as Partial<Record<keyof CloudOverviewResponse, unknown>> | null;\n const budget = rec(root?.budget);\n if (!root || !budget) return null;\n const total = num(budget['creditsTotalUsd']);\n const spent = num(budget['estimatedSpentUsd']);\n const remainingRaw = num(budget['estimatedRemainingUsd']);\n if (total === null || (spent === null && remainingRaw === null)) return null;\n const remaining = Math.max(0, remainingRaw ?? total - (spent ?? 0));\n const seat = rec(root.seat);\n const gate = rec(budget['canLaunch']);\n const url = text(budget['balanceUrl']);\n const policy = rec(budget['budget']);\n return {\n totalUsd: total,\n spentUsd: spent ?? Math.max(0, total - remaining),\n remainingUsd: remaining,\n remainingPercent: total > 0 ? Math.max(0, Math.min(100, (remaining / total) * 100)) : 0,\n running: Math.max(0, num(budget['running']) ?? 0),\n sessionsToday: Math.max(0, num(budget['sessionsToday']) ?? 0),\n maxSessionsPerDay: num(policy?.['maxSessionsPerDay']),\n seatReady: seat?.['ready'] !== false,\n seatReason: text(seat?.['reason']),\n canLaunch: gate?.['ok'] !== false,\n canLaunchReason: text(gate?.['reason']),\n estimateNote: text(budget['estimateNote']) ?? DEFAULT_ESTIMATE_NOTE,\n balanceUrl: url !== null && url.startsWith('https://claude.ai/') ? url : CLOUD_BALANCE_URL,\n };\n}\n\n/** \"$212\" / \"$3.50\" — whole dollars once the cents stop mattering. */\nexport function formatUsd(value: number): string {\n const v = Math.max(0, value);\n return v >= 100 || Number.isInteger(v) ? `$${Math.round(v)}` : `$${v.toFixed(2)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Local\n// ---------------------------------------------------------------------------\n\nconst RUNTIME_NAME: Readonly<Record<ServingRuntimeSnapshot['kind'], string>> = {\n 'llama-server': 'llama-server',\n ollama: 'Ollama',\n vllm: 'vLLM',\n unknown: 'Serving runtime',\n};\n\nconst STATE_WORD: Readonly<Record<ServingRuntimeSnapshot['state'], string>> = {\n running: 'Running',\n starting: 'Starting…',\n stopping: 'Stopping…',\n stopped: 'Stopped',\n unknown: 'State not reported',\n};\n\nexport interface RuntimeView {\n name: string;\n state: ServingRuntimeSnapshot['state'];\n word: string;\n tone: 'success' | 'warning' | 'neutral';\n /** \"Qwen3-32B · 16k context per agent · 1 of 4 slots busy\" — only the parts that were reported. */\n detail: string | null;\n canStart: boolean;\n canStop: boolean;\n /** Set when Verse cannot start or stop it (launchd, the operator's own terminal). */\n managedElsewhere: boolean;\n}\n\nexport function runtimeView(runtime: ServingRuntimeSnapshot | null): RuntimeView | null {\n if (!runtime) return null;\n const parts: string[] = [];\n if (runtime.model) parts.push(modelNameInText(runtime.model));\n // Per-slot context, the number one agent actually gets (fleet-types.ts).\n if (runtime.contextTokens !== null) parts.push(`${formatContextWindow(runtime.contextTokens)} context per agent`);\n if (runtime.slotsTotal !== null && runtime.slotsTotal > 0) {\n parts.push(runtime.slotsBusy !== null ? `${runtime.slotsBusy} of ${runtime.slotsTotal} slots busy` : `${runtime.slotsTotal} slots`);\n }\n const state = runtime.state;\n return {\n name: RUNTIME_NAME[runtime.kind] ?? RUNTIME_NAME.unknown,\n state,\n word: STATE_WORD[state] ?? STATE_WORD.unknown,\n tone: state === 'running' ? 'success' : state === 'starting' || state === 'stopping' ? 'warning' : 'neutral',\n detail: parts.length > 0 ? parts.join(' · ') : null,\n canStart: runtime.supervised && state === 'stopped',\n canStop: runtime.supervised && state === 'running',\n managedElsewhere: !runtime.supervised,\n };\n}\n\n/**\n * The context a local model runs with. The configured window is the one a\n * turn actually gets; when it is below the model's native window both are\n * said, so \"256k model\" is never read as \"256k here\".\n */\nexport function modelContextText(row: Pick<LocalModelRow, 'nativeContext' | 'configuredContext' | 'contextTruncated'>): string | null {\n const configured = row.configuredContext;\n const native = row.nativeContext;\n if (configured !== null && row.contextTruncated && native !== null) return `${formatContextWindow(configured)} of ${formatContextWindow(native)} context`;\n if (configured !== null) return `${formatContextWindow(configured)} context`;\n if (native !== null) return `${formatContextWindow(native)} context`;\n return null;\n}\n\n/** How many models the drawer lists before pointing at Usage for the rest. */\nexport const LOCAL_MODELS_SHOWN = 6;\n\n// ---------------------------------------------------------------------------\n// Local runtimes (3.14): Ollama, LM Studio and llama-server as ONE resource\n// ---------------------------------------------------------------------------\n\nexport interface LocalRuntimeLine {\n id: 'ollama' | 'lmstudio' | 'llama-server';\n name: string;\n /** Status-line tone: answering with something loaded = success. */\n tone: 'success' | 'warning' | 'danger' | 'neutral';\n /** \"Answering\", \"Not answering\", \"Loading…\". */\n word: string;\n /** \"4 installed · 1 loaded\" / \"listening on :8080 but not answering — restart it\". */\n detail: string;\n}\n\nfunction portOf(baseUrl: unknown): string {\n if (typeof baseUrl !== 'string') return '';\n try {\n const url = new URL(baseUrl);\n return url.port ? `:${url.port}` : url.host;\n } catch {\n return '';\n }\n}\n\nfunction modelCounts(report: Record<string, unknown>): { installed: number; loaded: number } {\n const models = Array.isArray(report['models']) ? report['models'] : [];\n let loaded = 0;\n // `state: 'loaded'` is the current wire; `loaded: true` the pre-3.10 one.\n for (const m of models) {\n const row = rec(m);\n if (row?.['state'] === 'loaded' || row?.['loaded'] === true) loaded += 1;\n }\n return { installed: models.length, loaded };\n}\n\nfunction catalogLine(id: 'ollama' | 'lmstudio', name: string, raw: unknown): LocalRuntimeLine | null {\n const report = rec(raw);\n if (!report) return null;\n const port = portOf(report['baseUrl']);\n if (report['reachable'] !== true) {\n return { id, name, tone: 'neutral', word: 'Not running', detail: port ? `nothing answering on ${port}` : 'nothing answering' };\n }\n const { installed, loaded } = modelCounts(report);\n const stale = report['stale'] === true ? ' · last known' : '';\n return {\n id,\n name,\n tone: loaded > 0 ? 'success' : 'neutral',\n word: 'Answering',\n detail: `${installed} installed · ${loaded > 0 ? `${loaded} loaded` : 'none loaded'}${stale}`,\n };\n}\n\nfunction llamaLine(raw: unknown): LocalRuntimeLine | null {\n const report = rec(raw);\n if (!report) return null;\n const port = portOf(report['baseUrl']);\n const status = report['status'];\n const reason = report['reason'];\n const name = 'llama-server';\n if (status === 'ok') {\n const count = typeof report['modelCount'] === 'number' ? report['modelCount'] : null;\n const slots = typeof report['slots'] === 'number' ? report['slots'] : null;\n const parts = [count !== null ? `${count} model${count === 1 ? '' : 's'} served` : 'serving', slots !== null ? `${slots} slots` : null]\n .filter((p): p is string => p !== null);\n return { id: 'llama-server', name, tone: 'success', word: 'Answering', detail: parts.join(' · ') };\n }\n if (status === 'loading') return { id: 'llama-server', name, tone: 'warning', word: 'Loading…', detail: `mapping weights on ${port}` };\n if (status === 'error') return { id: 'llama-server', name, tone: 'danger', word: 'Error', detail: `answering on ${port} with an error` };\n // `down`: refused = not running; timed out = a process holds the port but\n // never answers — wedged, which needs a restart, not a start.\n if (reason === 'llama-server-timeout') {\n return { id: 'llama-server', name, tone: 'danger', word: 'Not answering', detail: `listening on ${port} but not answering — restart it` };\n }\n return { id: 'llama-server', name, tone: 'neutral', word: 'Not running', detail: port ? `nothing answering on ${port}` : 'nothing answering' };\n}\n\n/**\n * One line per local runtime from GET /api/verse/local-models. A runtime the\n * server did not report (an older build has no `llamaServer`) is simply\n * absent — never shown as down.\n */\nexport function localRuntimeLines(raw: unknown): LocalRuntimeLine[] {\n const root = rec(raw);\n if (!root) return [];\n return [\n catalogLine('ollama', 'Ollama', root['ollama']),\n catalogLine('lmstudio', 'LM Studio', root['lmStudio']),\n llamaLine(root['llamaServer']),\n ].filter((line): line is LocalRuntimeLine => line !== null);\n}\n\n// ---------------------------------------------------------------------------\n// One card anatomy, one tier model (3.15, \"equal partners\")\n// ---------------------------------------------------------------------------\n\n/**\n * The facts line every card carries, whatever the provider: its TIER\n * (routing/tiers.ts), what one more turn costs, the models it offers and —\n * when there is one — the reserve kept for Mason. Status, usage and the\n * Chat / Fleet readiness lines are the card's other rows.\n */\nexport interface ResourceFactsView {\n tier: ResourceTier;\n basis: CostBasis;\n /** Runnable model labels, default first; empty when the card lists its own models. */\n models: string[];\n /** \"10 ACUs kept for you\", when the reserve is not already on a meter; null otherwise. */\n reserve: string | null;\n}\n\n/** Shown before \"+N more\". */\nexport const FACTS_MODELS_SHOWN = 3;\n\n/** \"Opus 5.5, Sonnet 5, Haiku +2 more\" — never empty-looking, never a bare \"…\". */\nexport function modelsLine(labels: readonly string[], max = FACTS_MODELS_SHOWN): string | null {\n const unique = [...new Set(labels.filter((l) => l.trim().length > 0))];\n if (unique.length === 0) return null;\n const shown = unique.slice(0, max).join(', ');\n return unique.length > max ? `${shown} +${unique.length - max} more` : shown;\n}\n\nfunction runnable(seat: Pick<VerseSeat, 'models'>) {\n const models = seat.models.filter((m) => !m.unavailableReason);\n return models.length > 0 ? models : seat.models.slice(0, 1);\n}\n\n/** The facts for one seat (its default model decides the tier). */\nexport function seatFacts(seat: Pick<VerseSeat, 'engine' | 'models' | 'costBasis'>): ResourceFactsView {\n const models = runnable(seat);\n const first = models[0]?.id ?? null;\n return {\n tier: seatTier(seat.engine, first),\n basis: seat.costBasis ?? costBasisOf(seat.engine, { modelId: first }),\n models: models.map((m) => m.label),\n reserve: null,\n };\n}\n\n/**\n * The facts for a PROVIDER card that covers several seats (Devin cloud + CLI,\n * the local runtime): the best tier any of them offers, and every cost basis\n * worded once (\"credits · subscription\").\n */\nexport function mergedFacts(seats: ReadonlyArray<Pick<VerseSeat, 'engine' | 'models' | 'costBasis'>>): ResourceFactsView | null {\n if (seats.length === 0) return null;\n const all = seats.map(seatFacts);\n const tier = all.reduce<ResourceTier>((best, f) => (tierRank(f.tier) < tierRank(best) ? f.tier : best), all[0]!.tier);\n return { tier, basis: all[0]!.basis, models: all.flatMap((f) => f.models), reserve: null };\n}\n\n/** Every cost basis a provider card spans, in first-seen order. */\nexport function costBases(seats: ReadonlyArray<Pick<VerseSeat, 'engine' | 'models' | 'costBasis'>>): CostBasis[] {\n return [...new Set(seats.map((s) => seatFacts(s).basis))];\n}\n\n/** One card in a tier section, ranked by status the same way for every provider. */\nexport interface TierEntry<K extends string = string> {\n key: K;\n tier: ResourceTier;\n /** `accountStatusRank` of the card's status; lower = more usable. */\n statusRank: number;\n /** 0 subscription / free, 1 credits / per-token — the router's marginal-cost rule. */\n marginal: number;\n index: number;\n}\n\n/**\n * Cards per tier, best tier first; inside a tier usable before not, a\n * subscription before a metered balance, then the caller's order. Empty tiers\n * are dropped. No provider is named anywhere in this ordering.\n */\nexport function groupByTier<E extends TierEntry>(entries: readonly E[]): Array<{ tier: ResourceTier; entries: E[] }> {\n const tiers: ResourceTier[] = ['elite', 'fast', 'free'];\n return tiers\n .map((tier) => ({\n tier,\n entries: entries\n .filter((e) => e.tier === tier)\n .sort((a, b) => a.statusRank - b.statusRank || a.marginal - b.marginal || a.index - b.index),\n }))\n .filter((g) => g.entries.length > 0);\n}\n\n/** A status rank for a card that has no capacity row (cloud credits, Devin): from its Chat verdict. */\nexport function readinessStatusRank(chatReady: boolean | null): number {\n if (chatReady === null) return accountStatusRank('not-checked');\n return accountStatusRank(chatReady ? 'usable' : 'unavailable');\n}\n","/**\n * routes/verse/resources/resources-queries.ts — the one read the Resources\n * drawer adds (unit 3.11 C6). Seats, health, budget, local models and the\n * serving runtime are read through their owners' QueryDefs (usage/, health/,\n * budget/, autonomy/fleet-queries); only the cloud lane's overview is new.\n *\n * GET /api/verse/cloud lands in parallel with this drawer. Until it does the\n * server answers 404, and that is a designed state (\"Cloud lane not available\n * yet\"), not an error: the fetcher resolves `{ available: false }` instead of\n * throwing. A 401 still propagates — an expired session is the whole app's\n * problem, not this panel's.\n */\nimport { VERSE_CLOUD_PATH } from '../../../../core/cloud/types.js';\nimport { VERSE_RESOURCE_READINESS_PATH, type ResourceReadinessResponse } from '../../../../core/routing/readiness-types.js';\nimport { ApiError, apiGet } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { projectCloudCredits, type CloudCreditsView } from './resources-model.js';\n\nexport const RESOURCES_CLOUD_KEY = 'verse-resources-cloud';\n\nexport interface CloudCreditsRead {\n /** False when the route is absent (404) or unreachable. */\n available: boolean;\n /** Null when absent, or when the body was not a cloud overview. */\n credits: CloudCreditsView | null;\n}\n\nexport const cloudCreditsQuery: QueryDef<CloudCreditsRead> = {\n key: RESOURCES_CLOUD_KEY,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>(VERSE_CLOUD_PATH, signal);\n return { available: true, credits: projectCloudCredits(raw) };\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 { available: false, credits: null };\n }\n },\n};\n\nexport const RESOURCES_READINESS_KEY = 'verse-resources-readiness';\n\nexport interface ReadinessRead {\n /** False when this server has no readiness route (404) or it could not answer. */\n available: boolean;\n /** Null when absent, or when the body was not a readiness response. */\n value: ResourceReadinessResponse | null;\n}\n\nfunction isReadiness(raw: unknown): raw is ResourceReadinessResponse {\n if (raw === null || typeof raw !== 'object') return false;\n const r = raw as Record<string, unknown>;\n return r['v'] === 1 && Array.isArray(r['resources']) && typeof r['autonomy'] === 'object' && r['autonomy'] !== null;\n}\n\n/**\n * GET /api/verse/budget/readiness (3.14): per resource, \"ready for chat?\" and\n * \"ready for the fleet?\" with the one fix. An older server answers 404 — the\n * drawer then simply shows no readiness lines, never a false \"not ready\".\n */\nexport const resourceReadinessQuery: QueryDef<ReadinessRead> = {\n key: RESOURCES_READINESS_KEY,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>(VERSE_RESOURCE_READINESS_PATH, signal);\n return { available: true, value: isReadiness(raw) ? raw : 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 { available: false, value: null };\n }\n },\n};\n\n/** While the drawer is open: seats and health ride their own 30 s polls; these are the drawer's own. */\nexport const RESOURCES_POLL_MS = { cloud: 60_000, local: 30_000, runtime: 15_000, readiness: 30_000 } as const;\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{t as e}from"./nav-BlWTsG_5.js";var t=3e3;function n(e){return typeof CSS<`u`&&typeof CSS.escape==`function`?CSS.escape(e):e.replace(/["\\]/g,`\\$&`)}function r(t,r,i=document){let a=i.querySelector(`[data-surface="${n(t)}"]`);return a?a.querySelector(`#${n(e(r))}`)??a.querySelector(`[data-verse-anchor="${n(r)}"]`):null}function i(e){typeof e.scrollIntoView==`function`&&e.scrollIntoView({block:`center`,behavior:`smooth`}),(e.tabIndex>=0||e.matches(`a[href],button,input,select,textarea,[tabindex]`))&&e.focus({preventScroll:!0})}function a({section:e,anchor:n},a=t){if(typeof document>`u`)return Promise.resolve(!1);let o=r(e,n);return o&&!o.closest(`[hidden]`)?(i(o),Promise.resolve(!0)):new Promise(t=>{let o=!1,s=e=>{o||(o=!0,l.disconnect(),window.clearTimeout(u),e&&i(e),t(e!==null))},c=()=>{let t=r(e,n);t&&!t.closest(`[hidden]`)&&s(t)},l=new MutationObserver(c);l.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`hidden`,`id`,`data-verse-anchor`]});let u=window.setTimeout(()=>s(null),a);c()})}export{t as ANCHOR_WAIT_MS,r as findAnchorElement,a as revealAnchor};
2
+ //# sourceMappingURL=reveal-anchor-zUWG9d5W.js.map