@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,"file":"thread-data-bh8JfvXs.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/leader/thread-model.ts","../../../../../../src/web-ui/routes/verse/leader/thread-data.ts"],"sourcesContent":["/**\n * routes/verse/leader/thread-model.ts — pure helpers behind the Leader\n * conversation on Mind (and its one-line preview on Command).\n *\n * narrow* every body the page reads, checked field by field: a\n * message the page cannot read is dropped, never guessed;\n * mergeThread server pages + replies this tab already received + the\n * optimistic sends still in flight, in time order, each\n * message once (an optimistic send disappears as soon as its\n * server copy is in any of the lists);\n * groupThread day separators and runs of consecutive messages from one\n * sender on one channel (Linear-style: one header per run);\n * questions which question messages are answered, and which one a\n * Needs-you item means;\n * awaitingReply \"Leader is thinking…\" — honest: only for a message THIS\n * tab sent that the server said it would answer later.\n *\n * Framework-free; tested directly (thread-model.test.ts).\n */\nimport {\n LEADER_THREAD_CHANNELS,\n LEADER_THREAD_KINDS,\n type LeaderSendResult,\n type LeaderThreadChannel,\n type LeaderThreadKind,\n type LeaderThreadMessage,\n type LeaderThreadPage,\n type DirectiveChip,\n} from './thread-types.js';\n\n// ---------------------------------------------------------------------------\n// Narrowing\n// ---------------------------------------------------------------------------\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nconst optString = (v: unknown): string | null => (typeof v === 'string' && v.length > 0 ? v : null);\n\n/** One message, or null when a required field is missing or out of vocabulary. */\nexport function narrowMessage(raw: unknown): LeaderThreadMessage | null {\n if (!isRecord(raw)) return null;\n const { id, at, from, channel, kind, text } = raw;\n if (typeof id !== 'string' || id.length === 0) return null;\n if (typeof at !== 'string' || !Number.isFinite(Date.parse(at))) return null;\n if (from !== 'mason' && from !== 'leader') return null;\n if (typeof text !== 'string') return null;\n // An unknown channel or kind from a newer server still reads as a message.\n const ch = LEADER_THREAD_CHANNELS.includes(channel as LeaderThreadChannel) ? (channel as LeaderThreadChannel) : 'verse';\n const k = LEADER_THREAD_KINDS.includes(kind as LeaderThreadKind) ? (kind as LeaderThreadKind) : 'message';\n const out: LeaderThreadMessage = { id, at, from, channel: ch, kind: k, text };\n // Optional fields are present only when the server sent a usable value.\n const replyTo = optString(raw['replyTo']);\n const memoId = optString(raw['memoId']);\n const questionId = optString(raw['questionId']);\n if (replyTo) out.replyTo = replyTo;\n if (memoId) out.memoId = memoId;\n if (questionId) out.questionId = questionId;\n const actionIds = Array.isArray(raw['actionIds']) ? raw['actionIds'].filter((a): a is string => typeof a === 'string' && a.length > 0) : [];\n if (actionIds.length) out.actionIds = actionIds;\n const delivery = raw['delivery'];\n if (isRecord(delivery)) {\n const telegram = delivery['telegram'];\n if (telegram === 'pending' || telegram === 'sent' || telegram === 'failed') {\n out.delivery = { telegram, ...(optString(delivery['sentAt']) ? { sentAt: delivery['sentAt'] as string } : {}) };\n }\n }\n return out;\n}\n\n/** `{ messages: [...] }` (or a bare array); null when neither. Unreadable messages are dropped. */\nexport function narrowThreadPage(raw: unknown): LeaderThreadPage | null {\n const list = Array.isArray(raw) ? raw : isRecord(raw) && Array.isArray(raw['messages']) ? raw['messages'] : null;\n if (!list) return null;\n return { messages: list.flatMap((m) => narrowMessage(m) ?? []) };\n}\n\n/** An OperatorDirective in force, as a chip; null when unreadable or retired (`retiredAt` set). */\nexport function narrowDirective(raw: unknown): DirectiveChip | null {\n if (!isRecord(raw)) return null;\n const { id, text } = raw;\n if (typeof id !== 'string' || id.length === 0 || typeof text !== 'string' || text.trim().length === 0) return null;\n // A retired directive is history, not a chip.\n if (optString(raw['retiredAt']) !== null) return null;\n const channel = LEADER_THREAD_CHANNELS.includes(raw['channel'] as LeaderThreadChannel) ? (raw['channel'] as LeaderThreadChannel) : null;\n return { id, text: text.trim(), createdAt: optString(raw['createdAt']), channel };\n}\n\n/** GET /directives `{ directives, retired }` → the ones in force, oldest first (`retired` is history). */\nexport function narrowDirectives(raw: unknown): DirectiveChip[] | null {\n const list = isRecord(raw) && Array.isArray(raw['directives']) ? raw['directives'] : null;\n if (!list) return null;\n const out = list.flatMap((d) => narrowDirective(d) ?? []);\n return out.sort((a, b) => (Date.parse(a.createdAt ?? '') || 0) - (Date.parse(b.createdAt ?? '') || 0));\n}\n\nexport function narrowSendResult(raw: unknown): LeaderSendResult | null {\n if (!isRecord(raw)) return null;\n const message = narrowMessage(raw['message']);\n if (!message) return null;\n return { message, reply: narrowMessage(raw['reply']), directive: narrowDirective(raw['directive']) };\n}\n\n/**\n * POST /actions/<id>/approve → the approval's thread messages (Mason's\n * approval and the Leader's acknowledgement), readable ones only.\n */\nexport function narrowApprovalThread(raw: unknown): LeaderThreadMessage[] {\n if (!isRecord(raw) || !isRecord(raw['thread'])) return [];\n const t = raw['thread'];\n return [narrowMessage(t['message']), narrowMessage(t['reply'])].filter((m): m is LeaderThreadMessage => m !== null);\n}\n\n// ---------------------------------------------------------------------------\n// Optimistic sends and the merge\n// ---------------------------------------------------------------------------\n\nexport interface PendingMessage {\n /** Local id (\"local-3\"); never a server id. */\n clientId: string;\n kind: 'message' | 'answer';\n text: string;\n /** Local ISO time the send started. */\n at: string;\n replyTo: string | null;\n /** For an answer: the question it answers. */\n questionId: string | null;\n state: 'sending' | 'failed';\n /** Operator sentence for a failed send. */\n error: string | null;\n}\n\nexport type ThreadEntry =\n | { type: 'message'; key: string; at: string; message: LeaderThreadMessage }\n | { type: 'pending'; key: string; at: string; pending: PendingMessage };\n\n/**\n * A server message that is the delivered copy of an optimistic send: from\n * Mason, the same words, not older than the send (allowing CLOCK_SLACK_MS\n * for a server clock a little behind this tab's).\n */\nconst CLOCK_SLACK_MS = 2 * 60_000;\nconst norm = (t: string) => t.replace(/\\s+/g, ' ').trim();\n\nfunction isCopyOf(m: LeaderThreadMessage, p: PendingMessage): boolean {\n if (m.from !== 'mason') return false;\n if (norm(m.text) !== norm(p.text)) return false;\n if (p.kind === 'answer' && p.questionId && m.questionId && m.questionId !== p.questionId) return false;\n return Date.parse(m.at) >= Date.parse(p.at) - CLOCK_SLACK_MS;\n}\n\nconst byTime = (a: { at: string; key: string }, b: { at: string; key: string }) => Date.parse(a.at) - Date.parse(b.at) || 0;\n\n/**\n * Everything known, oldest first, each message once. `pages` are server\n * reads (newest page first or last — order does not matter); `received` are\n * messages this tab got back from a send (its own message and the reply)\n * before the next read; `pending` are sends still in flight or failed.\n */\nexport function mergeThread(\n pages: readonly (readonly LeaderThreadMessage[])[],\n received: readonly LeaderThreadMessage[] = [],\n pending: readonly PendingMessage[] = [],\n): ThreadEntry[] {\n const byId = new Map<string, LeaderThreadMessage>();\n // Server reads win over a send's echo: they are newer (a status may have moved).\n for (const m of received) byId.set(m.id, m);\n for (const page of pages) for (const m of page) byId.set(m.id, m);\n const messages = [...byId.values()];\n const claimed = new Set<string>();\n const live: PendingMessage[] = [];\n for (const p of pending) {\n // A failed send stays until retried or discarded: its words never arrived.\n const copy = p.state === 'sending' ? messages.find((m) => !claimed.has(m.id) && isCopyOf(m, p)) : undefined;\n if (copy) claimed.add(copy.id);\n else live.push(p);\n }\n // Stable: equal times keep server order, and pending sends sit after the messages of their instant.\n const entries: ThreadEntry[] = [\n ...messages.map((message) => ({ type: 'message' as const, key: message.id, at: message.at, message })),\n ...live.map((p) => ({ type: 'pending' as const, key: p.clientId, at: p.at, pending: p })),\n ];\n return entries.map((e, i) => ({ e, i })).sort((x, y) => byTime(x.e, y.e) || x.i - y.i).map(({ e }) => e);\n}\n\n// ---------------------------------------------------------------------------\n// Grouping\n// ---------------------------------------------------------------------------\n\nexport const GROUP_GAP_MS = 5 * 60_000;\n\nexport type ThreadRow =\n | { type: 'day'; key: string; label: string }\n | { type: 'group'; key: string; from: 'mason' | 'leader'; channel: LeaderThreadChannel; at: string; entries: ThreadEntry[] }\n /** A system line (a channel note, an update from `system`), centred and quiet. */\n | { type: 'system'; key: string; entry: ThreadEntry & { type: 'message' } };\n\nfunction entryFrom(e: ThreadEntry): 'mason' | 'leader' {\n return e.type === 'pending' ? 'mason' : e.message.from;\n}\nfunction entryChannel(e: ThreadEntry): LeaderThreadChannel {\n return e.type === 'pending' ? 'verse' : e.message.channel;\n}\n/** Memos and directives are cards and chips: each stands alone, never folded into a run. */\nfunction standsAlone(e: ThreadEntry): boolean {\n return e.type === 'message' && (e.message.kind === 'memo' || e.message.kind === 'directive');\n}\n\nfunction dayKey(t: number): string {\n const d = new Date(t);\n return `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n}\n\n/** \"Today\", \"Yesterday\", \"Thu, Sep 24\" (local). */\nexport function dayLabel(iso: string, now: number = Date.now()): string {\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return '—';\n if (dayKey(t) === dayKey(now)) return 'Today';\n if (dayKey(t) === dayKey(now - 86_400_000)) return 'Yesterday';\n const d = new Date(t);\n const sameYear = d.getFullYear() === new Date(now).getFullYear();\n return d.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric', ...(sameYear ? {} : { year: 'numeric' }) });\n}\n\nexport function groupThread(entries: readonly ThreadEntry[], now: number = Date.now()): ThreadRow[] {\n const rows: ThreadRow[] = [];\n let day: string | null = null;\n let run: Extract<ThreadRow, { type: 'group' }> | null = null;\n let lastAt = 0;\n for (const e of entries) {\n const t = Date.parse(e.at);\n const k = dayKey(t);\n if (k !== day) {\n day = k;\n rows.push({ type: 'day', key: `day-${k}`, label: dayLabel(e.at, now) });\n run = null;\n }\n if (e.type === 'message' && e.message.channel === 'system') {\n rows.push({ type: 'system', key: e.key, entry: e });\n run = null;\n continue;\n }\n const from = entryFrom(e);\n const channel = entryChannel(e);\n const joins = run !== null && !standsAlone(e) && !standsAlone(run.entries[run.entries.length - 1]!) && run.from === from && run.channel === channel && t - lastAt <= GROUP_GAP_MS;\n if (joins && run) run.entries.push(e);\n else {\n run = { type: 'group', key: `g-${e.key}`, from, channel, at: e.at, entries: [e] };\n rows.push(run);\n }\n lastAt = t;\n }\n return rows;\n}\n\n// ---------------------------------------------------------------------------\n// Questions\n// ---------------------------------------------------------------------------\n\n/** question message id → the answer that closed it. */\nexport function answeredQuestions(messages: readonly LeaderThreadMessage[]): Map<string, LeaderThreadMessage> {\n const questions = messages.filter((m) => m.kind === 'question');\n const out = new Map<string, LeaderThreadMessage>();\n for (const a of messages) {\n if (a.from !== 'mason' || (a.kind !== 'answer' && !a.replyTo)) continue;\n const q = questions.find((q) => (a.questionId && q.questionId === a.questionId) || (a.replyTo && q.id === a.replyTo));\n if (q && !out.has(q.id)) out.set(q.id, a);\n }\n return out;\n}\n\nexport interface QuestionTarget {\n /** The thread's questionId, `<memoId>:<index>` (question-id.ts derives it from a Needs-you item). */\n questionId: string | null;\n}\n\n/**\n * The question message a target means: the one whose questionId is exactly\n * the target's (the server keys both off `<memoId>:<index>`). Null when the\n * thread does not carry it — the caller then answers as a quoted message.\n */\nexport function findQuestion(messages: readonly LeaderThreadMessage[], target: QuestionTarget): LeaderThreadMessage | null {\n if (!target.questionId) return null;\n return messages.find((m) => m.kind === 'question' && m.questionId === target.questionId) ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Waiting, previews, words\n// ---------------------------------------------------------------------------\n\n/** How long \"Leader is thinking…\" may show for a send the server said it would answer later. */\nexport const AWAIT_REPLY_MS = 3 * 60_000;\n\n/**\n * True while a send is in flight, or while a message this tab sent (with no\n * inline reply) is still the newest thing Mason said and nothing from the\n * Leader has come after it — for at most AWAIT_REPLY_MS.\n */\nexport function awaitingReply(entries: readonly ThreadEntry[], awaiting: ReadonlySet<string>, now: number = Date.now()): boolean {\n if (entries.some((e) => e.type === 'pending' && e.pending.state === 'sending')) return true;\n for (let i = entries.length - 1; i >= 0; i -= 1) {\n const e = entries[i]!;\n if (e.type !== 'message' || e.message.channel === 'system') continue;\n if (e.message.from === 'leader') return false;\n if (awaiting.has(e.message.id)) return now - Date.parse(e.message.at) < AWAIT_REPLY_MS;\n }\n return false;\n}\n\nexport const CHANNEL_LABEL: Readonly<Record<LeaderThreadChannel, string>> = {\n verse: 'Verse',\n telegram: 'Telegram',\n cli: 'CLI',\n system: 'System',\n};\n\n/** The newest message from the Leader (Command's preview line). */\nexport function latestLeaderMessage(messages: readonly LeaderThreadMessage[]): LeaderThreadMessage | null {\n let best: LeaderThreadMessage | null = null;\n for (const m of messages) {\n if (m.from !== 'leader' || m.channel === 'system') continue;\n if (!best || Date.parse(m.at) >= Date.parse(best.at)) best = m;\n }\n return best;\n}\n\n/**\n * One line of plain text from a message that may be Markdown: fences, marks\n * and link targets dropped, whitespace collapsed, clipped on a word.\n */\nexport function previewText(text: string, max = 140): string {\n const plain = text\n .replace(/```[\\s\\S]*?(```|$)/g, ' ')\n .replace(/!?\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n .replace(/^\\s{0,3}(#{1,6}|>|[-*+]|\\d+\\.)\\s+/gm, '')\n .replace(/[*_`~]+/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n if (plain.length <= max) return plain;\n const cut = plain.slice(0, max - 1);\n const space = cut.lastIndexOf(' ');\n return `${(space > max * 0.6 ? cut.slice(0, space) : cut).replace(/[\\s,.;:–—-]+$/, '')}…`;\n}\n\n/** \"9:14 AM\" */\nexport function clockTime(iso: string): string {\n const t = Date.parse(iso);\n return Number.isFinite(t) ? new Date(t).toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' }) : '';\n}\n\n/** Longest message the composer sends (the server may cap lower and say so). */\nexport const LEADER_MESSAGE_MAX = 4_000;\n","/**\n * routes/verse/leader/thread-data.ts — every read and write behind the\n * Leader conversation (Mind) and its preview line (Command). Paths and\n * shapes: thread-types.ts.\n *\n * Reads are OPTIONAL reads (command/surface-data.ts optionalQuery): a server\n * without the conversation routes answers 404, which is \"not in this build\n * yet\" on the card — never a broken Mind. Writes pull the held mutation\n * token (VerseControlLockedError without one; the panel opens the token\n * dialog first) and invalidate exactly what they change.\n */\nimport { apiDelete, apiGet, apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport { VerseControlLockedError } from '../autonomy/control-queries.js';\nimport { optionalQuery, SURFACE_KEYS } from '../command/surface-data.js';\nimport { refreshActivity } from '../shell/useActivity.js';\nimport { narrowDirective, narrowDirectives, narrowSendResult, narrowThreadPage } from './thread-model.js';\nimport {\n LEADER_ACTIONS_PATH,\n LEADER_DIRECTIVES_PATH,\n LEADER_QUESTIONS_PATH,\n LEADER_THREAD_PATH,\n type LeaderSendResult,\n type LeaderThreadMessage,\n type DirectiveChip,\n} from './thread-types.js';\n\n/** One page: enough for a day of conversation; older pages load on request. */\nexport const THREAD_PAGE_SIZE = 50;\n\nexport const LEADER_THREAD_KEYS = Object.freeze({\n thread: 'verse-leader-thread',\n directives: 'verse-leader-directives',\n});\n\nexport const leaderThreadQuery = optionalQuery(LEADER_THREAD_KEYS.thread, `${LEADER_THREAD_PATH}?limit=${THREAD_PAGE_SIZE}`, 'The Leader conversation', narrowThreadPage);\nexport const leaderDirectivesQuery = optionalQuery(LEADER_THREAD_KEYS.directives, LEADER_DIRECTIVES_PATH, 'Leader directives', narrowDirectives);\n\n/** The page before `beforeId` (the oldest message on screen). Throws like any read. */\nexport async function fetchOlderThread(beforeId: string, signal?: AbortSignal): Promise<LeaderThreadMessage[]> {\n const raw = await apiGet<unknown>(`${LEADER_THREAD_PATH}?limit=${THREAD_PAGE_SIZE}&before=${encodeURIComponent(beforeId)}`, signal);\n return narrowThreadPage(raw)?.messages ?? [];\n}\n\n/**\n * One path segment. The server matches ids on the RAW path (no decoding), so\n * a questionId's `:` (`<memoId>:<index>`) must go as-is — `:` is legal in a\n * path segment; anything else unusual is still escaped.\n */\nexport function pathSegment(id: string): string {\n return encodeURIComponent(id).replace(/%3A/gi, ':');\n}\n\nfunction token(): string {\n const t = getMutationToken();\n if (!t) throw new VerseControlLockedError();\n return t;\n}\n\nasync function post(path: string, body: unknown): Promise<unknown> {\n const result = await apiPost<unknown>(path, body, token());\n touchMutationHold();\n return result;\n}\n\n/**\n * A send the server accepted but answered in a shape this page cannot read\n * is still a send: the next read shows it. Null tells the caller \"refetch\".\n */\nexport async function sendLeaderMessage(text: string, replyTo: string | null = null): Promise<LeaderSendResult | null> {\n const result = narrowSendResult(await post(LEADER_THREAD_PATH, replyTo ? { text, replyTo } : { text }));\n if (result?.directive) invalidate(LEADER_THREAD_KEYS.directives);\n return result;\n}\n\nexport async function answerLeaderQuestion(questionId: string, text: string): Promise<LeaderSendResult | null> {\n const result = narrowSendResult(await post(`${LEADER_QUESTIONS_PATH}/${pathSegment(questionId)}/answer`, { text }));\n // The question's Needs-you row closes with its answer.\n void refreshActivity();\n return result;\n}\n\n/**\n * Approve a class-B action now (skip the window) or a class-C ask.\n * `{ ok, code, outcome, message, action, thread }`: a 409 (nothing to\n * approve, or refused now) throws with the server's `message` as its reason\n * (client.ts readRefusal); the approval and the Leader's acknowledgement\n * reach the conversation through the thread refetch.\n */\nexport async function approveLeaderAction(actionId: string): Promise<unknown> {\n const result = await post(`${LEADER_ACTIONS_PATH}/${pathSegment(actionId)}/approve`, {});\n invalidate(SURFACE_KEYS.leader);\n invalidate(LEADER_THREAD_KEYS.thread);\n void refreshActivity();\n return result;\n}\n\n/**\n * POST /directives → `{ directive, duplicate }` (201 new, 200 when the same\n * words are already in force — either way the chip is there after the refetch).\n */\nexport async function addLeaderDirective(text: string): Promise<DirectiveChip | null> {\n const raw = await post(LEADER_DIRECTIVES_PATH, { text });\n invalidate(LEADER_THREAD_KEYS.directives);\n invalidate(LEADER_THREAD_KEYS.thread);\n const record = raw !== null && typeof raw === 'object' && 'directive' in raw ? (raw as { directive: unknown }).directive : raw;\n return narrowDirective(record);\n}\n\n/** DELETE /directives/<id> → `{ directive }` (now retired). */\nexport async function retireLeaderDirective(id: string): Promise<void> {\n await apiDelete<unknown>(`${LEADER_DIRECTIVES_PATH}/${pathSegment(id)}`, token());\n touchMutationHold();\n invalidate(LEADER_THREAD_KEYS.directives);\n invalidate(LEADER_THREAD_KEYS.thread);\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import{n as e,r as t}from"./line-diff-B5Eonif2.js";var n=new Map([[`read`,`read`],[`readfile`,`read`],[`read_file`,`read`],[`view`,`read`],[`notebookread`,`read`],[`notebook_read`,`read`],[`cat`,`read`],[`open`,`read`],[`read_many_files`,`read`],[`view_file`,`read`],[`edit`,`edit`],[`multiedit`,`edit`],[`multi_edit`,`edit`],[`notebookedit`,`edit`],[`notebook_edit`,`edit`],[`str_replace`,`edit`],[`str_replace_editor`,`edit`],[`str_replace_based_edit_tool`,`edit`],[`apply_patch`,`edit`],[`patch`,`edit`],[`edit_structural`,`edit`],[`search_replace_regex`,`edit`],[`rename_file`,`edit`],[`update`,`edit`],[`applydiff`,`edit`],[`apply_diff`,`edit`],[`file_change`,`edit`],[`write`,`create`],[`create`,`create`],[`create_file`,`create`],[`writefile`,`create`],[`write_file`,`create`],[`new_file`,`create`],[`delete`,`delete`],[`delete_file`,`delete`],[`remove_file`,`delete`],[`rm`,`delete`],[`bash`,`command`],[`shell`,`command`],[`exec`,`command`],[`run`,`command`],[`run_command`,`command`],[`runcommand`,`command`],[`run_terminal_cmd`,`command`],[`bash_start`,`command`],[`bash_tail`,`command`],[`terminal`,`command`],[`test`,`command`],[`command_execution`,`command`],[`exec_command`,`command`],[`run_shell_command`,`command`],[`grep`,`search`],[`glob`,`search`],[`search`,`search`],[`find`,`search`],[`codebase_search`,`search`],[`ls`,`search`],[`tree`,`search`],[`list_dir`,`search`],[`task`,`task`],[`agent`,`task`],[`dispatch_agent`,`task`],[`subagent`,`task`],[`webfetch`,`web`],[`web_fetch`,`web`],[`fetch`,`web`],[`fetch_url`,`web`],[`http`,`web`],[`browser`,`web`],[`navigate`,`web`],[`open_page`,`web`],[`read_url`,`web`],[`browse`,`web`],[`websearch`,`web`],[`web_search`,`web`],[`search_web`,`web`],[`google_search`,`web`],[`brave_search`,`web`],[`bing_search`,`web`],[`tavily_search`,`web`],[`exa_search`,`web`],[`search_query`,`web`]]),r=new Set([`websearch`,`web_search`,`search_web`,`google_search`,`brave_search`,`bing_search`,`tavily_search`,`exa_search`,`search_query`]);function i(e){let t=e.trim();if(/^mcp:/i.test(t)){let e=t.lastIndexOf(`.`);t=e>=0?t.slice(e+1):t.slice(4)}let n=t.split(`__`).filter(Boolean);return(n[n.length-1]??t).trim().toLowerCase()}function a(e){return n.get(i(e))??`other`}function o(e){return r.has(i(e))}function s(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function c(e){return typeof e==`string`&&e.length>0?e:null}function l(e){let t=typeof e==`string`&&/^\d+$/.test(e.trim())?Number(e):e;return typeof t==`number`&&Number.isInteger(t)&&t>0&&t<1e8?t:null}var u=[`file_path`,`filePath`,`notebook_path`,`notebookPath`,`target_file`,`path`,`file`,`filename`,`fileName`,`relative_workspace_path`,`absolute_path`];function d(e){let t=s(e);if(!t)return[];let n=[],r=e=>{let t=c(e);t&&!t.includes(`\0`)&&!n.includes(t)&&n.push(t)};for(let e of u)r(t[e]);for(let e of[`paths`,`file_paths`,`files`,`changes`]){let n=t[e];if(Array.isArray(n))for(let e of n)r(typeof e==`string`?e:s(e)?.path)}return n}function f(e){let t=e.split(/[\\/]/).filter(Boolean);return t[t.length-1]??e}var p=160,m=2048,ee=16384,te=[`file`,`url`,`search`,`doc`,`memory`,`knowledge`];function h(e){let t=e.replace(/[\u0000-\u001f\u007f]+/g,` `).replace(/\s+/g,` `).trim();return t.length>p?`${t.slice(0,159)}…`:t}function g(e){let t=e.replace(/\\/g,`/`);return/\/\.ashlr\/verse\/memory\//.test(t)||/\/\.claude\/projects\/[^/]+\/memory\//.test(t)||/(^|\/)MEMORY\.md$/.test(t)?`memory`:/\/\.ashlr\/knowledge\/wiki\//.test(t)?`doc`:/\/\.ashlr\/(?:learn|knowledge)\//.test(t)?`knowledge`:/\.(?:md|mdx|markdown|rst|adoc)$/i.test(t)||/(^|\/)docs?\//i.test(t)?`doc`:`file`}function _(e){let t=e.trim();if(t.length===0||t.length>m||!/^https?:\/\//i.test(t))return null;let n;try{n=new URL(t)}catch{return null}if(n.protocol!==`http:`&&n.protocol!==`https:`)return null;n.username=``,n.password=``,n.hash=``;let r=n.toString();return n.pathname!==`/`&&r.endsWith(`/`)&&!n.search&&(r=r.slice(0,-1)),n.pathname===`/`&&!n.search&&(r=r.replace(/\/$/,``)),{url:r,domain:n.hostname.replace(/^www\./i,``).toLowerCase()}}function v(e,t,n){let r=_(e);if(!r)return null;let i=r.domain;try{let e=new URL(r.url).pathname;e&&e!==`/`&&(i=`${r.domain}${e.length>60?`${e.slice(0,59)}…`:e}`)}catch{}let a={kind:`url`,ref:r.url,title:h(t&&t.trim()?t:i),origin:`tool`,url:r.url,domain:r.domain};return n&&(a.toolUseId=n),a}function y(e,t,n){let r={kind:g(e),ref:e,title:f(e),origin:`tool`,path:e};return t&&(r.lineStart=t.start,t.end!==null&&(r.lineEnd=t.end)),n&&(r.toolUseId=n),r}function b(e){let t=e.view_range;if(Array.isArray(t)&&t.length===2){let e=l(t[0]),n=typeof t[1]==`number`&&t[1]===-1?null:l(t[1]);if(e!==null)return{start:e,end:n!==null&&n>=e?n:null}}let n=l(e.start_line)??l(e.startLine)??l(e.line_start)??l(e.offset)??l(e.start)??l(e.line),r=l(e.end_line)??l(e.endLine)??l(e.line_end)??l(e.end),i=l(e.limit);if(n===null&&i===null)return null;let a=n??1;return r!==null&&r>=a?{start:a,end:r}:i===null?{start:a,end:null}:{start:a,end:a+i-1}}function x(e){let t=e.slice(0,400),n=/^\s*(\d{1,7})(?:→|\t)/.exec(t);if(!n)return null;let r=(e.length>800?e.slice(-800):e).split(`
2
+ `);for(let e=r.length-1;e>=0;--e){let t=/^\s*(\d{1,7})(?:→|\t)/.exec(r[e]);if(t){let e=Number(n[1]),r=Number(t[1]);return r>=e&&e>0?{start:e,end:r}:null}}return null}function S(e){if(Array.isArray(e)){let t=e.filter(e=>typeof e==`string`),n=t.findIndex(e=>/^-l?c$/.test(e)||e===`-lc`);return n>=1&&t[n+1]!==void 0?t[n+1]:t.join(` `)||null}let t=c(e);if(!t)return null;let n=/^\s*(?:\S*\/)?(?:ba|z|da)?sh\s+-l?c\s+(['"])([\s\S]*)\1\s*$/.exec(t);if(!n)return t;let r=n[2];return n[1]===`'`?r.replace(/'\\''/g,`'`):r.replace(/\\"/g,`"`)}function C(e){let t=[],n=``,r=null,i=!1;for(let a=0;a<e.length;a+=1){let o=e[a];if(r){o===r?r=null:o===`\\`&&r===`"`&&a+1<e.length?n+=e[++a]:n+=o;continue}if(o===`"`||o===`'`){r=o,i=!0;continue}if(o===`\\`&&a+1<e.length){n+=e[++a],i=!0;continue}if(/\s/.test(o)){(i||n)&&t.push(n),n=``,i=!1;continue}n+=o,i=!0}return(i||n)&&t.push(n),t}var w=new Set([`cat`,`sed`,`head`,`tail`,`nl`,`bat`,`less`,`more`,`batcat`]),ne=/[*?$`<>|;&(){}]|^\/dev\//;function T(e){let t=/^\s*(\d+)\s*(?:,\s*(\d+|\$)\s*)?p\s*$/.exec(e);if(!t)return null;let n=Number(t[1]),r=t[2]===void 0?n:t[2]===`$`?null:Number(t[2]);return n>0&&(r===null||r>=n)?{start:n,end:r}:null}function re(e){let t=S(e);if(!t||t.length>4e3)return[];let n=[];for(let e of t.split(/&&|\|\||;|\n/).slice(0,20)){let t=e.split(`|`).map(e=>C(e.trim())).filter(e=>e.length>0),r=[];for(let e of t){let t=f(e[0]);if(!w.has(t)){r=[];continue}let i=e.slice(1),a=null,o=[];for(let e=0;e<i.length;e+=1){let n=i[e];if(/^\d*>/.test(n))break;if(t===`sed`){if(n===`-n`)continue;if(n===`-e`&&i[e+1]!==void 0){a=T(i[++e])??a;continue}let t=T(n);if(t){a=t;continue}}if((t===`head`||t===`tail`)&&(n===`-n`||n===`-c`)){let r=l(i[++e]);t===`head`&&n===`-n`&&r!==null&&(a={start:1,end:r});continue}if(t===`head`&&/^-\d+$/.test(n)){a={start:1,end:Number(n.slice(1))};continue}n.startsWith(`-`)||(t!==`sed`||o.length!==0||a!==null||!/^[\d,$]*[a-z]/i.test(n)||n.includes(`/`))&&!ne.test(n)&&n.length<1024&&o.push(n)}if(o.length===0&&r.length>0&&a){for(let e of r)e.range=a;continue}r=o.map(e=>({path:e,range:a})),n.push(...r)}}let r=new Set;return n.filter(e=>!r.has(e.path)&&(r.add(e.path),!0)).slice(0,12)}function ie(e){let t=e.slice(0,ee),n=[],r=/Links:\s*(\[[\s\S]*?\])\s*(?:\n|$)/.exec(t);if(r)try{let e=JSON.parse(r[1]);if(Array.isArray(e))for(let t of e){let e=s(t),r=c(e?.url);r&&n.push({title:c(e?.title),url:r})}}catch{}if(n.length===0){let e=/\[([^\]\n]{1,200})\]\((https?:\/\/[^\s)]+)\)/g;for(let r=e.exec(t);r&&n.length<12;r=e.exec(t))n.push({title:r[1],url:r[2]})}return n}function ae(e){let t=e.slice(0,2e3),n=/^(?:#\s+(.+)|Title:\s*(.+))$/m.exec(t),r=n?(n[1]??n[2]??``).trim():``;return r.length>0?r:null}var E=[`url`,`uri`,`href`,`link`,`page_url`];function D(e){if(e.output===null||e.isError)return[];let t=a(e.name),n=s(e.input),r=e.toolUseId,i=[];if(t===`read`){let t=(n?b(n):null)??x(e.output);for(let n of d(e.input))i.push(y(n,t,r));return i.slice(0,12)}if(t===`web`||t===`other`&&n&&E.some(e=>c(n[e])?.startsWith(`http`))){let t=n?c(n.query)??c(n.q)??c(n.search_query):null;if(o(e.name)||t&&!E.some(e=>n?.[e])){if(t){let e={kind:`search`,ref:`search:${t.trim().toLowerCase()}`,title:h(t),origin:`tool`,query:t.trim()};r&&(e.toolUseId=r),i.push(e)}for(let t of ie(e.output)){let e=v(t.url,t.title,r);if(e&&i.push(e),i.length>=12)break}}if(n)for(let t of E){let a=c(n[t]);if(!a)continue;let o=v(a,ae(e.output),r);o&&i.push(o);break}return i.slice(0,12)}if(t===`command`&&n){let e=n.command??n.cmd??n.script??n.commandLine;for(let t of re(e))i.push(y(t.path,t.range,r));return i}return i}function O(e){let t=[...e].sort((e,t)=>e.start-t.start),n=[];for(let e of t){let t=n[n.length-1];t&&(t.end===null||e.start<=t.end+1)?t.end=t.end===null||e.end===null?null:Math.max(t.end,e.end):n.push({start:e.start,end:e.end})}return n}function k(e){let t=new Map;for(let n of e){let e=t.get(n.ref);e||(e={n:t.size+1,source:n,ranges:[],toolUseIds:[],count:0,whole:!1,raw:[]},t.set(n.ref,e)),e.count+=1,n.toolUseId&&!e.toolUseIds.includes(n.toolUseId)&&e.toolUseIds.push(n.toolUseId),n.lineStart===void 0?n.kind!==`url`&&n.kind!==`search`&&(e.whole=!0):e.raw.push({start:n.lineStart,end:n.lineEnd??null})}return[...t.values()].map(({whole:e,raw:t,...n})=>({...n,ranges:e?[]:O(t)}))}function A(e){return e.map(e=>e.end===null?`${e.start}+`:e.end===e.start?`${e.start}`:`${e.start}-${e.end}`).join(`, `)}function j(){return{filesRead:0,filesEdited:0,filesCreated:0,filesDeleted:0,commands:0,commandsFailed:0,codeSearches:0,webLookups:0,subagents:0,otherTools:0,failed:0,sources:0,thoughts:0,hiddenThoughts:0}}function M(e,t,n){return`${e} ${e===1?t:n}`}function N(e,t=` · `){let n=[];e.filesRead>0&&n.push(`read ${M(e.filesRead,`file`,`files`)}`);let r=[];if(e.filesEdited>0&&r.push(`edited ${M(e.filesEdited,`file`,`files`)}`),e.filesCreated>0&&r.push(`created ${M(e.filesCreated,`file`,`files`)}`),e.filesDeleted>0&&r.push(`deleted ${M(e.filesDeleted,`file`,`files`)}`),r.length>0){let t=(e.additions??0)>0||(e.deletions??0)>0?` (+${e.additions??0} −${e.deletions??0})`:``;r[r.length-1]+=t,n.push(...r)}e.commands>0&&n.push(`ran ${M(e.commands,`command`,`commands`)}${e.commandsFailed>0?` (${e.commandsFailed} failed)`:``}`),e.codeSearches>0&&n.push(`searched the code ${e.codeSearches===1?`once`:`${e.codeSearches}×`}`),e.webLookups>0&&n.push(M(e.webLookups,`web lookup`,`web lookups`)),e.subagents>0&&n.push(`ran ${M(e.subagents,`subagent`,`subagents`)}`),e.otherTools>0&&n.push(`used ${M(e.otherTools,`other tool`,`other tools`)}`);let i=e.failed-e.commandsFailed;i>0&&n.push(`${i} failed call${i===1?``:`s`}`);let a=n.join(t);return a.length>0?`${a[0].toUpperCase()}${a.slice(1)}`:``}function P(e){switch(e){case`claude`:return{visibility:`summary`,silentTurnNote:null};case`codex`:return{visibility:`summary`,silentTurnNote:`No reasoning summary was returned for this turn`};case`grok`:return{visibility:`hidden`,silentTurnNote:`Reasoning not shared by this model`};case`local`:return{visibility:`varies`,silentTurnNote:null};default:return{visibility:`hidden`,silentTurnNote:e?`Reasoning not shared by this seat`:null}}}new Set(te);var F=[`edit`,`create`,`delete`];function I(e){return i(e)}function L(e){return a(e)}function R(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function z(e){return typeof e==`string`&&e.length>0?e:null}function B(e){return d(e)}function V(e){let t=e.split(/[\\/]/).filter(Boolean);return t[t.length-1]??e}function H(e){let t=e.split(/[\\/]/);return t.pop(),t.join(`/`)}var oe=[`command`,`cmd`,`script`,`shell_command`,`commandLine`],U=/^[ \t]*(?:exit(?:ed)?[ \t]+(?:with[ \t]+)?(?:code|status)|exit[ \t]*code|exit[ \t]*status|command[ \t]+exited[ \t]+with[ \t]+code)[ \t]*[:=]?[ \t]*(\d{1,3})[ \t]*\.?$/im;function W(e){let t=U.exec(e);if(!t)return null;let n=Number(t[1]);return Number.isInteger(n)&&n>=0&&n<=255?n:null}var G=/^diff --git /m,K=/^--- (?:a\/|\/dev\/null|[^\n]*\t)/m,q=/^\+\+\+ (?:b\/|\/dev\/null|[^\n]*\t)/m,se=/^@@ -\d+(?:,\d+)? \+\d+(?:,\d+)? @@/m;function J(e){return e?G.test(e)?!0:se.test(e)&&K.test(e)&&q.test(e):!1}function Y(e){let t=e.match(/^diff --git /gm);return t?t.length:(e.match(/^--- /gm)??[]).length}function X(e){let t=R(e);if(!t)return null;let n=t.old_string??t.oldString??t.old_str??t.old??t.search??t.find,r=t.new_string??t.newString??t.new_str??t.new??t.replace??t.replacement;return typeof n!=`string`||typeof r!=`string`?null:{old:n,next:r}}function ce(n,r){let i=[],a=1;return r.forEach((o,s)=>{let c=t(o.old,o.next,{path:n,oldStart:a,newStart:a,section:r.length>1?`edit ${s+1} of ${r.length}`:void 0});a+=Math.max(e(o.old).length,e(o.next).length)+8,c&&i.push(c.split(`
3
+ `).slice(2).join(`
4
+ `))}),i.length===0?``:[`--- a/${n}`,`+++ b/${n}`,...i].join(`
5
+ `)}function le(t,n){let r=e(n);return r.length===0?``:[`--- /dev/null`,`+++ b/${t}`,`@@ -0,0 +1,${r.length} @@`,...r.map(e=>`+${e}`)].join(`
6
+ `)}var Z=2e5;function Q(e){return e.length<=2e5?e:`${e.slice(0,Z)}\n… (${e.length-Z} more characters not shown)`}var $=/\bhas been updated\b|\bsuccessfully (?:over)?written\b|\bupdated successfully\b/i,ue=/\b(?:file )?created successfully\b|\bnew file created\b/i;function de({name:e,input:t,result:n}){let r=I(e),i=L(e),a=R(t),o=n?.output??``,s=n===null;i===`create`&&n&&$.test(o)&&!ue.test(o)&&(i=`edit`),r===`file_change`&&(i=fe(a)??i);let c=B(t),l=c[0]??null,u=null;if(a)for(let e of oe){let t=z(a[e]);if(t){u={command:t,exitCode:n?W(o):null},i===`other`&&(i=`command`);break}}let d=null,f=null;if(n&&J(o)&&(d={text:Q(o),anchored:!0,multiFile:Y(o)>1,origin:`output`}),!d&&a){let e=z(a.patch)??z(a.diff);e&&J(e)&&(d={text:Q(e),anchored:!0,multiFile:Y(e)>1,origin:`payload`})}if(!d&&a&&l){let e=X(a),t=a.edits??a.replacements??a.changes,n=Array.isArray(t)?t.map(X).filter(e=>e!==null):[],r=n.length>0?n:e?[e]:[];if(r.length>0){let e=ce(l,r);e&&(d={text:Q(e),anchored:!1,multiFile:!1,origin:`payload`}),i===`other`&&(i=`edit`)}}if(!d&&a&&l){let e=typeof a.content==`string`?a.content:typeof a.contents==`string`?a.contents:typeof a.text==`string`&&(i===`create`||i===`edit`)?a.text:null;if(e!==null){if(i===`create`){let t=le(l,e);t&&(d={text:Q(t),anchored:!0,multiFile:!1,origin:`payload`})}else f={path:l,text:Q(e)}}}let p=n!==null&&(n.isError||(u?.exitCode??0)>0),m=p?[]:D({name:e,input:t,output:n?o:null,isError:n?.isError===!0});return{base:r,action:i,paths:c,command:u,diff:d,written:f,failed:p,pending:s,sources:m,web:me(e,i,a),task:he(i,a)}}function fe(e){let t=e?.changes;if(!Array.isArray(t)||t.length===0)return null;let n=new Set(t.map(e=>String(R(e)?.kind??``).toLowerCase()));return n.size===1&&n.has(`add`)?`create`:n.size===1&&n.has(`delete`)?`delete`:`edit`}var pe=[`url`,`uri`,`href`,`link`,`page_url`];function me(e,t,n){if(t!==`web`||!n)return null;let r=z(n.query)??z(n.q)??z(n.search_query),i=null;for(let e of pe){let t=z(n[e]);if(t){i=t;break}}let a=i?_(i):null;return{mode:o(e)&&!i?`search`:i?`fetch`:r?`search`:`fetch`,query:r,url:a?.url??i,domain:a?.domain??null}}function he(e,t){return e!==`task`||!t?null:{description:z(t.description)??z(t.task)??z(t.prompt)?.split(`
7
+ `)[0]?.slice(0,120)??null,agent:z(t.subagent_type)??z(t.agent)??z(t.agent_type)}}function ge(e){return`verse-tool-${e.replace(/[^A-Za-z0-9_-]/g,``)}`}export{H as a,ge as c,j as d,A as f,V as i,k as l,P as m,L as n,B as o,o as p,I as r,de as s,F as t,N as u};
8
+ //# sourceMappingURL=tool-semantics-xF0Fw2Ck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-semantics-xF0Fw2Ck.js","names":[],"sources":["../../../../../../src/core/verse/trace.ts","../../../../../../src/web-ui/routes/verse/chat/tool-semantics.ts"],"sourcesContent":["/**\n * core/verse/trace.ts — one typed schema for \"what the agent thought, did,\n * and drew on\", whichever seat ran the turn (V3.15, additive).\n *\n * Every adapter already lowers its CLI's stream into the persisted VerseEvent\n * log (`thinking`, `tool-use`, `tool-result`, …). What each consumer then had\n * to re-derive on its own — which tool calls READ something, which URL a\n * fetch hit, what a turn amounted to, whether a seat's silence about its\n * reasoning is a choice or an absence — lives here, as pure functions:\n *\n * - `VerseTraceEvent` the normalized shape: `thinking`, `tool-call`,\n * `tool-result`, `source`, `summary`;\n * - `normalizeVerseEvents` VerseEvent[] → VerseTraceEvent[] (read side);\n * - `lowerTraceEvent` VerseTraceEvent → persisted VerseEvent shapes\n * (write side). A new adapter — the Devin chat\n * seat — can emit the normalized schema and let\n * this turn it into the events every existing\n * client already renders;\n * - `sourcesFromToolCall` the files / pages / searches one call proves the\n * agent saw, with the exact line range when the\n * payload or its output says so;\n * - `collateSources` numbered, de-duplicated citations;\n * - `describeTurnWork` the one-line \"what it did\" for a turn;\n * - `reasoningPolicyFor` an honest label for a seat that keeps its\n * reasoning to itself.\n *\n * DERIVED, NOT STORED. A source that a tool call proves is recomputed from the\n * call on every read, so it can never disagree with the call it came from;\n * only sources NO call shows (injected context, a remote seat's report) are\n * persisted as a `source` event. Same for summaries: a summary is a function\n * of the turn's events, so it is never written to the log.\n *\n * BROWSER-SAFE: type-only imports, no node:*. The web transcript and the\n * server share every classification below, so a Read is a read on both sides.\n *\n * Honesty rule (DESIGN §6, VERSE-TELEMETRY-V2): unknown is absent, never 0.\n */\nimport type { VerseEvent, VerseSource, VerseSourceKind, VerseThinkingKind } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Tool classification (shared with web-ui chat/tool-semantics.ts)\n// ---------------------------------------------------------------------------\n\nexport type VerseToolAction =\n | 'read'\n | 'edit'\n | 'create'\n | 'delete'\n | 'command'\n | 'search'\n | 'task'\n | 'web'\n | 'other';\n\n/** Bare tool names (lower-case, transport prefix removed) → what the call does. */\nexport const VERSE_TOOL_ACTION_BY_NAME: ReadonlyMap<string, VerseToolAction> = new Map<string, VerseToolAction>([\n ['read', 'read'], ['readfile', 'read'], ['read_file', 'read'], ['view', 'read'],\n ['notebookread', 'read'], ['notebook_read', 'read'], ['cat', 'read'], ['open', 'read'],\n ['read_many_files', 'read'], ['view_file', 'read'],\n ['edit', 'edit'], ['multiedit', 'edit'], ['multi_edit', 'edit'], ['notebookedit', 'edit'],\n ['notebook_edit', 'edit'], ['str_replace', 'edit'], ['str_replace_editor', 'edit'],\n ['str_replace_based_edit_tool', 'edit'], ['apply_patch', 'edit'], ['patch', 'edit'],\n ['edit_structural', 'edit'], ['search_replace_regex', 'edit'], ['rename_file', 'edit'],\n ['update', 'edit'], ['applydiff', 'edit'], ['apply_diff', 'edit'], ['file_change', 'edit'],\n ['write', 'create'], ['create', 'create'], ['create_file', 'create'], ['writefile', 'create'],\n ['write_file', 'create'], ['new_file', 'create'],\n ['delete', 'delete'], ['delete_file', 'delete'], ['remove_file', 'delete'], ['rm', 'delete'],\n ['bash', 'command'], ['shell', 'command'], ['exec', 'command'], ['run', 'command'],\n ['run_command', 'command'], ['runcommand', 'command'], ['run_terminal_cmd', 'command'],\n ['bash_start', 'command'], ['bash_tail', 'command'], ['terminal', 'command'], ['test', 'command'],\n ['command_execution', 'command'], ['exec_command', 'command'], ['run_shell_command', 'command'],\n ['grep', 'search'], ['glob', 'search'], ['search', 'search'], ['find', 'search'],\n ['codebase_search', 'search'], ['ls', 'search'], ['tree', 'search'], ['list_dir', 'search'],\n ['task', 'task'], ['agent', 'task'], ['dispatch_agent', 'task'], ['subagent', 'task'],\n ['webfetch', 'web'], ['web_fetch', 'web'], ['fetch', 'web'], ['fetch_url', 'web'], ['http', 'web'],\n ['browser', 'web'], ['navigate', 'web'], ['open_page', 'web'], ['read_url', 'web'], ['browse', 'web'],\n ['websearch', 'web'], ['web_search', 'web'], ['search_web', 'web'], ['google_search', 'web'],\n ['brave_search', 'web'], ['bing_search', 'web'], ['tavily_search', 'web'], ['exa_search', 'web'],\n ['search_query', 'web'],\n]);\n\n/** Web tools whose INPUT is a query, not an address. */\nconst WEB_SEARCH_NAMES: ReadonlySet<string> = new Set([\n 'websearch', 'web_search', 'search_web', 'google_search', 'brave_search', 'bing_search',\n 'tavily_search', 'exa_search', 'search_query',\n]);\n\n/**\n * Strip transport prefixes so an MCP-routed call reads as the call it is:\n * `mcp__plugin_ashlr_ashlr__ashlr__edit` → `edit`, codex `mcp:ashlr.read` → `read`.\n */\nexport function baseToolName(name: string): string {\n let bare = name.trim();\n if (/^mcp:/i.test(bare)) {\n const dot = bare.lastIndexOf('.');\n bare = dot >= 0 ? bare.slice(dot + 1) : bare.slice(4);\n }\n const parts = bare.split('__').filter(Boolean);\n return (parts[parts.length - 1] ?? bare).trim().toLowerCase();\n}\n\nexport function toolActionForName(name: string): VerseToolAction {\n return VERSE_TOOL_ACTION_BY_NAME.get(baseToolName(name)) ?? 'other';\n}\n\n/** True for a web tool whose argument is a query (the search itself is the source). */\nexport function isWebSearchTool(name: string): boolean {\n return WEB_SEARCH_NAMES.has(baseToolName(name));\n}\n\n// ---------------------------------------------------------------------------\n// Payload readers\n// ---------------------------------------------------------------------------\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction str(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction posInt(value: unknown): number | null {\n const n = typeof value === 'string' && /^\\d+$/.test(value.trim()) ? Number(value) : value;\n return typeof n === 'number' && Number.isInteger(n) && n > 0 && n < 100_000_000 ? n : null;\n}\n\nconst PATH_KEYS = [\n 'file_path', 'filePath', 'notebook_path', 'notebookPath', 'target_file',\n 'path', 'file', 'filename', 'fileName', 'relative_workspace_path', 'absolute_path',\n];\n\n/**\n * Every path-ish string in a tool payload, first-seen order, de-duplicated —\n * including list forms (`paths`, `files`) and codex `file_change`'s\n * `changes: [{path, kind}]`.\n */\nexport function toolInputPaths(input: unknown): string[] {\n const rec = record(input);\n if (!rec) return [];\n const out: string[] = [];\n const push = (value: unknown) => {\n const s = str(value);\n if (s && !s.includes('\\0') && !out.includes(s)) out.push(s);\n };\n for (const key of PATH_KEYS) push(rec[key]);\n for (const key of ['paths', 'file_paths', 'files', 'changes']) {\n const list = rec[key];\n if (Array.isArray(list)) for (const item of list) push(typeof item === 'string' ? item : record(item)?.['path']);\n }\n return out;\n}\n\n/** `src/web-ui/App.tsx` → `App.tsx`. */\nexport function pathBasename(path: string): string {\n const parts = path.split(/[\\\\/]/).filter(Boolean);\n return parts[parts.length - 1] ?? path;\n}\n\n// ---------------------------------------------------------------------------\n// Sources\n// ---------------------------------------------------------------------------\n\n/** How many sources one call may contribute (a search page lists many links). */\nexport const MAX_SOURCES_PER_CALL = 12;\nconst MAX_TITLE_CHARS = 160;\nconst MAX_URL_CHARS = 2048;\n/** Output is only ever scanned at its head/tail — a build log must not cost a regex over megabytes. */\nconst OUTPUT_SCAN_CHARS = 16_384;\n\nexport const VERSE_SOURCE_KINDS: readonly VerseSourceKind[] = ['file', 'url', 'search', 'doc', 'memory', 'knowledge'];\n\nfunction cleanTitle(text: string): string {\n // eslint-disable-next-line no-control-regex -- stripping control characters is the point\n const flat = text.replace(/[\\u0000-\\u001f\\u007f]+/g, ' ').replace(/\\s+/g, ' ').trim();\n return flat.length > MAX_TITLE_CHARS ? `${flat.slice(0, MAX_TITLE_CHARS - 1)}…` : flat;\n}\n\n/**\n * What kind of file-ish source a path is. Shared memory lives under\n * `~/.ashlr/verse/memory/` (project-memory.ts); approved knowledge and retros\n * under `~/.ashlr/learn/` (#535); the private repo wiki under\n * `~/.ashlr/knowledge/wiki/` (#537). Repository prose (`*.md`, `docs/`) is\n * documentation; everything else is a file.\n */\nexport function classifyPath(path: string): Extract<VerseSourceKind, 'file' | 'doc' | 'memory' | 'knowledge'> {\n const p = path.replace(/\\\\/g, '/');\n if (/\\/\\.ashlr\\/verse\\/memory\\//.test(p) || /\\/\\.claude\\/projects\\/[^/]+\\/memory\\//.test(p) || /(^|\\/)MEMORY\\.md$/.test(p)) return 'memory';\n if (/\\/\\.ashlr\\/knowledge\\/wiki\\//.test(p)) return 'doc';\n if (/\\/\\.ashlr\\/(?:learn|knowledge)\\//.test(p)) return 'knowledge';\n if (/\\.(?:md|mdx|markdown|rst|adoc)$/i.test(p) || /(^|\\/)docs?\\//i.test(p)) return 'doc';\n return 'file';\n}\n\n/** A normalized http(s) URL (no fragment, no trailing slash on the path) and its bare domain, or null. */\nexport function normalizeUrl(raw: string): { url: string; domain: string } | null {\n const text = raw.trim();\n if (text.length === 0 || text.length > MAX_URL_CHARS || !/^https?:\\/\\//i.test(text)) return null;\n let parsed: URL;\n try {\n parsed = new URL(text);\n } catch {\n return null;\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return null;\n // Credentials in a URL are a secret, not a citation.\n parsed.username = '';\n parsed.password = '';\n parsed.hash = '';\n let url = parsed.toString();\n if (parsed.pathname !== '/' && url.endsWith('/') && !parsed.search) url = url.slice(0, -1);\n if (parsed.pathname === '/' && !parsed.search) url = url.replace(/\\/$/, '');\n return { url, domain: parsed.hostname.replace(/^www\\./i, '').toLowerCase() };\n}\n\nfunction urlSource(raw: string, title: string | null, toolUseId: string | undefined): VerseSource | null {\n const norm = normalizeUrl(raw);\n if (!norm) return null;\n let fallback = norm.domain;\n try {\n const path = new URL(norm.url).pathname;\n if (path && path !== '/') fallback = `${norm.domain}${path.length > 60 ? `${path.slice(0, 59)}…` : path}`;\n } catch { /* normalizeUrl already parsed it */ }\n const source: VerseSource = {\n kind: 'url',\n ref: norm.url,\n title: cleanTitle(title && title.trim() ? title : fallback),\n origin: 'tool',\n url: norm.url,\n domain: norm.domain,\n };\n if (toolUseId) source.toolUseId = toolUseId;\n return source;\n}\n\nfunction fileSource(path: string, range: LineRange | null, toolUseId: string | undefined): VerseSource {\n const source: VerseSource = { kind: classifyPath(path), ref: path, title: pathBasename(path), origin: 'tool', path };\n if (range) {\n source.lineStart = range.start;\n if (range.end !== null) source.lineEnd = range.end;\n }\n if (toolUseId) source.toolUseId = toolUseId;\n return source;\n}\n\ninterface LineRange { start: number; end: number | null }\n\n/** A line range the INPUT names (Read offset/limit, view_range, start/end lines). */\nfunction inputRange(rec: Record<string, unknown>): LineRange | null {\n const view = rec['view_range'];\n if (Array.isArray(view) && view.length === 2) {\n const a = posInt(view[0]);\n const b = typeof view[1] === 'number' && view[1] === -1 ? null : posInt(view[1]);\n if (a !== null) return { start: a, end: b !== null && b >= a ? b : null };\n }\n const start = posInt(rec['start_line']) ?? posInt(rec['startLine']) ?? posInt(rec['line_start']) ?? posInt(rec['offset'])\n ?? posInt(rec['start']) ?? posInt(rec['line']);\n const end = posInt(rec['end_line']) ?? posInt(rec['endLine']) ?? posInt(rec['line_end']) ?? posInt(rec['end']);\n const limit = posInt(rec['limit']);\n if (start === null && limit === null) return null;\n const from = start ?? 1;\n if (end !== null && end >= from) return { start: from, end };\n if (limit !== null) return { start: from, end: from + limit - 1 };\n return { start: from, end: null };\n}\n\n/**\n * The range a READ's OUTPUT proves, from the line numbers the tool printed\n * (` 12→text` — Claude Code's Read; `12\\ttext` — cat -n / nl). Only the head\n * and tail are looked at.\n */\nfunction outputRange(output: string): LineRange | null {\n const head = output.slice(0, 400);\n const first = /^\\s*(\\d{1,7})(?:→|\\t)/.exec(head);\n if (!first) return null;\n const tail = output.length > 800 ? output.slice(-800) : output;\n const lines = tail.split('\\n');\n for (let i = lines.length - 1; i >= 0; i -= 1) {\n const m = /^\\s*(\\d{1,7})(?:→|\\t)/.exec(lines[i]!);\n if (m) {\n const start = Number(first[1]);\n const end = Number(m[1]);\n return end >= start && start > 0 ? { start, end } : null;\n }\n }\n return null;\n}\n\n// ---- shell reads (codex reads files with sed/cat/nl, not a Read tool) ------\n\n/** `bash -lc '<inner>'` / `['bash','-lc','<inner>']` → `<inner>`; anything else unchanged. */\nfunction unwrapShell(command: unknown): string | null {\n if (Array.isArray(command)) {\n const argv = command.filter((a): a is string => typeof a === 'string');\n const flag = argv.findIndex((a) => /^-l?c$/.test(a) || a === '-lc');\n if (flag >= 1 && argv[flag + 1] !== undefined) return argv[flag + 1]!;\n return argv.join(' ') || null;\n }\n const text = str(command);\n if (!text) return null;\n const wrapped = /^\\s*(?:\\S*\\/)?(?:ba|z|da)?sh\\s+-l?c\\s+(['\"])([\\s\\S]*)\\1\\s*$/.exec(text);\n if (!wrapped) return text;\n const inner = wrapped[2]!;\n return wrapped[1] === \"'\" ? inner.replace(/'\\\\''/g, \"'\") : inner.replace(/\\\\\"/g, '\"');\n}\n\n/** Minimal shell word splitter: quotes and backslashes, nothing else. */\nfunction shellWords(segment: string): string[] {\n const out: string[] = [];\n let word = '';\n let quote: '\"' | \"'\" | null = null;\n let has = false;\n for (let i = 0; i < segment.length; i += 1) {\n const c = segment[i]!;\n if (quote) {\n if (c === quote) quote = null;\n else if (c === '\\\\' && quote === '\"' && i + 1 < segment.length) word += segment[++i];\n else word += c;\n continue;\n }\n if (c === '\"' || c === \"'\") { quote = c; has = true; continue; }\n if (c === '\\\\' && i + 1 < segment.length) { word += segment[++i]; has = true; continue; }\n if (/\\s/.test(c)) {\n if (has || word) out.push(word);\n word = '';\n has = false;\n continue;\n }\n word += c;\n has = true;\n }\n if (has || word) out.push(word);\n return out;\n}\n\nconst READ_COMMANDS = new Set(['cat', 'sed', 'head', 'tail', 'nl', 'bat', 'less', 'more', 'batcat']);\nconst NOT_A_FILE = /[*?$`<>|;&(){}]|^\\/dev\\//;\n\n/** `sed -n '12,40p'` → 12..40; `sed -n 12p` → 12..12. */\nfunction sedRange(script: string): LineRange | null {\n const m = /^\\s*(\\d+)\\s*(?:,\\s*(\\d+|\\$)\\s*)?p\\s*$/.exec(script);\n if (!m) return null;\n const start = Number(m[1]);\n const end = m[2] === undefined ? start : m[2] === '$' ? null : Number(m[2]);\n return start > 0 && (end === null || end >= start) ? { start, end } : null;\n}\n\n/**\n * The files a shell command line READS, with the line range when `sed -n`\n * / `head -n` says so. Deliberately narrow: only the viewing commands above,\n * only literal path arguments. `grep`/`rg` searched; they did not read.\n */\nexport function shellReads(command: unknown): Array<{ path: string; range: LineRange | null }> {\n const inner = unwrapShell(command);\n if (!inner || inner.length > 4000) return [];\n const out: Array<{ path: string; range: LineRange | null }> = [];\n // `&&` / `;` / newline separate commands; `|` feeds the next one (nl … | sed -n 'a,bp').\n for (const chain of inner.split(/&&|\\|\\||;|\\n/).slice(0, 20)) {\n const stages = chain.split('|').map((s) => shellWords(s.trim())).filter((w) => w.length > 0);\n let pending: Array<{ path: string; range: LineRange | null }> = [];\n for (const words of stages) {\n const cmd = pathBasename(words[0]!);\n if (!READ_COMMANDS.has(cmd)) {\n pending = [];\n continue;\n }\n const args = words.slice(1);\n let range: LineRange | null = null;\n const files: string[] = [];\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i]!;\n // `> out` / `2>&1` / `>> log`: what follows is written, not read.\n if (/^\\d*>/.test(arg)) break;\n if (cmd === 'sed') {\n if (arg === '-n') continue;\n if (arg === '-e' && args[i + 1] !== undefined) { range = sedRange(args[++i]!) ?? range; continue; }\n const r = sedRange(arg);\n if (r) { range = r; continue; }\n }\n if ((cmd === 'head' || cmd === 'tail') && (arg === '-n' || arg === '-c')) {\n const n = posInt(args[++i]);\n if (cmd === 'head' && arg === '-n' && n !== null) range = { start: 1, end: n };\n continue;\n }\n if (cmd === 'head' && /^-\\d+$/.test(arg)) { range = { start: 1, end: Number(arg.slice(1)) }; continue; }\n if (arg.startsWith('-')) continue;\n if (cmd === 'sed' && files.length === 0 && range === null && /^[\\d,$]*[a-z]/i.test(arg) && !arg.includes('/')) continue;\n if (!NOT_A_FILE.test(arg) && arg.length < 1024) files.push(arg);\n }\n if (files.length === 0 && pending.length > 0 && range) {\n // `nl -ba f | sed -n '10,40p'` — the range belongs to the piped file.\n for (const entry of pending) entry.range = range;\n continue;\n }\n pending = files.map((path) => ({ path, range }));\n out.push(...pending);\n }\n }\n const seen = new Set<string>();\n return out.filter((entry) => (seen.has(entry.path) ? false : (seen.add(entry.path), true))).slice(0, MAX_SOURCES_PER_CALL);\n}\n\n// ---- web ------------------------------------------------------------------\n\n/** Claude Code's WebSearch result: `Links: [{\"title\":…,\"url\":…}, …]`. */\nfunction searchResultLinks(output: string): Array<{ title: string | null; url: string }> {\n const head = output.slice(0, OUTPUT_SCAN_CHARS);\n const links: Array<{ title: string | null; url: string }> = [];\n const block = /Links:\\s*(\\[[\\s\\S]*?\\])\\s*(?:\\n|$)/.exec(head);\n if (block) {\n try {\n const parsed: unknown = JSON.parse(block[1]!);\n if (Array.isArray(parsed)) {\n for (const item of parsed) {\n const rec = record(item);\n const url = str(rec?.['url']);\n if (url) links.push({ title: str(rec?.['title']), url });\n }\n }\n } catch { /* not JSON after all — fall through to markdown links */ }\n }\n if (links.length === 0) {\n const md = /\\[([^\\]\\n]{1,200})\\]\\((https?:\\/\\/[^\\s)]+)\\)/g;\n for (let m = md.exec(head); m && links.length < MAX_SOURCES_PER_CALL; m = md.exec(head)) links.push({ title: m[1]!, url: m[2]! });\n }\n return links;\n}\n\n/** A fetched page's title: a leading `# Heading` or `Title: …` line in its output. */\nfunction pageTitle(output: string): string | null {\n const head = output.slice(0, 2000);\n const m = /^(?:#\\s+(.+)|Title:\\s*(.+))$/m.exec(head);\n const title = m ? (m[1] ?? m[2] ?? '').trim() : '';\n return title.length > 0 ? title : null;\n}\n\nconst URL_KEYS = ['url', 'uri', 'href', 'link', 'page_url'];\n\nexport interface ToolCallForSources {\n name: string;\n input: unknown;\n /** Null while the call is still running. */\n output: string | null;\n isError: boolean;\n toolUseId?: string;\n}\n\n/**\n * The sources ONE tool call proves the agent saw. A failed or unfinished\n * call proves nothing (a Read that errored read nothing), so it yields none.\n * Pure and bounded: at most MAX_SOURCES_PER_CALL entries, output scanned at\n * its head and tail only.\n */\nexport function sourcesFromToolCall(call: ToolCallForSources): VerseSource[] {\n if (call.output === null || call.isError) return [];\n const action = toolActionForName(call.name);\n const rec = record(call.input);\n const id = call.toolUseId;\n const out: VerseSource[] = [];\n\n if (action === 'read') {\n const range = (rec ? inputRange(rec) : null) ?? outputRange(call.output);\n for (const path of toolInputPaths(call.input)) out.push(fileSource(path, range, id));\n return out.slice(0, MAX_SOURCES_PER_CALL);\n }\n\n if (action === 'web' || (action === 'other' && rec && URL_KEYS.some((k) => str(rec[k])?.startsWith('http')))) {\n const query = rec ? str(rec['query']) ?? str(rec['q']) ?? str(rec['search_query']) : null;\n if (isWebSearchTool(call.name) || (query && !URL_KEYS.some((k) => rec?.[k]))) {\n if (query) {\n const source: VerseSource = { kind: 'search', ref: `search:${query.trim().toLowerCase()}`, title: cleanTitle(query), origin: 'tool', query: query.trim() };\n if (id) source.toolUseId = id;\n out.push(source);\n }\n for (const link of searchResultLinks(call.output)) {\n const source = urlSource(link.url, link.title, id);\n if (source) out.push(source);\n if (out.length >= MAX_SOURCES_PER_CALL) break;\n }\n }\n if (rec) {\n for (const key of URL_KEYS) {\n const raw = str(rec[key]);\n if (!raw) continue;\n const source = urlSource(raw, pageTitle(call.output), id);\n if (source) out.push(source);\n break;\n }\n }\n return out.slice(0, MAX_SOURCES_PER_CALL);\n }\n\n if (action === 'command' && rec) {\n const command = rec['command'] ?? rec['cmd'] ?? rec['script'] ?? rec['commandLine'];\n for (const read of shellReads(command)) out.push(fileSource(read.path, read.range, id));\n return out;\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Citations\n// ---------------------------------------------------------------------------\n\nexport interface VerseCitation {\n /** 1-based citation number, in order of first use. */\n n: number;\n /** The first sighting's source (title/kind/url), ranges merged below. */\n source: VerseSource;\n /** Merged, sorted line ranges seen; empty = the whole file (or not a file). */\n ranges: Array<{ start: number; end: number | null }>;\n /** Every tool call that produced it, first first. */\n toolUseIds: string[];\n /** How many sightings were folded into this citation. */\n count: number;\n}\n\n/** Union of line ranges; an open-ended range (`end: null`) swallows everything after its start. */\nexport function mergeRanges(ranges: ReadonlyArray<{ start: number; end: number | null }>): Array<{ start: number; end: number | null }> {\n const sorted = [...ranges].sort((a, b) => a.start - b.start);\n const out: Array<{ start: number; end: number | null }> = [];\n for (const r of sorted) {\n const last = out[out.length - 1];\n if (last && (last.end === null || r.start <= last.end + 1)) {\n last.end = last.end === null || r.end === null ? null : Math.max(last.end, r.end);\n } else {\n out.push({ start: r.start, end: r.end });\n }\n }\n return out;\n}\n\n/**\n * De-duplicate by `ref` and number in order of first use. A file read whole\n * anywhere is cited whole (no ranges); otherwise its ranges are merged.\n */\nexport function collateSources(sources: readonly VerseSource[]): VerseCitation[] {\n const byRef = new Map<string, VerseCitation & { whole: boolean; raw: Array<{ start: number; end: number | null }> }>();\n for (const source of sources) {\n let entry = byRef.get(source.ref);\n if (!entry) {\n entry = { n: byRef.size + 1, source, ranges: [], toolUseIds: [], count: 0, whole: false, raw: [] };\n byRef.set(source.ref, entry);\n }\n entry.count += 1;\n if (source.toolUseId && !entry.toolUseIds.includes(source.toolUseId)) entry.toolUseIds.push(source.toolUseId);\n if (source.lineStart !== undefined) entry.raw.push({ start: source.lineStart, end: source.lineEnd ?? null });\n else if (source.kind !== 'url' && source.kind !== 'search') entry.whole = true;\n }\n return [...byRef.values()].map(({ whole, raw, ...citation }) => ({\n ...citation,\n ranges: whole ? [] : mergeRanges(raw),\n }));\n}\n\n/** `12-40, 88` — how a citation's ranges read after a path. */\nexport function formatRanges(ranges: ReadonlyArray<{ start: number; end: number | null }>): string {\n return ranges.map((r) => (r.end === null ? `${r.start}+` : r.end === r.start ? `${r.start}` : `${r.start}-${r.end}`)).join(', ');\n}\n\n// ---------------------------------------------------------------------------\n// Turn summary\n// ---------------------------------------------------------------------------\n\nexport interface VerseTurnStats {\n /** Distinct files by strongest action. */\n filesRead: number;\n filesEdited: number;\n filesCreated: number;\n filesDeleted: number;\n /** Diff line totals; absent when no call carried a diff. */\n additions?: number;\n deletions?: number;\n commands: number;\n commandsFailed: number;\n codeSearches: number;\n webLookups: number;\n subagents: number;\n otherTools: number;\n /** Failing tool calls of any kind. */\n failed: number;\n sources: number;\n /** Reasoning blocks shown (text) and hidden (redacted markers). */\n thoughts: number;\n hiddenThoughts: number;\n}\n\nexport function emptyTurnStats(): VerseTurnStats {\n return {\n filesRead: 0, filesEdited: 0, filesCreated: 0, filesDeleted: 0,\n commands: 0, commandsFailed: 0, codeSearches: 0, webLookups: 0, subagents: 0, otherTools: 0,\n failed: 0, sources: 0, thoughts: 0, hiddenThoughts: 0,\n };\n}\n\nfunction count(n: number, one: string, many: string): string {\n return `${n} ${n === 1 ? one : many}`;\n}\n\n/**\n * The one line a settled turn is summarized by — \"Read 8 files · edited 3\n * files (+42 −7) · ran 4 commands (1 failed) · 2 web lookups\". Built only\n * from counts; empty when the turn did no tool work (a plain answer needs no\n * summary line). Sources are listed under the answer, so they are not\n * repeated here.\n */\nexport function describeTurnWork(stats: VerseTurnStats, separator = ' · '): string {\n const parts: string[] = [];\n if (stats.filesRead > 0) parts.push(`read ${count(stats.filesRead, 'file', 'files')}`);\n const changed: string[] = [];\n if (stats.filesEdited > 0) changed.push(`edited ${count(stats.filesEdited, 'file', 'files')}`);\n if (stats.filesCreated > 0) changed.push(`created ${count(stats.filesCreated, 'file', 'files')}`);\n if (stats.filesDeleted > 0) changed.push(`deleted ${count(stats.filesDeleted, 'file', 'files')}`);\n if (changed.length > 0) {\n const delta = (stats.additions ?? 0) > 0 || (stats.deletions ?? 0) > 0\n ? ` (+${stats.additions ?? 0} −${stats.deletions ?? 0})`\n : '';\n changed[changed.length - 1] += delta;\n parts.push(...changed);\n }\n if (stats.commands > 0) {\n parts.push(`ran ${count(stats.commands, 'command', 'commands')}${stats.commandsFailed > 0 ? ` (${stats.commandsFailed} failed)` : ''}`);\n }\n if (stats.codeSearches > 0) parts.push(`searched the code ${stats.codeSearches === 1 ? 'once' : `${stats.codeSearches}×`}`);\n if (stats.webLookups > 0) parts.push(count(stats.webLookups, 'web lookup', 'web lookups'));\n if (stats.subagents > 0) parts.push(`ran ${count(stats.subagents, 'subagent', 'subagents')}`);\n if (stats.otherTools > 0) parts.push(`used ${count(stats.otherTools, 'other tool', 'other tools')}`);\n const nonCommandFailures = stats.failed - stats.commandsFailed;\n if (nonCommandFailures > 0) parts.push(`${nonCommandFailures} failed call${nonCommandFailures === 1 ? '' : 's'}`);\n const line = parts.join(separator);\n return line.length > 0 ? `${line[0]!.toUpperCase()}${line.slice(1)}` : '';\n}\n\n// ---------------------------------------------------------------------------\n// Reasoning visibility\n// ---------------------------------------------------------------------------\n\n/**\n * What a seat shows of its reasoning.\n * - `raw` the model's own chain of thought (local models);\n * - `summary` a provider-written summary (Claude 4+, hosted Codex models);\n * - `hidden` the provider keeps it to itself (Grok's CLI, remote agents);\n * - `varies` depends on the model behind the seat.\n */\nexport type VerseReasoningVisibility = 'raw' | 'summary' | 'hidden' | 'varies';\n\nexport interface VerseReasoningPolicy {\n visibility: VerseReasoningVisibility;\n /**\n * What to say under a SETTLED turn that carried no reasoning at all. Null\n * when silence is itself the truth: Claude marks a withheld think with a\n * redacted block, so no block means it did not think; a local model that\n * does not reason has nothing to show.\n */\n silentTurnNote: string | null;\n}\n\nexport function reasoningPolicyFor(engine: string | null | undefined): VerseReasoningPolicy {\n switch (engine) {\n case 'claude':\n return { visibility: 'summary', silentTurnNote: null };\n case 'codex':\n return { visibility: 'summary', silentTurnNote: 'No reasoning summary was returned for this turn' };\n case 'grok':\n return { visibility: 'hidden', silentTurnNote: 'Reasoning not shared by this model' };\n case 'local':\n return { visibility: 'varies', silentTurnNote: null };\n default:\n // A seat this build does not know (the Devin chat seat, a future CLI):\n // say what is true — nothing was shared — without blaming a model.\n return { visibility: 'hidden', silentTurnNote: engine ? 'Reasoning not shared by this seat' : null };\n }\n}\n\n// ---------------------------------------------------------------------------\n// The normalized schema\n// ---------------------------------------------------------------------------\n\nexport type VerseTraceEvent =\n | {\n type: 'thinking';\n turnId: string;\n text: string;\n /** The seat thought but withheld the words. */\n redacted: boolean;\n durationMs: number | null;\n kind: VerseThinkingKind | null;\n }\n | {\n type: 'tool-call';\n turnId: string;\n callId: string;\n /** The seat's own tool name, verbatim. */\n tool: string;\n action: VerseToolAction;\n input: unknown;\n }\n | { type: 'tool-result'; turnId: string; callId: string; output: string; isError: boolean }\n | { type: 'source'; turnId: string | null; source: VerseSource }\n | { type: 'summary'; turnId: string; text: string; stats: VerseTurnStats; ok: boolean; durationMs: number | null };\n\nexport type VerseTraceEventType = VerseTraceEvent['type'];\n\n/** A VerseEvent before the engine stamps `seq`/`at` (mirrors adapters/index.ts, which is node-side). */\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\nexport type VerseUnstampedEvent = DistributiveOmit<VerseEvent, 'seq' | 'at'>;\n\n/**\n * Normalized → the persisted events every client already renders (write side).\n * `source` persists only when no tool call proves it (origin `engine`/`agent`);\n * a `summary` is never persisted — it is re-derived from the turn's events.\n */\nexport function lowerTraceEvent(event: VerseTraceEvent): VerseUnstampedEvent[] {\n switch (event.type) {\n case 'thinking': {\n const out: Extract<VerseUnstampedEvent, { type: 'thinking' }> = { type: 'thinking', turnId: event.turnId, text: event.redacted ? '' : event.text };\n if (event.redacted) out.redacted = true;\n if (event.durationMs !== null && event.durationMs >= 0) out.durationMs = Math.round(event.durationMs);\n if (event.kind) out.kind = event.kind;\n return [out];\n }\n case 'tool-call':\n return [{ type: 'tool-use', turnId: event.turnId, toolUseId: event.callId, name: event.tool, input: event.input }];\n case 'tool-result':\n return [{ type: 'tool-result', turnId: event.turnId, toolUseId: event.callId, output: event.output, isError: event.isError }];\n case 'source':\n return event.source.origin === 'tool' ? [] : [{ type: 'source', turnId: event.turnId, source: event.source }];\n case 'summary':\n return [];\n default: {\n const never: never = event;\n return never;\n }\n }\n}\n\ninterface TurnAccumulator {\n stats: VerseTurnStats;\n files: Map<string, VerseToolAction>;\n refs: Set<string>;\n calls: Map<string, { name: string; input: unknown }>;\n}\n\nconst FILE_STRENGTH: Partial<Record<VerseToolAction, number>> = { read: 0, edit: 1, create: 2, delete: 3 };\n\nfunction tallyFiles(acc: TurnAccumulator): void {\n const s = acc.stats;\n s.filesRead = 0; s.filesEdited = 0; s.filesCreated = 0; s.filesDeleted = 0;\n for (const action of acc.files.values()) {\n if (action === 'read') s.filesRead += 1;\n else if (action === 'edit') s.filesEdited += 1;\n else if (action === 'create') s.filesCreated += 1;\n else if (action === 'delete') s.filesDeleted += 1;\n }\n}\n\n/**\n * The persisted log, read as the normalized schema. Each `tool-result` is\n * followed by the sources its call proves, and each `turn-done` by that\n * turn's `summary`. Transient and bookkeeping events are skipped.\n */\nexport function normalizeVerseEvents(events: readonly VerseEvent[]): VerseTraceEvent[] {\n const out: VerseTraceEvent[] = [];\n const turns = new Map<string, TurnAccumulator>();\n const turnFor = (turnId: string): TurnAccumulator => {\n let acc = turns.get(turnId);\n if (!acc) {\n acc = { stats: emptyTurnStats(), files: new Map(), refs: new Set(), calls: new Map() };\n turns.set(turnId, acc);\n }\n return acc;\n };\n const addSource = (turnId: string | null, source: VerseSource) => {\n out.push({ type: 'source', turnId, source });\n if (turnId === null) return;\n const acc = turnFor(turnId);\n if (!acc.refs.has(source.ref)) {\n acc.refs.add(source.ref);\n acc.stats.sources += 1;\n }\n };\n\n for (const event of events) {\n switch (event.type) {\n case 'thinking': {\n const redacted = event.redacted === true || event.text.length === 0;\n out.push({\n type: 'thinking',\n turnId: event.turnId,\n text: event.text,\n redacted,\n durationMs: typeof event.durationMs === 'number' ? event.durationMs : null,\n kind: event.kind ?? null,\n });\n const acc = turnFor(event.turnId);\n if (redacted) acc.stats.hiddenThoughts += 1;\n else acc.stats.thoughts += 1;\n break;\n }\n case 'tool-use': {\n const action = toolActionForName(event.name);\n out.push({ type: 'tool-call', turnId: event.turnId, callId: event.toolUseId, tool: event.name, action, input: event.input });\n const acc = turnFor(event.turnId);\n acc.calls.set(event.toolUseId, { name: event.name, input: event.input });\n if (action === 'command') acc.stats.commands += 1;\n else if (action === 'search') acc.stats.codeSearches += 1;\n else if (action === 'web') acc.stats.webLookups += 1;\n else if (action === 'task') acc.stats.subagents += 1;\n else if (action === 'other') acc.stats.otherTools += 1;\n const strength = FILE_STRENGTH[action];\n if (strength !== undefined) {\n for (const path of toolInputPaths(event.input)) {\n const prev = acc.files.get(path);\n if (prev === undefined || strength > (FILE_STRENGTH[prev] ?? -1)) acc.files.set(path, action);\n }\n tallyFiles(acc);\n }\n break;\n }\n case 'tool-result': {\n out.push({ type: 'tool-result', turnId: event.turnId, callId: event.toolUseId, output: event.output, isError: event.isError });\n const acc = turnFor(event.turnId);\n const call = acc.calls.get(event.toolUseId);\n if (event.isError) {\n acc.stats.failed += 1;\n if (call && toolActionForName(call.name) === 'command') acc.stats.commandsFailed += 1;\n }\n if (call) {\n for (const source of sourcesFromToolCall({ name: call.name, input: call.input, output: event.output, isError: event.isError, toolUseId: event.toolUseId })) {\n addSource(event.turnId, source);\n }\n }\n break;\n }\n case 'source':\n addSource(event.turnId, event.source);\n break;\n case 'turn-done': {\n const acc = turnFor(event.turnId);\n out.push({\n type: 'summary',\n turnId: event.turnId,\n text: describeTurnWork(acc.stats),\n stats: { ...acc.stats },\n ok: event.ok,\n durationMs: event.durationMs > 0 ? event.durationMs : null,\n });\n break;\n }\n default:\n break;\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Wire validation (shared by the session store and the web SSE reader)\n// ---------------------------------------------------------------------------\n\nconst SOURCE_KIND_SET: ReadonlySet<string> = new Set(VERSE_SOURCE_KINDS);\nconst ORIGINS: ReadonlySet<string> = new Set(['tool', 'engine', 'agent']);\n\nconst optionalString = (v: unknown, max: number): boolean => v === undefined || (typeof v === 'string' && v.length <= max);\nconst optionalLine = (v: unknown): boolean => v === undefined || (typeof v === 'number' && Number.isInteger(v) && v > 0);\n\n/** A `source` payload is well-formed. Malformed lines are dropped, never drawn. */\nexport function isVerseSource(value: unknown): value is VerseSource {\n const rec = record(value);\n if (!rec) return false;\n return typeof rec['kind'] === 'string' && SOURCE_KIND_SET.has(rec['kind'])\n && typeof rec['ref'] === 'string' && rec['ref'].length > 0 && rec['ref'].length <= 4096\n && typeof rec['title'] === 'string' && rec['title'].length <= 1024\n && typeof rec['origin'] === 'string' && ORIGINS.has(rec['origin'])\n && optionalString(rec['path'], 4096) && optionalString(rec['url'], MAX_URL_CHARS)\n && optionalString(rec['domain'], 255) && optionalString(rec['query'], 2048)\n && optionalString(rec['toolUseId'], 256) && optionalString(rec['detail'], 1024)\n && optionalLine(rec['lineStart']) && optionalLine(rec['lineEnd']);\n}\n","/**\n * routes/verse/chat/tool-semantics.ts — what a tool call actually DID.\n *\n * An agentic session is mostly tool work, and `{name, input, result}` is too\n * raw to read: the transcript can tell you `Edit` ran with some JSON, not\n * that `src/core/api.ts` gained four lines. Everything downstream — the\n * per-turn file-activity summary, the diff rendering, the command block, the\n * error affordances — needs the same derived facts, so they are derived ONCE\n * here, as pure functions over the event payload.\n *\n * Deliberately conservative. A fact that cannot be read out of the payload\n * (an exit code the tool never printed, the file offset an `Edit` payload\n * does not carry) is reported as unknown rather than guessed — DESIGN §6,\n * and the same discipline VERSE-TELEMETRY-V2 imposes on provider data.\n */\nimport type { VerseSource } from '../../../../core/verse/types.js';\nimport {\n baseToolName as coreBaseToolName,\n isWebSearchTool,\n normalizeUrl,\n sourcesFromToolCall,\n toolActionForName,\n toolInputPaths,\n type VerseToolAction,\n} from '../../../../core/verse/trace.js';\nimport { splitLines, unifiedDiffFor } from './line-diff.js';\n\n/** Shared with the server (core/verse/trace.ts) so a Read is a read on both sides. */\nexport type ToolAction = VerseToolAction;\n\n/** Actions that change the working tree — the blast radius of a turn. */\nexport const MUTATING_ACTIONS: readonly ToolAction[] = ['edit', 'create', 'delete'];\n\nexport interface ToolDiff {\n /** Unified-diff text, ready for `routes/inbox/diff-parser.ts`. */\n text: string;\n /**\n * False when the line numbers are synthetic. An `Edit` payload says what\n * was replaced, never where it sat, so the viewer hides the gutter rather\n * than printing numbers that are not the file's.\n */\n anchored: boolean;\n /** More than one file — the inbox `DiffViewer` file tree earns its place. */\n multiFile: boolean;\n /** Where the diff came from, for the block's caption. */\n origin: 'payload' | 'output';\n}\n\nexport interface CommandFacts {\n command: string;\n /** Only when the result states one in so many words; otherwise unknown. */\n exitCode: number | null;\n}\n\nexport interface WrittenContent {\n path: string;\n text: string;\n}\n\nexport interface ToolFacts {\n /** Normalized name with any MCP prefix removed (`ashlr__edit` → `edit`). */\n base: string;\n action: ToolAction;\n /** Files this call touched, most significant first; may be empty. */\n paths: string[];\n command: CommandFacts | null;\n diff: ToolDiff | null;\n /** A whole file written whose previous contents were never in the payload. */\n written: WrittenContent | null;\n /** The tool reported failure, or stated a non-zero exit. */\n failed: boolean;\n /** Still waiting for its result. */\n pending: boolean;\n /**\n * V3.15: what this call proves the agent saw — files (with the line range\n * the payload or output states), fetched pages, searches. Empty while\n * pending or when the call failed (a Read that errored read nothing).\n */\n sources: VerseSource[];\n /** V3.15: a web call's address or query, for the one-line row. */\n web: WebFacts | null;\n /** V3.15: a subagent call's brief, for the one-line row. */\n task: TaskFacts | null;\n}\n\nexport interface WebFacts {\n /** `search` = the argument is a query; `fetch` = an address. */\n mode: 'search' | 'fetch';\n query: string | null;\n url: string | null;\n domain: string | null;\n}\n\nexport interface TaskFacts {\n /** The short description the agent gave the subagent. */\n description: string | null;\n /** The subagent's type/name, when the call names one. */\n agent: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Name → action (the table lives in core/verse/trace.ts)\n// ---------------------------------------------------------------------------\n\n/**\n * Strip transport prefixes so an MCP-routed edit reads as an edit:\n * `mcp__plugin_ashlr_ashlr__ashlr__edit` → `edit`, codex `mcp:ashlr.edit` → `edit`.\n */\nexport function baseToolName(name: string): string {\n return coreBaseToolName(name);\n}\n\nexport function actionForName(name: string): ToolAction {\n return toolActionForName(name);\n}\n\n/** Short verb for a file-activity row; also the a11y wording. */\nexport const ACTION_LABEL: Record<ToolAction, string> = {\n read: 'read',\n edit: 'edited',\n create: 'created',\n delete: 'deleted',\n command: 'ran',\n search: 'searched',\n task: 'delegated',\n web: 'fetched',\n other: 'used',\n};\n\n// ---------------------------------------------------------------------------\n// Payload readers\n// ---------------------------------------------------------------------------\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction str(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\n/**\n * Every path-ish string in the payload, first-seen order, de-duplicated —\n * list forms and codex `file_change` `changes: [{path}]` included.\n */\nexport function pathsIn(input: unknown): string[] {\n return toolInputPaths(input);\n}\n\n/** `src/web-ui/App.tsx` → `App.tsx`. Never the whole path in a dense row. */\nexport function fileBasename(path: string): string {\n const parts = path.split(/[\\\\/]/).filter(Boolean);\n return parts[parts.length - 1] ?? path;\n}\n\n/** The directory part, for the second line of a file-activity row. */\nexport function fileDirname(path: string): string {\n const parts = path.split(/[\\\\/]/);\n parts.pop();\n return parts.join('/');\n}\n\n// ---------------------------------------------------------------------------\n// Commands\n// ---------------------------------------------------------------------------\n\nconst COMMAND_KEYS = ['command', 'cmd', 'script', 'shell_command', 'commandLine'];\n\n/**\n * A line that is nothing but a stated exit status. Deliberately anchored to\n * the whole line: `exit 1` appearing inside a shell script in the output is\n * not the command's exit code, and reporting it as one would be a lie in the\n * place the operator is most likely to trust.\n */\nconst EXIT_LINE = /^[ \\t]*(?:exit(?:ed)?[ \\t]+(?:with[ \\t]+)?(?:code|status)|exit[ \\t]*code|exit[ \\t]*status|command[ \\t]+exited[ \\t]+with[ \\t]+code)[ \\t]*[:=]?[ \\t]*(\\d{1,3})[ \\t]*\\.?$/im;\n\n/** The exit code the output states, or null when it states none. */\nexport function statedExitCode(output: string): number | null {\n const match = EXIT_LINE.exec(output);\n if (!match) return null;\n const code = Number(match[1]);\n return Number.isInteger(code) && code >= 0 && code <= 255 ? code : null;\n}\n\n// ---------------------------------------------------------------------------\n// Diffs\n// ---------------------------------------------------------------------------\n\nconst GIT_HEADER = /^diff --git /m;\nconst OLD_HEADER = /^--- (?:a\\/|\\/dev\\/null|[^\\n]*\\t)/m;\nconst NEW_HEADER = /^\\+\\+\\+ (?:b\\/|\\/dev\\/null|[^\\n]*\\t)/m;\nconst HUNK_HEADER = /^@@ -\\d+(?:,\\d+)? \\+\\d+(?:,\\d+)? @@/m;\n\n/**\n * True when this text is itself a unified diff we can hand to the parser.\n *\n * A `@@` hunk is sufficient but NOT necessary. `git diff`/`git show` output\n * consisting only of renames, only of mode changes, or only of\n * \"Binary files … differ\" carries no hunk header at all; requiring one sent\n * that output down the raw-terminal path, where a rename reads as noise. The\n * parser already degrades a hunkless entry into `unparsedNotice` and a\n * `renamed`/`added`/`deleted` status, both of which `DiffBlock` renders — so a\n * `diff --git` header on its own is enough to treat the text as a diff.\n */\nexport function looksLikeUnifiedDiff(text: string): boolean {\n if (!text) return false;\n if (GIT_HEADER.test(text)) return true;\n // Without the git header the `---`/`+++` pair is only conclusive alongside a\n // hunk; plain prose can contain a line of dashes.\n return HUNK_HEADER.test(text) && OLD_HEADER.test(text) && NEW_HEADER.test(text);\n}\n\nfunction fileCount(diff: string): number {\n const git = diff.match(/^diff --git /gm);\n if (git) return git.length;\n return (diff.match(/^--- /gm) ?? []).length;\n}\n\ninterface EditPair { old: string; next: string }\n\n/** `{old_string, new_string}` under any of the spellings the tools use. */\nfunction editPair(value: unknown): EditPair | null {\n const rec = record(value);\n if (!rec) return null;\n const old = rec.old_string ?? rec.oldString ?? rec.old_str ?? rec.old ?? rec.search ?? rec.find;\n const next = rec.new_string ?? rec.newString ?? rec.new_str ?? rec.new ?? rec.replace ?? rec.replacement;\n if (typeof old !== 'string' || typeof next !== 'string') return null;\n return { old, next };\n}\n\n/**\n * One file header followed by every edit's hunks. Each edit gets its own\n * synthetic offset so the hunks stay distinct for the parser; the numbers\n * are not the file's, which is why the result is `anchored: false`.\n */\nfunction diffForEdits(path: string, edits: readonly EditPair[]): string {\n const bodies: string[] = [];\n let offset = 1;\n edits.forEach((edit, index) => {\n const text = unifiedDiffFor(edit.old, edit.next, {\n path,\n oldStart: offset,\n newStart: offset,\n section: edits.length > 1 ? `edit ${index + 1} of ${edits.length}` : undefined,\n });\n offset += Math.max(splitLines(edit.old).length, splitLines(edit.next).length) + 8;\n if (text) bodies.push(text.split('\\n').slice(2).join('\\n'));\n });\n if (bodies.length === 0) return '';\n return [`--- a/${path}`, `+++ b/${path}`, ...bodies].join('\\n');\n}\n\n/** A brand-new file as an all-additions diff; its new-side numbers are real. */\nfunction diffForCreate(path: string, content: string): string {\n const lines = splitLines(content);\n if (lines.length === 0) return '';\n return [\n `--- /dev/null`,\n `+++ b/${path}`,\n `@@ -0,0 +1,${lines.length} @@`,\n ...lines.map((line) => `+${line}`),\n ].join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// The one entry point\n// ---------------------------------------------------------------------------\n\n/**\n * Ceiling on any agent-supplied text this module carries into a `ToolFacts`.\n *\n * `ToolUseCard` caps the raw output it renders, but the diff and written-file\n * paths bypass that cap entirely: they read `result.output` / `input.content`\n * straight off the payload. A `git diff` over a large tree, or a `Write` of a\n * generated file, then gets fully parsed by `DiffBlock` and fully materialised\n * into the DOM — and `buildTurns` re-parses it for every tool call on every\n * transcript rebuild. This is agent-controlled content with no upstream bound,\n * so the bound belongs here, where the text is first captured.\n *\n * Matches `CommandOutput`'s own ceiling so the two paths truncate alike.\n */\nexport const MAX_FACT_TEXT_CHARS = 200_000;\n\n/** Truncate with the same sentence `CommandOutput` uses, so the UI reads as one. */\nexport function capFactText(text: string): string {\n if (text.length <= MAX_FACT_TEXT_CHARS) return text;\n return `${text.slice(0, MAX_FACT_TEXT_CHARS)}\\n… (${text.length - MAX_FACT_TEXT_CHARS} more characters not shown)`;\n}\n\nexport interface ToolCallInput {\n name: string;\n input: unknown;\n result: { output: string; isError: boolean } | null;\n}\n\n/** Claude Code's Write says which of the two it did; nothing else does. */\nconst WROTE_EXISTING = /\\bhas been updated\\b|\\bsuccessfully (?:over)?written\\b|\\bupdated successfully\\b/i;\nconst WROTE_NEW = /\\b(?:file )?created successfully\\b|\\bnew file created\\b/i;\n\nexport function readToolFacts({ name, input, result }: ToolCallInput): ToolFacts {\n const base = baseToolName(name);\n let action = actionForName(name);\n const rec = record(input);\n const output = result?.output ?? '';\n const pending = result === null;\n\n // Write is create-or-overwrite and only the RESULT knows which.\n if (action === 'create' && result && WROTE_EXISTING.test(output) && !WROTE_NEW.test(output)) action = 'edit';\n // Codex `file_change` says per file whether it was added, updated or deleted.\n if (base === 'file_change') action = fileChangeAction(rec) ?? action;\n\n const paths = pathsIn(input);\n const primary = paths[0] ?? null;\n\n let command: CommandFacts | null = null;\n if (rec) {\n for (const key of COMMAND_KEYS) {\n const value = str(rec[key]);\n if (value) {\n command = { command: value, exitCode: result ? statedExitCode(output) : null };\n if (action === 'other') action = 'command';\n break;\n }\n }\n }\n\n let diff: ToolDiff | null = null;\n let written: WrittenContent | null = null;\n\n // 1. The result is itself a diff (`git diff`, a patch tool echoing back).\n if (result && looksLikeUnifiedDiff(output)) {\n diff = { text: capFactText(output), anchored: true, multiFile: fileCount(output) > 1, origin: 'output' };\n }\n\n // 2. The INPUT is a diff (apply_patch / a patch argument).\n if (!diff && rec) {\n const patch = str(rec.patch) ?? str(rec.diff);\n if (patch && looksLikeUnifiedDiff(patch)) {\n diff = { text: capFactText(patch), anchored: true, multiFile: fileCount(patch) > 1, origin: 'payload' };\n }\n }\n\n // 3. Edit-shaped payloads: one pair, or MultiEdit's `edits` array.\n if (!diff && rec && primary) {\n const single = editPair(rec);\n const listValue = rec.edits ?? rec.replacements ?? rec.changes;\n const many = Array.isArray(listValue)\n ? listValue.map(editPair).filter((e): e is EditPair => e !== null)\n : [];\n const pairs = many.length > 0 ? many : single ? [single] : [];\n if (pairs.length > 0) {\n const text = diffForEdits(primary, pairs);\n if (text) diff = { text: capFactText(text), anchored: false, multiFile: false, origin: 'payload' };\n if (action === 'other') action = 'edit';\n }\n }\n\n // 4. A whole file written. A create's line numbers are real; an overwrite's\n // old side was never in the payload, so it is shown as content, not as a\n // diff claiming the file had nothing in it before.\n if (!diff && rec && primary) {\n const content = typeof rec.content === 'string' ? rec.content\n : typeof rec.contents === 'string' ? rec.contents\n : typeof rec.text === 'string' && (action === 'create' || action === 'edit') ? rec.text\n : null;\n if (content !== null) {\n if (action === 'create') {\n const text = diffForCreate(primary, content);\n if (text) diff = { text: capFactText(text), anchored: true, multiFile: false, origin: 'payload' };\n } else {\n written = { path: primary, text: capFactText(content) };\n }\n }\n }\n\n const failed = result !== null && (result.isError || (command?.exitCode ?? 0) > 0);\n const sources = failed ? [] : sourcesFromToolCall({ name, input, output: result ? output : null, isError: result?.isError === true });\n\n return { base, action, paths, command, diff, written, failed, pending, sources, web: webFacts(name, action, rec), task: taskFacts(action, rec) };\n}\n\n/** Codex `changes: [{kind:'add'|'update'|'delete'}]` → one action; mixed → edit. */\nfunction fileChangeAction(rec: Record<string, unknown> | null): ToolAction | null {\n const changes = rec?.changes;\n if (!Array.isArray(changes) || changes.length === 0) return null;\n const kinds = new Set(changes.map((c) => String(record(c)?.kind ?? '').toLowerCase()));\n if (kinds.size === 1 && kinds.has('add')) return 'create';\n if (kinds.size === 1 && kinds.has('delete')) return 'delete';\n return 'edit';\n}\n\nconst URL_KEYS = ['url', 'uri', 'href', 'link', 'page_url'];\n\nfunction webFacts(name: string, action: ToolAction, rec: Record<string, unknown> | null): WebFacts | null {\n if (action !== 'web' || !rec) return null;\n const query = str(rec.query) ?? str(rec.q) ?? str(rec.search_query);\n let url: string | null = null;\n for (const key of URL_KEYS) {\n const value = str(rec[key]);\n if (value) { url = value; break; }\n }\n const norm = url ? normalizeUrl(url) : null;\n const mode = isWebSearchTool(name) && !url ? 'search' : url ? 'fetch' : query ? 'search' : 'fetch';\n return { mode, query, url: norm?.url ?? url, domain: norm?.domain ?? null };\n}\n\nfunction taskFacts(action: ToolAction, rec: Record<string, unknown> | null): TaskFacts | null {\n if (action !== 'task' || !rec) return null;\n const description = str(rec.description) ?? str(rec.task) ?? (str(rec.prompt)?.split('\\n')[0]?.slice(0, 120) ?? null);\n return { description, agent: str(rec.subagent_type) ?? str(rec.agent) ?? str(rec.agent_type) };\n}\n\n/** DOM id a file-activity row scrolls to. One per tool call. */\nexport function toolAnchorId(toolUseId: string): string {\n return `verse-tool-${toolUseId.replace(/[^A-Za-z0-9_-]/g, '')}`;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{s as e,t}from"./tool-semantics-xF0Fw2Ck.js";function n(e,t){let n=[...t].sort((e,t)=>t.length-e.length);for(let t of n){let n=t.endsWith(`/`)?t:`${t}/`;if(e.startsWith(n))return{root:t,path:e.slice(n.length)}}return!e.startsWith(`/`)&&t[0]?{root:t[0],path:e.replace(/^\.\//,``)}:null}function r(r,i){if(i.length===0)return[];let a=0;for(let e=r.length-1;e>=0;--e)if(r[e].type===`user-message`){a=e;break}let o=new Map;for(let e=a;e<r.length;e+=1){let t=r[e];t.type===`tool-result`&&o.set(t.toolUseId,{output:t.output,isError:t.isError})}let s=new Set,c=[];for(let l=a;l<r.length;l+=1){let a=r[l];if(a.type!==`tool-use`)continue;let u=o.get(a.toolUseId);if(!u||u.isError)continue;let d=e({name:a.name,input:a.input,result:u});if(t.includes(d.action)&&!d.failed)for(let e of d.paths){let t=n(e,i);if(!t)continue;let r=`${t.root}\u0000${t.path}`;s.has(r)||(s.add(r),c.push(t))}}return c}export{r as lastTurnFiles};
2
+ //# sourceMappingURL=turn-files-fJGOtf4K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-files-fJGOtf4K.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/turn-files.ts"],"sourcesContent":["/**\n * routes/verse/chat/turn-files.ts — the files the latest turn changed, for\n * the Review pane's \"This turn\" scope (slots.tsx `TurnFileChange`, unit C2).\n *\n * Read from the session's event log (the head's structural events — tool\n * calls and results, never streamed tokens), so it is recomputed when a\n * call lands, not per token. A call counts when it MUTATES the tree (edit,\n * create, delete — tool-semantics MUTATING_ACTIONS) and its result was not\n * an error. Paths are made relative to the root that contains them; a path\n * under none of the chat's roots is left out rather than guessed at.\n */\nimport type { VerseEvent } from '../../../data/api-types.js';\nimport type { TurnFileChange } from '../shell/slots.js';\nimport { MUTATING_ACTIONS, readToolFacts } from './tool-semantics.js';\n\nfunction relativeTo(path: string, roots: readonly string[]): TurnFileChange | null {\n // The longest root wins: a worktree nested inside its repo is its own root.\n const sorted = [...roots].sort((a, b) => b.length - a.length);\n for (const root of sorted) {\n const prefix = root.endsWith('/') ? root : `${root}/`;\n if (path.startsWith(prefix)) return { root, path: path.slice(prefix.length) };\n }\n // A relative path is relative to the primary root (the CLI's cwd).\n if (!path.startsWith('/') && roots[0]) return { root: roots[0], path: path.replace(/^\\.\\//, '') };\n return null;\n}\n\nexport function lastTurnFiles(events: readonly VerseEvent[], roots: readonly string[]): TurnFileChange[] {\n if (roots.length === 0) return [];\n let start = 0;\n for (let i = events.length - 1; i >= 0; i -= 1) {\n if (events[i]!.type === 'user-message') {\n start = i;\n break;\n }\n }\n const results = new Map<string, { output: string; isError: boolean }>();\n for (let i = start; i < events.length; i += 1) {\n const e = events[i]!;\n if (e.type === 'tool-result') results.set(e.toolUseId, { output: e.output, isError: e.isError });\n }\n const seen = new Set<string>();\n const out: TurnFileChange[] = [];\n for (let i = start; i < events.length; i += 1) {\n const e = events[i]!;\n if (e.type !== 'tool-use') continue;\n const result = results.get(e.toolUseId);\n if (!result || result.isError) continue;\n const facts = readToolFacts({ name: e.name, input: e.input, result });\n if (!MUTATING_ACTIONS.includes(facts.action) || facts.failed) continue;\n for (const path of facts.paths) {\n const change = relativeTo(path, roots);\n if (!change) continue;\n const key = `${change.root}\\u0000${change.path}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(change);\n }\n }\n return out;\n}\n"],"mappings":"mDAeA,SAAS,EAAW,EAAc,EAAiD,CAEjF,IAAM,EAAS,CAAC,GAAG,CAAK,CAAC,CAAC,MAAM,EAAG,IAAM,EAAE,OAAS,EAAE,MAAM,EAC5D,IAAK,IAAM,KAAQ,EAAQ,CACzB,IAAM,EAAS,EAAK,SAAS,GAAG,EAAI,EAAO,GAAG,EAAK,GACnD,GAAI,EAAK,WAAW,CAAM,EAAG,MAAO,CAAE,OAAM,KAAM,EAAK,MAAM,EAAO,MAAM,CAAE,CAC9E,CAGA,MADI,CAAC,EAAK,WAAW,GAAG,GAAK,EAAM,GAAW,CAAE,KAAM,EAAM,GAAI,KAAM,EAAK,QAAQ,QAAS,EAAE,CAAE,EACzF,IACT,CAEA,SAAgB,EAAc,EAA+B,EAA4C,CACvG,GAAI,EAAM,SAAW,EAAG,MAAO,CAAC,EAChC,IAAI,EAAQ,EACZ,IAAK,IAAI,EAAI,EAAO,OAAS,EAAG,GAAK,EAAG,IACtC,GAAI,EAAO,EAAE,CAAE,OAAS,eAAgB,CACtC,EAAQ,EACR,KACF,CAEF,IAAM,EAAU,IAAI,IACpB,IAAK,IAAI,EAAI,EAAO,EAAI,EAAO,OAAQ,GAAK,EAAG,CAC7C,IAAM,EAAI,EAAO,GACb,EAAE,OAAS,eAAe,EAAQ,IAAI,EAAE,UAAW,CAAE,OAAQ,EAAE,OAAQ,QAAS,EAAE,OAAQ,CAAC,CACjG,CACA,IAAM,EAAO,IAAI,IACX,EAAwB,CAAC,EAC/B,IAAK,IAAI,EAAI,EAAO,EAAI,EAAO,OAAQ,GAAK,EAAG,CAC7C,IAAM,EAAI,EAAO,GACjB,GAAI,EAAE,OAAS,WAAY,SAC3B,IAAM,EAAS,EAAQ,IAAI,EAAE,SAAS,EACtC,GAAI,CAAC,GAAU,EAAO,QAAS,SAC/B,IAAM,EAAQ,EAAc,CAAE,KAAM,EAAE,KAAM,MAAO,EAAE,MAAO,QAAO,CAAC,EAChE,GAAC,EAAiB,SAAS,EAAM,MAAM,GAAK,GAAM,OACtD,IAAK,IAAM,KAAQ,EAAM,MAAO,CAC9B,IAAM,EAAS,EAAW,EAAM,CAAK,EACrC,GAAI,CAAC,EAAQ,SACb,IAAM,EAAM,GAAG,EAAO,KAAK,QAAQ,EAAO,OACtC,EAAK,IAAI,CAAG,IAChB,EAAK,IAAI,CAAG,EACZ,EAAI,KAAK,CAAM,EACjB,CACF,CACA,OAAO,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";import{c as r,o as i,r as a,s as o}from"./VerseMobileApp-DdL64BfN.js";import{t as s}from"./parts.module-CBkHcD6w.js";var c=e(n(),1),l=t(),u={...o,...s},d=u;function f({title:e,trailing:t,footer:n,children:r,flat:i=!1}){let a=(0,c.useId)();return(0,l.jsxs)(`section`,{className:d.section,"aria-labelledby":e?a:void 0,children:[e?(0,l.jsxs)(`div`,{className:d.sectionHeader,children:[(0,l.jsx)(`h2`,{id:a,style:{margin:0,font:`inherit`},children:e}),t]}):null,i?r:(0,l.jsx)(`div`,{className:d.group,children:r}),n?(0,l.jsx)(`p`,{className:d.sectionFooter,children:n}):null]})}function p({title:e,subtitle:t,leading:n,trailing:i,onClick:a,chevron:o=!!a,label:s}){let c=(0,l.jsxs)(l.Fragment,{children:[n?(0,l.jsx)(`span`,{className:d.rowLead,children:n}):null,(0,l.jsxs)(`span`,{className:d.rowBody,children:[(0,l.jsx)(`span`,{className:d.rowTitle,children:e}),t?(0,l.jsx)(`span`,{className:d.rowSub,children:t}):null]}),i||o?(0,l.jsxs)(`span`,{className:d.rowTrail,children:[i,o?(0,l.jsx)(r,{size:14,className:d.chevron}):null]}):null]});return a?(0,l.jsx)(`button`,{type:`button`,className:d.row,onClick:a,"aria-label":s,children:c}):(0,l.jsx)(`div`,{className:d.row,children:c})}function m({tone:e=`neutral`,dot:t=!1,pulse:n=!1,children:r}){return(0,l.jsxs)(`span`,{className:i(d.badge,d[`tone-${e}`]),children:[t?(0,l.jsx)(`span`,{className:i(d.dot,n&&d.pulse),"aria-hidden":`true`}):null,r]})}function h(e){return e===null?`unknown`:e>=90?`danger`:e>=70?`warning`:`ok`}function g({label:e,percent:t,valueText:n,note:r}){let i=t===null?null:Math.max(0,Math.min(100,t)),a=n??(i===null?`unknown`:`${Math.round(i)}% used`);return(0,l.jsxs)(`div`,{className:d.meter,children:[(0,l.jsxs)(`div`,{className:d.meterHead,children:[(0,l.jsx)(`span`,{className:d.meterLabel,children:e}),(0,l.jsx)(`span`,{className:d.meterValue,children:a})]}),(0,l.jsx)(`div`,{className:d.meterTrack,role:`meter`,"aria-label":typeof e==`string`?e:void 0,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":i??void 0,"aria-valuetext":a,children:(0,l.jsx)(`div`,{className:d.meterFill,"data-tone":h(i),style:{width:`${i??0}%`}})}),r?(0,l.jsx)(`span`,{className:d.meterNote,children:r}):null]})}function _({tone:e=`warning`,children:t}){return(0,l.jsx)(`div`,{className:d.banner,"data-tone":e,role:e===`danger`?`alert`:`status`,children:t})}function v({title:e,body:t,action:n}){return(0,l.jsxs)(`div`,{className:d.empty,children:[(0,l.jsx)(`p`,{className:d.emptyTitle,children:e}),t?(0,l.jsx)(`p`,{className:d.emptyBody,children:t}):null,n]})}function y({title:e,reason:t,onRetry:n}){return(0,l.jsxs)(`div`,{className:d.empty,role:`alert`,children:[(0,l.jsx)(`p`,{className:d.emptyTitle,children:e}),t?(0,l.jsx)(`p`,{className:d.emptyBody,children:t}):null,n?(0,l.jsx)(a,{variant:`tinted`,onClick:n,children:`Try again`}):null]})}export{g as a,u as c,y as i,_ as n,p as o,v as r,f as s,m as t};
2
+ //# sourceMappingURL=ui-parts-C9HJZZ3G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-parts-C9HJZZ3G.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/ui-parts.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/ui-parts.tsx — inset-grouped lists, badges, meters,\n * banners and the empty / error states every phone screen shares (styling:\n * ui.module.css). Off the first paint: the Home frame needs none of them.\n */\nimport { useId, type ReactNode } from 'react';\nimport { ChevronGlyph } from './mobile-icons.js';\nimport partStyles from './parts.module.css';\nimport { Button, cx, ui as coreStyles } from './ui.js';\n\n/** Every phone class: the frame's (ui.module.css) and the parts' (parts.module.css). */\nexport const ui: Readonly<Record<string, string>> = { ...coreStyles, ...partStyles };\nconst styles = ui;\n\n// ---------------------------------------------------------------------------\n// Lists\n// ---------------------------------------------------------------------------\n\nexport function Section({ title, trailing, footer, children, flat = false }: { title?: ReactNode; trailing?: ReactNode; footer?: ReactNode; children: ReactNode; flat?: boolean }) {\n const id = useId();\n return (\n <section className={styles.section} aria-labelledby={title ? id : undefined}>\n {title ? (\n <div className={styles.sectionHeader}>\n <h2 id={id} style={{ margin: 0, font: 'inherit' }}>{title}</h2>\n {trailing}\n </div>\n ) : null}\n {flat ? children : <div className={styles.group}>{children}</div>}\n {footer ? <p className={styles.sectionFooter}>{footer}</p> : null}\n </section>\n );\n}\n\nexport interface RowProps {\n title: ReactNode;\n subtitle?: ReactNode;\n leading?: ReactNode;\n trailing?: ReactNode;\n onClick?: () => void;\n chevron?: boolean;\n /** Accessible name when the visible title is not enough. */\n label?: string;\n}\n\nexport function Row({ title, subtitle, leading, trailing, onClick, chevron = Boolean(onClick), label }: RowProps) {\n const body = (\n <>\n {leading ? <span className={styles.rowLead}>{leading}</span> : null}\n <span className={styles.rowBody}>\n <span className={styles.rowTitle}>{title}</span>\n {subtitle ? <span className={styles.rowSub}>{subtitle}</span> : null}\n </span>\n {trailing || chevron ? (\n <span className={styles.rowTrail}>\n {trailing}\n {chevron ? <ChevronGlyph size={14} className={styles.chevron} /> : null}\n </span>\n ) : null}\n </>\n );\n if (!onClick) return <div className={styles.row}>{body}</div>;\n return (\n <button type=\"button\" className={styles.row} onClick={onClick} aria-label={label}>\n {body}\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Status\n// ---------------------------------------------------------------------------\n\nexport type Tone = 'running' | 'success' | 'warning' | 'danger' | 'info' | 'neutral';\n\nexport function Badge({ tone = 'neutral', dot = false, pulse = false, children }: { tone?: Tone; dot?: boolean; pulse?: boolean; children: ReactNode }) {\n return (\n <span className={cx(styles.badge, styles[`tone-${tone}`])}>\n {dot ? <span className={cx(styles.dot, pulse && styles.pulse)} aria-hidden=\"true\" /> : null}\n {children}\n </span>\n );\n}\n\nexport interface MeterProps {\n label: ReactNode;\n /** 0–100; null = unknown (an empty track and \"unknown\", never 0%). */\n percent: number | null;\n /** Right-hand text; defaults to the percent. */\n valueText?: string;\n note?: ReactNode;\n}\n\nexport function meterTone(percent: number | null): 'ok' | 'warning' | 'danger' | 'unknown' {\n if (percent === null) return 'unknown';\n if (percent >= 90) return 'danger';\n if (percent >= 70) return 'warning';\n return 'ok';\n}\n\nexport function Meter({ label, percent, valueText, note }: MeterProps) {\n const clamped = percent === null ? null : Math.max(0, Math.min(100, percent));\n const text = valueText ?? (clamped === null ? 'unknown' : `${Math.round(clamped)}% used`);\n return (\n <div className={styles.meter}>\n <div className={styles.meterHead}>\n <span className={styles.meterLabel}>{label}</span>\n <span className={styles.meterValue}>{text}</span>\n </div>\n <div\n className={styles.meterTrack}\n role=\"meter\"\n aria-label={typeof label === 'string' ? label : undefined}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={clamped ?? undefined}\n aria-valuetext={text}\n >\n <div className={styles.meterFill} data-tone={meterTone(clamped)} style={{ width: `${clamped ?? 0}%` }} />\n </div>\n {note ? <span className={styles.meterNote}>{note}</span> : null}\n </div>\n );\n}\n\nexport function Banner({ tone = 'warning', children }: { tone?: 'warning' | 'danger' | 'info'; children: ReactNode }) {\n return (\n <div className={styles.banner} data-tone={tone} role={tone === 'danger' ? 'alert' : 'status'}>\n {children}\n </div>\n );\n}\n\nexport function EmptyState({ title, body, action }: { title: string; body?: ReactNode; action?: ReactNode }) {\n return (\n <div className={styles.empty}>\n <p className={styles.emptyTitle}>{title}</p>\n {body ? <p className={styles.emptyBody}>{body}</p> : null}\n {action}\n </div>\n );\n}\n\nexport function ErrorState({ title, reason, onRetry }: { title: string; reason: string | null; onRetry?: () => void }) {\n return (\n <div className={styles.empty} role=\"alert\">\n <p className={styles.emptyTitle}>{title}</p>\n {reason ? <p className={styles.emptyBody}>{reason}</p> : null}\n {onRetry ? <Button variant=\"tinted\" onClick={onRetry}>Try again</Button> : null}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{i as e,t}from"./global-7hs7NyAO.js";var n=`2.1.280`;function r(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function i(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:null}function a(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:null}function o(e,t,n=!1){let r=e[t];return typeof r==`boolean`?r:n}function s(e){return Array.isArray(e)?e:[]}var c=/(launcher\.mjs|native-profiles|account-connections|console-startup|\/\.ashlr\b|Bearer\s|--token\b)/i;function l(e){if(typeof e!=`string`)return null;let t=e.trim();return t.length===0||t.length>200||c.test(t)||/[\r\n]/.test(t)?null:t}function u(e){return e===null?null:Math.max(0,Math.min(100,e))}function d(e){let t=r(e);if(!t)return null;let n=i(t,`id`)??i(t,`label`);if(n===null)return null;let s=r(t.nativeReport),c=o(t,`limitReached`)||o(t,`rateLimitReached`),l=t.measured;return{id:n,label:i(t,`label`),usedPercent:u(a(t,`usedPercent`)??a(t,`used_percent`)),resetsAt:i(t,`resetsAt`)??i(t,`resets_at`),resetDescription:(s?i(s,`resetDescription`):null)??i(t,`resetDescription`),limitReached:c,measured:typeof l==`boolean`?l:!c}}function f(e){let t=r(e);if(!t)return null;let n=i(t,`balance`),s=n===null?a(t,`balance`):Number.parseFloat(n);return{hasCredits:o(t,`hasCredits`)||o(t,`has_credits`),unlimited:o(t,`unlimited`),balance:n,balanceValue:typeof s==`number`&&Number.isFinite(s)?s:null}}var p=[`claude`,`codex`,`grok`];function m(e){let t=r(e);if(!t)return null;let n=i(t,`id`),a=i(t,`provider`);if(n===null||a===null||!p.includes(a))return null;let o=s(t.windows).map(d).filter(e=>e!==null),c=i(t,`state`),u=i(t,`authentication`),m=r(t.unsupported);return{id:n,label:i(t,`label`)??n,provider:a,state:c===`checking`||c===`observed`||c===`signed-out`||c===`unavailable`?c:`unavailable`,authentication:u===`signed-in`||u===`signed-out`?u:`unknown`,health:i(t,`health`),planType:i(t,`planType`)??i(t,`plan_type`),observedAt:i(t,`observedAt`),windows:o,binding:d(t.binding),credits:f(t.credits),reason:i(t,`reason`),unsupported:h(t,m),reconnectCommand:l(t.reconnectCommand),notes:s(t.notes).filter(e=>typeof e==`string`)}}function h(e,t){if(t)return{code:i(t,`code`)??`usage-version-unsupported`,pinnedVersion:i(t,`pinnedVersion`)??i(t,`version`)};let r=i(e,`reason`);return r===`usage-version-unsupported`?{code:r,pinnedVersion:n}:null}function g(e){let t=i(e,`collectorNote`);if(t)return t;let n=r(e.collector);return!n||i(n,`owner`)!==`another-collector`?null:i(n,`note`)??`Another collector process owns the quota-refresh lease, so these readings are read-only and may be staler than this server’s poll interval.`}function _(e){let t=r(e);if(!t)return null;let n=Array.isArray(t.accounts)?t.accounts:Array.isArray(e)?e:null;return n===null?null:{sampledAt:i(t,`sampledAt`),refreshing:o(t,`refreshing`),accounts:n.map(m).filter(e=>e!==null),collectorNote:g(t)}}function v(e){let t=r(e);if(!t)return null;let n=i(t,`day`);return n===null||!/^\d{4}-\d{2}-\d{2}$/.test(n)?null:{day:n,tokensIn:a(t,`tokensIn`)??0,tokensOut:a(t,`tokensOut`)??0,estCostUsd:a(t,`estCostUsd`)??0,sessions:a(t,`sessions`)??0,cacheRead:a(t,`cacheRead`),cacheWrite:a(t,`cacheWrite`),cacheHitRate:a(t,`cacheHitRate`)}}function y(e,t){let n=r(e),a=n?Array.isArray(n.byDay)?n.byDay:Array.isArray(n.days)?n.days:null:Array.isArray(e)?e:null;if(a===null)return null;let c=n?i(n,`window`):null;return{window:c===`7d`||c===`30d`?c:t,days:a.map(v).filter(e=>e!==null).sort((e,t)=>e.day.localeCompare(t.day)),generatedAt:n?i(n,`generatedAt`):null,estimated:!n||o(n,`estimated`,!0),caveats:n?s(n.caveats).filter(e=>typeof e==`string`):[]}}function b(e,t){let n=r(e);if(!n)return null;let s=i(n,`label`)??i(n,`id`)??i(n,`name`)??i(n,`model`);if(s===null)return null;let c=n.capabilities,l=i(n,`state`),d=n.supportsTools,f=a(n,`nativeContextLength`)??a(n,`nativeContext`),p=a(n,`contextLength`)??a(n,`configuredContext`),m=i(n,`placement`);return{name:s,runtime:t,loaded:l===null?o(n,`loaded`)||o(n,`resident`):l===`loaded`,sizeBytes:a(n,`sizeBytes`)??a(n,`size`),sizeVramBytes:a(n,`sizeVramBytes`)??a(n,`size_vram`),placement:m===`gpu`||m===`cpu`||m===`split`?m:`unknown`,gpuPercent:u(a(n,`gpuPercent`)),memoryPercent:u(a(n,`memoryPercent`)),family:i(n,`family`),arch:i(n,`arch`),expiresAt:i(n,`expiresAt`)??i(n,`expires_at`),parameterSize:i(n,`parameterSize`)??i(n,`parameter_size`),quantization:i(n,`quantization`)??i(n,`quantization_level`),nativeContext:f,configuredContext:p!==null&&f!==null&&p===f?null:p,capabilities:Array.isArray(c)?c.filter(e=>typeof e==`string`):null,supportsTools:typeof d==`boolean`?d:null}}function x(e,t){let n=r(e);if(!n)return null;let s=Array.isArray(n.models)?n.models:null;if(s===null)return null;let c=s.map(e=>b(e,t)).filter(e=>e!==null),l=o(n,`stale`),u=r(n.detailInspection),d=u?a(u,`attempted`):null,f=u?a(u,`pending`):null,p=d!==null&&f!==null&&Number.isInteger(d)&&Number.isInteger(f)&&d>=0&&f>0&&d+f===c.length?{attempted:d,pending:f}:void 0;return{models:c,status:{runtime:t,reachable:o(n,`reachable`),reason:i(n,`reason`),stale:l,staleForMs:l?a(n,`staleForMs`):null,modelCount:c.length,...p?{detailInspection:p}:{}}}}function S(e){let t=r(e);if(!t)return null;let n=x(t.ollama,`ollama`),c=x(t.lmStudio??t.lmstudio,`lmstudio`);if(n!==null||c!==null){let e=[n,c].filter(e=>e!==null),o=e.some(e=>e.status.reachable),l=r(t.machine);return{reachable:o,models:e.flatMap(e=>e.models),memoryBudgetBytes:(l?a(l,`totalMemoryBytes`):null)??a(t,`memoryBudgetBytes`)??a(t,`memoryBudget`),freeMemoryBytes:l?a(l,`freeMemoryBytes`):null,reason:o?null:e.map(e=>e.status.reason).find(e=>e!==null)??null,runtimes:e.map(e=>e.status),notes:s(t.notes).filter(e=>typeof e==`string`),sampledAt:i(t,`sampledAt`)}}let l=Array.isArray(t.models)?t.models:null;return l===null?null:{reachable:o(t,`reachable`,!0),models:l.map(e=>b(e,null)).filter(e=>e!==null),memoryBudgetBytes:a(t,`memoryBudgetBytes`)??a(t,`memoryBudget`),freeMemoryBytes:a(t,`freeMemoryBytes`),reason:i(t,`reason`),runtimes:[],notes:s(t.notes).filter(e=>typeof e==`string`),sampledAt:i(t,`sampledAt`)}}var C=`verse-usage-frontier`,w=`verse-usage-control`,T={key:C,fetch:t=>e(`/api/usage`,t)};function E(e){return e instanceof t?e.status===404?`This server does not expose /api/verse/control, so configured caps and today’s spend are unavailable here.`:`Configured caps unavailable (HTTP ${e.status}).`:`Configured caps unavailable: the request failed.`}var D={key:w,fetch:async n=>{try{return{raw:await e(`/api/verse/control`,n),available:!0,reason:null}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{raw:null,available:!1,reason:E(e)}}}},O=`verse-usage-accounts`,k=`verse-usage-local-models`,A=`verse-usage-series`;function j(e,n){return n instanceof t?n.status===404?`This server does not expose ${e} yet, so this panel has no source.`:`${e} answered HTTP ${n.status}.`:`${e} could not be reached.`}function M(n){return async r=>{try{return{raw:await e(n,r),available:!0,reason:null}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{raw:null,available:!1,reason:j(n,e)}}}}var N={key:O,fetch:M(`/api/verse/accounts`)},P=[350,1200],F=M(`/api/verse/local-models`);function I(e){if(!e.available)return!1;let t=S(e.raw);return t!==null&&!t.reachable}function L(e,t){return new Promise((n,r)=>{if(t?.aborted){r(new DOMException(`Aborted`,`AbortError`));return}let i=()=>{clearTimeout(a),r(new DOMException(`Aborted`,`AbortError`))},a=setTimeout(()=>{t?.removeEventListener(`abort`,i),n()},e);t?.addEventListener(`abort`,i,{once:!0})})}var R={key:k,fetch:async e=>{let t=await F(e);for(let n of P){if(!I(t))return t;await L(n,e),t=await F(e)}return t}},z={"7d":{key:`${A}:7d`,fetch:M(`/api/verse/usage-series?window=7d`)},"30d":{key:`${A}:30d`,fetch:M(`/api/verse/usage-series?window=30d`)}};function B(e){return z[e]}export{R as a,y as c,D as i,B as n,_ as o,N as r,S as s,T as t};
2
+ //# sourceMappingURL=usage-queries-7aq_WIzn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-queries-7aq_WIzn.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/usage/usage-contract.ts","../../../../../../src/web-ui/routes/verse/usage/usage-queries.ts"],"sourcesContent":["/**\n * routes/verse/usage/usage-contract.ts\n *\n * ┌───────────────────────────────────────────────────────────────────────┐\n * │ INTEGRATION — RECONCILED AGAINST OWNER T'S REAL ROUTES (V2.1) │\n * │ │\n * │ GET /api/verse/accounts → VerseAccountsSnapshot │\n * │ GET /api/verse/usage-series → {window, byDay, estimated, caveats} │\n * │ GET /api/verse/local-models → VerseLocalModelsSnapshot │\n * │ │\n * │ T's types now exist and are imported below as the WIRE shapes. The │\n * │ interfaces in this file are no longer stand-ins for them: they are │\n * │ the DISPLAY shapes this section renders, and they differ from the │\n * │ wire on purpose in three places the seam actually required — │\n * │ │\n * │ 1. local-models arrives as TWO runtime reports (ollama, lmStudio) │\n * │ plus a `machine` budget. This section shows one list of models │\n * │ against one budget, so `projectLocalModels` flattens them. │\n * │ 2. usage-series arrives as `{byDay}`, not `{days}` (T's documented │\n * │ deviation 1). The projector reads `byDay` and still accepts │\n * │ `days`/a bare array so an older server degrades rather than dies. │\n * │ 3. `unsupported` is not a wire field. T reports the version-pin │\n * │ failure in `reason` as the verbatim probe code, so it is DERIVED │\n * │ here from that code plus T's exported pin constant rather than │\n * │ being added to T's contract late in the run. │\n * │ │\n * │ The `WIRE_*_KEYS` blocks below are the executable seam contract: │\n * │ every canonical field name this module reads is pinned to `keyof` the │\n * │ corresponding core type, so a rename in src/core/verse breaks THIS │\n * │ build instead of silently degrading the panel to \"unknown\" at run │\n * │ time — which is exactly how this seam was broken when integration │\n * │ started. │\n * └───────────────────────────────────────────────────────────────────────┘\n *\n * Why every read goes through a structural narrower instead of a cast:\n *\n * - This section must render correctly against a server that does NOT have\n * T's routes (404) and against one that has an earlier spelling of them.\n * A cast would turn a field-name drift into `undefined.something` at\n * render time; a narrower turns it into an honest \"unknown\" with a reason.\n * - Nothing here is ever coerced. A missing percentage stays `null`, never\n * 0 — `usedPercent: 0` and \"no reading\" are different facts and the UI\n * draws them differently (docs/VERSE-TELEMETRY-V2.md, closing rules).\n *\n * SECURITY (docs/VERSE-CONTRACT-V2.md ground rules): a native-profile\n * launcher command must never reach a surface. `sanitizeCommand` below is a\n * client-side backstop on top of the server's own stripping — if a payload\n * ever carries a launcher path, this module drops it rather than printing it.\n *\n * Pure: no React, no I/O.\n */\n// EVERY import from src/core here MUST be type-only.\n//\n// `core/verse/accounts.ts` is the server's collector: it pulls node:fs,\n// node:child_process, the quota lease and the connection monitor. A VALUE\n// import of even a one-word constant from it drags that entire graph into the\n// browser bundle — `vite build` externalizes the node built-ins and the build\n// fails. Type-only imports are erased, so the seam guards below cost nothing\n// at runtime. The two constants this module needs are therefore re-declared\n// locally and PINNED TO CORE'S LITERAL TYPES (see below), which gives the same\n// drift protection with no emitted import.\nimport type {\n VerseAccountRecord,\n VerseAccountWindow,\n VerseAccountsCollectorStatus,\n VerseAccountsSnapshot,\n VerseCodexCredits,\n} from '../../../../core/verse/accounts.js';\nimport type {\n VerseLocalModel,\n VerseLocalModelsSnapshot,\n VerseLocalRuntimeReport,\n} from '../../../../core/verse/local-models.js';\nimport type { DailyUsage as CoreDailyUsage } from '../../../../core/types.js';\n\n// ---------------------------------------------------------------------------\n// Seam contract — compile-time only, zero runtime cost.\n//\n// Each entry pins a field name this module reads off the wire to `keyof` the\n// core type that produces it. Renaming a field in src/core/verse now fails\n// `npm run typecheck:web` here, at the seam, rather than turning a live panel\n// into a silent \"unknown\".\n// ---------------------------------------------------------------------------\n\nconst WIRE_ACCOUNT_KEYS = {\n id: 'id',\n label: 'label',\n provider: 'provider',\n state: 'state',\n authentication: 'authentication',\n health: 'health',\n planType: 'planType',\n observedAt: 'observedAt',\n windows: 'windows',\n binding: 'binding',\n credits: 'credits',\n reason: 'reason',\n notes: 'notes',\n} as const satisfies Record<string, keyof VerseAccountRecord>;\n\nconst WIRE_WINDOW_KEYS = {\n id: 'id',\n usedPercent: 'usedPercent',\n resetsAt: 'resetsAt',\n nativeReport: 'nativeReport',\n limitReached: 'limitReached',\n measured: 'measured',\n} as const satisfies Record<string, keyof VerseAccountWindow>;\n\nconst WIRE_CREDITS_KEYS = {\n hasCredits: 'hasCredits',\n unlimited: 'unlimited',\n balance: 'balance',\n} as const satisfies Record<string, keyof VerseCodexCredits>;\n\nconst WIRE_ACCOUNTS_SNAPSHOT_KEYS = {\n sampledAt: 'sampledAt',\n refreshing: 'refreshing',\n accounts: 'accounts',\n collector: 'collector',\n notes: 'notes',\n} as const satisfies Record<string, keyof VerseAccountsSnapshot>;\n\nconst WIRE_COLLECTOR_KEYS = {\n owner: 'owner',\n note: 'note',\n} as const satisfies Record<string, keyof VerseAccountsCollectorStatus>;\n\nconst WIRE_LOCAL_SNAPSHOT_KEYS = {\n machine: 'machine',\n ollama: 'ollama',\n lmStudio: 'lmStudio',\n} as const satisfies Record<string, keyof VerseLocalModelsSnapshot>;\n\nconst WIRE_LOCAL_RUNTIME_KEYS = {\n reachable: 'reachable',\n models: 'models',\n reason: 'reason',\n detailInspection: 'detailInspection',\n // V2.1: a RETAINED known-good reading rather than a fresh probe. Both must\n // be projected — a stale reading presented as fresh is the exact failure\n // this seam exists to prevent.\n stale: 'stale',\n staleForMs: 'staleForMs',\n} as const satisfies Record<string, keyof VerseLocalRuntimeReport>;\n\nconst WIRE_LOCAL_MODEL_KEYS = {\n id: 'id',\n label: 'label',\n state: 'state',\n sizeBytes: 'sizeBytes',\n sizeVramBytes: 'sizeVramBytes',\n placement: 'placement',\n gpuPercent: 'gpuPercent',\n memoryPercent: 'memoryPercent',\n family: 'family',\n arch: 'arch',\n expiresAt: 'expiresAt',\n contextLength: 'contextLength',\n nativeContextLength: 'nativeContextLength',\n parameterSize: 'parameterSize',\n quantization: 'quantization',\n capabilities: 'capabilities',\n supportsTools: 'supportsTools',\n} as const satisfies Record<string, keyof VerseLocalModel>;\n\n/**\n * Claude's version-pin constants, re-declared rather than imported.\n *\n * The annotations are the drift guard: `typeof import(...)` is a TYPE position,\n * so it is erased at build time, but it resolves to core's literal type\n * (`'2.1.257'`, `'usage-version-unsupported'`). Change either constant in\n * `core/verse/accounts.ts` and this file stops compiling — the same protection\n * a value import would give, without pulling node:fs into the browser.\n */\ntype CoreAccountsModule = typeof import('../../../../core/verse/accounts.js');\n\nexport const CLAUDE_VERSION_REASON: CoreAccountsModule['VERSE_CLAUDE_VERSION_REASON'] =\n 'usage-version-unsupported';\n\nexport const CLAUDE_USAGE_PINNED_VERSION: CoreAccountsModule['VERSE_CLAUDE_USAGE_PINNED_VERSION'] =\n '2.1.280';\n\n/** `byDay` is the wire key (T's deviation 1); `DailyUsage` below mirrors core. */\nconst WIRE_DAILY_USAGE_KEYS = {\n day: 'day',\n tokensIn: 'tokensIn',\n tokensOut: 'tokensOut',\n estCostUsd: 'estCostUsd',\n sessions: 'sessions',\n cacheRead: 'cacheRead',\n cacheWrite: 'cacheWrite',\n cacheHitRate: 'cacheHitRate',\n} as const satisfies Record<string, keyof CoreDailyUsage>;\n\n// Referenced so the guards are not dead code under `noUnusedLocals`.\nexport const WIRE_CONTRACT_KEYS = {\n account: WIRE_ACCOUNT_KEYS,\n window: WIRE_WINDOW_KEYS,\n credits: WIRE_CREDITS_KEYS,\n accountsSnapshot: WIRE_ACCOUNTS_SNAPSHOT_KEYS,\n collector: WIRE_COLLECTOR_KEYS,\n localSnapshot: WIRE_LOCAL_SNAPSHOT_KEYS,\n localRuntime: WIRE_LOCAL_RUNTIME_KEYS,\n localModel: WIRE_LOCAL_MODEL_KEYS,\n dailyUsage: WIRE_DAILY_USAGE_KEYS,\n} as const;\n\n// ---------------------------------------------------------------------------\n// GET /api/verse/accounts\n// ---------------------------------------------------------------------------\n\n/** Provider ids this surface knows how to describe. */\nexport type AccountProvider = 'claude' | 'codex' | 'grok';\n\n/**\n * One quota window on an account.\n *\n * `resetsAt` is an ISO string when the provider gave a real timestamp (Codex\n * publishes an epoch the server normalizes). Claude's is STRUCTURALLY always\n * null and the human sentence lives in `nativeReport.resetDescription`, which\n * is rendered verbatim and never turned into a countdown.\n */\nexport interface AccountWindow {\n id: string;\n /** Human label when the server supplies one; otherwise `id` is shown. */\n label: string | null;\n /** 0–100. `null` is \"no reading\", never 0. */\n usedPercent: number | null;\n /** ISO 8601, or null. */\n resetsAt: string | null;\n /** Verbatim provider prose, e.g. \"resets Sep 25 at 7pm (America/New_York)\". */\n resetDescription: string | null;\n /**\n * True when the provider signalled `rateLimitReachedType` — the upstream\n * writes the SENTINEL 100, which is a flag, not a measurement. Rendered as\n * \"limit reached\", never as \"100% used\".\n */\n limitReached: boolean;\n /**\n * False when `usedPercent` is a FLAGGED SENTINEL rather than a reading.\n *\n * Codex writes `rateLimitReachedType` upstream as the value 100, so a bare\n * 100 is indistinguishable from a genuinely measured 100 by the time it\n * arrives. The server distinguishes them; this surface must not collapse\n * them back together. Absent on the wire → assumed measured UNLESS the\n * limit flag is set, which is the only case where the sentinel is written.\n */\n measured: boolean;\n}\n\n/**\n * Codex credits. Independent of the window: a 100%-used week with a spendable\n * balance is NOT blocked, and this surface must not say it is.\n */\nexport interface AccountCredits {\n hasCredits: boolean;\n unlimited: boolean;\n /** Raw decimal string from the provider, kept verbatim for the title text. */\n balance: string | null;\n /** `balance` parsed, or null when it was absent/unparseable. */\n balanceValue: number | null;\n}\n\nexport interface Account {\n id: string;\n label: string;\n provider: AccountProvider;\n state: 'checking' | 'observed' | 'signed-out' | 'unavailable';\n authentication: 'signed-in' | 'signed-out' | 'unknown';\n /**\n * The connection monitor's own health verdict. Claude's is ALWAYS `unknown`\n * by construction (docs/VERSE-TELEMETRY-V2.md) — that is not a fault and is\n * never rendered as one.\n */\n health: string | null;\n planType: string | null;\n observedAt: string | null;\n windows: AccountWindow[];\n /**\n * The server's computed binding window (highest used percent). Kept as its\n * own field rather than recomputed blindly, but `accounts-model.ts` verifies\n * it against `windows` and falls back to computing it when absent.\n */\n binding: AccountWindow | null;\n credits: AccountCredits | null;\n /** Plain-language reason for a non-observed state. */\n reason: string | null;\n /**\n * Present when a probe failed CLOSED on a version pin (Claude's probe is\n * pinned to a specific Claude Code build). The fix is a one-line constant\n * bump, so the UI names it instead of showing a silent \"unknown\".\n */\n unsupported: { code: string; pinnedVersion: string | null } | null;\n /** Already sanitized — see `sanitizeCommand`. Null when nothing safe to show. */\n reconnectCommand: string | null;\n /**\n * The server's plain-language facts for this account (`VerseAccountRecord.\n * notes`). Grok's \"reconnect through `ashlr resources`, profile path withheld\n * on purpose\" lives here, which is why this surface shows notes rather than\n * only the machine-readable `reason`.\n */\n notes: string[];\n}\n\nexport interface AccountsSnapshot {\n sampledAt: string | null;\n refreshing: boolean;\n accounts: Account[];\n /**\n * Set when another collector process owns the quota-refresh lease, so these\n * readings are read-only and may be staler than this server's poll interval.\n */\n collectorNote: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// GET /api/verse/usage-series?window=7d|30d\n// ---------------------------------------------------------------------------\n\nexport type SeriesWindow = '7d' | '30d';\n\n/** `buildRollup(window, cfg).byDay` — see docs/VERSE-TELEMETRY-V2.md. */\nexport interface DailyUsage {\n /** YYYY-MM-DD. */\n day: string;\n tokensIn: number;\n tokensOut: number;\n /** ESTIMATED from a static price table. Never a billed figure. */\n estCostUsd: number;\n sessions: number;\n /** Optional: absent means the rollup carried no cache columns for that day. */\n cacheRead: number | null;\n cacheWrite: number | null;\n /** 0–1 fraction, or null. */\n cacheHitRate: number | null;\n}\n\nexport interface UsageSeries {\n window: SeriesWindow;\n days: DailyUsage[];\n generatedAt: string | null;\n /**\n * The server states outright that every cost column here is estimated.\n * Carried through rather than re-asserted locally so the disclosure the UI\n * prints is the one the producer actually made.\n */\n estimated: boolean;\n /** The server's own caveats, rendered verbatim beside the charts. */\n caveats: string[];\n}\n\n// ---------------------------------------------------------------------------\n// GET /api/verse/local-models\n// ---------------------------------------------------------------------------\n\nexport interface LocalModel {\n name: string;\n /** Which runtime reported it, so a flattened list stays attributable. */\n runtime: 'ollama' | 'lmstudio' | null;\n /** Resident in memory right now (Ollama /api/ps), vs merely installed. */\n loaded: boolean;\n /** Total resident bytes, or null when not reported. */\n sizeBytes: number | null;\n /** Of `sizeBytes`, how much sits in VRAM. null = not reported. */\n sizeVramBytes: number | null;\n /**\n * Where the weights actually sit. `split` is the one that matters: a model\n * that only half-fits the GPU runs at a fraction of the speed of one that\n * fits, and that is the difference between usable and not.\n */\n placement: 'gpu' | 'cpu' | 'split' | 'unknown';\n /** The runtime's own GPU share, 0–100. Preferred over recomputing it. */\n gpuPercent: number | null;\n /** Resident size against total machine memory, 0–100, else null. */\n memoryPercent: number | null;\n family: string | null;\n arch: string | null;\n /** Keep-alive expiry (ISO). Only meaningful while `loaded`. */\n expiresAt: string | null;\n /** e.g. \"79.7B\". Provider string, never parsed into a number for display. */\n parameterSize: string | null;\n /** e.g. \"Q4_K_M\". */\n quantization: string | null;\n /** Native context from model_info[\"<arch>.context_length\"]. */\n nativeContext: number | null;\n /** Context Ashlr actually configures for this seat, when it differs. */\n configuredContext: number | null;\n /**\n * `capabilities` from /api/show. `null` means the capability list was not\n * reported — which is NOT the same as \"does not support tools\".\n */\n capabilities: string[] | null;\n /**\n * The runtime's own answer to \"can this drive an agentic session\", which is\n * AUTHORITATIVE over `capabilities` and must be preferred when non-null.\n *\n * This matters: owner T sends `capabilities: []` when a runtime reported no\n * capability list, and reading that array alone would render \"no tools\" —\n * a hard, wrong gate — where T's `supportsTools: null` correctly means\n * \"unknown\". Deriving tool support from the array alone was a real defect\n * at this seam, not a cosmetic one.\n */\n supportsTools: boolean | null;\n}\n\n/**\n * One runtime's own reachability, kept per-runtime rather than folded into the\n * flattened list, because STALENESS is per-runtime and must be stated.\n *\n * `stale` means the server served a RETAINED known-good reading after a probe\n * TIMED OUT (core `VERSE_LOCAL_LAST_GOOD_TTL_MS`). That is the honest choice\n * server-side — a timeout is \"no answer yet\", not \"the runtime is gone\" — but\n * it obliges this surface to say plainly that the numbers are N seconds old\n * rather than presenting them as fresh.\n */\nexport interface LocalRuntimeStatus {\n runtime: 'ollama' | 'lmstudio';\n reachable: boolean;\n /** Machine-readable degradation code; never rendered as a sentence. */\n reason: string | null;\n /** True when this report is a retained reading rather than a fresh probe. */\n stale: boolean;\n /** Age of that retained reading in ms. Null when `stale` is false. */\n staleForMs: number | null;\n modelCount: number;\n detailInspection?: { attempted: number; pending: number };\n}\n\nexport interface LocalModelsSnapshot {\n reachable: boolean;\n models: LocalModel[];\n /** Machine memory budget in bytes, or null when the server did not say. */\n memoryBudgetBytes: number | null;\n /** Machine memory reported free right now, or null. */\n freeMemoryBytes: number | null;\n reason: string | null;\n /** Per-runtime reachability and staleness. Empty on a flat legacy body. */\n runtimes: LocalRuntimeStatus[];\n /** The server's own plain-language caveats for this snapshot. */\n notes: string[];\n sampledAt: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Narrowing helpers\n// ---------------------------------------------------------------------------\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction str(source: Record<string, unknown>, key: string): string | null {\n const v = source[key];\n return typeof v === 'string' && v.length > 0 ? v : null;\n}\n\nfunction num(source: Record<string, unknown>, key: string): number | null {\n const v = source[key];\n return typeof v === 'number' && Number.isFinite(v) ? v : null;\n}\n\nfunction bool(source: Record<string, unknown>, key: string, fallback = false): boolean {\n const v = source[key];\n return typeof v === 'boolean' ? v : fallback;\n}\n\nfunction list(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\n/**\n * Drop anything that looks like a native-profile launcher invocation or an\n * absolute path into the private account store. The server is supposed to\n * strip these; this is the client-side backstop, because the cost of printing\n * one is unacceptable and the cost of showing \"no command\" is a sentence.\n */\nconst FORBIDDEN_COMMAND = /(launcher\\.mjs|native-profiles|account-connections|console-startup|\\/\\.ashlr\\b|Bearer\\s|--token\\b)/i;\n\nexport function sanitizeCommand(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n if (trimmed.length === 0 || trimmed.length > 200) return null;\n if (FORBIDDEN_COMMAND.test(trimmed)) return null;\n // A newline would let a payload smuggle a second command onto the surface.\n if (/[\\r\\n]/.test(trimmed)) return null;\n return trimmed;\n}\n\nfunction clampPercent(value: number | null): number | null {\n if (value === null) return null;\n return Math.max(0, Math.min(100, value));\n}\n\nfunction projectWindow(raw: unknown): AccountWindow | null {\n const r = record(raw);\n if (!r) return null;\n const id = str(r, 'id') ?? str(r, 'label');\n if (id === null) return null;\n const native = record(r['nativeReport']);\n const limitReached = bool(r, 'limitReached') || bool(r, 'rateLimitReached');\n const measuredRaw = r['measured'];\n return {\n id,\n label: str(r, 'label'),\n usedPercent: clampPercent(num(r, 'usedPercent') ?? num(r, 'used_percent')),\n resetsAt: str(r, 'resetsAt') ?? str(r, 'resets_at'),\n resetDescription:\n (native ? str(native, 'resetDescription') : null) ?? str(r, 'resetDescription'),\n limitReached,\n // Absent → measured, EXCEPT under a limit flag, which is the one case the\n // upstream writes the sentinel 100. Defaulting a flagged window to\n // `measured: true` would let a denial print as \"100% used\".\n measured: typeof measuredRaw === 'boolean' ? measuredRaw : !limitReached,\n };\n}\n\nfunction projectCredits(raw: unknown): AccountCredits | null {\n const r = record(raw);\n if (!r) return null;\n const balance = str(r, 'balance');\n const parsed = balance === null ? num(r, 'balance') : Number.parseFloat(balance);\n return {\n hasCredits: bool(r, 'hasCredits') || bool(r, 'has_credits'),\n unlimited: bool(r, 'unlimited'),\n balance,\n balanceValue: typeof parsed === 'number' && Number.isFinite(parsed) ? parsed : null,\n };\n}\n\nconst PROVIDERS: readonly string[] = ['claude', 'codex', 'grok'];\n\nfunction projectAccount(raw: unknown): Account | null {\n const r = record(raw);\n if (!r) return null;\n const id = str(r, 'id');\n const provider = str(r, 'provider');\n if (id === null || provider === null || !PROVIDERS.includes(provider)) return null;\n\n const windows = list(r['windows'])\n .map(projectWindow)\n .filter((w): w is AccountWindow => w !== null);\n\n const state = str(r, 'state');\n const auth = str(r, 'authentication');\n const unsupportedRaw = record(r['unsupported']);\n\n return {\n id,\n label: str(r, 'label') ?? id,\n provider: provider as AccountProvider,\n state:\n state === 'checking' || state === 'observed' || state === 'signed-out' || state === 'unavailable'\n ? state\n : 'unavailable',\n authentication: auth === 'signed-in' || auth === 'signed-out' ? auth : 'unknown',\n health: str(r, 'health'),\n planType: str(r, 'planType') ?? str(r, 'plan_type'),\n observedAt: str(r, 'observedAt'),\n windows,\n binding: projectWindow(r['binding']),\n credits: projectCredits(r['credits']),\n reason: str(r, 'reason'),\n unsupported: projectUnsupported(r, unsupportedRaw),\n reconnectCommand: sanitizeCommand(r['reconnectCommand']),\n notes: list(r['notes']).filter((n): n is string => typeof n === 'string'),\n };\n}\n\n/**\n * A version-pinned probe that failed CLOSED, named rather than swallowed.\n *\n * `unsupported` is not a field on the wire. Owner T reports the failure as the\n * verbatim probe code in `reason` (`usage-version-unsupported`) and states the\n * pin in `notes`, so this derives the structured form from those rather than\n * requiring a late contract change. An explicit `unsupported` object is still\n * honoured first, so a server that grows one later wins without a client edit.\n */\nfunction projectUnsupported(\n r: Record<string, unknown>,\n explicit: Record<string, unknown> | null,\n): Account['unsupported'] {\n if (explicit) {\n return {\n code: str(explicit, 'code') ?? CLAUDE_VERSION_REASON,\n pinnedVersion: str(explicit, 'pinnedVersion') ?? str(explicit, 'version'),\n };\n }\n const reason = str(r, 'reason');\n if (reason !== CLAUDE_VERSION_REASON) return null;\n return { code: reason, pinnedVersion: CLAUDE_USAGE_PINNED_VERSION };\n}\n\n/**\n * The read-only banner. Owner T reports lease ownership as a structured\n * `collector` status, not a flat `collectorNote`, so the note is derived from\n * it — and ONLY when another process owns the lease, because that is the one\n * case where these readings may be staler than this server's poll interval.\n * A stray `collectorNote` string is still accepted for forward compatibility.\n */\nfunction projectCollectorNote(root: Record<string, unknown>): string | null {\n const flat = str(root, 'collectorNote');\n if (flat) return flat;\n const collector = record(root['collector']);\n if (!collector) return null;\n if (str(collector, 'owner') !== 'another-collector') return null;\n return (\n str(collector, 'note') ??\n 'Another collector process owns the quota-refresh lease, so these readings are read-only and may be staler than this server’s poll interval.'\n );\n}\n\nexport function projectAccountsSnapshot(raw: unknown): AccountsSnapshot | null {\n const root = record(raw);\n if (!root) return null;\n const rawAccounts = Array.isArray(root['accounts']) ? root['accounts'] : Array.isArray(raw) ? raw : null;\n if (rawAccounts === null) return null;\n return {\n sampledAt: str(root, 'sampledAt'),\n refreshing: bool(root, 'refreshing'),\n accounts: rawAccounts.map(projectAccount).filter((a): a is Account => a !== null),\n collectorNote: projectCollectorNote(root),\n };\n}\n\nfunction projectDay(raw: unknown): DailyUsage | null {\n const r = record(raw);\n if (!r) return null;\n const day = str(r, 'day');\n if (day === null || !/^\\d{4}-\\d{2}-\\d{2}$/.test(day)) return null;\n return {\n day,\n tokensIn: num(r, 'tokensIn') ?? 0,\n tokensOut: num(r, 'tokensOut') ?? 0,\n estCostUsd: num(r, 'estCostUsd') ?? 0,\n sessions: num(r, 'sessions') ?? 0,\n cacheRead: num(r, 'cacheRead'),\n cacheWrite: num(r, 'cacheWrite'),\n cacheHitRate: num(r, 'cacheHitRate'),\n };\n}\n\n/**\n * `byDay` is the wire key. Owner T wraps the series as\n * `{window, byDay, estimated, caveats}` rather than returning a bare array\n * (documented deviation 1), so `byDay` is read FIRST. `days` and a bare array\n * remain accepted so an older or differently-shaped server degrades to a\n * rendered series instead of a dead panel.\n */\nexport function projectUsageSeries(raw: unknown, requested: SeriesWindow): UsageSeries | null {\n const root = record(raw);\n const rawDays = root\n ? Array.isArray(root['byDay'])\n ? root['byDay']\n : Array.isArray(root['days'])\n ? root['days']\n : null\n : Array.isArray(raw)\n ? raw\n : null;\n if (rawDays === null) return null;\n const windowValue = root ? str(root, 'window') : null;\n return {\n window: windowValue === '7d' || windowValue === '30d' ? windowValue : requested,\n days: rawDays\n .map(projectDay)\n .filter((d): d is DailyUsage => d !== null)\n .sort((a, b) => a.day.localeCompare(b.day)),\n generatedAt: root ? str(root, 'generatedAt') : null,\n // The producer asserts estimation explicitly. Absent → still true: every\n // cost column on this route is price-table derived, and defaulting the\n // disclosure OFF would drop it exactly when the server is older.\n estimated: root ? bool(root, 'estimated', true) : true,\n caveats: root ? list(root['caveats']).filter((c): c is string => typeof c === 'string') : [],\n };\n}\n\nfunction projectLocalModel(raw: unknown, runtime: LocalModel['runtime']): LocalModel | null {\n const r = record(raw);\n if (!r) return null;\n // `label`/`id` are owner T's spellings; `name`/`model` are the Ollama-native\n // ones a differently-shaped server might send.\n const name = str(r, 'label') ?? str(r, 'id') ?? str(r, 'name') ?? str(r, 'model');\n if (name === null) return null;\n const caps = r['capabilities'];\n const state = str(r, 'state');\n const supportsTools = r['supportsTools'];\n\n // `nativeContextLength` is the architecture maximum; `contextLength` is what\n // the runtime actually configured for the loaded instance. They are two\n // different facts and the panel shows the gap between them, so they must not\n // collapse onto one field.\n const nativeContext = num(r, 'nativeContextLength') ?? num(r, 'nativeContext');\n const configuredContext = num(r, 'contextLength') ?? num(r, 'configuredContext');\n\n const placement = str(r, 'placement');\n\n return {\n name,\n runtime,\n loaded: state !== null ? state === 'loaded' : bool(r, 'loaded') || bool(r, 'resident'),\n sizeBytes: num(r, 'sizeBytes') ?? num(r, 'size'),\n sizeVramBytes: num(r, 'sizeVramBytes') ?? num(r, 'size_vram'),\n placement:\n placement === 'gpu' || placement === 'cpu' || placement === 'split' ? placement : 'unknown',\n gpuPercent: clampPercent(num(r, 'gpuPercent')),\n memoryPercent: clampPercent(num(r, 'memoryPercent')),\n family: str(r, 'family'),\n arch: str(r, 'arch'),\n expiresAt: str(r, 'expiresAt') ?? str(r, 'expires_at'),\n parameterSize: str(r, 'parameterSize') ?? str(r, 'parameter_size'),\n quantization: str(r, 'quantization') ?? str(r, 'quantization_level'),\n nativeContext,\n // Only a genuine narrowing is worth showing. When the runtime reports the\n // same number twice there is no truncation to report.\n configuredContext:\n configuredContext !== null && nativeContext !== null && configuredContext === nativeContext\n ? null\n : configuredContext,\n capabilities: Array.isArray(caps) ? caps.filter((c): c is string => typeof c === 'string') : null,\n supportsTools: typeof supportsTools === 'boolean' ? supportsTools : null,\n };\n}\n\nfunction projectRuntimeReport(\n raw: unknown,\n runtime: NonNullable<LocalModel['runtime']>,\n): { status: LocalRuntimeStatus; models: LocalModel[] } | null {\n const r = record(raw);\n if (!r) return null;\n const rawModels = Array.isArray(r['models']) ? r['models'] : null;\n if (rawModels === null) return null;\n const models = rawModels\n .map((m) => projectLocalModel(m, runtime))\n .filter((m): m is LocalModel => m !== null);\n const stale = bool(r, 'stale');\n const inspection = record(r['detailInspection']);\n const attempted = inspection ? num(inspection, 'attempted') : null;\n const pending = inspection ? num(inspection, 'pending') : null;\n const detailInspection = attempted !== null && pending !== null && Number.isInteger(attempted) && Number.isInteger(pending) && attempted >= 0 && pending > 0 && attempted + pending === models.length ? { attempted, pending } : undefined;\n return {\n models,\n status: {\n runtime,\n reachable: bool(r, 'reachable'),\n reason: str(r, 'reason'),\n stale,\n // Only meaningful under `stale`. A staleForMs on a fresh report would be\n // a contradiction, and printing it would age a current reading.\n staleForMs: stale ? num(r, 'staleForMs') : null,\n modelCount: models.length,\n ...(detailInspection ? { detailInspection } : {}),\n },\n };\n}\n\n/**\n * Owner T reports local availability per RUNTIME (`ollama`, `lmStudio`) with a\n * shared `machine` budget. This panel answers one question — \"what can I run\n * right now, and against how much memory\" — so the runtimes are flattened into\n * one list, each row keeping its `runtime` so it stays attributable.\n *\n * Reachability is the OR of the runtimes: one dead runtime is not an unreachable\n * local stack. `reason` is only carried when NOTHING is reachable, because a\n * degradation note beside a working list would misdescribe what is on screen.\n *\n * A flat `{reachable, models, memoryBudgetBytes}` body is still accepted, so an\n * older or differently-shaped server degrades rather than rendering nothing.\n */\nexport function projectLocalModels(raw: unknown): LocalModelsSnapshot | null {\n const root = record(raw);\n if (!root) return null;\n\n const ollama = projectRuntimeReport(root['ollama'], 'ollama');\n const lmStudio = projectRuntimeReport(root['lmStudio'] ?? root['lmstudio'], 'lmstudio');\n\n if (ollama !== null || lmStudio !== null) {\n const reports = [ollama, lmStudio].filter((x): x is NonNullable<typeof x> => x !== null);\n const reachable = reports.some((x) => x.status.reachable);\n const machine = record(root['machine']);\n return {\n reachable,\n models: reports.flatMap((x) => x.models),\n memoryBudgetBytes:\n (machine ? num(machine, 'totalMemoryBytes') : null) ??\n num(root, 'memoryBudgetBytes') ??\n num(root, 'memoryBudget'),\n freeMemoryBytes: machine ? num(machine, 'freeMemoryBytes') : null,\n reason: reachable\n ? null\n : (reports.map((x) => x.status.reason).find((x) => x !== null) ?? null),\n runtimes: reports.map((x) => x.status),\n notes: list(root['notes']).filter((n): n is string => typeof n === 'string'),\n sampledAt: str(root, 'sampledAt'),\n };\n }\n\n const rawModels = Array.isArray(root['models']) ? root['models'] : null;\n if (rawModels === null) return null;\n return {\n reachable: bool(root, 'reachable', true),\n models: rawModels.map((m) => projectLocalModel(m, null)).filter((m): m is LocalModel => m !== null),\n memoryBudgetBytes: num(root, 'memoryBudgetBytes') ?? num(root, 'memoryBudget'),\n freeMemoryBytes: num(root, 'freeMemoryBytes'),\n reason: str(root, 'reason'),\n // A flat legacy body carries no per-runtime reachability, so there is\n // nothing to attribute and nothing to call stale. An empty list says that\n // honestly; a fabricated entry would not.\n runtimes: [],\n notes: list(root['notes']).filter((n): n is string => typeof n === 'string'),\n sampledAt: str(root, 'sampledAt'),\n };\n}\n","/**\n * routes/verse/usage/usage-queries.ts — the reads behind the Usage section.\n *\n * `/api/control` is fetched through the shared `controlSnapshotQuery` so this\n * section rides the same cache (and the same SSE invalidation) as every other\n * view rather than opening a second copy of a large snapshot.\n *\n * `/api/verse/control` is owner B's new route. It is fetched through a\n * NON-throwing wrapper because this section must still render when the route\n * is absent (server started without --allow-dispatch, or B's route not landed\n * yet): a missing configured-caps source is a degraded panel, not a dead\n * section. 401 is the one error that still propagates — an expired read\n * session is an unauthorized state for the whole surface, not a degraded one.\n *\n * The cache key is deliberately NOT shared with the Autonomy section's own\n * read of the same route: this module stores a wrapper shape, and two owners\n * writing different value types under one key would be a real bug.\n */\nimport type { FrontierUsage } from '../../../../core/usage/frontier-usage.js';\nimport { ApiError, apiGet } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { projectLocalModels, type SeriesWindow } from './usage-contract.js';\n\nexport const USAGE_FRONTIER_KEY = 'verse-usage-frontier';\nexport const USAGE_VERSE_CONTROL_KEY = 'verse-usage-control';\n\n/** GET /api/usage — per-engine frontier usage (see core/usage/frontier-usage.ts). */\nexport const frontierUsageQuery: QueryDef<FrontierUsage> = {\n key: USAGE_FRONTIER_KEY,\n fetch: (signal) => apiGet<FrontierUsage>('/api/usage', signal),\n};\n\nexport interface VerseControlRead {\n /** Raw body; narrowed by `projectVerseControl` (owner B's types are not landed). */\n raw: unknown;\n available: boolean;\n reason: string | null;\n}\n\nfunction describeControlFailure(err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) {\n return 'This server does not expose /api/verse/control, so configured caps and today’s spend are unavailable here.';\n }\n return `Configured caps unavailable (HTTP ${err.status}).`;\n }\n return 'Configured caps unavailable: the request failed.';\n}\n\nexport const verseControlQuery: QueryDef<VerseControlRead> = {\n key: USAGE_VERSE_CONTROL_KEY,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>('/api/verse/control', signal);\n return { raw, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { raw: null, available: false, reason: describeControlFailure(err) };\n }\n },\n};\n\n// ---------------------------------------------------------------------------\n// Owner T's routes (GET /api/verse/{accounts,usage-series,local-models})\n// ---------------------------------------------------------------------------\n//\n// These three are fetched through the SAME non-throwing wrapper pattern as\n// /api/verse/control, for the same reason and one more: they are landing in\n// parallel with this section. A server that predates them answers 404, and a\n// 404 here means \"this panel is degraded\", not \"the Usage view is broken\".\n// 401 still propagates, because an expired read session is an unauthorized\n// state for the whole surface.\n//\n// The bodies are narrowed structurally by usage-contract.ts rather than cast,\n// so a field-name drift between T's route and this client degrades to an\n// honest \"unknown\" instead of throwing at render time.\n\nexport const USAGE_ACCOUNTS_KEY = 'verse-usage-accounts';\nexport const USAGE_LOCAL_MODELS_KEY = 'verse-usage-local-models';\nexport const USAGE_SERIES_KEY_PREFIX = 'verse-usage-series';\n\n/** A read that is allowed to be absent. `raw` is null when it was. */\nexport interface OptionalRead {\n raw: unknown;\n available: boolean;\n reason: string | null;\n}\n\nfunction describeOptionalFailure(path: string, err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) {\n return `This server does not expose ${path} yet, so this panel has no source.`;\n }\n return `${path} answered HTTP ${err.status}.`;\n }\n return `${path} could not be reached.`;\n}\n\nfunction optionalGet(path: string): (signal?: AbortSignal) => Promise<OptionalRead> {\n return async (signal) => {\n try {\n const raw = await apiGet<unknown>(path, signal);\n return { raw, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { raw: null, available: false, reason: describeOptionalFailure(path, err) };\n }\n };\n}\n\n/** GET /api/verse/accounts — per-account state, windows, credits, plan. */\nexport const verseAccountsQuery: QueryDef<OptionalRead> = {\n key: USAGE_ACCOUNTS_KEY,\n fetch: optionalGet('/api/verse/accounts'),\n};\n\n// ---------------------------------------------------------------------------\n// GET /api/verse/local-models — and why this one read retries\n// ---------------------------------------------------------------------------\n//\n// `/api/verse/local-models` probes the runtimes live on every request, with a\n// 2s per-probe timeout (core/verse/local-models.ts\n// VERSE_LOCAL_PROBE_TIMEOUT_MS). A probe that times out is reported as\n// `{reachable: false, reason: 'ollama-unreachable'}` in a perfectly ordinary\n// HTTP 200 — which is correct on the server's terms (it genuinely did not get\n// an answer) but is NOT the same fact as \"Ollama is not running\", and nothing\n// in the payload distinguishes the two.\n//\n// That distinction matters here because this section is the thing that causes\n// the timeout. Mounting Usage, and every press of its Refresh button, fires\n// seven reads at once, several of which spawn short-lived account-probe\n// processes server-side; measured against a live Ollama with twelve models,\n// roughly one burst in ten starves the 2s probe and comes back\n// `ollama-unreachable`. Nothing re-reads this route afterwards — it has no SSE\n// invalidation key — so that one false negative is what the operator stares\n// at, and pressing Refresh re-creates the very burst that produced it.\n//\n// So a reported-unreachable local stack is RE-READ, up to twice, with a short\n// gap for the burst to drain. This is not \"ignore the failure\": the retries\n// are bounded, each one is a real request, and whatever the last read says is\n// what this section renders — a runtime that is genuinely down answers fast\n// (connection refused, not a timeout) and still reports unreachable, three\n// times, in well under a second.\n//\n// Only an AVAILABLE read is retried. A 404/500 (`available: false`) is a\n// statement about the route, not about the runtime, and re-asking cannot\n// change it.\n\n/** Two extra reads at most, spaced so the section's own request burst drains. */\nconst LOCAL_MODELS_RETRY_DELAYS_MS = [350, 1200] as const;\n\nconst readLocalModels = optionalGet('/api/verse/local-models');\n\nfunction reportsNothingReachable(read: OptionalRead): boolean {\n if (!read.available) return false;\n const snapshot = projectLocalModels(read.raw);\n return snapshot !== null && !snapshot.reachable;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n return;\n }\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(new DOMException('Aborted', 'AbortError'));\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/** GET /api/verse/local-models — resident vs installed, VRAM split, tools. */\nexport const verseLocalModelsQuery: QueryDef<OptionalRead> = {\n key: USAGE_LOCAL_MODELS_KEY,\n fetch: async (signal) => {\n let read = await readLocalModels(signal);\n for (const delayMs of LOCAL_MODELS_RETRY_DELAYS_MS) {\n if (!reportsNothingReachable(read)) return read;\n await sleep(delayMs, signal);\n read = await readLocalModels(signal);\n }\n return read;\n },\n};\n\n// One QueryDef per window, created once at module scope: useQuery keys on\n// `def.key`, and minting a fresh object per render would be harmless but\n// useRefresh/useRefetch's useCallback deps would churn for no reason.\nconst SERIES_QUERIES: Record<SeriesWindow, QueryDef<OptionalRead>> = {\n '7d': {\n key: `${USAGE_SERIES_KEY_PREFIX}:7d`,\n fetch: optionalGet('/api/verse/usage-series?window=7d'),\n },\n '30d': {\n key: `${USAGE_SERIES_KEY_PREFIX}:30d`,\n fetch: optionalGet('/api/verse/usage-series?window=30d'),\n },\n};\n\nexport function usageSeriesQuery(window: SeriesWindow): QueryDef<OptionalRead> {\n return SERIES_QUERIES[window];\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{s as t}from"./index-BMfejJ9u.js";import{N as n,S as r,l as i,o as a,u as o,w as s}from"./global-7hs7NyAO.js";import{S as c,b as l,d as u,f as d,j as f}from"./VerseShared-8n7hxr-e.js";var p=[`user-message`,`turn-started`,`text-delta`,`assistant-message`,`thinking`,`tool-use`,`tool-result`,`usage`,`turn-done`,`error`,`cancelled`,`compaction`,`context`,`thinking-delta`,`thinking-progress`,`progress`,`status`,`recovered`,`history-truncated`,`source`,`remote-status`,`remote-pr`];function m(e){return Math.min(1e3*2**e,15e3)}var h=e=>e===null||typeof e==`number`&&Number.isFinite(e)&&e>=0;function g(e){return e.type===`context`?typeof e.contextTokens==`number`&&Number.isFinite(e.contextTokens)&&e.contextTokens>=0&&typeof e.exact==`boolean`&&h(e.contextWindow)&&(e.autoCompactAt===void 0||h(e.autoCompactAt)):e.type!==`compaction`||(e.trigger===`auto`||e.trigger===`manual`)&&h(e.preTokens)&&h(e.postTokens)&&h(e.durationMs)}var _=e=>e===void 0||typeof e==`number`&&Number.isFinite(e)&&e>=0;function v(e){switch(e.type){case`thinking-delta`:return typeof e.text==`string`;case`thinking-progress`:return e.estimatedTokens!==void 0&&_(e.estimatedTokens);case`progress`:return(e.phase===`thinking`||e.phase===`tool`||e.phase===`writing`||e.phase===`waiting`)&&typeof e.elapsedMs==`number`&&Number.isFinite(e.elapsedMs)&&e.elapsedMs>=0&&(e.tool===void 0||typeof e.tool==`string`)&&_(e.outTokens)&&_(e.tokPerSec);case`status`:return(e.kind===`retry`||e.kind===`preflight`||e.kind===`watchdog`)&&typeof e.message==`string`;case`history-truncated`:return typeof e.droppedBefore==`number`&&Number.isFinite(e.droppedBefore);case`source`:{let t=e.source;return!!t&&typeof t==`object`&&typeof t.kind==`string`&&typeof t.ref==`string`&&t.ref.length>0&&typeof t.title==`string`&&typeof t.origin==`string`}default:return!0}}function y(e){try{let t=JSON.parse(e);if(!t||typeof t!=`object`)return null;let n=t;return typeof n.seq!=`number`||typeof n.type!=`string`||!g(t)||!v(t)?null:t}catch{return null}}var b=`verse-sessions`;function x(e=!0){return n()?`/api/events?topics=${b}`:`/api/events?${e?`topics=${b}&`:``}client=${encodeURIComponent(s())}`}var S=!1;function C(){let e=null,t=null,i=0,a=!1,o=!1,s=()=>{if(a||typeof EventSource>`u`||r().phase!==`authenticated`)return;let c=n()||!S&&!o,l=new EventSource(x(c),{withCredentials:!0}),d=!1;e=l,l.onopen=()=>{d=!0,i=0,o&&=(S=!0,!1)},l.addEventListener(`verse-sessions`,()=>u()),l.onerror=()=>{if(l.close(),e===l&&(e=null),!(a||r().phase!==`authenticated`)){if(!d&&c&&!n()){o=!0,s();return}o=!1,t=setTimeout(()=>{t=null,i+=1,s()},m(i))}}};return s(),()=>{a=!0,t&&clearTimeout(t),t=null,e?.close(),e=null}}var w=e(t(),1),T=5e3,E=new Map,D=new Set;function O(e){return D.add(e),()=>D.delete(e)}function k(){return E}function A(e,t){if(!((E.get(e)??-1)>=t)){E=new Map(E).set(e,t);for(let e of[...D])e();d(e,t)}}function j(){return(0,w.useSyncExternalStore)(O,k,k)}function M(){let e=i(l,{freshMs:4500}),t=i(c),n=o(l),r=(0,w.useCallback)(()=>n(),[n]);f(r,T);let s=j();return{activity:e.data??null,meta:t.data??null,metaError:t.status===`error`?a(t.error):null,localSeen:s}}export{y as a,C as i,M as n,p as r,A as t};
2
+ //# sourceMappingURL=use-chat-activity-C1AfctzC.js.map