@ashlr/hub 3.22.0 → 3.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (929) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +5 -5
  3. package/dist/authority-surface.json +16 -11
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/verify-safety-sources.d.ts +4 -0
  6. package/dist/cli/verify-safety-sources.js +41 -0
  7. package/dist/cli/verify-safety-sources.js.map +1 -0
  8. package/dist/cli/verify-safety.js +16 -1
  9. package/dist/cli/verify-safety.js.map +1 -1
  10. package/dist/core/decide/needs-you.d.ts +3 -1
  11. package/dist/core/decide/needs-you.js +52 -28
  12. package/dist/core/decide/needs-you.js.map +1 -1
  13. package/dist/core/fleet/fleet-control-model.d.ts +2 -1
  14. package/dist/core/fleet/fleet-control-model.js +5 -0
  15. package/dist/core/fleet/fleet-control-model.js.map +1 -1
  16. package/dist/core/fleet/fleet-control-types.d.ts +11 -1
  17. package/dist/core/fleet/fleet-control.d.ts +4 -0
  18. package/dist/core/fleet/fleet-control.js +23 -1
  19. package/dist/core/fleet/fleet-control.js.map +1 -1
  20. package/dist/core/fleet/quota.js +1 -1
  21. package/dist/core/fleet/quota.js.map +1 -1
  22. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  23. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +4 -2
  24. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +3 -1
  25. package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js +2 -0
  26. package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js.map +1 -0
  27. package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js +2 -0
  28. package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js.map +1 -0
  29. package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js +2 -0
  30. package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js.map +1 -0
  31. package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js +2 -0
  32. package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js.map +1 -0
  33. package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js +2 -0
  34. package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js.map +1 -0
  35. package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js +2 -0
  36. package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js.map +1 -0
  37. package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js +3 -0
  38. package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js.map +1 -0
  39. package/dist/core/web/public/next/assets/App-ttVrZYp5.js +8 -0
  40. package/dist/core/web/public/next/assets/App-ttVrZYp5.js.map +1 -0
  41. package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js +2 -0
  42. package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js.map +1 -0
  43. package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js +2 -0
  44. package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js.map +1 -0
  45. package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js +2 -0
  46. package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js.map +1 -0
  47. package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js +3 -0
  48. package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js.map +1 -0
  49. package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js +2 -0
  50. package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js.map +1 -0
  51. package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js +2 -0
  52. package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js.map +1 -0
  53. package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js +2 -0
  54. package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js.map +1 -0
  55. package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js +7 -0
  56. package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js.map +1 -0
  57. package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js +2 -0
  58. package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js.map +1 -0
  59. package/dist/core/web/public/next/assets/Button-CstSJwha.js +2 -0
  60. package/dist/core/web/public/next/assets/Button-CstSJwha.js.map +1 -0
  61. package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js +2 -0
  62. package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js.map +1 -0
  63. package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js +16 -0
  64. package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js.map +1 -0
  65. package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js +2 -0
  66. package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js.map +1 -0
  67. package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js +2 -0
  68. package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js.map +1 -0
  69. package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js +3 -0
  70. package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js.map +1 -0
  71. package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js +5 -0
  72. package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js.map +1 -0
  73. package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js +2 -0
  74. package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js.map +1 -0
  75. package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js +3 -0
  76. package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js.map +1 -0
  77. package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js +3 -0
  78. package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js.map +1 -0
  79. package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js +9 -0
  80. package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js.map +1 -0
  81. package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js +3 -0
  82. package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js.map +1 -0
  83. package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js +4 -0
  84. package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js.map +1 -0
  85. package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js +2 -0
  86. package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js.map +1 -0
  87. package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js +2 -0
  88. package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js.map +1 -0
  89. package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js +2 -0
  90. package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js.map +1 -0
  91. package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js +2 -0
  92. package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js.map +1 -0
  93. package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js +2 -0
  94. package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js.map +1 -0
  95. package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js +2 -0
  96. package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js.map +1 -0
  97. package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js +2 -0
  98. package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js.map +1 -0
  99. package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js +2 -0
  100. package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js.map +1 -0
  101. package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js +2 -0
  102. package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js.map +1 -0
  103. package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js +2 -0
  104. package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js.map +1 -0
  105. package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js +2 -0
  106. package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js.map +1 -0
  107. package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js +2 -0
  108. package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js.map +1 -0
  109. package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js +2 -0
  110. package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js.map +1 -0
  111. package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js +5 -0
  112. package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js.map +1 -0
  113. package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js +2 -0
  114. package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js.map +1 -0
  115. package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js +2 -0
  116. package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js.map +1 -0
  117. package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js +2 -0
  118. package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js.map +1 -0
  119. package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js +3 -0
  120. package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js.map +1 -0
  121. package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js +2 -0
  122. package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js.map +1 -0
  123. package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js +3 -0
  124. package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js.map +1 -0
  125. package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js +2 -0
  126. package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js.map +1 -0
  127. package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js +2 -0
  128. package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js.map +1 -0
  129. package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js +9 -0
  130. package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js.map +1 -0
  131. package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js +2 -0
  132. package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js.map +1 -0
  133. package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js +3 -0
  134. package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js.map +1 -0
  135. package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js +2 -0
  136. package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js.map +1 -0
  137. package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js +2 -0
  138. package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js.map +1 -0
  139. package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js +2 -0
  140. package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js.map +1 -0
  141. package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js +2 -0
  142. package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js.map +1 -0
  143. package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js +2 -0
  144. package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js.map +1 -0
  145. package/dist/core/web/public/next/assets/McpSection-snZNKexW.js +2 -0
  146. package/dist/core/web/public/next/assets/McpSection-snZNKexW.js.map +1 -0
  147. package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js +3 -0
  148. package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js.map +1 -0
  149. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js +72 -0
  150. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js.map +1 -0
  151. package/dist/core/web/public/next/assets/Meter-VXI75VNe.js +2 -0
  152. package/dist/core/web/public/next/assets/Meter-VXI75VNe.js.map +1 -0
  153. package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js +2 -0
  154. package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js.map +1 -0
  155. package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js +3 -0
  156. package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js.map +1 -0
  157. package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js +2 -0
  158. package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js.map +1 -0
  159. package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js +2 -0
  160. package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js.map +1 -0
  161. package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js +3 -0
  162. package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js.map +1 -0
  163. package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js +2 -0
  164. package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js.map +1 -0
  165. package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js +7 -0
  166. package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js.map +1 -0
  167. package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js +2 -0
  168. package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js.map +1 -0
  169. package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js +3 -0
  170. package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js.map +1 -0
  171. package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js +2 -0
  172. package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js.map +1 -0
  173. package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js +2 -0
  174. package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js.map +1 -0
  175. package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js +2 -0
  176. package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js.map +1 -0
  177. package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js +4 -0
  178. package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js.map +1 -0
  179. package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js +3 -0
  180. package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js.map +1 -0
  181. package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js +3 -0
  182. package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js.map +1 -0
  183. package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js +9 -0
  184. package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js.map +1 -0
  185. package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js +2 -0
  186. package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js.map +1 -0
  187. package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js +2 -0
  188. package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js.map +1 -0
  189. package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js +2 -0
  190. package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js.map +1 -0
  191. package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js +2 -0
  192. package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js.map +1 -0
  193. package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js +2 -0
  194. package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js.map +1 -0
  195. package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js +2 -0
  196. package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js.map +1 -0
  197. package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js +2 -0
  198. package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js.map +1 -0
  199. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js +7 -0
  200. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js.map +1 -0
  201. package/dist/core/web/public/next/assets/ResourcesChrome-DuEa7WOo.css +1 -0
  202. package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js +3 -0
  203. package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js.map +1 -0
  204. package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js +3 -0
  205. package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js.map +1 -0
  206. package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js +2 -0
  207. package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js.map +1 -0
  208. package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js +2 -0
  209. package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js.map +1 -0
  210. package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js +2 -0
  211. package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js.map +1 -0
  212. package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js +2 -0
  213. package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js.map +1 -0
  214. package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js +2 -0
  215. package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js.map +1 -0
  216. package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js +3 -0
  217. package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js.map +1 -0
  218. package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js +3 -0
  219. package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js.map +1 -0
  220. package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js +2 -0
  221. package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js.map +1 -0
  222. package/dist/core/web/public/next/assets/Select-B8GqZOX9.js +2 -0
  223. package/dist/core/web/public/next/assets/Select-B8GqZOX9.js.map +1 -0
  224. package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js +2 -0
  225. package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js.map +1 -0
  226. package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js +2 -0
  227. package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js.map +1 -0
  228. package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js +2 -0
  229. package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js.map +1 -0
  230. package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js +2 -0
  231. package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js.map +1 -0
  232. package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js +2 -0
  233. package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js.map +1 -0
  234. package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js +3 -0
  235. package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js.map +1 -0
  236. package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js +2 -0
  237. package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js.map +1 -0
  238. package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js +2 -0
  239. package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js.map +1 -0
  240. package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js +3 -0
  241. package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js.map +1 -0
  242. package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js +2 -0
  243. package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js.map +1 -0
  244. package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js +2 -0
  245. package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js.map +1 -0
  246. package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js +2 -0
  247. package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js.map +1 -0
  248. package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js +2 -0
  249. package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js.map +1 -0
  250. package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js +2 -0
  251. package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js.map +1 -0
  252. package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js +2 -0
  253. package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js.map +1 -0
  254. package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js +2 -0
  255. package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js.map +1 -0
  256. package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js +2 -0
  257. package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js.map +1 -0
  258. package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js +2 -0
  259. package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js.map +1 -0
  260. package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js +2 -0
  261. package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js.map +1 -0
  262. package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js +2 -0
  263. package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js.map +1 -0
  264. package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js +3 -0
  265. package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js.map +1 -0
  266. package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js +26 -0
  267. package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js.map +1 -0
  268. package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js +2 -0
  269. package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js.map +1 -0
  270. package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js +2 -0
  271. package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js.map +1 -0
  272. package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js +9 -0
  273. package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js.map +1 -0
  274. package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js +3 -0
  275. package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js.map +1 -0
  276. package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js +2 -0
  277. package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js.map +1 -0
  278. package/dist/core/web/public/next/assets/VerseConsoleApp-BmckthwC.css +1 -0
  279. package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js +3 -0
  280. package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js.map +1 -0
  281. package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js +3 -0
  282. package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js.map +1 -0
  283. package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js +2 -0
  284. package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js.map +1 -0
  285. package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js +2 -0
  286. package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js.map +1 -0
  287. package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js +2 -0
  288. package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js.map +1 -0
  289. package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js +2 -0
  290. package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js.map +1 -0
  291. package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js +6 -0
  292. package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js.map +1 -0
  293. package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js +2 -0
  294. package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js.map +1 -0
  295. package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js +2 -0
  296. package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js.map +1 -0
  297. package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js +2 -0
  298. package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js.map +1 -0
  299. package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js +2 -0
  300. package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js.map +1 -0
  301. package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js +2 -0
  302. package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js.map +1 -0
  303. package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js +2 -0
  304. package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js.map +1 -0
  305. package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js +2 -0
  306. package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js.map +1 -0
  307. package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js +2 -0
  308. package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js.map +1 -0
  309. package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js +2 -0
  310. package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js.map +1 -0
  311. package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js +2 -0
  312. package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js.map +1 -0
  313. package/dist/core/web/public/next/assets/charts-DT9PYS49.js +2 -0
  314. package/dist/core/web/public/next/assets/charts-DT9PYS49.js.map +1 -0
  315. package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js +2 -0
  316. package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js.map +1 -0
  317. package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js +2 -0
  318. package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js.map +1 -0
  319. package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js +2 -0
  320. package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js.map +1 -0
  321. package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js +2 -0
  322. package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js.map +1 -0
  323. package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js +2 -0
  324. package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js.map +1 -0
  325. package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js +2 -0
  326. package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js.map +1 -0
  327. package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js +2 -0
  328. package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js.map +1 -0
  329. package/dist/core/web/public/next/assets/control-queries-BG53otwz.js +2 -0
  330. package/dist/core/web/public/next/assets/control-queries-BG53otwz.js.map +1 -0
  331. package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js +2 -0
  332. package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js.map +1 -0
  333. package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js +2 -0
  334. package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js.map +1 -0
  335. package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js +2 -0
  336. package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js.map +1 -0
  337. package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js +2 -0
  338. package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js.map +1 -0
  339. package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js +2 -0
  340. package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js.map +1 -0
  341. package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js +2 -0
  342. package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js.map +1 -0
  343. package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js +2 -0
  344. package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js.map +1 -0
  345. package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js +2 -0
  346. package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js.map +1 -0
  347. package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js +3 -0
  348. package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js.map +1 -0
  349. package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js +2 -0
  350. package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js.map +1 -0
  351. package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js +5 -0
  352. package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js.map +1 -0
  353. package/dist/core/web/public/next/assets/global-w7KDTTi0.js +3 -0
  354. package/dist/core/web/public/next/assets/global-w7KDTTi0.js.map +1 -0
  355. package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js +3 -0
  356. package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js.map +1 -0
  357. package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js +2 -0
  358. package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js.map +1 -0
  359. package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js +2 -0
  360. package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js.map +1 -0
  361. package/dist/core/web/public/next/assets/icons-C3G-y5j2.js +2 -0
  362. package/dist/core/web/public/next/assets/icons-C3G-y5j2.js.map +1 -0
  363. package/dist/core/web/public/next/assets/index-BC5Uslm5.js +11 -0
  364. package/dist/core/web/public/next/assets/index-BC5Uslm5.js.map +1 -0
  365. package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js +2 -0
  366. package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js.map +1 -0
  367. package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js +2 -0
  368. package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js.map +1 -0
  369. package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js +2 -0
  370. package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js.map +1 -0
  371. package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js +2 -0
  372. package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js.map +1 -0
  373. package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js +2 -0
  374. package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js.map +1 -0
  375. package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js +2 -0
  376. package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js.map +1 -0
  377. package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js +7 -0
  378. package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js.map +1 -0
  379. package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js +2 -0
  380. package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js.map +1 -0
  381. package/dist/core/web/public/next/assets/mutations-CdLi0erM.js +2 -0
  382. package/dist/core/web/public/next/assets/mutations-CdLi0erM.js.map +1 -0
  383. package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js +2 -0
  384. package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js.map +1 -0
  385. package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js +2 -0
  386. package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js.map +1 -0
  387. package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js +2 -0
  388. package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js.map +1 -0
  389. package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js +2 -0
  390. package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js.map +1 -0
  391. package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js +2 -0
  392. package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js.map +1 -0
  393. package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js +2 -0
  394. package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js.map +1 -0
  395. package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js +2 -0
  396. package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js.map +1 -0
  397. package/dist/core/web/public/next/assets/panes-5GU8cuI9.js +3 -0
  398. package/dist/core/web/public/next/assets/panes-5GU8cuI9.js.map +1 -0
  399. package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js +2 -0
  400. package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js.map +1 -0
  401. package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js +2 -0
  402. package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js.map +1 -0
  403. package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js +2 -0
  404. package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js.map +1 -0
  405. package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js +2 -0
  406. package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js.map +1 -0
  407. package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js +2 -0
  408. package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js.map +1 -0
  409. package/dist/core/web/public/next/assets/primitives-6nAFZkcg.js +1 -0
  410. package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js +2 -0
  411. package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js.map +1 -0
  412. package/dist/core/web/public/next/assets/queries-PgZlvFqO.js +2 -0
  413. package/dist/core/web/public/next/assets/queries-PgZlvFqO.js.map +1 -0
  414. package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js +2 -0
  415. package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js.map +1 -0
  416. package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js +3 -0
  417. package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js.map +1 -0
  418. package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js +2 -0
  419. package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js.map +1 -0
  420. package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js +2 -0
  421. package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js.map +1 -0
  422. package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js +2 -0
  423. package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js.map +1 -0
  424. package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js +2 -0
  425. package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js.map +1 -0
  426. package/dist/core/web/public/next/assets/slots-DWlj_c7i.js +3 -0
  427. package/dist/core/web/public/next/assets/slots-DWlj_c7i.js.map +1 -0
  428. package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js +4 -0
  429. package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js.map +1 -0
  430. package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js +2 -0
  431. package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js.map +1 -0
  432. package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js +2 -0
  433. package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js.map +1 -0
  434. package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js +2 -0
  435. package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js.map +1 -0
  436. package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js +2 -0
  437. package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js.map +1 -0
  438. package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js +2 -0
  439. package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js.map +1 -0
  440. package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js +6 -0
  441. package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js.map +1 -0
  442. package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js +2 -0
  443. package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js.map +1 -0
  444. package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js +2 -0
  445. package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js.map +1 -0
  446. package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js +2 -0
  447. package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js.map +1 -0
  448. package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js +2 -0
  449. package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js.map +1 -0
  450. package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js +2 -0
  451. package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js.map +1 -0
  452. package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js +2 -0
  453. package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js.map +1 -0
  454. package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js +2 -0
  455. package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js.map +1 -0
  456. package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js +2 -0
  457. package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js.map +1 -0
  458. package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js +2 -0
  459. package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js.map +1 -0
  460. package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js +2 -0
  461. package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js.map +1 -0
  462. package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js +2 -0
  463. package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js.map +1 -0
  464. package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js +2 -0
  465. package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js.map +1 -0
  466. package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js +2 -0
  467. package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js.map +1 -0
  468. package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js +2 -0
  469. package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js.map +1 -0
  470. package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js +2 -0
  471. package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js.map +1 -0
  472. package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js +3 -0
  473. package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js.map +1 -0
  474. package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js +2 -0
  475. package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js.map +1 -0
  476. package/dist/core/web/public/next/index.html +1 -1
  477. package/dist/release-dependency-inventory.json +1 -1
  478. package/package.json +1 -1
  479. package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js +0 -2
  480. package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js.map +0 -1
  481. package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js +0 -2
  482. package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js.map +0 -1
  483. package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js +0 -2
  484. package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js.map +0 -1
  485. package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js +0 -2
  486. package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js.map +0 -1
  487. package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js +0 -2
  488. package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js.map +0 -1
  489. package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js +0 -2
  490. package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js.map +0 -1
  491. package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js +0 -3
  492. package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js.map +0 -1
  493. package/dist/core/web/public/next/assets/App-CPKNuUdC.js +0 -8
  494. package/dist/core/web/public/next/assets/App-CPKNuUdC.js.map +0 -1
  495. package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js +0 -2
  496. package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js.map +0 -1
  497. package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js +0 -2
  498. package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js.map +0 -1
  499. package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js +0 -2
  500. package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js.map +0 -1
  501. package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js +0 -3
  502. package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js.map +0 -1
  503. package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js +0 -2
  504. package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js.map +0 -1
  505. package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js +0 -2
  506. package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js.map +0 -1
  507. package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js +0 -2
  508. package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js.map +0 -1
  509. package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js +0 -7
  510. package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js.map +0 -1
  511. package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js +0 -2
  512. package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js.map +0 -1
  513. package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js +0 -2
  514. package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js.map +0 -1
  515. package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js +0 -2
  516. package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js.map +0 -1
  517. package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js +0 -16
  518. package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js.map +0 -1
  519. package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js +0 -2
  520. package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js.map +0 -1
  521. package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js +0 -2
  522. package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js.map +0 -1
  523. package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js +0 -3
  524. package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js.map +0 -1
  525. package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js +0 -5
  526. package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js.map +0 -1
  527. package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js +0 -2
  528. package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js.map +0 -1
  529. package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js +0 -3
  530. package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js.map +0 -1
  531. package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js +0 -3
  532. package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js.map +0 -1
  533. package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js +0 -9
  534. package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js.map +0 -1
  535. package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js +0 -3
  536. package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js.map +0 -1
  537. package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js +0 -4
  538. package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js.map +0 -1
  539. package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js +0 -2
  540. package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js.map +0 -1
  541. package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js +0 -2
  542. package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js.map +0 -1
  543. package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js +0 -2
  544. package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js.map +0 -1
  545. package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js +0 -2
  546. package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js.map +0 -1
  547. package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js +0 -2
  548. package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js.map +0 -1
  549. package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js +0 -2
  550. package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js.map +0 -1
  551. package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js +0 -2
  552. package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js.map +0 -1
  553. package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js +0 -2
  554. package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js.map +0 -1
  555. package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js +0 -2
  556. package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js.map +0 -1
  557. package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js +0 -2
  558. package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js.map +0 -1
  559. package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js +0 -2
  560. package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js.map +0 -1
  561. package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js +0 -2
  562. package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js.map +0 -1
  563. package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js +0 -2
  564. package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js.map +0 -1
  565. package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js +0 -5
  566. package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js.map +0 -1
  567. package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js +0 -2
  568. package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js.map +0 -1
  569. package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js +0 -2
  570. package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js.map +0 -1
  571. package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js +0 -2
  572. package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js.map +0 -1
  573. package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js +0 -3
  574. package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js.map +0 -1
  575. package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js +0 -2
  576. package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js.map +0 -1
  577. package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js +0 -3
  578. package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js.map +0 -1
  579. package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js +0 -2
  580. package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js.map +0 -1
  581. package/dist/core/web/public/next/assets/Input-Bt6fp051.js +0 -2
  582. package/dist/core/web/public/next/assets/Input-Bt6fp051.js.map +0 -1
  583. package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js +0 -9
  584. package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js.map +0 -1
  585. package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js +0 -2
  586. package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js.map +0 -1
  587. package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js +0 -3
  588. package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js.map +0 -1
  589. package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js +0 -2
  590. package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js.map +0 -1
  591. package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js +0 -2
  592. package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js.map +0 -1
  593. package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js +0 -2
  594. package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js.map +0 -1
  595. package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js +0 -2
  596. package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js.map +0 -1
  597. package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js +0 -2
  598. package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js.map +0 -1
  599. package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js +0 -2
  600. package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js.map +0 -1
  601. package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js +0 -3
  602. package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js.map +0 -1
  603. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js +0 -72
  604. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js.map +0 -1
  605. package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js +0 -2
  606. package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js.map +0 -1
  607. package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js +0 -2
  608. package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js.map +0 -1
  609. package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js +0 -3
  610. package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js.map +0 -1
  611. package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js +0 -2
  612. package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js.map +0 -1
  613. package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js +0 -2
  614. package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js.map +0 -1
  615. package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js +0 -3
  616. package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js.map +0 -1
  617. package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js +0 -2
  618. package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js.map +0 -1
  619. package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js +0 -7
  620. package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js.map +0 -1
  621. package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js +0 -2
  622. package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js.map +0 -1
  623. package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js +0 -3
  624. package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js.map +0 -1
  625. package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js +0 -2
  626. package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js.map +0 -1
  627. package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js +0 -2
  628. package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js.map +0 -1
  629. package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js +0 -2
  630. package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js.map +0 -1
  631. package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js +0 -4
  632. package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js.map +0 -1
  633. package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js +0 -3
  634. package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js.map +0 -1
  635. package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js +0 -3
  636. package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js.map +0 -1
  637. package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js +0 -9
  638. package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js.map +0 -1
  639. package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js +0 -2
  640. package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js.map +0 -1
  641. package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js +0 -2
  642. package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js.map +0 -1
  643. package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js +0 -2
  644. package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js.map +0 -1
  645. package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js +0 -2
  646. package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js.map +0 -1
  647. package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js +0 -2
  648. package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js.map +0 -1
  649. package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js +0 -2
  650. package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js.map +0 -1
  651. package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js +0 -2
  652. package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js.map +0 -1
  653. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js +0 -7
  654. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js.map +0 -1
  655. package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js +0 -3
  656. package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js.map +0 -1
  657. package/dist/core/web/public/next/assets/ResourcesChrome-p_VCkMZH.css +0 -1
  658. package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js +0 -3
  659. package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js.map +0 -1
  660. package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js +0 -2
  661. package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js.map +0 -1
  662. package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js +0 -2
  663. package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js.map +0 -1
  664. package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js +0 -2
  665. package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js.map +0 -1
  666. package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js +0 -2
  667. package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js.map +0 -1
  668. package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js +0 -2
  669. package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js.map +0 -1
  670. package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js +0 -3
  671. package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js.map +0 -1
  672. package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js +0 -3
  673. package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js.map +0 -1
  674. package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js +0 -2
  675. package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js.map +0 -1
  676. package/dist/core/web/public/next/assets/Select-tf4lNvWD.js +0 -2
  677. package/dist/core/web/public/next/assets/Select-tf4lNvWD.js.map +0 -1
  678. package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js +0 -2
  679. package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js.map +0 -1
  680. package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js +0 -2
  681. package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js.map +0 -1
  682. package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js +0 -2
  683. package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js.map +0 -1
  684. package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js +0 -2
  685. package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js.map +0 -1
  686. package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js +0 -2
  687. package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js.map +0 -1
  688. package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js +0 -3
  689. package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js.map +0 -1
  690. package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js +0 -2
  691. package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js.map +0 -1
  692. package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js +0 -2
  693. package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js.map +0 -1
  694. package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js +0 -3
  695. package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js.map +0 -1
  696. package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js +0 -2
  697. package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js.map +0 -1
  698. package/dist/core/web/public/next/assets/Slider-C68TumXj.js +0 -2
  699. package/dist/core/web/public/next/assets/Slider-C68TumXj.js.map +0 -1
  700. package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js +0 -2
  701. package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js.map +0 -1
  702. package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js +0 -2
  703. package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js.map +0 -1
  704. package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js +0 -2
  705. package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js.map +0 -1
  706. package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js +0 -2
  707. package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js.map +0 -1
  708. package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js +0 -2
  709. package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js.map +0 -1
  710. package/dist/core/web/public/next/assets/Surface-DCL7uORg.js +0 -2
  711. package/dist/core/web/public/next/assets/Surface-DCL7uORg.js.map +0 -1
  712. package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js +0 -2
  713. package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js.map +0 -1
  714. package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js +0 -2
  715. package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js.map +0 -1
  716. package/dist/core/web/public/next/assets/Tag-Ciht3C94.js +0 -2
  717. package/dist/core/web/public/next/assets/Tag-Ciht3C94.js.map +0 -1
  718. package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js +0 -26
  719. package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js.map +0 -1
  720. package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js +0 -3
  721. package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js.map +0 -1
  722. package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js +0 -2
  723. package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js.map +0 -1
  724. package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js +0 -2
  725. package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js.map +0 -1
  726. package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js +0 -9
  727. package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js.map +0 -1
  728. package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js +0 -3
  729. package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js.map +0 -1
  730. package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js +0 -2
  731. package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js.map +0 -1
  732. package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js +0 -3
  733. package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js.map +0 -1
  734. package/dist/core/web/public/next/assets/VerseConsoleApp-n6qr3lCF.css +0 -1
  735. package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js +0 -3
  736. package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js.map +0 -1
  737. package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js +0 -2
  738. package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js.map +0 -1
  739. package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js +0 -2
  740. package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js.map +0 -1
  741. package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js +0 -2
  742. package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js.map +0 -1
  743. package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js +0 -2
  744. package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js.map +0 -1
  745. package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js +0 -6
  746. package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js.map +0 -1
  747. package/dist/core/web/public/next/assets/actions-gBplqbpY.js +0 -2
  748. package/dist/core/web/public/next/assets/actions-gBplqbpY.js.map +0 -1
  749. package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js +0 -2
  750. package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js.map +0 -1
  751. package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js +0 -2
  752. package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js.map +0 -1
  753. package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js +0 -2
  754. package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js.map +0 -1
  755. package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js +0 -2
  756. package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js.map +0 -1
  757. package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js +0 -2
  758. package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js.map +0 -1
  759. package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js +0 -2
  760. package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js.map +0 -1
  761. package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js +0 -2
  762. package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js.map +0 -1
  763. package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js +0 -2
  764. package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js.map +0 -1
  765. package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js +0 -2
  766. package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js.map +0 -1
  767. package/dist/core/web/public/next/assets/charts-CzqC55eL.js +0 -2
  768. package/dist/core/web/public/next/assets/charts-CzqC55eL.js.map +0 -1
  769. package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js +0 -2
  770. package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js.map +0 -1
  771. package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js +0 -2
  772. package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js.map +0 -1
  773. package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js +0 -2
  774. package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js.map +0 -1
  775. package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js +0 -2
  776. package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js.map +0 -1
  777. package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js +0 -2
  778. package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js.map +0 -1
  779. package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js +0 -2
  780. package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js.map +0 -1
  781. package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js +0 -2
  782. package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js.map +0 -1
  783. package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js +0 -2
  784. package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js.map +0 -1
  785. package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js +0 -2
  786. package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js.map +0 -1
  787. package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js +0 -2
  788. package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js.map +0 -1
  789. package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js +0 -2
  790. package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js.map +0 -1
  791. package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js +0 -2
  792. package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js.map +0 -1
  793. package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js +0 -2
  794. package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js.map +0 -1
  795. package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js +0 -2
  796. package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js.map +0 -1
  797. package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js +0 -2
  798. package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js.map +0 -1
  799. package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js +0 -2
  800. package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js.map +0 -1
  801. package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js +0 -3
  802. package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js.map +0 -1
  803. package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js +0 -2
  804. package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js.map +0 -1
  805. package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js +0 -5
  806. package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js.map +0 -1
  807. package/dist/core/web/public/next/assets/global-BJ_kVFpD.js +0 -3
  808. package/dist/core/web/public/next/assets/global-BJ_kVFpD.js.map +0 -1
  809. package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js +0 -3
  810. package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js.map +0 -1
  811. package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js +0 -2
  812. package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js.map +0 -1
  813. package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js +0 -2
  814. package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js.map +0 -1
  815. package/dist/core/web/public/next/assets/icons-MYfI6vZr.js +0 -2
  816. package/dist/core/web/public/next/assets/icons-MYfI6vZr.js.map +0 -1
  817. package/dist/core/web/public/next/assets/index-DOAOxiKl.js +0 -11
  818. package/dist/core/web/public/next/assets/index-DOAOxiKl.js.map +0 -1
  819. package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js +0 -2
  820. package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js.map +0 -1
  821. package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js +0 -2
  822. package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js.map +0 -1
  823. package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js +0 -2
  824. package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js.map +0 -1
  825. package/dist/core/web/public/next/assets/live-model-CCjYFk48.js +0 -2
  826. package/dist/core/web/public/next/assets/live-model-CCjYFk48.js.map +0 -1
  827. package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js +0 -2
  828. package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js.map +0 -1
  829. package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js +0 -2
  830. package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js.map +0 -1
  831. package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js +0 -7
  832. package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js.map +0 -1
  833. package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js +0 -2
  834. package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js.map +0 -1
  835. package/dist/core/web/public/next/assets/mutations-BlGALvmG.js +0 -2
  836. package/dist/core/web/public/next/assets/mutations-BlGALvmG.js.map +0 -1
  837. package/dist/core/web/public/next/assets/nav-ByibvQW1.js +0 -2
  838. package/dist/core/web/public/next/assets/nav-ByibvQW1.js.map +0 -1
  839. package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js +0 -2
  840. package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js.map +0 -1
  841. package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js +0 -2
  842. package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js.map +0 -1
  843. package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js +0 -2
  844. package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js.map +0 -1
  845. package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js +0 -2
  846. package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js.map +0 -1
  847. package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js +0 -2
  848. package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js.map +0 -1
  849. package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js +0 -2
  850. package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js.map +0 -1
  851. package/dist/core/web/public/next/assets/panes-CHt3427X.js +0 -3
  852. package/dist/core/web/public/next/assets/panes-CHt3427X.js.map +0 -1
  853. package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js +0 -2
  854. package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js.map +0 -1
  855. package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js +0 -2
  856. package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js.map +0 -1
  857. package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js +0 -2
  858. package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js.map +0 -1
  859. package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js +0 -2
  860. package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js.map +0 -1
  861. package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js +0 -2
  862. package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js.map +0 -1
  863. package/dist/core/web/public/next/assets/primitives-CDKCUR2v.js +0 -1
  864. package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js +0 -2
  865. package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js.map +0 -1
  866. package/dist/core/web/public/next/assets/queries--mGK10fL.js +0 -2
  867. package/dist/core/web/public/next/assets/queries--mGK10fL.js.map +0 -1
  868. package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js +0 -2
  869. package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js.map +0 -1
  870. package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js +0 -3
  871. package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js.map +0 -1
  872. package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js +0 -2
  873. package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js.map +0 -1
  874. package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js +0 -2
  875. package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js.map +0 -1
  876. package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js +0 -2
  877. package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js.map +0 -1
  878. package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js +0 -2
  879. package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js.map +0 -1
  880. package/dist/core/web/public/next/assets/slots-40edgV7X.js +0 -3
  881. package/dist/core/web/public/next/assets/slots-40edgV7X.js.map +0 -1
  882. package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js +0 -4
  883. package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js.map +0 -1
  884. package/dist/core/web/public/next/assets/sse-CAFwslNC.js +0 -2
  885. package/dist/core/web/public/next/assets/sse-CAFwslNC.js.map +0 -1
  886. package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js +0 -2
  887. package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js.map +0 -1
  888. package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js +0 -2
  889. package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js.map +0 -1
  890. package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js +0 -2
  891. package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js.map +0 -1
  892. package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js +0 -2
  893. package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js.map +0 -1
  894. package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js +0 -6
  895. package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js.map +0 -1
  896. package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js +0 -2
  897. package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js.map +0 -1
  898. package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js +0 -2
  899. package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js.map +0 -1
  900. package/dist/core/web/public/next/assets/usage-queries-BONqdout.js +0 -2
  901. package/dist/core/web/public/next/assets/usage-queries-BONqdout.js.map +0 -1
  902. package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js +0 -2
  903. package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js.map +0 -1
  904. package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js +0 -2
  905. package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js.map +0 -1
  906. package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js +0 -2
  907. package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js.map +0 -1
  908. package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js +0 -2
  909. package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js.map +0 -1
  910. package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js +0 -2
  911. package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js.map +0 -1
  912. package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js +0 -2
  913. package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js.map +0 -1
  914. package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js +0 -2
  915. package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js.map +0 -1
  916. package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js +0 -2
  917. package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js.map +0 -1
  918. package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js +0 -2
  919. package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js.map +0 -1
  920. package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js +0 -2
  921. package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js.map +0 -1
  922. package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js +0 -2
  923. package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js.map +0 -1
  924. package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js +0 -2
  925. package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js.map +0 -1
  926. package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js +0 -3
  927. package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js.map +0 -1
  928. package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js +0 -2
  929. package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VoiceInput-k3vB_FxV.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/voice/voice-bridge.ts","../../../../../../src/web-ui/routes/verse/voice/identifier-bias.ts","../../../../../../src/web-ui/routes/verse/voice/voice-store.ts","../../../../../../src/web-ui/routes/verse/voice/VoiceInput.module.css","../../../../../../src/web-ui/routes/verse/voice/VoiceInput.tsx"],"sourcesContent":["/**\n * routes/verse/voice/voice-bridge.ts — the web half of the desktop dictation\n * channel (shell contract v1 `voice`; native: desktop/src-tauri/src/voice/).\n *\n * Page → native: `window.__ASHLR_DESKTOP__.voice.send(msg)` (shell_contract.js\n * emits `shell-voice`; native parses it strictly, voice/protocol.rs).\n * Native → page: the `ashlr:voice` window event, carrying one of\n * `voice://state | level | partial | final | error`. Every detail crossed from\n * another runtime, so it is validated here before anything reads it.\n *\n * Inert in a browser: no bridge, no events. `nativeVoice()` returning null is\n * the feature test (an older desktop shell has no `voice` key either).\n */\n\nexport const NATIVE_VOICE_EVENT = 'ashlr:voice';\n\nexport type VoiceMode = 'prose' | 'verbatim' | 'command';\nexport type MicStatus = 'granted' | 'denied' | 'restricted' | 'undetermined' | 'no-usage-description' | 'unsupported';\nexport type ModelPhase = 'missing' | 'downloading' | 'verifying' | 'ready' | 'loading' | 'loaded' | 'failed';\nexport type LexiconStatus = 'live' | 'cached' | 'none';\nexport type VoiceErrorCode =\n | 'mic-denied'\n | 'mic-restricted'\n | 'mic-undetermined'\n | 'no-usage-description'\n | 'no-input-device'\n | 'capture-failed'\n | 'model-missing'\n | 'model-download-failed'\n | 'model-load-failed'\n | 'engine-failed'\n | 'no-speech'\n | 'busy'\n | 'unsupported';\nexport type FixAction =\n | 'request-mic'\n | 'open-mic-settings'\n | 'open-sound-settings'\n | 'download-model'\n | 'cancel-download'\n | 'retry-lexicon';\n\nexport interface NativeVoiceState {\n version: number;\n mic: MicStatus;\n engine: {\n id: 'parakeet' | 'whisper' | 'none';\n label: string;\n model: ModelPhase;\n progress: number | null;\n totalBytes: number;\n error: string | null;\n };\n hotkey: { accelerator: string; commandAccelerator: string; registered: boolean; error: string | null };\n lexicon: LexiconStatus;\n session: {\n id: string;\n origin: 'button' | 'hotkey';\n mode: VoiceMode;\n phase: 'listening' | 'finalizing';\n latched: boolean;\n } | null;\n}\n\nexport type NativeVoiceEvent =\n | { event: 'voice://state'; state: NativeVoiceState }\n | { event: 'voice://level'; session: string; level: number }\n | { event: 'voice://partial'; session: string; text: string }\n | {\n event: 'voice://final';\n session: string;\n text: string;\n mode: VoiceMode;\n engine: string;\n lexicon: LexiconStatus;\n latencyMs: number;\n audioMs: number;\n }\n | { event: 'voice://error'; session: string | null; code: VoiceErrorCode; message: string };\n\nexport type VoiceRequest =\n | { op: 'status' }\n | { op: 'start'; session: string; mode: VoiceMode; cwd?: string }\n | { op: 'context'; session: string; mode: VoiceMode; cwd?: string }\n | { op: 'stop'; session: string }\n | { op: 'cancel'; session: string }\n | { op: 'fix'; action: FixAction };\n\nconst MODES: readonly string[] = ['prose', 'verbatim', 'command'];\nconst MICS: readonly string[] = ['granted', 'denied', 'restricted', 'undetermined', 'no-usage-description', 'unsupported'];\nconst PHASES: readonly string[] = ['missing', 'downloading', 'verifying', 'ready', 'loading', 'loaded', 'failed'];\nconst LEXICON: readonly string[] = ['live', 'cached', 'none'];\nconst ERRORS: readonly string[] = [\n 'mic-denied', 'mic-restricted', 'mic-undetermined', 'no-usage-description', 'no-input-device', 'capture-failed',\n 'model-missing', 'model-download-failed', 'model-load-failed', 'engine-failed', 'no-speech', 'busy', 'unsupported',\n];\n/** Transcripts are bounded (10 min of speech is far below this). */\nconst TEXT_MAX = 64 * 1024;\nconst MESSAGE_MAX = 400;\nconst SESSION_RE = /^[A-Za-z0-9_-]{1,64}$/;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\nfunction isString(value: unknown, max: number): value is string {\n return typeof value === 'string' && value.length <= max;\n}\nfunction isSession(value: unknown): value is string {\n return typeof value === 'string' && SESSION_RE.test(value);\n}\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\nfunction oneOf<T extends string>(value: unknown, allowed: readonly string[]): value is T {\n return typeof value === 'string' && allowed.includes(value);\n}\n\nfunction parseState(raw: unknown): NativeVoiceState | null {\n if (!isRecord(raw) || !isRecord(raw['engine']) || !isRecord(raw['hotkey'])) return null;\n const e = raw['engine'];\n const h = raw['hotkey'];\n const s = raw['session'];\n if (!isFiniteNumber(raw['version']) || !oneOf<MicStatus>(raw['mic'], MICS) || !oneOf<LexiconStatus>(raw['lexicon'], LEXICON)) return null;\n if (!oneOf<'parakeet' | 'whisper' | 'none'>(e['id'], ['parakeet', 'whisper', 'none'])) return null;\n if (!isString(e['label'], 60) || !oneOf<ModelPhase>(e['model'], PHASES)) return null;\n if (!(e['progress'] === null || (isFiniteNumber(e['progress']) && e['progress'] >= 0 && e['progress'] <= 1))) return null;\n if (!isFiniteNumber(e['totalBytes']) || !(e['error'] === null || isString(e['error'], MESSAGE_MAX))) return null;\n if (!isString(h['accelerator'], 16) || !isString(h['commandAccelerator'], 16) || typeof h['registered'] !== 'boolean') return null;\n if (!(h['error'] === null || isString(h['error'], MESSAGE_MAX))) return null;\n let session: NativeVoiceState['session'] = null;\n if (s !== null) {\n if (!isRecord(s) || !isSession(s['id']) || !oneOf(s['origin'], ['button', 'hotkey']) || !oneOf<VoiceMode>(s['mode'], MODES)) return null;\n if (!oneOf(s['phase'], ['listening', 'finalizing']) || typeof s['latched'] !== 'boolean') return null;\n session = {\n id: s['id'],\n origin: s['origin'] as 'button' | 'hotkey',\n mode: s['mode'],\n phase: s['phase'] as 'listening' | 'finalizing',\n latched: s['latched'],\n };\n }\n return {\n version: raw['version'],\n mic: raw['mic'],\n engine: {\n id: e['id'],\n label: e['label'],\n model: e['model'],\n progress: e['progress'] as number | null,\n totalBytes: e['totalBytes'],\n error: e['error'] as string | null,\n },\n hotkey: {\n accelerator: h['accelerator'],\n commandAccelerator: h['commandAccelerator'],\n registered: h['registered'],\n error: h['error'] as string | null,\n },\n lexicon: raw['lexicon'],\n session,\n };\n}\n\n/** Boundary check for one `ashlr:voice` detail. Null for anything malformed. */\nexport function parseNativeVoiceEvent(detail: unknown): NativeVoiceEvent | null {\n if (!isRecord(detail)) return null;\n switch (detail['event']) {\n case 'voice://state': {\n const state = parseState(detail['state']);\n return state ? { event: 'voice://state', state } : null;\n }\n case 'voice://level': {\n const level = detail['level'];\n if (!isSession(detail['session']) || !isFiniteNumber(level)) return null;\n return { event: 'voice://level', session: detail['session'], level: Math.min(1, Math.max(0, level)) };\n }\n case 'voice://partial':\n if (!isSession(detail['session']) || !isString(detail['text'], TEXT_MAX)) return null;\n return { event: 'voice://partial', session: detail['session'], text: detail['text'] };\n case 'voice://final': {\n const d = detail;\n if (!isSession(d['session']) || !isString(d['text'], TEXT_MAX) || !oneOf<VoiceMode>(d['mode'], MODES)) return null;\n if (!isString(d['engine'], 32) || !oneOf<LexiconStatus>(d['lexicon'], LEXICON)) return null;\n if (!isFiniteNumber(d['latencyMs']) || !isFiniteNumber(d['audioMs'])) return null;\n return {\n event: 'voice://final',\n session: d['session'],\n text: d['text'],\n mode: d['mode'],\n engine: d['engine'],\n lexicon: d['lexicon'],\n latencyMs: d['latencyMs'],\n audioMs: d['audioMs'],\n };\n }\n case 'voice://error': {\n const session = detail['session'];\n if (!(session === null || isSession(session))) return null;\n if (!oneOf<VoiceErrorCode>(detail['code'], ERRORS) || !isString(detail['message'], MESSAGE_MAX)) return null;\n return { event: 'voice://error', session, code: detail['code'], message: detail['message'] };\n }\n default:\n return null;\n }\n}\n\ninterface VoiceBridge {\n version?: unknown;\n send?: (msg: unknown) => boolean;\n}\n\n/** The desktop dictation bridge, or null (browser, or an older desktop shell). */\nexport function nativeVoice(): { send: (msg: VoiceRequest) => boolean } | null {\n try {\n const bridge = (window as unknown as { __ASHLR_DESKTOP__?: { voice?: VoiceBridge } }).__ASHLR_DESKTOP__?.voice;\n if (!bridge || bridge.version !== 1 || typeof bridge.send !== 'function') return null;\n const send = bridge.send;\n return {\n send: (msg) => {\n try {\n return send(msg) === true;\n } catch {\n return false;\n }\n },\n };\n } catch {\n return null;\n }\n}\n\n/** Listen for validated native voice events. Returns an unsubscribe function. */\nexport function subscribeNativeVoice(handler: (event: NativeVoiceEvent) => void): () => void {\n function onEvent(event: Event): void {\n const parsed = parseNativeVoiceEvent((event as CustomEvent<unknown>).detail);\n if (parsed) handler(parsed);\n }\n window.addEventListener(NATIVE_VOICE_EVENT, onEvent);\n return () => window.removeEventListener(NATIVE_VOICE_EVENT, onEvent);\n}\n","/**\n * routes/verse/voice/identifier-bias.ts — turn spoken file/identifier names\n * into the real thing, in backticks, when (and only when) the match is\n * confident.\n *\n * Speech engines hear \"open the browser pane dot rs file\" — never\n * `browser_pane.rs`. The composer knows the chat's files, so a dictated span\n * is rewritten when it is clearly naming one:\n *\n * 1. **Spoken or written extension**: 1–4 words + \"dot rs\" / \".rs\" whose\n * letters (case and separators ignored) equal a known file's basename.\n * 2. **Cue word**: 2–4 words right before file / component / function / hook\n * / module / struct / class / type / test / script / crate, equal to a\n * known basename (without extension). Two words minimum: a single English\n * word (\"composer\", \"index\") is far too often just a word.\n * 3. **Already identifier-shaped**: a token the engine wrote as camelCase,\n * snake_case or name.ext that equals a known basename gets backticks.\n *\n * \"Equal\" is exact on the compacted form (`browser_pane.rs` → `browserpane`),\n * and the match must be unique — anything fuzzier is left as spoken. Pure;\n * the caller supplies the known identifiers (composer: the chat's files).\n */\n\nexport interface Candidate {\n /** Character span in the text to replace. */\n start: number;\n end: number;\n /** Letters+digits only, lower-case: what must equal a known identifier. */\n compact: string;\n /** The extension it must have (spoken/written), or null. */\n ext: string | null;\n kind: 'extension' | 'cue' | 'token';\n /** Words in the span (longer spans win when several resolve). */\n words: number;\n}\n\nconst EXTENSIONS = new Set([\n 'ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'rs', 'md', 'json', 'css', 'scss', 'html', 'toml', 'yaml', 'yml',\n 'py', 'go', 'swift', 'kt', 'java', 'rb', 'sh', 'sql', 'txt', 'lock', 'plist',\n]);\nconst CUES = new Set(['file', 'component', 'function', 'hook', 'module', 'struct', 'class', 'type', 'test', 'script', 'crate', 'enum', 'trait']);\nconst DOT_WORDS = new Set(['dot', 'period']);\n\ninterface Word {\n text: string;\n start: number;\n end: number;\n}\n\nexport function compact(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\nfunction splitExt(name: string): { stem: string; ext: string | null } {\n const at = name.lastIndexOf('.');\n if (at <= 0 || at === name.length - 1) return { stem: name, ext: null };\n return { stem: name.slice(0, at), ext: name.slice(at + 1).toLowerCase() };\n}\n\nfunction words(text: string): Word[] {\n const out: Word[] = [];\n const re = /[A-Za-z0-9_]+(?:[.-][A-Za-z0-9_]+)*/g;\n for (let m = re.exec(text); m; m = re.exec(text)) out.push({ text: m[0], start: m.index, end: m.index + m[0].length });\n return out;\n}\n\n/** Only whitespace between two words (no punctuation, no newline). */\nfunction adjacent(text: string, a: Word, b: Word): boolean {\n return /^[ \\t]+$/.test(text.slice(a.end, b.start));\n}\n\nfunction insideBackticks(text: string, at: number): boolean {\n let ticks = 0;\n for (let i = 0; i < at; i += 1) if (text[i] === '`') ticks += 1;\n return ticks % 2 === 1;\n}\n\nfunction identifierShaped(token: string): boolean {\n return /[a-z][A-Z]/.test(token) || /[A-Za-z0-9]_[A-Za-z0-9]/.test(token) || /^[A-Za-z0-9_-]+\\.[A-Za-z0-9]+$/.test(token);\n}\n\nexport function findCandidates(text: string): Candidate[] {\n const ws = words(text);\n const out: Candidate[] = [];\n const run = (from: number, to: number): boolean => {\n for (let i = from; i < to; i += 1) if (!adjacent(text, ws[i]!, ws[i + 1]!)) return false;\n return true;\n };\n for (let k = 0; k < ws.length; k += 1) {\n const w = ws[k]!;\n const lower = w.text.toLowerCase();\n // 1a. \"… dot rs\"\n if (DOT_WORDS.has(lower) && k + 1 < ws.length && EXTENSIONS.has(ws[k + 1]!.text.toLowerCase()) && adjacent(text, w, ws[k + 1]!)) {\n const ext = ws[k + 1]!.text.toLowerCase();\n for (let n = Math.min(4, k); n >= 1; n -= 1) {\n if (!run(k - n, k)) continue;\n const span = ws.slice(k - n, k);\n out.push({ start: span[0]!.start, end: ws[k + 1]!.end, compact: compact(span.map((s) => s.text).join('')), ext, kind: 'extension', words: n });\n }\n }\n // 1b. \"… pane.rs\" (the engine wrote the extension onto the last word)\n const { stem, ext } = splitExt(w.text);\n if (ext && EXTENSIONS.has(ext)) {\n for (let n = Math.min(3, k); n >= 0; n -= 1) {\n if (n > 0 && !run(k - n, k)) continue;\n const span = ws.slice(k - n, k);\n const letters = `${span.map((s) => s.text).join('')}${stem}`;\n out.push({ start: (span[0] ?? w).start, end: w.end, compact: compact(letters), ext, kind: 'extension', words: n + 1 });\n }\n }\n // 2. \"… browser pane file\"\n if (CUES.has(lower)) {\n for (let n = Math.min(4, k); n >= 2; n -= 1) {\n if (!run(k - n, k)) continue;\n const span = ws.slice(k - n, k);\n out.push({ start: span[0]!.start, end: span[span.length - 1]!.end, compact: compact(span.map((s) => s.text).join('')), ext: null, kind: 'cue', words: n });\n }\n }\n // 3. useVoice / browser_pane / VoiceInput.tsx\n if (identifierShaped(w.text)) {\n const parts = splitExt(w.text);\n out.push({ start: w.start, end: w.end, compact: compact(parts.ext && EXTENSIONS.has(parts.ext) ? parts.stem : w.text), ext: parts.ext && EXTENSIONS.has(parts.ext) ? parts.ext : null, kind: 'token', words: 1 });\n }\n }\n return out.filter((c) => c.compact.length >= 3 && !insideBackticks(text, c.start));\n}\n\n/** The distinct compacted names worth looking up (for a file search). */\nexport function lookupQueries(candidates: readonly Candidate[], limit = 6): string[] {\n const seen: string[] = [];\n const sorted = [...candidates].sort((a, b) => b.words - a.words);\n for (const c of sorted) {\n if (!seen.includes(c.compact)) seen.push(c.compact);\n if (seen.length >= limit) break;\n }\n return seen;\n}\n\nfunction basename(path: string): string {\n const parts = path.split(/[\\\\/]/);\n return parts[parts.length - 1] ?? path;\n}\n\n/** The unique known name a candidate names, or null. */\nexport function resolveCandidate(candidate: Candidate, known: readonly string[]): string | null {\n const hits = new Set<string>();\n for (const entry of known) {\n const name = basename(entry);\n const { stem, ext } = splitExt(name);\n if (candidate.ext !== null) {\n if (ext === candidate.ext && compact(stem) === candidate.compact) hits.add(name);\n } else if (candidate.kind === 'token') {\n if (compact(stem) === candidate.compact || compact(name) === candidate.compact) hits.add(ext ? name : stem);\n } else if (compact(stem) === candidate.compact && compact(stem).length >= 6) {\n hits.add(name);\n }\n }\n return hits.size === 1 ? [...hits][0]! : null;\n}\n\n/** Rewrite the text: longest confident, non-overlapping matches, in backticks. */\nexport function applyBias(text: string, candidates: readonly Candidate[], known: readonly string[]): string {\n if (known.length === 0 || candidates.length === 0) return text;\n const resolved = candidates\n .map((c) => ({ c, name: resolveCandidate(c, known) }))\n .filter((r): r is { c: Candidate; name: string } => r.name !== null)\n .sort((a, b) => b.c.end - b.c.start - (a.c.end - a.c.start));\n const taken: Array<[number, number]> = [];\n const chosen: Array<{ start: number; end: number; name: string }> = [];\n for (const { c, name } of resolved) {\n if (taken.some(([s, e]) => c.start < e && s < c.end)) continue;\n taken.push([c.start, c.end]);\n chosen.push({ start: c.start, end: c.end, name });\n }\n chosen.sort((a, b) => b.start - a.start);\n let out = text;\n for (const { start, end, name } of chosen) out = `${out.slice(0, start)}\\`${name}\\`${out.slice(end)}`;\n return out;\n}\n\n/**\n * Convenience for callers: find candidates, look the names up with `lookup`\n * (e.g. the chat's file search), and apply. Never throws; a slow or failing\n * lookup leaves the text as spoken.\n */\nexport async function biasIdentifiers(\n text: string,\n lookup: (queries: string[]) => Promise<readonly string[]>,\n timeoutMs = 400,\n): Promise<string> {\n const candidates = findCandidates(text);\n if (candidates.length === 0) return text;\n try {\n const known = await Promise.race([\n lookup(lookupQueries(candidates)),\n new Promise<readonly string[]>((resolve) => setTimeout(() => resolve([]), timeoutMs)),\n ]);\n return applyBias(text, candidates, known);\n } catch {\n return text;\n }\n}\n","/**\n * routes/verse/voice/voice-store.ts — the one dictation state machine behind\n * every mic button, the ⌃⌥V hotkey and the floating pill (VoiceHud).\n *\n * Two backends, one shape:\n * - `native` (the desktop app): capture + Parakeet run in Rust\n * (desktop/src-tauri/src/voice/); this store sends ops and routes events.\n * - `web-speech` (a plain browser): the Web Speech API fallback.\n *\n * Surfaces register a TARGET (where text goes, how to post-process it). A\n * mic button starts a dictation for its own target; a hotkey dictation is\n * bound to the focused target, else the last-focused one, else the chat\n * composer. Finals are post-processed per mode — `prose` gets identifier\n * biasing (the lexicon already ran natively), `verbatim` (terminal) is\n * inserted exactly as heard, `command` becomes a command-palette query — and\n * inserted SOLID; partials only ever show dimmed in the pill.\n *\n * Module-level singleton, read through useSyncExternalStore. The meter level\n * (20 Hz) has its own channel so the waveform can paint without re-rendering\n * React.\n */\nimport { useSyncExternalStore } from 'react';\nimport {\n nativeVoice,\n subscribeNativeVoice,\n type FixAction,\n type LexiconStatus,\n type NativeVoiceEvent,\n type NativeVoiceState,\n type VoiceErrorCode,\n type VoiceMode,\n} from './voice-bridge.js';\nimport { biasIdentifiers } from './identifier-bias.js';\nimport { getSpeechRecognition, startWebSpeech, type WebSpeechSession } from './web-speech.js';\nimport { handOffToPalette } from './palette-handoff.js';\n\nexport type VoiceSurface = 'composer' | 'leader' | 'palette' | 'terminal';\n\nexport interface VoiceTarget {\n id: string;\n surface: VoiceSurface;\n /** `verbatim` for the terminal: no cleanup, no backticks, no lexicon. */\n mode: 'prose' | 'verbatim';\n /** Focus inside this element makes it the hotkey's target. */\n element: () => HTMLElement | null;\n /** The chat's repo, so the lexicon's project terms apply. */\n cwd?: () => string | null;\n insert: (text: string) => void;\n /** Names the chat's files, for identifier biasing (prose only). */\n lookupIdentifiers?: (queries: string[]) => Promise<readonly string[]>;\n /** Told when a dictation for this target starts / ends. */\n onListening?: (listening: boolean) => void;\n}\n\nexport type VoiceBackend = 'native' | 'web-speech' | 'none';\n\nexport interface VoiceSessionView {\n id: string;\n targetId: string | null;\n origin: 'button' | 'hotkey';\n mode: VoiceMode;\n phase: 'starting' | 'listening' | 'finalizing';\n partial: string;\n latched: boolean;\n}\n\nexport interface VoiceErrorView {\n code: VoiceErrorCode;\n message: string;\n targetId: string | null;\n}\n\nexport interface VoiceNotice {\n /** \"Inserted\" / \"Sent to ⌘K\" / the orphan text. */\n kind: 'inserted' | 'palette' | 'orphan';\n text: string;\n lexicon: LexiconStatus | null;\n latencyMs: number | null;\n mode: VoiceMode;\n}\n\nexport interface VoiceSnapshot {\n backend: VoiceBackend;\n native: NativeVoiceState | null;\n session: VoiceSessionView | null;\n error: VoiceErrorView | null;\n notice: VoiceNotice | null;\n /** Ids of mounted targets (the HUD hides for a surface-less page). */\n targets: readonly string[];\n}\n\n/** Errors that need the operator (a fix button); the rest fade by themselves. */\nconst STICKY_ERRORS: ReadonlySet<VoiceErrorCode> = new Set([\n 'mic-denied',\n 'mic-restricted',\n 'mic-undetermined',\n 'no-usage-description',\n 'no-input-device',\n 'model-download-failed',\n 'model-load-failed',\n]);\nconst TRANSIENT_MS = 6_000;\nconst NOTICE_MS = 2_600;\nconst START_TIMEOUT_MS = 6_000;\n\n// ── state ────────────────────────────────────────────────────────────────────\n\nconst targets = new Map<string, VoiceTarget>();\nlet lastFocused: string | null = null;\nlet snapshot: VoiceSnapshot = {\n backend: 'none',\n native: null,\n session: null,\n error: null,\n notice: null,\n targets: [],\n};\nconst listeners = new Set<() => void>();\nconst levelListeners = new Set<(level: number) => void>();\nlet initialised = false;\nlet unsubscribeNative: (() => void) | null = null;\nlet webSession: WebSpeechSession | null = null;\nlet seq = 0;\nlet errorTimer: ReturnType<typeof setTimeout> | null = null;\nlet noticeTimer: ReturnType<typeof setTimeout> | null = null;\nlet startTimer: ReturnType<typeof setTimeout> | null = null;\n\nfunction emit(next: Partial<VoiceSnapshot>): void {\n snapshot = { ...snapshot, ...next };\n for (const listener of [...listeners]) listener();\n}\n\nfunction detectBackend(): VoiceBackend {\n if (nativeVoice()) return 'native';\n if (getSpeechRecognition()) return 'web-speech';\n return 'none';\n}\n\nfunction onFocusIn(event: FocusEvent): void {\n const node = event.target instanceof Node ? event.target : null;\n if (!node) return;\n for (const target of targets.values()) {\n if (target.element()?.contains(node)) {\n lastFocused = target.id;\n return;\n }\n }\n}\n\nfunction onKeyDown(event: KeyboardEvent): void {\n // Native registers Escape globally while dictating, so the page only sees\n // it when that failed — or in a browser.\n if (event.key === 'Escape' && snapshot.session) {\n event.preventDefault();\n cancelVoice();\n }\n}\n\nfunction ensureInit(): void {\n if (initialised) return;\n initialised = true;\n const backend = detectBackend();\n emit({ backend });\n try {\n document.addEventListener('focusin', onFocusIn, true);\n document.addEventListener('keydown', onKeyDown, true);\n } catch {\n /* no document (tests without jsdom) */\n }\n if (backend === 'native') {\n unsubscribeNative = subscribeNativeVoice(onNativeEvent);\n nativeVoice()?.send({ op: 'status' });\n }\n}\n\n// ── targets ──────────────────────────────────────────────────────────────────\n\nexport function registerVoiceTarget(target: VoiceTarget): () => void {\n ensureInit();\n targets.set(target.id, target);\n emit({ targets: [...targets.keys()] });\n return () => {\n if (targets.get(target.id) === target) targets.delete(target.id);\n if (lastFocused === target.id) lastFocused = null;\n emit({ targets: [...targets.keys()] });\n };\n}\n\n/** Focused target, else last-focused, else the chat composer, else any. */\nexport function pickHotkeyTarget(activeElement: Element | null = safeActiveElement()): VoiceTarget | null {\n const live = [...targets.values()].filter((t) => t.element()?.isConnected !== false);\n if (activeElement) {\n const focused = live.find((t) => t.element()?.contains(activeElement));\n if (focused) return focused;\n }\n const last = lastFocused ? live.find((t) => t.id === lastFocused) : undefined;\n if (last) return last;\n return live.find((t) => t.surface === 'composer') ?? live.find((t) => t.surface === 'leader') ?? live[0] ?? null;\n}\n\nfunction safeActiveElement(): Element | null {\n try {\n return document.activeElement;\n } catch {\n return null;\n }\n}\n\n// ── actions ──────────────────────────────────────────────────────────────────\n\nfunction newSessionId(): string {\n seq += 1;\n return `v-${Date.now().toString(36)}-${seq}`;\n}\n\nfunction setError(code: VoiceErrorCode, message: string, targetId: string | null): void {\n if (errorTimer) clearTimeout(errorTimer);\n errorTimer = null;\n emit({ error: { code, message, targetId } });\n if (!STICKY_ERRORS.has(code)) {\n errorTimer = setTimeout(() => {\n errorTimer = null;\n emit({ error: null });\n }, TRANSIENT_MS);\n }\n}\n\nexport function dismissVoiceError(): void {\n if (errorTimer) clearTimeout(errorTimer);\n errorTimer = null;\n emit({ error: null });\n}\n\nfunction setNotice(notice: VoiceNotice | null, sticky = false): void {\n if (noticeTimer) clearTimeout(noticeTimer);\n noticeTimer = null;\n emit({ notice });\n if (notice && !sticky) {\n noticeTimer = setTimeout(() => {\n noticeTimer = null;\n emit({ notice: null });\n }, NOTICE_MS);\n }\n}\n\nexport function dismissVoiceNotice(): void {\n setNotice(null);\n}\n\nfunction endSession(): void {\n const current = snapshot.session;\n if (startTimer) clearTimeout(startTimer);\n startTimer = null;\n if (current?.targetId) targets.get(current.targetId)?.onListening?.(false);\n emit({ session: null });\n for (const listener of [...levelListeners]) listener(0);\n}\n\nfunction beginSession(session: VoiceSessionView): void {\n emit({ session, error: null });\n if (session.targetId) targets.get(session.targetId)?.onListening?.(true);\n}\n\n/** Start dictating into `targetId` (a mic button). */\nexport function startVoice(targetId: string): void {\n ensureInit();\n const target = targets.get(targetId);\n if (!target || snapshot.session) return;\n const mode: VoiceMode = target.mode;\n if (snapshot.backend === 'native') {\n const id = newSessionId();\n const cwd = target.cwd?.() ?? null;\n beginSession({ id, targetId, origin: 'button', mode, phase: 'starting', partial: '', latched: true });\n const sent = nativeVoice()?.send({ op: 'start', session: id, mode, ...(cwd ? { cwd } : {}) }) ?? false;\n if (!sent) {\n endSession();\n setError('unsupported', 'The desktop app did not accept the request — restart Ashlr.', targetId);\n return;\n }\n startTimer = setTimeout(() => {\n startTimer = null;\n if (snapshot.session?.id === id && snapshot.session.phase === 'starting') {\n endSession();\n setError('capture-failed', 'The microphone did not start — try again.', targetId);\n }\n }, START_TIMEOUT_MS);\n return;\n }\n if (snapshot.backend === 'web-speech') {\n const id = newSessionId();\n beginSession({ id, targetId, origin: 'button', mode, phase: 'listening', partial: '', latched: true });\n webSession = startWebSpeech({\n onPartial: (text) => {\n if (snapshot.session?.id === id) emit({ session: { ...snapshot.session, partial: text } });\n },\n onFinal: (text) => {\n void deliverFinal(targetId, text, mode, null, null);\n },\n onError: (code, message) => setError(code, message, targetId),\n onEnd: () => {\n webSession = null;\n if (snapshot.session?.id === id) endSession();\n },\n });\n if (!webSession) endSession();\n return;\n }\n setError('unsupported', 'Dictation is not available in this browser.', targetId);\n}\n\n/** Stop and transcribe. */\nexport function stopVoice(): void {\n const session = snapshot.session;\n if (!session) return;\n if (snapshot.backend === 'native') {\n emit({ session: { ...session, phase: 'finalizing' } });\n nativeVoice()?.send({ op: 'stop', session: session.id });\n return;\n }\n if (webSession) {\n emit({ session: { ...session, phase: 'finalizing' } });\n webSession.stop();\n }\n}\n\n/** Stop and throw the audio away. */\nexport function cancelVoice(): void {\n const session = snapshot.session;\n if (!session) return;\n if (snapshot.backend === 'native') nativeVoice()?.send({ op: 'cancel', session: session.id });\n webSession?.cancel();\n webSession = null;\n endSession();\n}\n\nexport function toggleVoice(targetId: string): void {\n const session = snapshot.session;\n if (!session) startVoice(targetId);\n else if (session.phase === 'finalizing') return;\n else stopVoice();\n}\n\nexport function fixVoice(action: FixAction): void {\n if (snapshot.backend !== 'native') return;\n nativeVoice()?.send({ op: 'fix', action });\n if (action !== 'cancel-download') dismissVoiceError();\n}\n\n// ── native events ────────────────────────────────────────────────────────────\n\nfunction onNativeEvent(event: NativeVoiceEvent): void {\n switch (event.event) {\n case 'voice://state':\n return onNativeState(event.state);\n case 'voice://level':\n if (snapshot.session?.id === event.session) for (const listener of [...levelListeners]) listener(event.level);\n return;\n case 'voice://partial':\n if (snapshot.session?.id === event.session) emit({ session: { ...snapshot.session, partial: event.text } });\n return;\n case 'voice://final': {\n const mine = snapshot.session?.id === event.session;\n const targetId = mine ? (snapshot.session?.targetId ?? null) : null;\n // A final ends the dictation (native's session-cleared state follows).\n if (mine) endSession();\n void deliverFinal(targetId, event.text, event.mode, event.lexicon, event.latencyMs);\n return;\n }\n case 'voice://error': {\n // Always shown: a hotkey press that never became a session (mic denied,\n // model missing) reports under a session id the page never bound.\n const targetId = snapshot.session?.targetId ?? null;\n if (event.session !== null && event.session === snapshot.session?.id) endSession();\n setError(event.code, event.message, targetId);\n return;\n }\n }\n}\n\nfunction onNativeState(state: NativeVoiceState): void {\n emit({ native: state });\n const local = snapshot.session;\n const remote = state.session;\n if (!remote) {\n // A just-sent start has not reached native yet: an older snapshot says\n // \"no session\" — ignore it until native answers (or the start times out).\n if (local && local.phase !== 'starting') endSession();\n return;\n }\n if (local && local.id === remote.id) {\n if (startTimer && remote.phase === 'listening') {\n clearTimeout(startTimer);\n startTimer = null;\n }\n const phase = local.phase === 'finalizing' ? 'finalizing' : remote.phase;\n emit({ session: { ...local, phase, latched: remote.origin === 'button' ? true : remote.latched, mode: remote.mode } });\n return;\n }\n if (remote.origin === 'hotkey') {\n // A hotkey dictation: bind it to the focused Verse input and tell native\n // how to post-process for it (prose vs verbatim, the chat's repo).\n const target = pickHotkeyTarget();\n const mode: VoiceMode = remote.mode === 'command' ? 'command' : (target?.mode ?? 'prose');\n const cwd = mode === 'prose' ? (target?.cwd?.() ?? null) : null;\n if (local) endSession();\n beginSession({\n id: remote.id,\n targetId: mode === 'command' ? null : (target?.id ?? null),\n origin: 'hotkey',\n mode,\n phase: remote.phase,\n partial: '',\n latched: remote.latched,\n });\n nativeVoice()?.send({ op: 'context', session: remote.id, mode, ...(cwd ? { cwd } : {}) });\n return;\n }\n // A mic-button dictation this page did not start (the page reloaded while\n // it ran): adopt it so the pill can stop or cancel it; its words, having\n // no input, stay in the pill with Copy.\n if (local?.phase === 'starting') return;\n if (local) endSession();\n beginSession({ id: remote.id, targetId: null, origin: 'button', mode: remote.mode, phase: remote.phase, partial: '', latched: true });\n}\n\nasync function deliverFinal(\n targetId: string | null,\n raw: string,\n mode: VoiceMode,\n lexicon: LexiconStatus | null,\n latencyMs: number | null,\n): Promise<void> {\n const text = raw.trim();\n if (!text) return;\n if (mode === 'command') {\n handOffToPalette(text);\n setNotice({ kind: 'palette', text, lexicon, latencyMs, mode });\n return;\n }\n const target = targetId ? targets.get(targetId) : undefined;\n if (!target) {\n // Nowhere to put it (the input unmounted, or no dictation-enabled input\n // on screen): keep it visible with a Copy button rather than lose it.\n setNotice({ kind: 'orphan', text, lexicon, latencyMs, mode }, true);\n return;\n }\n let finalText = text;\n if (mode === 'prose' && target.lookupIdentifiers) {\n finalText = await biasIdentifiers(text, target.lookupIdentifiers);\n }\n target.insert(finalText);\n try {\n target.element()?.focus({ preventScroll: true });\n } catch {\n /* detached */\n }\n setNotice({ kind: 'inserted', text: finalText, lexicon, latencyMs, mode });\n}\n\n// ── reading it ───────────────────────────────────────────────────────────────\n\nexport function getVoiceSnapshot(): VoiceSnapshot {\n return snapshot;\n}\n\nexport function subscribeVoice(listener: () => void): () => void {\n ensureInit();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\n/** The meter level (0..1) of the live dictation, ~20 Hz. */\nexport function subscribeVoiceLevel(listener: (level: number) => void): () => void {\n levelListeners.add(listener);\n return () => {\n levelListeners.delete(listener);\n };\n}\n\nexport function useVoiceSnapshot(): VoiceSnapshot {\n return useSyncExternalStore(subscribeVoice, getVoiceSnapshot, getVoiceSnapshot);\n}\n\n/** Tests only: forget everything. */\nexport function resetVoiceStoreForTests(): void {\n unsubscribeNative?.();\n unsubscribeNative = null;\n try {\n document.removeEventListener('focusin', onFocusIn, true);\n document.removeEventListener('keydown', onKeyDown, true);\n } catch {\n /* ignore */\n }\n for (const t of [errorTimer, noticeTimer, startTimer]) if (t) clearTimeout(t);\n errorTimer = noticeTimer = startTimer = null;\n webSession = null;\n targets.clear();\n lastFocused = null;\n initialised = false;\n seq = 0;\n listeners.clear();\n levelListeners.clear();\n snapshot = { backend: 'none', native: null, session: null, error: null, notice: null, targets: [] };\n}\n","/* routes/verse/voice — the mic button (VoiceInput) and the floating\n dictation pill (VoiceHud). Tokens only; no raw colours. */\n\n/* ---- mic button ---------------------------------------------------------- */\n.mic {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: var(--control-h-sm);\n height: var(--control-h-sm);\n padding: 0;\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-secondary);\n cursor: pointer;\n}\n.mic:hover:not(:disabled) { background: var(--bg-hover); color: var(--text-primary); }\n.mic:active:not(:disabled) { background: var(--bg-active); }\n.mic:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n.mic:disabled { opacity: 0.45; cursor: not-allowed; }\n.mic[aria-busy='true'] { cursor: progress; color: var(--status-running-fg); }\n.mic[data-error='true']::after {\n content: '';\n position: absolute;\n top: 3px;\n right: 3px;\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--status-danger-solid);\n}\n.micLive { color: var(--status-running-fg); background: var(--status-running-bg); }\n.micPulse {\n position: absolute;\n inset: -2px;\n border-radius: var(--radius-sm);\n border: 1px solid var(--status-running-solid);\n animation: voice-ring 1.4s ease-out infinite;\n pointer-events: none;\n}\n@keyframes voice-ring {\n from { opacity: 0.9; transform: scale(1); }\n to { opacity: 0; transform: scale(1.25); }\n}\n\n/* ---- the pill ------------------------------------------------------------ */\n.hud {\n position: fixed;\n left: 50%;\n bottom: calc(var(--space-6) + env(safe-area-inset-bottom, 0px));\n z-index: var(--z-toast);\n transform: translateX(-50%);\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n width: max-content;\n min-width: 320px;\n max-width: min(640px, calc(100vw - 2 * var(--space-4)));\n padding: var(--space-2) var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-lg);\n background: var(--bg-surface-raised);\n box-shadow: var(--shadow-toast);\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n.hud[data-state='listening'] { border-color: var(--status-running-solid); }\n.hud[data-state='error'] { border-color: var(--status-danger-solid); }\n.hudRow { display: flex; align-items: center; gap: var(--space-2); min-width: 0; }\n.hudDot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 24px;\n height: 24px;\n border-radius: var(--radius-full);\n background: var(--status-running-bg);\n color: var(--status-running-fg);\n}\n.hudDot[data-tone='danger'] { background: var(--status-danger-bg); color: var(--status-danger-fg); }\n.hudLabel { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; font-weight: var(--font-weight-medium); white-space: nowrap; }\n.hudWhere { color: var(--text-tertiary); font-weight: var(--font-weight-regular); }\n.hudHint { flex: 1 1 auto; min-width: 0; color: var(--text-tertiary); font-size: var(--text-xs-size); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.hudMessage { flex: 1 1 auto; min-width: 0; }\n.hudButton {\n flex: none;\n height: var(--control-h-xs);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-surface);\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-xs-size);\n cursor: pointer;\n white-space: nowrap;\n}\n.hudButton:hover { background: var(--bg-hover); }\n.hudButton[data-primary='true'] { border-color: transparent; background: var(--accent-500); color: var(--accent-contrast); }\n.hudButton[data-primary='true']:hover { background: var(--accent-600); }\n.hudButton:focus-visible, .hudIcon:focus-visible, .rawBadge:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n.hudIcon {\n flex: none;\n width: var(--control-h-xs);\n height: var(--control-h-xs);\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-secondary);\n font-size: var(--text-md-size);\n line-height: 1;\n cursor: pointer;\n}\n.hudIcon:hover { background: var(--bg-hover); color: var(--text-primary); }\n/* Partials are provisional: dimmed and italic until the final lands solid. */\n.hudPartial {\n margin: 0;\n padding-left: calc(24px + var(--space-2));\n color: var(--text-tertiary);\n font-style: italic;\n overflow-wrap: anywhere;\n}\n.hudPartial[data-solid='true'] { padding-left: 0; color: var(--text-primary); font-style: normal; }\n.hudModel { display: flex; align-items: center; gap: var(--space-2); font-size: var(--text-xs-size); color: var(--text-secondary); }\n.hudModelText { flex: none; white-space: nowrap; }\n.progress { position: relative; flex: 1 1 auto; min-width: 80px; height: 4px; overflow: hidden; border-radius: var(--radius-full); background: var(--meter-track); }\n.progressFill { position: absolute; inset: 0; transform-origin: left center; background: var(--accent-500); transition: transform var(--duration-base) var(--ease-standard); }\n.rawBadge {\n flex: none;\n height: 18px;\n padding: 0 var(--space-1);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs);\n background: transparent;\n color: var(--text-tertiary);\n font: inherit;\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n cursor: pointer;\n}\n\n/* ---- waveform / meter ---------------------------------------------------- */\n.wave { display: inline-flex; align-items: center; gap: 2px; flex: none; height: 20px; }\n.waveBar {\n display: block;\n width: 2px;\n height: 100%;\n border-radius: var(--radius-full);\n background: var(--status-running-solid);\n transform: scaleY(0.08);\n transform-origin: center;\n transition: transform 60ms linear;\n}\n.wave:not([data-active='true']) .waveBar { background: var(--text-disabled); }\n.meter { position: relative; flex: none; width: 72px; height: 6px; overflow: hidden; border-radius: var(--radius-full); background: var(--meter-track); }\n.meterFill { position: absolute; inset: 0; transform-origin: left center; transform: scaleX(0.02); background: var(--status-running-solid); }\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .micPulse { animation: none; }\n :root:not([data-motion='full']) .waveBar,\n :root:not([data-motion='full']) .progressFill { transition: none; }\n}\n:root[data-motion='reduce'] .micPulse { animation: none; }\n:root[data-motion='reduce'] .waveBar,\n:root[data-motion='reduce'] .progressFill { transition: none; }\n\n@media (max-width: 520px) {\n .hud { min-width: 0; width: calc(100vw - 2 * var(--space-4)); }\n .hudHint, .hudWhere { display: none; }\n .wave { display: none; }\n .hudModelText { white-space: normal; }\n}\n","/**\n * routes/verse/voice/VoiceInput.tsx — the mic button every dictation-enabled\n * Verse input carries (chat composer, Leader composer, ⌘K, terminal).\n *\n * It registers its input as a dictation TARGET (voice-store.ts): a click\n * dictates into it, and the ⌃⌥V hotkey dictates into it when it is focused\n * (or was last). The live state — waveform, \"Listening · local Parakeet\",\n * dimmed partials, errors with one-click fixes — is the floating VoiceHud,\n * one for the whole app, so every surface looks and behaves the same.\n *\n * Lazy: surfaces import this with `lazy(() => import('./voice/VoiceInput.js'))`\n * so none of the voice code is in the first-paint bundle.\n */\nimport { useEffect, useId, useRef, type RefObject } from 'react';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { registerVoiceTarget, toggleVoice, useVoiceSnapshot, type VoiceSurface } from './voice-store.js';\nimport styles from './VoiceInput.module.css';\n\n/** Keep native shortcut symbols from pulling in the full UI font face. */\nexport function readableVoiceAccelerator(accelerator: string): string {\n return accelerator\n .replaceAll('\\u2303', 'Ctrl+')\n .replaceAll('\\u2325', 'Option+')\n .replaceAll('\\u21e7', 'Shift+')\n .replaceAll('\\u2318', 'Command+');\n}\n\nexport interface VoiceInputProps {\n surface: VoiceSurface;\n /** `verbatim` (terminal): inserted exactly as heard, no cleanup. */\n mode?: 'prose' | 'verbatim';\n /** The input (or its wrapper): focus inside it routes ⌃⌥V here. */\n targetRef: RefObject<HTMLElement | null>;\n /** Insert a FINAL transcript (partials never reach the input). */\n onInsert: (text: string) => void;\n /** The chat's repo, for project lexicon terms. */\n cwd?: () => string | null;\n /** The chat's file names, for turning \"browser pane dot rs\" into `browser_pane.rs`. */\n lookupIdentifiers?: (queries: string[]) => Promise<readonly string[]>;\n onListeningChange?: (listening: boolean) => void;\n disabled?: boolean;\n className?: string;\n}\n\nexport function VoiceInput({\n surface,\n mode = 'prose',\n targetRef,\n onInsert,\n cwd,\n lookupIdentifiers,\n onListeningChange,\n disabled = false,\n className,\n}: VoiceInputProps) {\n const id = `${surface}-${useId()}`;\n const voice = useVoiceSnapshot();\n const latest = useRef({ onInsert, cwd, lookupIdentifiers, onListeningChange });\n latest.current = { onInsert, cwd, lookupIdentifiers, onListeningChange };\n\n useEffect(\n () =>\n registerVoiceTarget({\n id,\n surface,\n mode,\n element: () => targetRef.current,\n cwd: () => latest.current.cwd?.() ?? null,\n insert: (text) => latest.current.onInsert(text),\n ...(lookupIdentifiers ? { lookupIdentifiers: (q: string[]) => latest.current.lookupIdentifiers?.(q) ?? Promise.resolve([]) } : {}),\n onListening: (on) => latest.current.onListeningChange?.(on),\n }),\n // `lookupIdentifiers` presence (not identity) decides whether biasing is offered.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [id, surface, mode, targetRef, Boolean(lookupIdentifiers)],\n );\n\n const session = voice.session;\n const mine = session?.targetId === id;\n const live = mine && session?.phase !== 'finalizing';\n const busy = mine && session?.phase === 'finalizing';\n const errored = voice.error?.targetId === id;\n const hotkey = voice.backend === 'native' ? voice.native?.hotkey : null;\n\n if (voice.backend === 'none') {\n return (\n <Tooltip label=\"Dictation needs the Ashlr desktop app, or a browser with speech recognition\" placement=\"top\">\n <button type=\"button\" className={`${styles.mic} ${className ?? ''}`} disabled aria-disabled=\"true\" data-surface={surface}>\n <MicIcon />\n <span className=\"visually-hidden\">Dictation unavailable</span>\n </button>\n </Tooltip>\n );\n }\n\n const label = live ? 'Stop and insert' : busy ? 'Transcribing…' : 'Dictate';\n const shortcut = live ? 'Esc cancels' : hotkey?.registered ? readableVoiceAccelerator(hotkey.accelerator) : undefined;\n return (\n <Tooltip label={label} shortcut={shortcut} placement=\"top\">\n <button\n type=\"button\"\n className={`${styles.mic} ${live ? styles.micLive : ''} ${className ?? ''}`}\n data-surface={surface}\n data-error={errored ? 'true' : undefined}\n disabled={(disabled && !mine) || (!!session && !mine)}\n aria-pressed={live}\n aria-busy={busy || undefined}\n aria-label={live ? 'Stop dictation and insert' : 'Start dictation'}\n // Keep focus (and the caret) in the input: the text lands where it was.\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => toggleVoice(id)}\n >\n <MicIcon />\n {live ? <span className={styles.micPulse} aria-hidden=\"true\" /> : null}\n </button>\n </Tooltip>\n );\n}\n\nexport function MicIcon() {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <rect x=\"7\" y=\"2\" width=\"6\" height=\"10\" rx=\"3\" fill=\"currentColor\" />\n <path d=\"M4.5 9.5a5.5 5.5 0 0 0 11 0M10 15v3M7 18h6\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport default VoiceInput;\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{C as r,M as i,V as a,a as o,i as s,l as c,u as l}from"./global-w7KDTTi0.js";import{t as u}from"./MutationTokenDialog-DlY2VLVh.js";import{i as d}from"./SkipToContent-BynsXs9i.js";import{j as f,r as p}from"./VerseShared-Bf-XTHCh.js";import{n as m}from"./MessageMarkdownRenderer-D5R-zr-W.js";import{t as h}from"./Button-CstSJwha.js";import{b as g,y as _}from"./icons-C3G-y5j2.js";import{n as v,t as y}from"./use-token-gate-h5QAERLT.js";import{t as b}from"./EmptyState-CGVr0VO2.js";import{i as x,n as S,r as C,t as w}from"./wiki-focus-De8-E48Z.js";var T=e(n(),1);function E(e){return e.endLine&&e.endLine>e.line?`${e.file}:${e.line}-${e.endLine}`:`${e.file}:${e.line}`}function D(e){if(!e.startsWith(`#cite:`))return null;let t=e.slice(6),n=/^(.+):(\d{1,7})(?:-(\d{1,7}))?$/.exec(t);if(!n)return null;let r;try{r=decodeURI(n[1]).replace(/%28/g,`(`).replace(/%29/g,`)`)}catch{return null}if(!r||r.startsWith(`/`)||r.split(`/`).includes(`..`))return null;let i=Number(n[2]),a=n[3]?Number(n[3]):void 0;return i<1?null:{file:r,line:i,...a&&a>i?{endLine:a}:{}}}var O=String.raw`((?:[\w@+.-]+\/)*[\w@+-][\w@+.-]*\.[A-Za-z0-9]{1,10})`,k=String.raw`(?::|#L)(\d{1,7})(?:\s?(?:-|–|:|-L)\s?L?(\d{1,7}))?`;new RegExp(String.raw`(?<![\w/:.@-])(\[|\x60)?${O}${k}(\]|\x60)?(?![\w/])`,`g`);function A(e){let t=new Set(e.map(e=>e.id)),n=new Map,r=[];for(let i of e)if(i.parent&&t.has(i.parent)&&i.parent!==i.id){let e=n.get(i.parent)??[];e.push(i),n.set(i.parent,e)}else r.push(i);let i=[],a=new Set,o=(e,t)=>{if(!a.has(e.id)){a.add(e.id),i.push({page:e,depth:t});for(let r of n.get(e.id)??[])o(r,Math.min(t+1,3))}};for(let e of r)o(e,0);for(let t of e)a.has(t.id)||o(t,0);return i}function j(e){return e?e.slice(0,7):`no commit`}function M(e){if(!e||!e.exists)return{text:`Not built yet`,tone:`neutral`};let t=`Generated at ${j(e.generatedCommit)}`;if(e.stalePages===0)return{text:`${t} · fresh`,tone:`success`};let n=e.stalePages;return{text:`${t} · ${n} ${n===1?`page`:`pages`} stale`,tone:`warning`}}function N(e){if(e===`facts-only`)return`repository facts only (no model)`;let[t,...n]=e.split(`:`),r=n.join(`:`)||t||e;return t===`local`?`${r} (local)`:t===`grok`?`Grok (${r})`:e}function P(e,t,n){return!e||!t||!/^https:\/\/github\.com\/[\w.-]+\/[\w.-]+$/.test(e)?null:`${e}/blob/${t}/${n.file.split(`/`).map(encodeURIComponent).join(`/`)}${n.endLine&&n.endLine>n.line?`#L${n.line}-L${n.endLine}`:`#L${n.line}`}`}function F(e,t){if(!t)return null;let n=e=>e.replace(/\/+$/,``),r=e.find(e=>n(e.repo)===n(t));if(r)return r;let i=n(t).split(`/`).pop(),a=e.filter(e=>e.name===i);return a.length===1?a[0]:null}function I(e,t){return e.find(e=>e.key===t)??e.find(e=>e.exists)??e[0]??null}function L(e){if(!e)return null;if(e.state===`running`){let{index:t,total:n,page:r}=e.progress;return n>0?`Building… ${t} of ${n}${r?` (${r})`:``}`:`Building… reading the repo`}if(e.state===`failed`)return`Build failed: ${e.error??`unknown error`}`;let t=e.summary;if(!t)return`Build finished.`;let n=[`${t.generated} written`,`${t.skippedFresh} already fresh`];return t.deferred>0&&n.push(`${t.deferred} left for next time (${t.budgetStop??`budget`} budget)`),`Build finished: ${n.join(` · `)}${t.modelNote?` — ${t.modelNote}`:``}`}var R={section:`_section_zh843_8`,scroll:`_scroll_zh843_16`,page:`_page_zh843_25`,header:`_header_zh843_34`,headerText:`_headerText_zh843_42`,title:`_title_zh843_49`,lede:`_lede_zh843_58`,toolbar:`_toolbar_zh843_65`,spacer:`_spacer_zh843_71`,picker:`_picker_zh843_74`,badge:`_badge_zh843_90`,meta:`_meta_zh843_112`,segmented:`_segmented_zh843_118`,privacy:`_privacy_zh843_146`,banner:`_banner_zh843_158`,job:`_job_zh843_173`,ask:`_ask_zh843_194`,scope:`_scope_zh843_221`,answer:`_answer_zh843_230`,answerHead:`_answerHead_zh843_239`,sources:`_sources_zh843_245`,cite:`_cite_zh843_258`,body:`_body_zh843_274`,tree:`_tree_zh843_286`,treeTitle:`_treeTitle_zh843_330`,staleDot:`_staleDot_zh843_337`,article:`_article_zh843_345`,pageMeta:`_pageMeta_zh843_351`,markdown:`_markdown_zh843_359`,visuallyHidden:`_visuallyHidden_zh843_474`},z=t();function B({markdown:e,onCite:t,onPage:n,label:r}){let i=(0,T.useMemo)(()=>m(e),[e]);return(0,z.jsx)(`div`,{className:R.markdown,"aria-label":r,onClick:e=>{let r=(e.target?.closest(`a`))?.getAttribute(`href`)??``;if(r.startsWith(`#cite:`)){e.preventDefault();let n=D(r);n&&t(n)}else if(r.startsWith(`#page:`)){e.preventDefault();let t=r.slice(6);/^[a-z0-9][a-z0-9-]{0,95}$/.test(t)&&n?.(t)}},dangerouslySetInnerHTML:{__html:i}})}var V=`/api/verse/wiki`,H=`verse-wiki-repos`,U=e=>`verse-wiki-repo:${e}`,W=(e,t)=>`verse-wiki-page:${e}:${t}`,G={key:H,fetch:e=>s(V,e)};function K(e){return{key:U(e),fetch:t=>s(`${V}/repo/${encodeURIComponent(e)}`,t)}}function ee(e,t){return{key:W(e,t),fetch:n=>s(`${V}/repo/${encodeURIComponent(e)}/page/${encodeURIComponent(t)}`,n)}}function te(e){return{key:`verse-wiki-graph:${e}`,fetch:t=>s(`${V}/repo/${encodeURIComponent(e)}/graph`,t)}}function q(){let e=r();if(!e)throw new p;return e}async function ne(e,t={}){let n=await o(`${V}/repo/${encodeURIComponent(e)}/build`,t.force?{force:!0}:{},q());return i(),a(U(e)),a(H),n.job}function re(e,t){a(`verse-wiki-graph:${e}`),a(U(e)),a(H);for(let n of t)a(W(e,n))}async function ie(e,t){let n=await o(`${V}/ask`,t?{question:e,repoKey:t}:{question:e},q());return i(),n}async function ae(e,t,n){await o(`${V}/open`,{repoKey:e,file:t,line:n},q()),i()}var J={root:`_root_akcd2_1`,toolbar:`_toolbar_akcd2_2`,detail:`_detail_akcd2_5`,viewport:`_viewport_akcd2_7`,caption:`_caption_akcd2_8`,coverage:`_coverage_akcd2_8`,layout:`_layout_akcd2_9`,canvas:`_canvas_akcd2_11`,node:`_node_akcd2_14`,edge:`_edge_akcd2_25`,edgeHeading:`_edgeHeading_akcd2_26`,evidence:`_evidence_akcd2_27`};function oe({repoKey:e,onCite:t}){let n=(0,T.useMemo)(()=>te(e),[e]),r=c(n,{freshMs:15e3}),i=l(n);return!r.data&&!r.error?(0,z.jsx)(`p`,{role:`status`,children:`Mapping local modules…`}):r.error||!r.data?(0,z.jsxs)(`div`,{role:`alert`,children:[(0,z.jsx)(`p`,{children:r.error?y(r.error):`The module map could not be read.`}),(0,z.jsx)(`button`,{type:`button`,onClick:i,children:`Retry map`})]}):(0,z.jsx)(se,{graph:r.data,onCite:t,onRefresh:i})}function se({graph:e,onCite:t,onRefresh:n}){let[r,i]=(0,T.useState)(``),[a,o]=(0,T.useState)(null),s=e.nodes.filter(e=>`${e.id} ${e.files.map(e=>e.file).join(` `)} ${e.exports.map(e=>e.name).join(` `)}`.toLowerCase().includes(r.trim().toLowerCase())),c=s.find(e=>e.id===a)??s[0]??null,l=new Map(s.map((e,t)=>[e.id,{x:120+t%3*240,y:60+Math.floor(t/3)*110}])),u=Math.max(130,Math.ceil(s.length/3)*110+20),d=e.edges.filter(e=>e.from===c?.id),f=e.edges.filter(e=>e.to===c?.id),p=new Set([...d.map(e=>e.to),...f.map(e=>e.from)]),m=e=>{i(``),o(e)},h=e.coverage.importEvidence,g=e.coverage.listingIncomplete||e.coverage.listingTruncated||e.coverage.unreadFiles>0||e.coverage.omittedModuleFiles>0||(h?h.unresolvedLocalImports>0||h.unsupportedSourceFiles>0||h.droppedCitations>0||h.omittedCitations>0||h.omittedModuleImports>0:e.edges.length>0),_=(n,r)=>(0,z.jsxs)(`li`,{className:J.edge,children:[(0,z.jsxs)(`div`,{className:J.edgeHeading,children:[(0,z.jsx)(`button`,{type:`button`,onClick:()=>m(r),children:r}),(0,z.jsxs)(`span`,{children:[n.imports,` imports · inferred`]})]}),(0,z.jsxs)(`div`,{className:J.evidence,children:[n.citations?.length?n.citations.map(n=>(0,z.jsx)(`button`,{type:`button`,"aria-label":`Open import ${E(n)}`,onClick:()=>t(n,e.commit),children:E(n)},`${n.file}:${n.line}`)):(0,z.jsx)(`span`,{children:n.citations===void 0?`Import line evidence unavailable; refresh the map.`:`No checked import lines in this sample.`}),n.omittedCitations?(0,z.jsxs)(`span`,{children:[n.omittedCitations,` additional import references are outside the citation sample.`]}):null,n.droppedCitations?(0,z.jsxs)(`span`,{children:[n.droppedCitations,` import citations failed the file or line check.`]}):null]})]},r);return(0,z.jsxs)(`section`,{className:J.root,"aria-label":`Codebase module map`,children:[(0,z.jsxs)(`div`,{className:J.toolbar,children:[(0,z.jsxs)(`label`,{children:[`Find a module`,(0,z.jsx)(`input`,{type:`search`,"aria-label":`Find a module`,placeholder:`Module, file or symbol…`,value:r,onChange:e=>i(e.target.value)})]}),(0,z.jsxs)(`span`,{children:[s.length,` of `,e.nodes.length,` modules`]}),n?(0,z.jsx)(`button`,{type:`button`,onClick:n,children:`Refresh map`}):null]}),(0,z.jsx)(`p`,{className:J.caption,children:`Select a module to trace what it uses and what depends on it. This map is built locally without a model.`}),h?.unresolvedLocalImports?(0,z.jsxs)(`p`,{className:J.caption,role:`status`,children:[h.unresolvedLocalImports,` detected local import references could not be resolved in the listed files. Some dependencies may be missing.`]}):null,s.length===0?(0,z.jsx)(`p`,{role:`status`,children:e.nodes.length?`No matching modules. Try a file name or clear the search.`:e.coverage.listingIncomplete?`The repo listing could not be completed. Check local access and refresh the map.`:`No readable modules were found in this repo.`}):(0,z.jsxs)(`div`,{className:J.layout,children:[(0,z.jsx)(`div`,{className:J.viewport,tabIndex:0,"aria-label":`Scrollable dependency map`,children:(0,z.jsxs)(`div`,{className:J.canvas,style:{height:u},children:[(0,z.jsx)(`svg`,{width:`720`,height:u,"aria-hidden":`true`,children:[...d,...f].map(e=>{let t=l.get(e.from),n=l.get(e.to);return t&&n?(0,z.jsx)(`path`,{d:`M${t.x},${t.y} C${t.x},${t.y+55} ${n.x},${n.y-55} ${n.x},${n.y}`},`${e.from}:${e.to}`):null})}),s.map(e=>{let t=l.get(e.id);return(0,z.jsxs)(`button`,{type:`button`,className:J.node,style:{left:t.x,top:t.y},"aria-pressed":c?.id===e.id,"data-related":p.has(e.id)||void 0,onClick:()=>o(e.id),children:[(0,z.jsx)(`span`,{children:e.id}),(0,z.jsxs)(`small`,{children:[e.sourceFiles,` source files`,e.testFiles?`, ${e.testFiles} tests`:``]})]},e.id)})]})}),c?(0,z.jsxs)(`aside`,{className:J.detail,"aria-label":`Selected module`,children:[(0,z.jsx)(`h3`,{children:c.id}),(0,z.jsxs)(`p`,{children:[c.sourceFiles,` source files and `,c.testFiles,` tests`]}),(0,z.jsx)(`h4`,{children:`Uses`}),d.length?(0,z.jsx)(`ul`,{children:d.map(e=>_(e,e.to))}):(0,z.jsx)(`p`,{children:`No cross-module imports found in the files read.`}),(0,z.jsx)(`h4`,{children:`Used by`}),f.length?(0,z.jsx)(`ul`,{children:f.map(e=>_(e,e.from))}):(0,z.jsx)(`p`,{children:`No incoming imports found in the files read.`}),(0,z.jsx)(`h4`,{children:`Start reading`}),c.files.length?(0,z.jsx)(`ul`,{children:c.files.map(n=>(0,z.jsx)(`li`,{children:(0,z.jsxs)(`button`,{type:`button`,onClick:()=>t({file:n.file,line:1},e.commit),children:[n.file,`:1`]})},n.file))}):(0,z.jsx)(`p`,{children:`No source files from this module were read.`}),c.exports.length?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`h4`,{children:`Exports`}),(0,z.jsx)(`ul`,{children:c.exports.map(n=>(0,z.jsxs)(`li`,{children:[(0,z.jsx)(`button`,{type:`button`,onClick:()=>t(n.cite,e.commit),children:n.name}),(0,z.jsx)(`span`,{children:n.kind})]},`${n.cite.file}:${n.cite.line}:${n.name}`))})]}):null]}):null]}),(0,z.jsxs)(`details`,{className:J.coverage,children:[(0,z.jsxs)(`summary`,{children:[g?`Partial coverage`:`Coverage and evidence`,`: `,e.coverage.readFiles,` of `,e.coverage.listedFiles,` listed files read`]}),(0,z.jsx)(`p`,{children:`File names are extracted from the repo listing. Module groups and dependency links are inferred from directory structure and resolved import statements using pattern matching; they are not a complete runtime call graph.`}),(0,z.jsxs)(`p`,{children:[e.coverage.unreadFiles,` listed files were not read; `,e.coverage.omittedModuleFiles,` listed files are outside the displayed modules.`,e.coverage.listingTruncated?` The file listing reached its scan limit.`:``,e.coverage.listingIncomplete?` Some directories could not be listed or reached the depth limit; this is not complete coverage.`:``,` Secrets, ignored paths, symlinks, binaries and generated dependencies are excluded.`]}),h?(0,z.jsxs)(`p`,{children:[`Detected local imports in read sources: `,h.unresolvedLocalImports,` unresolved. `,h.unsupportedSourceFiles,` read source files use languages without supported local import resolution. `,h.checkedCitations,` source-line citations passed the file and line checks; `,h.droppedCitations,` failed and were removed; `,h.omittedCitations,` additional references are outside the citation sample; `,h.omittedModuleImports,` resolved imports point outside the displayed modules. Citation samples retain at most four lines per dependency and 512 lines in total. Pattern matches can include comments or strings and do not prove runtime dependency behavior.`]}):(0,z.jsx)(`p`,{children:`Import-resolution and source-line evidence is unavailable in this sample. Missing evidence does not mean zero unresolved imports. Refresh the map to check the read sources.`}),(0,z.jsxs)(`p`,{children:[`Sampled `,new Date(e.generatedAt).toLocaleString(),`. Current working files, listed against `,e.commit?e.commit.slice(0,8):`a local directory scan`,`. Refreshes may reuse a sample for up to 15 seconds.`]})]})]})}var Y=`verse.wiki.repo`,X=`verse.wiki.citeTarget`,ce=2500;function Z(e){try{return localStorage.getItem(e)}catch{return null}}function Q(e,t){try{localStorage.setItem(e,t)}catch{}}function $(e){return e.endLine&&e.endLine>e.line?`${e.file}:${e.line}-${e.endLine}`:`${e.file}:${e.line}`}function le(e,t,n){return(0,T.useCallback)(async(r,i,a,o)=>{let s=t===`github`?P(a,o,r):null;if(s){window.open(s,`_blank`,`noopener,noreferrer`);return}if(i)try{await e.run(`Open ${$(r)} in your editor`,async()=>(await ae(i,r.file,r.line),!0))&&n({tone:`neutral`,text:`Opened ${$(r)} in your editor.`})}catch(e){n({tone:`danger`,text:y(e)})}},[e,t,n])}function ue(){let e=c(G),t=v(),n=(0,T.useMemo)(()=>e.data?.repos??[],[e.data]),[r,i]=(0,T.useState)(()=>Z(Y)),a=(0,T.useMemo)(()=>I(n,r),[n,r]),[o,s]=(0,T.useState)(()=>Z(X)===`github`?`github`:`editor`),[l,f]=(0,T.useState)(null),[p,m]=(0,T.useState)(``),[_,E]=(0,T.useState)(!1),[D,O]=(0,T.useState)(!1),[k,A]=(0,T.useState)(null),[j,M]=(0,T.useState)(null),N=(0,T.useRef)(null),P=le(t,o,f),L=(0,T.useCallback)(e=>{i(e),Q(Y,e),A(null)},[]),B=(0,T.useSyncExternalStore)(C,w,w);(0,T.useEffect)(()=>{if(B&&e.data){if(S(B)){let e=F(n,B.projectPath);e?L(e.key):B.projectPath&&f({tone:`neutral`,text:"That project is not enrolled, so it has no wiki. Enroll it with `ashlr enroll add <path>`."}),B.kind===`ask`&&N.current?.focus()}x(B.seq)}},[B,e.data,n,L]);let V=async e=>{e.preventDefault();let n=p.trim();if(n){O(!0),f(null);try{let e=await t.run(`Ask the codebase`,()=>ie(n,_?null:a?.key??null));e&&A(e)}catch(e){f({tone:`danger`,text:y(e)})}finally{O(!1)}}},H=e=>{s(e),Q(X,e)},U=k&&j&&k.repoKey===a?.key?j.githubUrl:null,W=k&&j&&k.repoKey===a?.key?j.status.generatedCommit:null;return(0,z.jsxs)(`section`,{className:R.section,"aria-label":`Repo wiki`,children:[(0,z.jsx)(`div`,{className:R.scroll,children:(0,z.jsxs)(`div`,{className:R.page,children:[(0,z.jsxs)(`header`,{className:R.header,children:[(0,z.jsxs)(`div`,{className:R.headerText,children:[(0,z.jsx)(`h2`,{className:R.title,children:`Repo wiki`}),(0,z.jsx)(`p`,{className:R.lede,children:`Architecture pages for your enrolled repos, written on your own models and kept on this Mac. Every citation is checked against the code.`})]}),(0,z.jsxs)(`div`,{className:R.segmented,role:`radiogroup`,"aria-label":`Citations open in`,children:[(0,z.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":o===`editor`,onClick:()=>H(`editor`),children:`Editor`}),(0,z.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":o===`github`,onClick:()=>H(`github`),children:`GitHub`})]})]}),e.data===void 0&&!e.error?(0,z.jsxs)(`div`,{"aria-busy":`true`,"aria-label":`Loading repos`,children:[(0,z.jsx)(d,{width:`40%`}),(0,z.jsx)(d,{width:`70%`})]}):e.error?(0,z.jsx)(`p`,{className:R.banner,"data-tone":`danger`,children:y(e.error)}):n.length===0||!a?(0,z.jsx)(b,{title:`No enrolled repos`,body:(0,z.jsxs)(z.Fragment,{children:[`The wiki only reads repos you enrolled. Enroll one with `,(0,z.jsx)(`code`,{children:`ashlr enroll add <path>`}),`, then build its wiki here or with `,(0,z.jsx)(`code`,{children:`ashlr wiki build`}),`.`]})}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`p`,{className:l?R.banner:R.visuallyHidden,"data-tone":l?.tone,role:`status`,"aria-live":`polite`,children:l?.text??``}),(0,z.jsxs)(`form`,{className:R.ask,onSubmit:e=>void V(e),role:`search`,"aria-label":`Ask the codebase`,children:[(0,z.jsx)(g,{size:14}),(0,z.jsx)(`input`,{ref:N,type:`text`,value:p,maxLength:1e3,placeholder:_?`Ask across every enrolled repo…`:`Ask ${a.name}… e.g. “where are sessions persisted?”`,onChange:e=>m(e.target.value),"aria-label":`Question`}),(0,z.jsxs)(`label`,{className:R.scope,children:[(0,z.jsx)(`input`,{type:`checkbox`,checked:_,onChange:e=>E(e.target.checked)}),`All repos`]}),(0,z.jsx)(h,{type:`submit`,variant:`primary`,size:`sm`,busy:D,disabled:!p.trim(),children:`Ask`})]}),k?(0,z.jsx)(de,{answer:k,onDismiss:()=>A(null),onCite:e=>void P(e,k.repoKey,U,W)}):null,(0,z.jsx)(fe,{repo:a,rows:n,gate:t,target:o,onChoose:L,onNotice:f,onView:M,openCite:P},a.key)]})]})}),(0,z.jsx)(u,{open:t.dialog.open,reason:t.dialog.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:t.dialog.onClose,onUnlocked:t.dialog.onUnlocked})]})}function de({answer:e,onDismiss:t,onCite:n}){let r=e.status===`answered`?`success`:e.status===`extractive`?`neutral`:`warning`,i=e.status===`answered`?`Answer`:e.status===`extractive`?`Best passages`:`Not found`;return(0,z.jsxs)(`div`,{className:R.answer,"data-status":e.status,"aria-label":`Answer`,children:[(0,z.jsxs)(`div`,{className:R.answerHead,children:[(0,z.jsx)(`span`,{className:R.badge,"data-tone":r,children:i}),e.repoName?(0,z.jsx)(`span`,{className:R.meta,children:e.repoName}):null,e.engine===`none`?null:(0,z.jsxs)(`span`,{className:R.meta,children:[N(e.engine),e.local?``:` · left this Mac`]}),e.droppedCitations>0?(0,z.jsxs)(`span`,{className:R.meta,children:[e.droppedCitations,` unverifiable citation`,e.droppedCitations===1?``:`s`,` removed`]}):null,(0,z.jsx)(`span`,{className:R.spacer}),(0,z.jsx)(h,{variant:`ghost`,size:`sm`,onClick:t,children:`Dismiss`})]}),(0,z.jsx)(B,{markdown:e.answer,label:`Answer text`,onCite:n}),e.sources.length>0?(0,z.jsx)(`ul`,{className:R.sources,"aria-label":`Sources`,children:e.sources.slice(0,8).map((e,t)=>{let r={file:e.file,line:e.line,...e.endLine?{endLine:e.endLine}:{}};return(0,z.jsxs)(`li`,{children:[(0,z.jsx)(`button`,{type:`button`,className:R.cite,onClick:()=>n(r),children:$(r)}),(0,z.jsx)(`span`,{className:R.meta,children:e.via===`wiki`?e.title??`wiki`:e.via===`index`?`code`:`genome`})]},`${e.file}:${e.line}:${t}`)})}):null,e.alsoIn.length>0?(0,z.jsxs)(`p`,{className:R.meta,children:[`Also relevant: `,e.alsoIn.map(e=>e.repoName).join(`, `)]}):null]})}function fe({repo:e,rows:t,gate:n,target:r,onChoose:i,onNotice:a,onView:o,openCite:s}){let u=(0,T.useMemo)(()=>K(e.key),[e.key]),p=c(u,{freshMs:5e3}),m=l(u),g=l(G),v=p.data,x=v?.status,S=v?.job??null,C=S?.state===`running`;f(m,ce,{enabled:C});let[w,E]=(0,T.useState)(!1),[D,O]=(0,T.useState)(`overview`),[k,N]=(0,T.useState)(0),[P,F]=(0,T.useState)(`pages`);(0,T.useEffect)(()=>{o(v??null)},[v,o]);let I=(0,T.useRef)(!1);(0,T.useEffect)(()=>{I.current&&!C&&(re(e.key,(x?.pages??[]).map(e=>e.id)),m(),g(),N(e=>e+1)),I.current=C},[C,e.key,x,m,g]);let B=(0,T.useMemo)(()=>A(x?.pages??[]),[x]),V=B.find(e=>e.page.id===D)?.page??B[0]?.page??null,H=M(x),U=async()=>{E(!0),a(null);try{await n.run(`Build the wiki for ${e.name}`,()=>ne(e.key))&&m()}catch(e){a({tone:`danger`,text:y(e)})}finally{E(!1)}};return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(`div`,{className:R.toolbar,children:[(0,z.jsxs)(`label`,{className:R.picker,children:[(0,z.jsx)(`span`,{className:R.visuallyHidden,children:`Repo`}),(0,z.jsx)(`select`,{value:e.key,onChange:e=>i(e.target.value),"aria-label":`Repo`,children:t.map(e=>(0,z.jsxs)(`option`,{value:e.key,children:[e.name,e.exists?``:` — no wiki yet`]},e.key))})]}),(0,z.jsx)(`span`,{className:R.badge,"data-tone":H.tone,"aria-label":`Freshness`,children:H.text}),x?.exists&&x.currentCommit&&x.currentCommit!==x.generatedCommit?(0,z.jsxs)(`span`,{className:R.meta,children:[`HEAD is `,j(x.currentCommit)]}):null,r===`github`&&v&&!v.githubUrl?(0,z.jsx)(`span`,{className:R.meta,children:`No GitHub origin — citations open in your editor`}):null,(0,z.jsx)(`span`,{className:R.spacer}),x?.exists?(0,z.jsx)(h,{variant:`subtle`,size:`sm`,icon:(0,z.jsx)(_,{size:14}),busy:w||C,disabled:C,onClick:()=>void U(),children:x.stalePages>0||x.pendingPages>0?`Refresh stale pages`:`Check for changes`}):null]}),(0,z.jsxs)(`p`,{className:R.privacy,children:[`Local models first; Grok only where your grant and this repo allow it; never Claude. Pages live in `,(0,z.jsx)(`code`,{children:`~/.ashlr/knowledge/wiki`}),`, never in the repo.`]}),(0,z.jsxs)(`div`,{className:R.segmented,role:`group`,"aria-label":`Wiki view`,children:[(0,z.jsx)(`button`,{type:`button`,"aria-pressed":P===`pages`,onClick:()=>F(`pages`),children:`Pages`}),(0,z.jsx)(`button`,{type:`button`,"aria-pressed":P===`map`,onClick:()=>F(`map`),children:`Module map`})]}),S?(0,z.jsx)(`p`,{className:R.job,"data-state":S.state,role:`status`,"aria-live":`polite`,children:L(S)}):null,P===`map`?(0,z.jsx)(oe,{repoKey:e.key,onCite:(t,n)=>void s(t,e.key,v?.githubUrl??null,n)}):v===void 0&&!p.error?(0,z.jsxs)(`div`,{"aria-busy":`true`,"aria-label":`Loading wiki`,children:[(0,z.jsx)(d,{width:`30%`}),(0,z.jsx)(d,{width:`85%`})]}):p.error||!x?(0,z.jsx)(`p`,{className:R.banner,"data-tone":`danger`,children:p.error?y(p.error):`The wiki could not be read.`}):x.exists?(0,z.jsxs)(`div`,{className:R.body,children:[(0,z.jsx)(`nav`,{className:R.tree,"aria-label":`Wiki pages`,children:(0,z.jsx)(`ul`,{children:B.map(({page:e,depth:t})=>(0,z.jsx)(`li`,{"data-depth":t,children:(0,z.jsxs)(`button`,{type:`button`,"aria-current":V?.id===e.id?`page`:void 0,onClick:()=>O(e.id),children:[(0,z.jsx)(`span`,{className:R.treeTitle,children:e.title}),e.stale?(0,z.jsx)(`span`,{className:R.staleDot,role:`img`,"aria-label":`stale`,title:`Its code changed since this page was written`}):null]})},e.id))})}),V?(0,z.jsx)(pe,{repoKey:e.key,page:V,onPage:O,onCite:(t,n)=>void s(t,e.key,v?.githubUrl??null,n)},`${V.id}:${k}`):null]}):(0,z.jsx)(b,{title:`No wiki for ${e.name} yet`,body:`Build it once: overview, module map, key flows, data stores, commands and change guides, each with checked file:line citations. After that, only pages whose code changed are rewritten.`,action:(0,z.jsx)(h,{variant:`primary`,size:`sm`,busy:w||C,disabled:C,onClick:()=>void U(),children:`Build wiki`})})]})}function pe({repoKey:e,page:t,onPage:n,onCite:r}){let i=(0,T.useMemo)(()=>ee(e,t.id),[e,t.id]),a=c(i,{freshMs:6e4}),o=a.data;return(0,z.jsx)(`article`,{className:R.article,"aria-label":t.title,children:o===void 0&&!a.error?(0,z.jsxs)(`div`,{"aria-busy":`true`,children:[(0,z.jsx)(d,{width:`40%`}),(0,z.jsx)(d,{width:`90%`}),(0,z.jsx)(d,{width:`80%`})]}):a.error||!o?(0,z.jsx)(`p`,{className:R.banner,"data-tone":`danger`,children:a.error?y(a.error):`This page could not be read.`}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(`p`,{className:R.pageMeta,children:[`Written by `,N(o.meta.model),` at `,j(o.meta.commit),` · `,o.meta.citations,` citations`,o.meta.droppedCitations>0?` · ${o.meta.droppedCitations} unverifiable removed`:``,t.stale?` · stale: its code changed since`:``]}),(0,z.jsx)(B,{markdown:o.markdown,label:`Page text`,onCite:e=>r(e,o.meta.commit),onPage:n})]})})}function me(){return(0,z.jsx)(ue,{})}export{me as WikiSection};
2
+ //# sourceMappingURL=WikiSection-DeBKNqd6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WikiSection-DeBKNqd6.js","names":[],"sources":["../../../../../../src/core/knowledge/wiki/citations.ts","../../../../../../src/web-ui/routes/verse/wiki/wiki-model.ts","../../../../../../src/web-ui/routes/verse/wiki/Wiki.module.css","../../../../../../src/web-ui/routes/verse/wiki/WikiMarkdown.tsx","../../../../../../src/web-ui/routes/verse/wiki/wiki-queries.ts","../../../../../../src/web-ui/routes/verse/wiki/WikiGraph.module.css","../../../../../../src/web-ui/routes/verse/wiki/WikiGraph.tsx","../../../../../../src/web-ui/routes/verse/wiki/WikiView.tsx","../../../../../../src/web-ui/routes/verse/sections/WikiSection.tsx"],"sourcesContent":["/**\n * wiki/citations.ts — find, VERIFY and canonicalise file:line citations.\n *\n * Every citation that survives into a stored page or an Ask answer points at a\n * file that exists in the repo and a line inside it. Model output is treated as\n * a claim: `src/a.ts:40` is kept only when `src/a.ts` is a listed repo file\n * with at least 40 lines; otherwise the line reference is dropped (the path\n * stays as plain code text) and counted, so the UI can say how many were\n * removed. A bare basename (`a.ts:40`) is resolved when exactly one repo file\n * has that name.\n *\n * Canonical form in stored markdown: [src/a.ts:40-52](#cite:src/a.ts:40-52)\n * A fragment link, deliberately: the Verse renderer sanitises hrefs with\n * DOMPurify, which drops unknown schemes like `cite:`, but keeps fragments; the\n * wiki view intercepts `#cite:` clicks and opens the editor or GitHub.\n */\n\nimport type { WikiCitation } from './types.js';\n\nexport const CITE_PREFIX = '#cite:';\n\n/** Returns the line count of a repo file, or null when it is not a known file. */\nexport type LineCounter = (rel: string) => number | null | Promise<number | null>;\n\nexport interface VerifyResult {\n markdown: string;\n citations: WikiCitation[];\n dropped: number;\n}\n\nfunction encodePath(rel: string): string {\n return encodeURI(rel).replace(/\\(/g, '%28').replace(/\\)/g, '%29');\n}\n\nexport function citationLabel(c: WikiCitation): string {\n return c.endLine && c.endLine > c.line ? `${c.file}:${c.line}-${c.endLine}` : `${c.file}:${c.line}`;\n}\n\n/** The canonical markdown link for a verified citation. */\nexport function citationLink(c: WikiCitation): string {\n const span = c.endLine && c.endLine > c.line ? `${c.line}-${c.endLine}` : `${c.line}`;\n return `[${citationLabel(c)}](${CITE_PREFIX}${encodePath(c.file)}:${span})`;\n}\n\n/** Parse the href of a canonical citation link (used by the UI and tests). */\nexport function parseCitationHref(href: string): WikiCitation | null {\n if (!href.startsWith(CITE_PREFIX)) return null;\n const body = href.slice(CITE_PREFIX.length);\n const m = /^(.+):(\\d{1,7})(?:-(\\d{1,7}))?$/.exec(body);\n if (!m) return null;\n let file: string;\n try {\n file = decodeURI(m[1]!).replace(/%28/g, '(').replace(/%29/g, ')');\n } catch {\n return null;\n }\n if (!file || file.startsWith('/') || file.split('/').includes('..')) return null;\n const line = Number(m[2]);\n const endLine = m[3] ? Number(m[3]) : undefined;\n if (line < 1) return null;\n return { file, line, ...(endLine && endLine > line ? { endLine } : {}) };\n}\n\n// A path with an extension, then `:12`, `:12-20`, `#L12`, `#L12-L20`.\nconst PATH = String.raw`((?:[\\w@+.-]+\\/)*[\\w@+-][\\w@+.-]*\\.[A-Za-z0-9]{1,10})`;\nconst SPAN = String.raw`(?::|#L)(\\d{1,7})(?:\\s?(?:-|–|:|-L)\\s?L?(\\d{1,7}))?`;\n/** An already-linked citation from a previous pass (kept as-is on re-verify). */\nconst CANONICAL_RE = /\\[([^\\]\\n]{1,300})\\]\\(#cite:([^)\\s]{1,400})\\)/g;\n/** A model-made markdown link whose label or target is a citation. */\nconst MD_LINK_RE = /\\[([^\\]\\n]{1,300})\\]\\(([^)\\s]{1,400})\\)/g;\n/** Bare, bracketed or inline-code citations. */\nconst BARE_RE = new RegExp(String.raw`(?<![\\w/:.@-])(\\[|\\x60)?${PATH}${SPAN}(\\]|\\x60)?(?![\\w/])`, 'g');\n\ninterface Parsed {\n file: string;\n line: number;\n endLine?: number;\n}\n\nfunction parseLoose(text: string): Parsed | null {\n const m = new RegExp(String.raw`^\\x60?${PATH}${SPAN}\\x60?$`).exec(text.trim());\n if (!m) return null;\n const line = Number(m[2]);\n const end = m[3] ? Number(m[3]) : undefined;\n return { file: m[1]!.replace(/^\\.\\//, ''), line, ...(end !== undefined && end > line ? { endLine: end } : {}) };\n}\n\n/** Split markdown into fenced-code and prose segments; citations are only rewritten in prose. */\nfunction segments(md: string): Array<{ code: boolean; text: string }> {\n const out: Array<{ code: boolean; text: string }> = [];\n const re = /^(```|~~~)[^\\n]*\\n[\\s\\S]*?^\\1[^\\n]*$/gm;\n let last = 0;\n for (const m of md.matchAll(re)) {\n if (m.index! > last) out.push({ code: false, text: md.slice(last, m.index) });\n out.push({ code: true, text: m[0] });\n last = m.index! + m[0].length;\n }\n if (last < md.length) out.push({ code: false, text: md.slice(last) });\n return out;\n}\n\nexport interface CitationResolver {\n /** All listed repo files (for basename resolution). */\n files: readonly string[];\n lines: LineCounter;\n}\n\n/** Exact read-index check shared by prose citations and local graph evidence. */\nexport function checkedCitation(c: WikiCitation, count: number | null): WikiCitation | null {\n if (typeof c.file !== 'string' || !c.file || c.file.startsWith('/') || /^[A-Za-z]:/.test(c.file)\n || c.file.includes('\\\\') || Array.from(c.file).some((character) => character.charCodeAt(0) < 32)\n || c.file.split('/').some((part) => part === '..' || part === '.')\n || count === null || !Number.isInteger(count) || count < 1\n || !Number.isInteger(c.line) || c.line < 1 || c.line > count\n || (c.endLine !== undefined && (!Number.isInteger(c.endLine) || c.endLine < c.line))) return null;\n const endLine = c.endLine === undefined ? undefined : Math.min(c.endLine, count);\n return { file: c.file, line: c.line, ...(endLine !== undefined && endLine > c.line ? { endLine } : {}) };\n}\n\nasync function verifyOne(p: Parsed, resolver: CitationResolver, byBase: Map<string, string[]>): Promise<WikiCitation | null> {\n let file = p.file;\n let count = await resolver.lines(file);\n if (count === null && !file.includes('/')) {\n const matches = byBase.get(file) ?? [];\n if (matches.length === 1) {\n file = matches[0]!;\n count = await resolver.lines(file);\n }\n }\n return checkedCitation({ ...p, file }, count);\n}\n\nasync function replaceAsync(text: string, re: RegExp, fn: (m: RegExpMatchArray) => Promise<string>): Promise<string> {\n const matches = [...text.matchAll(re)];\n if (matches.length === 0) return text;\n const reps = await Promise.all(matches.map(fn));\n let out = '';\n let last = 0;\n matches.forEach((m, i) => {\n out += text.slice(last, m.index) + reps[i];\n last = m.index! + m[0].length;\n });\n return out + text.slice(last);\n}\n\n/**\n * Verify and canonicalise every citation in `markdown`. Unverifiable citations\n * lose their line reference (the path stays as `code`) and are counted in\n * `dropped`. Idempotent over its own output.\n */\nexport async function verifyCitations(markdown: string, resolver: CitationResolver): Promise<VerifyResult> {\n const byBase = new Map<string, string[]>();\n for (const f of resolver.files) {\n const base = f.slice(f.lastIndexOf('/') + 1);\n const list = byBase.get(base) ?? [];\n list.push(f);\n byBase.set(base, list);\n }\n const citations: WikiCitation[] = [];\n let dropped = 0;\n // Placeholders keep rewritten links from being matched again by later passes.\n const held: string[] = [];\n const hold = (s: string): string => {\n held.push(s);\n return `\\u0000${held.length - 1}\\u0000`;\n };\n const keep = (c: WikiCitation): string => {\n citations.push(c);\n return hold(citationLink(c));\n };\n\n const parts = await Promise.all(\n segments(markdown).map(async (seg) => {\n if (seg.code) return seg.text;\n let text = seg.text;\n text = await replaceAsync(text, CANONICAL_RE, async (m) => {\n const parsed = parseCitationHref(`${CITE_PREFIX}${m[2]}`);\n const ok = parsed ? await verifyOne(parsed, resolver, byBase) : null;\n if (ok) return keep(ok);\n dropped++;\n return hold(`\\`${parsed?.file ?? m[1]}\\``);\n });\n text = await replaceAsync(text, MD_LINK_RE, async (m) => {\n const parsed = parseLoose(m[2]!) ?? parseLoose(m[1]!);\n if (!parsed) return m[0];\n const ok = await verifyOne(parsed, resolver, byBase);\n if (ok) return keep(ok);\n dropped++;\n return hold(`\\`${parsed.file}\\``);\n });\n text = await replaceAsync(text, BARE_RE, async (m) => {\n const [, open, file, line, end, close] = m;\n const parsed: Parsed = { file: file!.replace(/^\\.\\//, ''), line: Number(line), ...(end && Number(end) > Number(line) ? { endLine: Number(end) } : {}) };\n const ok = await verifyOne(parsed, resolver, byBase);\n // Unbalanced wrappers (`[a.ts:1` / `a.ts:1]`) are not ours to eat.\n const lead = open && !close ? open : '';\n const trail = close && !open ? close : '';\n if (ok) return lead + keep(ok) + trail;\n dropped++;\n return `${lead}${hold(`\\`${parsed.file}\\``)}${trail}`;\n });\n return text;\n }),\n );\n // eslint-disable-next-line no-control-regex\n const markdownOut = parts.join('').replace(/\\u0000(\\d+)\\u0000/g, (_s, i: string) => held[Number(i)] ?? '');\n return { markdown: markdownOut, citations, dropped };\n}\n\n/** Collect canonical citations already present in stored markdown (no verification). */\nexport function collectCitations(markdown: string): WikiCitation[] {\n const out: WikiCitation[] = [];\n for (const m of markdown.matchAll(CANONICAL_RE)) {\n const c = parseCitationHref(`${CITE_PREFIX}${m[2]}`);\n if (c) out.push(c);\n }\n return out;\n}\n","/**\n * routes/verse/wiki/wiki-model.ts — pure helpers for the Wiki section:\n * the page tree, the freshness line, citation links (editor / GitHub), and\n * matching a ⌘K project to a wiki repo. No React, no fetch.\n */\nimport { parseCitationHref } from '../../../../core/knowledge/wiki/citations.js';\nimport type { WikiCitation, WikiRepoView, WikiReposView, WikiStatus } from '../../../../core/knowledge/wiki/types.js';\n\nexport { parseCitationHref };\n\nexport type WikiRepoRow = WikiReposView['repos'][number];\nexport type WikiTreePage = WikiStatus['pages'][number];\n\n/** Pages in reading order: each top-level page followed by its children (depth-first). */\nexport function pageTree(pages: readonly WikiTreePage[]): Array<{ page: WikiTreePage; depth: number }> {\n const ids = new Set(pages.map((p) => p.id));\n const children = new Map<string, WikiTreePage[]>();\n const roots: WikiTreePage[] = [];\n for (const p of pages) {\n if (p.parent && ids.has(p.parent) && p.parent !== p.id) {\n const list = children.get(p.parent) ?? [];\n list.push(p);\n children.set(p.parent, list);\n } else {\n roots.push(p);\n }\n }\n const out: Array<{ page: WikiTreePage; depth: number }> = [];\n const seen = new Set<string>();\n const walk = (p: WikiTreePage, depth: number): void => {\n if (seen.has(p.id)) return;\n seen.add(p.id);\n out.push({ page: p, depth });\n for (const c of children.get(p.id) ?? []) walk(c, Math.min(depth + 1, 3));\n };\n for (const r of roots) walk(r, 0);\n // Anything unreachable (a parent cycle) still shows, at the top level.\n for (const p of pages) if (!seen.has(p.id)) walk(p, 0);\n return out;\n}\n\nexport function shortSha(sha: string | null): string {\n return sha ? sha.slice(0, 7) : 'no commit';\n}\n\nexport type FreshnessTone = 'success' | 'warning' | 'neutral';\n\n/** \"Generated at abc1234 · 3 pages stale\" — the badge next to the repo picker. */\nexport function freshness(status: WikiStatus | undefined): { text: string; tone: FreshnessTone } {\n if (!status || !status.exists) return { text: 'Not built yet', tone: 'neutral' };\n const at = `Generated at ${shortSha(status.generatedCommit)}`;\n if (status.stalePages === 0) return { text: `${at} · fresh`, tone: 'success' };\n const n = status.stalePages;\n return { text: `${at} · ${n} ${n === 1 ? 'page' : 'pages'} stale`, tone: 'warning' };\n}\n\n/** Who wrote a page, in operator words. */\nexport function modelLabel(model: string): string {\n if (model === 'facts-only') return 'repository facts only (no model)';\n const [engine, ...rest] = model.split(':');\n const name = rest.join(':') || engine || model;\n if (engine === 'local') return `${name} (local)`;\n if (engine === 'grok') return `Grok (${name})`;\n return model;\n}\n\n/** `https://github.com/o/r/blob/<sha>/<path>#L10-L12`, or null without a GitHub origin or commit. */\nexport function githubCitationUrl(githubUrl: string | null, commit: string | null, cite: WikiCitation): string | null {\n if (!githubUrl || !commit || !/^https:\\/\\/github\\.com\\/[\\w.-]+\\/[\\w.-]+$/.test(githubUrl)) return null;\n const path = cite.file.split('/').map(encodeURIComponent).join('/');\n const lines = cite.endLine && cite.endLine > cite.line ? `#L${cite.line}-L${cite.endLine}` : `#L${cite.line}`;\n return `${githubUrl}/blob/${commit}/${path}${lines}`;\n}\n\n/** The wiki repo a ⌘K project names (paths may both be `~`-collapsed by the server). */\nexport function repoForProject(repos: readonly WikiRepoRow[], projectPath: string | null): WikiRepoRow | null {\n if (!projectPath) return null;\n const norm = (p: string) => p.replace(/\\/+$/, '');\n const exact = repos.find((r) => norm(r.repo) === norm(projectPath));\n if (exact) return exact;\n const base = norm(projectPath).split('/').pop();\n const byName = repos.filter((r) => r.name === base);\n return byName.length === 1 ? byName[0]! : null;\n}\n\n/** The repo to show first: a remembered one, else the first with a wiki, else the first. */\nexport function initialRepo(repos: readonly WikiRepoRow[], remembered: string | null): WikiRepoRow | null {\n return repos.find((r) => r.key === remembered) ?? repos.find((r) => r.exists) ?? repos[0] ?? null;\n}\n\n/** A job line: \"Building… 3 of 9 (modules)\". */\nexport function jobLine(job: WikiRepoView['job']): string | null {\n if (!job) return null;\n if (job.state === 'running') {\n const { index, total, page } = job.progress;\n return total > 0 ? `Building… ${index} of ${total}${page ? ` (${page})` : ''}` : 'Building… reading the repo';\n }\n if (job.state === 'failed') return `Build failed: ${job.error ?? 'unknown error'}`;\n const s = job.summary;\n if (!s) return 'Build finished.';\n const parts = [`${s.generated} written`, `${s.skippedFresh} already fresh`];\n if (s.deferred > 0) parts.push(`${s.deferred} left for next time (${s.budgetStop ?? 'budget'} budget)`);\n return `Build finished: ${parts.join(' · ')}${s.modelNote ? ` — ${s.modelNote}` : ''}`;\n}\n","/*\n * Repo wiki (3.15) — the Apps & Accounts page frame (one centred column),\n * widened for reading: a page tree on the left, the page on the right.\n * Tokens only (DESIGN.md §13; style-scan-310 enforces it): no raw colour, no\n * px font size. At the compact width the tree stacks above the page.\n */\n\n.section {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--bg-canvas);\n}\n\n.scroll {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: var(--space-6) var(--space-4) var(--space-12);\n /* Same traffic-light allowance as Apps (see Apps.module.css). */\n padding-left: max(var(--space-4), calc(var(--app-traffic-light-inset, 0px) - var(--rail-width, 56px)));\n}\n\n.page {\n container-type: inline-size;\n max-width: 1080px;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: var(--space-4);\n}\n\n.header {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-end;\n justify-content: space-between;\n gap: var(--space-3) var(--space-4);\n margin-bottom: var(--space-2);\n}\n.headerText {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n max-width: var(--measure-read);\n}\n.title {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-xl-size);\n line-height: var(--text-xl-line);\n letter-spacing: var(--tracking-display);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.lede {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n\n.toolbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2) var(--space-3);\n}\n.spacer {\n flex: 1;\n}\n.picker select {\n height: var(--control-h-sm);\n max-width: 320px;\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n}\n.picker select:focus-visible {\n outline: none;\n box-shadow: var(--shadow-focus-ring);\n}\n\n.badge {\n display: inline-flex;\n align-items: center;\n min-height: var(--control-h-xs);\n padding: 0 var(--space-2);\n border-radius: var(--radius-full);\n background: var(--status-neutral-bg);\n color: var(--status-neutral-fg);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-weight: var(--font-weight-medium);\n white-space: nowrap;\n}\n.badge[data-tone='success'] {\n background: var(--status-success-bg);\n color: var(--status-success-fg);\n}\n.badge[data-tone='warning'] {\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n}\n\n.meta {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.segmented {\n display: inline-flex;\n padding: var(--space-px);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-surface);\n}\n.segmented button {\n min-height: var(--control-h-xs);\n padding: 0 var(--space-3);\n border-radius: var(--radius-xs);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n transition: background var(--duration-fast) var(--ease-standard);\n}\n.segmented button[aria-checked='true'],\n.segmented button[aria-pressed='true'] {\n background: var(--bg-selected);\n color: var(--text-primary);\n}\n.segmented button:disabled {\n color: var(--text-disabled);\n}\n.segmented button:focus-visible {\n outline: none;\n box-shadow: var(--shadow-focus-ring);\n}\n\n.privacy {\n margin: 0;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n color: var(--text-tertiary);\n}\n.privacy code,\n.lede code {\n font-family: var(--font-mono);\n font-size: 0.92em;\n}\n\n.banner {\n margin: 0;\n padding: var(--space-3) var(--space-4);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n background: var(--bg-surface);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n.banner[data-tone='danger'] {\n border-color: color-mix(in srgb, var(--status-danger-solid) 40%, var(--border-subtle));\n color: var(--status-danger-fg);\n}\n\n.job {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n border-left: 2px solid var(--status-running-solid);\n border-radius: 0 var(--radius-sm) var(--radius-sm) 0;\n background: var(--status-running-bg);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n}\n.job[data-state='done'] {\n border-left-color: var(--status-success-solid);\n background: var(--status-success-bg);\n}\n.job[data-state='failed'] {\n border-left-color: var(--status-danger-solid);\n background: var(--status-danger-bg);\n}\n\n/* ── Ask ────────────────────────────────────────────────────────────── */\n\n.ask {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding: var(--space-1) var(--space-1) var(--space-1) var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-md);\n background: var(--bg-input);\n color: var(--text-tertiary);\n}\n.ask:focus-within {\n border-color: var(--border-focus);\n box-shadow: var(--shadow-focus-ring);\n}\n.ask input[type='text'] {\n flex: 1;\n min-width: 0;\n height: var(--control-h-sm);\n border: 0;\n background: transparent;\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n}\n.ask input[type='text']:focus {\n outline: none;\n}\n.scope {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n white-space: nowrap;\n}\n\n.answer {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n padding: var(--space-4);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n background: var(--bg-surface);\n}\n.answerHead {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n}\n.sources {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-1) var(--space-3);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.sources li {\n display: inline-flex;\n align-items: baseline;\n gap: var(--space-1);\n}\n.cite {\n padding: 0;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-link);\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n.cite:focus-visible {\n outline: none;\n box-shadow: var(--shadow-focus-ring);\n border-radius: var(--radius-xs);\n}\n\n/* ── Tree + page ────────────────────────────────────────────────────── */\n\n.body {\n display: grid;\n grid-template-columns: minmax(180px, 240px) minmax(0, 1fr);\n gap: var(--space-6);\n align-items: start;\n}\n@container (max-width: 640px) {\n .body {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n\n.tree {\n position: sticky;\n top: 0;\n}\n.tree ul {\n display: flex;\n flex-direction: column;\n gap: var(--space-px);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.tree li[data-depth='1'] {\n padding-inline-start: var(--space-3);\n}\n.tree li[data-depth='2'],\n.tree li[data-depth='3'] {\n padding-inline-start: var(--space-6);\n}\n.tree button {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n width: 100%;\n min-height: var(--control-h-sm);\n padding: 0 var(--space-2);\n border-radius: var(--radius-sm);\n text-align: left;\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n transition: background var(--duration-fast) var(--ease-standard);\n}\n.tree button:hover {\n background: var(--bg-hover);\n}\n.tree button[aria-current='page'] {\n background: var(--bg-selected);\n color: var(--text-primary);\n font-weight: var(--font-weight-medium);\n}\n.tree button:focus-visible {\n outline: none;\n box-shadow: var(--shadow-focus-ring);\n}\n.treeTitle {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.staleDot {\n flex: none;\n width: var(--space-2);\n height: var(--space-2);\n border-radius: var(--radius-full);\n background: var(--status-warning-solid);\n}\n\n.article {\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n}\n.pageMeta {\n margin: 0;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n/* Page / answer prose: the chat's Markdown rhythm, reading width. */\n.markdown {\n max-width: var(--measure-read);\n color: var(--text-primary);\n font-size: var(--text-base-size);\n line-height: var(--text-base-line-relaxed);\n overflow-wrap: anywhere;\n}\n.markdown > * + * {\n margin-top: var(--space-4);\n}\n.markdown > :first-child {\n margin-top: 0;\n}\n.markdown p {\n margin: 0;\n}\n.markdown h1,\n.markdown h2,\n.markdown h3 {\n font-family: var(--font-display);\n letter-spacing: var(--tracking-display);\n font-weight: var(--font-weight-semibold);\n margin-top: var(--space-6);\n margin-bottom: calc(-1 * var(--space-1));\n}\n.markdown h1 {\n font-size: var(--text-xl-size);\n line-height: var(--text-xl-line);\n}\n.markdown h2 {\n font-size: var(--text-lg-size);\n line-height: var(--text-lg-line);\n}\n.markdown h3 {\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n}\n.markdown ul,\n.markdown ol {\n padding-left: 1.5em;\n margin-block: 0;\n}\n.markdown li + li {\n margin-top: var(--space-1);\n}\n.markdown li::marker {\n color: var(--text-tertiary);\n}\n.markdown blockquote {\n margin: 0;\n padding-left: var(--space-4);\n border-left: 2px solid var(--border-strong);\n color: var(--text-secondary);\n}\n.markdown a {\n color: var(--text-link);\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n/* Citations: the link text IS the file:line — set it in mono so it scans as code. */\n.markdown a[href^='#cite:'] {\n font-family: var(--font-mono);\n font-size: 0.86em;\n text-decoration-style: dotted;\n}\n.markdown a:focus-visible {\n outline: none;\n box-shadow: var(--shadow-focus-ring);\n border-radius: var(--radius-xs);\n}\n.markdown code {\n font-family: var(--font-mono);\n font-size: 0.92em;\n background: var(--bg-code);\n border-radius: var(--radius-xs);\n padding: 0.1em 0.3em;\n}\n.markdown pre {\n margin: 0;\n padding: var(--space-3);\n overflow-x: auto;\n border-radius: var(--radius-sm);\n background: var(--bg-code);\n}\n.markdown pre code {\n padding: 0;\n background: none;\n}\n.markdown table {\n display: block;\n max-width: 100%;\n overflow-x: auto;\n border-collapse: collapse;\n font-size: var(--text-sm-size);\n}\n.markdown th,\n.markdown td {\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n text-align: left;\n vertical-align: top;\n}\n.markdown th {\n border-bottom-color: var(--border-default);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n.markdown tr:last-child td {\n border-bottom: 0;\n}\n\n.visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n","/**\n * routes/verse/wiki/WikiMarkdown.tsx — a wiki page (or an Ask answer) as\n * Markdown, with clickable citations.\n *\n * Rendering is the chat's renderer (marked + DOMPurify, MessageMarkdownRenderer):\n * the stored page is already secret-scrubbed on the server and is still\n * treated as untrusted HTML here. Citations arrive as fragment links —\n * `#cite:src/a.ts:10-12` and `#page:modules` — which DOMPurify keeps (unknown\n * schemes would be stripped); one delegated click handler turns them into\n * \"open at that line\" / \"go to that page\" instead of navigation.\n */\nimport { useMemo, type MouseEvent } from 'react';\nimport { renderMarkdown } from '../MessageMarkdownRenderer.js';\nimport type { WikiCitation } from '../../../../core/knowledge/wiki/types.js';\nimport { parseCitationHref } from './wiki-model.js';\nimport styles from './Wiki.module.css';\n\nexport interface WikiMarkdownProps {\n markdown: string;\n onCite: (cite: WikiCitation) => void;\n onPage?: (id: string) => void;\n label?: string;\n}\n\nexport function WikiMarkdown({ markdown, onCite, onPage, label }: WikiMarkdownProps) {\n const html = useMemo(() => renderMarkdown(markdown), [markdown]);\n const onClick = (event: MouseEvent<HTMLDivElement>) => {\n const anchor = (event.target as HTMLElement | null)?.closest('a');\n const href = anchor?.getAttribute('href') ?? '';\n if (href.startsWith('#cite:')) {\n event.preventDefault();\n const cite = parseCitationHref(href);\n if (cite) onCite(cite);\n } else if (href.startsWith('#page:')) {\n event.preventDefault();\n const id = href.slice('#page:'.length);\n if (/^[a-z0-9][a-z0-9-]{0,95}$/.test(id)) onPage?.(id);\n }\n };\n return (\n // Clicks are delegated to the links inside; the links themselves are the\n // focusable, keyboard-operable elements (Enter on a link fires click).\n <div className={styles.markdown} aria-label={label} onClick={onClick} dangerouslySetInnerHTML={{ __html: html }} />\n );\n}\n","/**\n * routes/verse/wiki/wiki-queries.ts — the reads and writes behind the Wiki\n * section (core/verse/wiki-api.ts).\n *\n * GET /api/verse/wiki → WikiReposView\n * GET /api/verse/wiki/repo/<key> → WikiRepoView (freshness + job)\n * GET /api/verse/wiki/repo/<key>/page/<id> → WikiPageView\n * POST /api/verse/wiki/repo/<key>/build → 202 {job} (background)\n * POST /api/verse/wiki/ask → WikiAskResult (a model may run)\n * POST /api/verse/wiki/open → {ok} (editor at a line)\n *\n * Reads spend nothing. Writes pull the held mutation token, touch the hold,\n * and invalidate what they change.\n */\nimport type {\n WikiAskResult,\n WikiGraphView,\n WikiJobView,\n WikiPageView,\n WikiRepoView,\n WikiReposView,\n} from '../../../../core/knowledge/wiki/types.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { apiGet, apiPost } from '../../../data/client.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\n\nexport const WIKI_PATH = '/api/verse/wiki';\nexport const WIKI_REPOS_KEY = 'verse-wiki-repos';\n\nconst repoKeyOf = (key: string) => `verse-wiki-repo:${key}`;\nconst pageKeyOf = (key: string, id: string) => `verse-wiki-page:${key}:${id}`;\n\nexport const wikiReposQuery: QueryDef<WikiReposView> = {\n key: WIKI_REPOS_KEY,\n fetch: (signal) => apiGet<WikiReposView>(WIKI_PATH, signal),\n};\n\nexport function wikiRepoQuery(key: string): QueryDef<WikiRepoView> {\n return { key: repoKeyOf(key), fetch: (signal) => apiGet<WikiRepoView>(`${WIKI_PATH}/repo/${encodeURIComponent(key)}`, signal) };\n}\n\nexport function wikiPageQuery(key: string, id: string): QueryDef<WikiPageView> {\n return {\n key: pageKeyOf(key, id),\n fetch: (signal) => apiGet<WikiPageView>(`${WIKI_PATH}/repo/${encodeURIComponent(key)}/page/${encodeURIComponent(id)}`, signal),\n };\n}\n\nexport function wikiGraphQuery(key: string): QueryDef<WikiGraphView> {\n return { key: `verse-wiki-graph:${key}`, fetch: (signal) => apiGet<WikiGraphView>(`${WIKI_PATH}/repo/${encodeURIComponent(key)}/graph`, signal) };\n}\n\nfunction token(): string {\n const t = getMutationToken();\n if (!t) throw new VerseMutationLockedError();\n return t;\n}\n\n/** Start a background build; returns the job as the server reports it. */\nexport async function startWikiBuild(key: string, opts: { force?: boolean } = {}): Promise<WikiJobView | null> {\n const res = await apiPost<{ job: WikiJobView | null }>(`${WIKI_PATH}/repo/${encodeURIComponent(key)}/build`, opts.force ? { force: true } : {}, token());\n touchMutationHold();\n invalidate(repoKeyOf(key));\n invalidate(WIKI_REPOS_KEY);\n return res.job;\n}\n\n/** A finished build changes pages: drop every cached read for the repo. */\nexport function invalidateWikiRepo(key: string, pageIds: readonly string[]): void {\n invalidate(`verse-wiki-graph:${key}`);\n invalidate(repoKeyOf(key));\n invalidate(WIKI_REPOS_KEY);\n for (const id of pageIds) invalidate(pageKeyOf(key, id));\n}\n\nexport async function askWikiQuestion(question: string, repoKey: string | null): Promise<WikiAskResult> {\n const res = await apiPost<WikiAskResult>(`${WIKI_PATH}/ask`, repoKey ? { question, repoKey } : { question }, token());\n touchMutationHold();\n return res;\n}\n\nexport async function openWikiCitation(repoKey: string, file: string, line: number): Promise<void> {\n await apiPost<{ ok: true }>(`${WIKI_PATH}/open`, { repoKey, file, line }, token());\n touchMutationHold();\n}\n",".root { display: flex; flex-direction: column; gap: var(--space-3); min-width: 0; }\n.toolbar { display: flex; align-items: end; flex-wrap: wrap; gap: var(--space-3); color: var(--text-secondary); font-size: var(--text-sm-size); }\n.toolbar label { display: flex; flex-direction: column; gap: var(--space-1); flex: 1; min-width: 180px; }\n.toolbar input { width: 100%; box-sizing: border-box; padding: var(--space-2); border: 1px solid var(--border-default); border-radius: var(--radius-sm); background: var(--bg-input); color: var(--text-primary); font: inherit; }\n.toolbar button, .detail button { border: 0; background: transparent; color: var(--text-primary); font: inherit; cursor: pointer; text-align: left; padding: var(--space-1); overflow-wrap: anywhere; }\n.toolbar button { min-height: var(--control-h-sm); }\n.root button:focus-visible, .root input:focus-visible, .viewport:focus-visible { outline: 2px solid var(--border-focus); outline-offset: 3px; }\n.caption, .detail p, .coverage { margin: 0; font-size: var(--text-xs-size); line-height: var(--text-xs-line-relaxed); color: var(--text-secondary); }\n.layout { display: grid; grid-template-columns: minmax(0, 1fr) minmax(220px, 280px); gap: var(--space-4); }\n.viewport { min-width: 0; max-height: 480px; overflow: auto; border: 1px solid var(--border-default); border-radius: var(--radius-md); background: var(--bg-canvas); }\n.canvas { position: relative; width: 720px; }\n.canvas svg { position: absolute; inset: 0; pointer-events: none; }\n.canvas path { fill: none; stroke: var(--border-focus); stroke-width: 2; opacity: 0.65; }\n.node { position: absolute; transform: translate(-50%, -50%); width: 184px; min-height: 64px; display: flex; flex-direction: column; gap: var(--space-1); justify-content: center; padding: var(--space-2); border: 1px solid var(--border-default); border-radius: var(--radius-md); background: var(--bg-surface); color: var(--text-primary); font: inherit; cursor: pointer; text-align: left; overflow-wrap: anywhere; }\n.node span { font-size: var(--text-sm-size); font-weight: var(--font-weight-medium); }\n.node small { font-size: var(--text-xs-size); color: var(--text-secondary); }\n.node[aria-pressed='true'] { border-color: var(--border-focus); box-shadow: var(--shadow-focus-ring); background: var(--bg-hover); }\n.node[data-related='true'] { border-color: var(--border-focus); }\n.detail { min-width: 0; max-height: 480px; overflow-y: auto; padding: 0 var(--space-1); }\n.detail h3 { margin: 0 0 var(--space-2); font-size: var(--text-md-size); overflow-wrap: anywhere; }\n.detail h4 { margin: var(--space-4) 0 var(--space-1); font-size: var(--text-sm-size); }\n.detail ul { list-style: none; padding: 0; margin: 0; }\n.detail li { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-1); font-size: var(--text-xs-size); line-height: var(--text-xs-line-relaxed); }\n.detail li span { color: var(--text-tertiary); }\n.detail li.edge { display: block; margin-bottom: var(--space-2); }\n.edgeHeading { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-1); }\n.evidence { display: flex; flex-direction: column; align-items: flex-start; gap: var(--space-1); margin-left: var(--space-1); padding-left: var(--space-2); border-left: 1px solid var(--border-default); overflow-wrap: anywhere; }\n.detail button:hover { text-decoration: underline; }\n.coverage summary { cursor: pointer; }\n.coverage p { margin: var(--space-2) 0 0; }\n@container (max-width: 700px) { .layout { grid-template-columns: minmax(0, 1fr); } .detail { max-height: none; } .viewport { max-height: 360px; } }\n","import { useMemo, useState } from 'react';\nimport type { WikiCitation, WikiGraphEdge, WikiGraphView } from '../../../../core/knowledge/wiki/types.js';\nimport { citationLabel } from '../../../../core/knowledge/wiki/citations.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { describeContextError } from '../context/use-token-gate.js';\nimport { wikiGraphQuery } from './wiki-queries.js';\nimport styles from './WikiGraph.module.css';\n\nexport function WikiGraph({ repoKey, onCite }: { repoKey: string; onCite: (cite: WikiCitation, commit: string | null) => void }) {\n const def = useMemo(() => wikiGraphQuery(repoKey), [repoKey]);\n const q = useQuery(def, { freshMs: 15_000 });\n const refetch = useRefetch(def);\n if (!q.data && !q.error) return <p role=\"status\">Mapping local modules…</p>;\n if (q.error || !q.data) return <div role=\"alert\"><p>{q.error ? describeContextError(q.error) : 'The module map could not be read.'}</p><button type=\"button\" onClick={refetch}>Retry map</button></div>;\n return <WikiGraphCanvas graph={q.data} onCite={onCite} onRefresh={refetch} />;\n}\n\n/** A navigable overview plus an explicit list of dependencies for keyboard users. */\nexport function WikiGraphCanvas({ graph, onCite, onRefresh }: {\n graph: WikiGraphView;\n onCite: (cite: WikiCitation, commit: string | null) => void;\n onRefresh?: () => void;\n}) {\n const [search, setSearch] = useState('');\n const [chosen, setChosen] = useState<string | null>(null);\n const nodes = graph.nodes.filter((n) => `${n.id} ${n.files.map((f) => f.file).join(' ')} ${n.exports.map((e) => e.name).join(' ')}`.toLowerCase().includes(search.trim().toLowerCase()));\n const selected = nodes.find((n) => n.id === chosen) ?? nodes[0] ?? null;\n const positions = new Map(nodes.map((n, index) => [n.id, { x: 120 + (index % 3) * 240, y: 60 + Math.floor(index / 3) * 110 }]));\n const height = Math.max(130, Math.ceil(nodes.length / 3) * 110 + 20);\n const outgoing = graph.edges.filter((e) => e.from === selected?.id);\n const incoming = graph.edges.filter((e) => e.to === selected?.id);\n const related = new Set([...outgoing.map((e) => e.to), ...incoming.map((e) => e.from)]);\n const selectRelated = (id: string) => { setSearch(''); setChosen(id); };\n const evidence = graph.coverage.importEvidence;\n const incomplete = graph.coverage.listingIncomplete || graph.coverage.listingTruncated || graph.coverage.unreadFiles > 0 || graph.coverage.omittedModuleFiles > 0\n || (evidence ? evidence.unresolvedLocalImports > 0 || evidence.unsupportedSourceFiles > 0 || evidence.droppedCitations > 0 || evidence.omittedCitations > 0 || evidence.omittedModuleImports > 0 : graph.edges.length > 0);\n const dependency = (edge: WikiGraphEdge, id: string) => <li key={id} className={styles.edge}>\n <div className={styles.edgeHeading}><button type=\"button\" onClick={() => selectRelated(id)}>{id}</button><span>{edge.imports} imports · inferred</span></div>\n <div className={styles.evidence}>\n {edge.citations?.length ? edge.citations.map((cite) => <button type=\"button\" key={`${cite.file}:${cite.line}`} aria-label={`Open import ${citationLabel(cite)}`} onClick={() => onCite(cite, graph.commit)}>{citationLabel(cite)}</button>) : <span>{edge.citations === undefined ? 'Import line evidence unavailable; refresh the map.' : 'No checked import lines in this sample.'}</span>}\n {edge.omittedCitations ? <span>{edge.omittedCitations} additional import references are outside the citation sample.</span> : null}\n {edge.droppedCitations ? <span>{edge.droppedCitations} import citations failed the file or line check.</span> : null}\n </div>\n </li>;\n return (\n <section className={styles.root} aria-label=\"Codebase module map\">\n <div className={styles.toolbar}>\n <label>Find a module<input type=\"search\" aria-label=\"Find a module\" placeholder=\"Module, file or symbol…\" value={search} onChange={(e) => setSearch(e.target.value)} /></label>\n <span>{nodes.length} of {graph.nodes.length} modules</span>\n {onRefresh ? <button type=\"button\" onClick={onRefresh}>Refresh map</button> : null}\n </div>\n <p className={styles.caption}>Select a module to trace what it uses and what depends on it. This map is built locally without a model.</p>\n {evidence?.unresolvedLocalImports ? <p className={styles.caption} role=\"status\">{evidence.unresolvedLocalImports} detected local import references could not be resolved in the listed files. Some dependencies may be missing.</p> : null}\n {nodes.length === 0 ? <p role=\"status\">{graph.nodes.length ? 'No matching modules. Try a file name or clear the search.' : graph.coverage.listingIncomplete ? 'The repo listing could not be completed. Check local access and refresh the map.' : 'No readable modules were found in this repo.'}</p> : (\n <div className={styles.layout}>\n <div className={styles.viewport} tabIndex={0} aria-label=\"Scrollable dependency map\">\n <div className={styles.canvas} style={{ height }}>\n <svg width=\"720\" height={height} aria-hidden=\"true\">\n {[...outgoing, ...incoming].map((edge) => {\n const from = positions.get(edge.from); const to = positions.get(edge.to);\n return from && to ? <path key={`${edge.from}:${edge.to}`} d={`M${from.x},${from.y} C${from.x},${from.y + 55} ${to.x},${to.y - 55} ${to.x},${to.y}`} /> : null;\n })}\n </svg>\n {nodes.map((node) => {\n const point = positions.get(node.id)!;\n return <button type=\"button\" key={node.id} className={styles.node} style={{ left: point.x, top: point.y }} aria-pressed={selected?.id === node.id} data-related={related.has(node.id) || undefined} onClick={() => setChosen(node.id)}>\n <span>{node.id}</span><small>{node.sourceFiles} source files{node.testFiles ? `, ${node.testFiles} tests` : ''}</small>\n </button>;\n })}\n </div>\n </div>\n {selected ? <aside className={styles.detail} aria-label=\"Selected module\">\n <h3>{selected.id}</h3>\n <p>{selected.sourceFiles} source files and {selected.testFiles} tests</p>\n <h4>Uses</h4>\n {outgoing.length ? <ul>{outgoing.map((e) => dependency(e, e.to))}</ul> : <p>No cross-module imports found in the files read.</p>}\n <h4>Used by</h4>\n {incoming.length ? <ul>{incoming.map((e) => dependency(e, e.from))}</ul> : <p>No incoming imports found in the files read.</p>}\n <h4>Start reading</h4>\n {selected.files.length ? <ul>{selected.files.map((f) => <li key={f.file}><button type=\"button\" onClick={() => onCite({ file: f.file, line: 1 }, graph.commit)}>{f.file}:1</button></li>)}</ul> : <p>No source files from this module were read.</p>}\n {selected.exports.length ? <><h4>Exports</h4><ul>{selected.exports.map((e) => <li key={`${e.cite.file}:${e.cite.line}:${e.name}`}><button type=\"button\" onClick={() => onCite(e.cite, graph.commit)}>{e.name}</button><span>{e.kind}</span></li>)}</ul></> : null}\n </aside> : null}\n </div>\n )}\n <details className={styles.coverage}>\n <summary>{incomplete ? 'Partial coverage' : 'Coverage and evidence'}: {graph.coverage.readFiles} of {graph.coverage.listedFiles} listed files read</summary>\n <p>File names are extracted from the repo listing. Module groups and dependency links are inferred from directory structure and resolved import statements using pattern matching; they are not a complete runtime call graph.</p>\n <p>{graph.coverage.unreadFiles} listed files were not read; {graph.coverage.omittedModuleFiles} listed files are outside the displayed modules.{graph.coverage.listingTruncated ? ' The file listing reached its scan limit.' : ''}{graph.coverage.listingIncomplete ? ' Some directories could not be listed or reached the depth limit; this is not complete coverage.' : ''} Secrets, ignored paths, symlinks, binaries and generated dependencies are excluded.</p>\n {evidence ? <p>Detected local imports in read sources: {evidence.unresolvedLocalImports} unresolved. {evidence.unsupportedSourceFiles} read source files use languages without supported local import resolution. {evidence.checkedCitations} source-line citations passed the file and line checks; {evidence.droppedCitations} failed and were removed; {evidence.omittedCitations} additional references are outside the citation sample; {evidence.omittedModuleImports} resolved imports point outside the displayed modules. Citation samples retain at most four lines per dependency and 512 lines in total. Pattern matches can include comments or strings and do not prove runtime dependency behavior.</p> : <p>Import-resolution and source-line evidence is unavailable in this sample. Missing evidence does not mean zero unresolved imports. Refresh the map to check the read sources.</p>}\n <p>Sampled {new Date(graph.generatedAt).toLocaleString()}. Current working files, listed against {graph.commit ? graph.commit.slice(0, 8) : 'a local directory scan'}. Refreshes may reuse a sample for up to 15 seconds.</p>\n </details>\n </section>\n );\n}\n","/**\n * routes/verse/wiki/WikiView.tsx — the private repo wiki (3.15).\n *\n * One page: pick an enrolled repo, read its architecture pages (overview,\n * module map, key flows, data stores, commands, \"how to change X\"), click a\n * citation to open that file at that line (editor, or GitHub at the commit\n * the page was written at), and Ask the codebase with cited answers.\n *\n * Honest about freshness: \"Generated at abc1234 · 3 pages stale\" is computed\n * by the server from git blob ids, and a stale page is marked in the tree.\n * Building never blocks this view: the server runs it in the background and\n * this view polls the job while it runs.\n *\n * Split in three so each read only runs when it can succeed (the query hook\n * has no \"enabled\" flag): the view (repos, picker, Ask), the repo panel (one\n * repo's freshness, job and page tree) and the page panel (one page).\n */\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore, type FormEvent } from 'react';\nimport type { WikiAskResult, WikiCitation, WikiRepoView } from '../../../../core/knowledge/wiki/types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport { IconRefresh, IconSearch } from '../../../components/primitives/icons.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { describeContextError, useTokenGate, type TokenGate } from '../context/use-token-gate.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { WikiMarkdown } from './WikiMarkdown.js';\nimport { WikiGraph } from './WikiGraph.js';\nimport { getWikiFocus, isWikiFocusLive, subscribeWikiFocus, takeWikiFocus } from './wiki-focus.js';\nimport { freshness, githubCitationUrl, initialRepo, jobLine, modelLabel, pageTree, repoForProject, shortSha, type WikiRepoRow, type WikiTreePage } from './wiki-model.js';\nimport { askWikiQuestion, invalidateWikiRepo, openWikiCitation, startWikiBuild, wikiPageQuery, wikiRepoQuery, wikiReposQuery } from './wiki-queries.js';\nimport styles from './Wiki.module.css';\n\nconst REPO_STORAGE_KEY = 'verse.wiki.repo';\nconst TARGET_STORAGE_KEY = 'verse.wiki.citeTarget';\nexport const WIKI_JOB_POLL_MS = 2_500;\n\ntype CiteTarget = 'editor' | 'github';\ntype Notice = { tone: 'neutral' | 'danger'; text: string } | null;\n\nfunction readStored(key: string): string | null {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction writeStored(key: string, value: string): void {\n try {\n localStorage.setItem(key, value);\n } catch {\n // private mode / quota: the choice just is not remembered\n }\n}\n\nfunction citeLabel(c: WikiCitation): string {\n return c.endLine && c.endLine > c.line ? `${c.file}:${c.line}-${c.endLine}` : `${c.file}:${c.line}`;\n}\n\n/** Open a citation: GitHub at the page's commit when chosen and possible, else the editor (gated). */\nfunction useCitationOpener(gate: TokenGate, target: CiteTarget, setNotice: (n: Notice) => void) {\n return useCallback(\n async (cite: WikiCitation, repoKey: string | null, githubUrl: string | null, commit: string | null) => {\n const url = target === 'github' ? githubCitationUrl(githubUrl, commit, cite) : null;\n if (url) {\n window.open(url, '_blank', 'noopener,noreferrer');\n return;\n }\n if (!repoKey) return;\n try {\n const done = await gate.run(`Open ${citeLabel(cite)} in your editor`, async () => {\n await openWikiCitation(repoKey, cite.file, cite.line);\n return true;\n });\n if (done) setNotice({ tone: 'neutral', text: `Opened ${citeLabel(cite)} in your editor.` });\n } catch (err) {\n setNotice({ tone: 'danger', text: describeContextError(err) });\n }\n },\n [gate, target, setNotice],\n );\n}\n\nexport function WikiView() {\n const repos = useQuery(wikiReposQuery);\n const gate = useTokenGate();\n const rows = useMemo(() => repos.data?.repos ?? [], [repos.data]);\n\n const [chosenKey, setChosenKey] = useState<string | null>(() => readStored(REPO_STORAGE_KEY));\n const selected = useMemo(() => initialRepo(rows, chosenKey), [rows, chosenKey]);\n const [target, setTarget] = useState<CiteTarget>(() => (readStored(TARGET_STORAGE_KEY) === 'github' ? 'github' : 'editor'));\n const [notice, setNotice] = useState<Notice>(null);\n const [question, setQuestion] = useState('');\n const [allRepos, setAllRepos] = useState(false);\n const [asking, setAsking] = useState(false);\n const [answer, setAnswer] = useState<WikiAskResult | null>(null);\n const [repoView, setRepoView] = useState<WikiRepoView | null>(null);\n const askRef = useRef<HTMLInputElement>(null);\n const openCite = useCitationOpener(gate, target, setNotice);\n\n const chooseRepo = useCallback((next: string) => {\n setChosenKey(next);\n writeStored(REPO_STORAGE_KEY, next);\n setAnswer(null);\n }, []);\n\n // ⌘K hand-off: \"Open repo wiki…\" (a repo) / \"Ask the codebase…\" (focus Ask).\n const focus = useSyncExternalStore(subscribeWikiFocus, getWikiFocus, getWikiFocus);\n useEffect(() => {\n if (!focus || !repos.data) return;\n if (isWikiFocusLive(focus)) {\n const match = repoForProject(rows, focus.projectPath);\n if (match) chooseRepo(match.key);\n else if (focus.projectPath) setNotice({ tone: 'neutral', text: 'That project is not enrolled, so it has no wiki. Enroll it with `ashlr enroll add <path>`.' });\n if (focus.kind === 'ask') askRef.current?.focus();\n }\n takeWikiFocus(focus.seq);\n }, [focus, repos.data, rows, chooseRepo]);\n\n const onAsk = async (event: FormEvent) => {\n event.preventDefault();\n const q = question.trim();\n if (!q) return;\n setAsking(true);\n setNotice(null);\n try {\n const res = await gate.run('Ask the codebase', () => askWikiQuestion(q, allRepos ? null : selected?.key ?? null));\n if (res) setAnswer(res);\n } catch (err) {\n setNotice({ tone: 'danger', text: describeContextError(err) });\n } finally {\n setAsking(false);\n }\n };\n\n const setCiteTarget = (next: CiteTarget) => {\n setTarget(next);\n writeStored(TARGET_STORAGE_KEY, next);\n };\n\n // An answer's citations can link to GitHub only when it is about the repo on screen.\n const answerGithub = answer && repoView && answer.repoKey === selected?.key ? repoView.githubUrl : null;\n const answerCommit = answer && repoView && answer.repoKey === selected?.key ? repoView.status.generatedCommit : null;\n\n return (\n <section className={styles.section} aria-label=\"Repo wiki\">\n <div className={styles.scroll}>\n <div className={styles.page}>\n <header className={styles.header}>\n <div className={styles.headerText}>\n <h2 className={styles.title}>Repo wiki</h2>\n <p className={styles.lede}>\n Architecture pages for your enrolled repos, written on your own models and kept on this Mac. Every citation is checked against the code.\n </p>\n </div>\n <div className={styles.segmented} role=\"radiogroup\" aria-label=\"Citations open in\">\n <button type=\"button\" role=\"radio\" aria-checked={target === 'editor'} onClick={() => setCiteTarget('editor')}>Editor</button>\n <button type=\"button\" role=\"radio\" aria-checked={target === 'github'} onClick={() => setCiteTarget('github')}>GitHub</button>\n </div>\n </header>\n\n {repos.data === undefined && !repos.error ? (\n <div aria-busy=\"true\" aria-label=\"Loading repos\">\n <SkeletonLine width=\"40%\" />\n <SkeletonLine width=\"70%\" />\n </div>\n ) : repos.error ? (\n <p className={styles.banner} data-tone=\"danger\">{describeContextError(repos.error)}</p>\n ) : rows.length === 0 || !selected ? (\n <EmptyState\n title=\"No enrolled repos\"\n body={<>The wiki only reads repos you enrolled. Enroll one with <code>ashlr enroll add &lt;path&gt;</code>, then build its wiki here or with <code>ashlr wiki build</code>.</>}\n />\n ) : (\n <>\n <p className={notice ? styles.banner : styles.visuallyHidden} data-tone={notice?.tone} role=\"status\" aria-live=\"polite\">{notice?.text ?? ''}</p>\n\n <form className={styles.ask} onSubmit={(e) => void onAsk(e)} role=\"search\" aria-label=\"Ask the codebase\">\n <IconSearch size={14} />\n <input\n ref={askRef}\n type=\"text\"\n value={question}\n maxLength={1000}\n placeholder={allRepos ? 'Ask across every enrolled repo…' : `Ask ${selected.name}… e.g. “where are sessions persisted?”`}\n onChange={(e) => setQuestion(e.target.value)}\n aria-label=\"Question\"\n />\n <label className={styles.scope}>\n <input type=\"checkbox\" checked={allRepos} onChange={(e) => setAllRepos(e.target.checked)} />\n All repos\n </label>\n <Button type=\"submit\" variant=\"primary\" size=\"sm\" busy={asking} disabled={!question.trim()}>Ask</Button>\n </form>\n\n {answer ? (\n <AnswerCard\n answer={answer}\n onDismiss={() => setAnswer(null)}\n onCite={(c) => void openCite(c, answer.repoKey, answerGithub, answerCommit)}\n />\n ) : null}\n\n <WikiRepoPanel\n key={selected.key}\n repo={selected}\n rows={rows}\n gate={gate}\n target={target}\n onChoose={chooseRepo}\n onNotice={setNotice}\n onView={setRepoView}\n openCite={openCite}\n />\n </>\n )}\n </div>\n </div>\n <MutationTokenDialog\n open={gate.dialog.open}\n reason={gate.dialog.reason}\n tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\"\n onClose={gate.dialog.onClose}\n onUnlocked={gate.dialog.onUnlocked}\n />\n </section>\n );\n}\n\nfunction AnswerCard({ answer, onDismiss, onCite }: { answer: WikiAskResult; onDismiss: () => void; onCite: (c: WikiCitation) => void }) {\n const tone = answer.status === 'answered' ? 'success' : answer.status === 'extractive' ? 'neutral' : 'warning';\n const label = answer.status === 'answered' ? 'Answer' : answer.status === 'extractive' ? 'Best passages' : 'Not found';\n return (\n <div className={styles.answer} data-status={answer.status} aria-label=\"Answer\">\n <div className={styles.answerHead}>\n <span className={styles.badge} data-tone={tone}>{label}</span>\n {answer.repoName ? <span className={styles.meta}>{answer.repoName}</span> : null}\n {answer.engine !== 'none' ? <span className={styles.meta}>{modelLabel(answer.engine)}{answer.local ? '' : ' · left this Mac'}</span> : null}\n {answer.droppedCitations > 0 ? (\n <span className={styles.meta}>{answer.droppedCitations} unverifiable citation{answer.droppedCitations === 1 ? '' : 's'} removed</span>\n ) : null}\n <span className={styles.spacer} />\n <Button variant=\"ghost\" size=\"sm\" onClick={onDismiss}>Dismiss</Button>\n </div>\n <WikiMarkdown markdown={answer.answer} label=\"Answer text\" onCite={onCite} />\n {answer.sources.length > 0 ? (\n <ul className={styles.sources} aria-label=\"Sources\">\n {answer.sources.slice(0, 8).map((s, i) => {\n const cite: WikiCitation = { file: s.file, line: s.line, ...(s.endLine ? { endLine: s.endLine } : {}) };\n return (\n <li key={`${s.file}:${s.line}:${i}`}>\n <button type=\"button\" className={styles.cite} onClick={() => onCite(cite)}>{citeLabel(cite)}</button>\n <span className={styles.meta}>{s.via === 'wiki' ? s.title ?? 'wiki' : s.via === 'index' ? 'code' : 'genome'}</span>\n </li>\n );\n })}\n </ul>\n ) : null}\n {answer.alsoIn.length > 0 ? <p className={styles.meta}>Also relevant: {answer.alsoIn.map((a) => a.repoName).join(', ')}</p> : null}\n </div>\n );\n}\n\ninterface RepoPanelProps {\n repo: WikiRepoRow;\n rows: readonly WikiRepoRow[];\n gate: TokenGate;\n target: CiteTarget;\n onChoose: (key: string) => void;\n onNotice: (n: Notice) => void;\n onView: (v: WikiRepoView | null) => void;\n openCite: (cite: WikiCitation, repoKey: string | null, githubUrl: string | null, commit: string | null) => Promise<void>;\n}\n\nfunction WikiRepoPanel({ repo, rows, gate, target, onChoose, onNotice, onView, openCite }: RepoPanelProps) {\n const def = useMemo(() => wikiRepoQuery(repo.key), [repo.key]);\n const q = useQuery(def, { freshMs: 5_000 });\n const refetch = useRefetch(def);\n const refetchRepos = useRefetch(wikiReposQuery);\n const view = q.data;\n const status = view?.status;\n const job = view?.job ?? null;\n const running = job?.state === 'running';\n usePollWhileVisible(refetch, WIKI_JOB_POLL_MS, { enabled: running });\n const [building, setBuilding] = useState(false);\n const [pageId, setPageId] = useState('overview');\n const [pageEpoch, setPageEpoch] = useState(0);\n const [surface, setSurface] = useState<'pages' | 'map'>('pages');\n\n useEffect(() => {\n onView(view ?? null);\n }, [view, onView]);\n\n // A finished build changed pages: drop the cached reads it touched.\n const wasRunning = useRef(false);\n useEffect(() => {\n if (wasRunning.current && !running) {\n invalidateWikiRepo(repo.key, (status?.pages ?? []).map((p) => p.id));\n refetch();\n refetchRepos();\n setPageEpoch((n) => n + 1);\n }\n wasRunning.current = running;\n }, [running, repo.key, status, refetch, refetchRepos]);\n\n const tree = useMemo(() => pageTree(status?.pages ?? []), [status]);\n const active = tree.find((t) => t.page.id === pageId)?.page ?? tree[0]?.page ?? null;\n const fresh = freshness(status);\n\n const onBuild = async () => {\n setBuilding(true);\n onNotice(null);\n try {\n const started = await gate.run(`Build the wiki for ${repo.name}`, () => startWikiBuild(repo.key));\n if (started) refetch();\n } catch (err) {\n onNotice({ tone: 'danger', text: describeContextError(err) });\n } finally {\n setBuilding(false);\n }\n };\n\n return (\n <>\n <div className={styles.toolbar}>\n <label className={styles.picker}>\n <span className={styles.visuallyHidden}>Repo</span>\n <select value={repo.key} onChange={(e) => onChoose(e.target.value)} aria-label=\"Repo\">\n {rows.map((r) => (\n <option key={r.key} value={r.key}>{r.name}{r.exists ? '' : ' — no wiki yet'}</option>\n ))}\n </select>\n </label>\n <span className={styles.badge} data-tone={fresh.tone} aria-label=\"Freshness\">{fresh.text}</span>\n {status?.exists && status.currentCommit && status.currentCommit !== status.generatedCommit ? (\n <span className={styles.meta}>HEAD is {shortSha(status.currentCommit)}</span>\n ) : null}\n {target === 'github' && view && !view.githubUrl ? <span className={styles.meta}>No GitHub origin — citations open in your editor</span> : null}\n <span className={styles.spacer} />\n {status?.exists ? (\n <Button variant=\"subtle\" size=\"sm\" icon={<IconRefresh size={14} />} busy={building || running} disabled={running} onClick={() => void onBuild()}>\n {status.stalePages > 0 || status.pendingPages > 0 ? 'Refresh stale pages' : 'Check for changes'}\n </Button>\n ) : null}\n </div>\n\n <p className={styles.privacy}>\n Local models first; Grok only where your grant and this repo allow it; never Claude. Pages live in <code>~/.ashlr/knowledge/wiki</code>, never in the repo.\n </p>\n\n <div className={styles.segmented} role=\"group\" aria-label=\"Wiki view\">\n <button type=\"button\" aria-pressed={surface === 'pages'} onClick={() => setSurface('pages')}>Pages</button>\n <button type=\"button\" aria-pressed={surface === 'map'} onClick={() => setSurface('map')}>Module map</button>\n </div>\n\n {job ? <p className={styles.job} data-state={job.state} role=\"status\" aria-live=\"polite\">{jobLine(job)}</p> : null}\n\n {surface === 'map' ? (\n <WikiGraph repoKey={repo.key} onCite={(c, commit) => void openCite(c, repo.key, view?.githubUrl ?? null, commit)} />\n ) : view === undefined && !q.error ? (\n <div aria-busy=\"true\" aria-label=\"Loading wiki\">\n <SkeletonLine width=\"30%\" />\n <SkeletonLine width=\"85%\" />\n </div>\n ) : q.error || !status ? (\n <p className={styles.banner} data-tone=\"danger\">{q.error ? describeContextError(q.error) : 'The wiki could not be read.'}</p>\n ) : !status.exists ? (\n <EmptyState\n title={`No wiki for ${repo.name} yet`}\n body=\"Build it once: overview, module map, key flows, data stores, commands and change guides, each with checked file:line citations. After that, only pages whose code changed are rewritten.\"\n action={\n <Button variant=\"primary\" size=\"sm\" busy={building || running} disabled={running} onClick={() => void onBuild()}>\n Build wiki\n </Button>\n }\n />\n ) : (\n <div className={styles.body}>\n <nav className={styles.tree} aria-label=\"Wiki pages\">\n <ul>\n {tree.map(({ page: p, depth }) => (\n <li key={p.id} data-depth={depth}>\n <button type=\"button\" aria-current={active?.id === p.id ? 'page' : undefined} onClick={() => setPageId(p.id)}>\n <span className={styles.treeTitle}>{p.title}</span>\n {p.stale ? <span className={styles.staleDot} role=\"img\" aria-label=\"stale\" title=\"Its code changed since this page was written\" /> : null}\n </button>\n </li>\n ))}\n </ul>\n </nav>\n {active ? (\n <WikiPagePanel\n key={`${active.id}:${pageEpoch}`}\n repoKey={repo.key}\n page={active}\n onPage={setPageId}\n onCite={(c, commit) => void openCite(c, repo.key, view?.githubUrl ?? null, commit)}\n />\n ) : null}\n </div>\n )}\n </>\n );\n}\n\nfunction WikiPagePanel({ repoKey, page, onPage, onCite }: { repoKey: string; page: WikiTreePage; onPage: (id: string) => void; onCite: (c: WikiCitation, commit: string | null) => void }) {\n const def = useMemo(() => wikiPageQuery(repoKey, page.id), [repoKey, page.id]);\n const q = useQuery(def, { freshMs: 60_000 });\n const data = q.data;\n return (\n <article className={styles.article} aria-label={page.title}>\n {data === undefined && !q.error ? (\n <div aria-busy=\"true\">\n <SkeletonLine width=\"40%\" />\n <SkeletonLine width=\"90%\" />\n <SkeletonLine width=\"80%\" />\n </div>\n ) : q.error || !data ? (\n <p className={styles.banner} data-tone=\"danger\">{q.error ? describeContextError(q.error) : 'This page could not be read.'}</p>\n ) : (\n <>\n <p className={styles.pageMeta}>\n Written by {modelLabel(data.meta.model)} at {shortSha(data.meta.commit)} · {data.meta.citations} citations\n {data.meta.droppedCitations > 0 ? ` · ${data.meta.droppedCitations} unverifiable removed` : ''}\n {page.stale ? ' · stale: its code changed since' : ''}\n </p>\n <WikiMarkdown markdown={data.markdown} label=\"Page text\" onCite={(c) => onCite(c, data.meta.commit)} onPage={onPage} />\n </>\n )}\n </article>\n );\n}\n","/**\n * routes/verse/sections/WikiSection.tsx — the Repo wiki tray section (3.15).\n * Takes no props, per the shell contract; its own lazy chunk (the section\n * glob in shell/section-modules.ts), so the wiki — and the Markdown renderer\n * it shares with chat — never touch first paint. Reached from the gear tray\n * and from ⌘K (\"Open repo wiki…\", \"Ask the codebase…\").\n */\nimport { WikiView } from '../wiki/WikiView.js';\n\nexport function WikiSection() {\n return <WikiView />;\n}\n"],"mappings":"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"}