@ashlr/hub 3.11.3 → 3.12.0

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 (558) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +44 -18
  3. package/dist/authority-surface.json +74 -59
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/authority.d.ts +39 -0
  6. package/dist/cli/authority.js +222 -55
  7. package/dist/cli/authority.js.map +1 -1
  8. package/dist/cli/help.js +1 -1
  9. package/dist/cli/help.js.map +1 -1
  10. package/dist/cli/verse.d.ts +3 -0
  11. package/dist/cli/verse.js +10 -0
  12. package/dist/cli/verse.js.map +1 -1
  13. package/dist/core/authority/trust-roots.js +7 -1
  14. package/dist/core/authority/trust-roots.js.map +1 -1
  15. package/dist/core/authority/types.d.ts +2 -2
  16. package/dist/core/cloud/cloud-api.js +1 -1
  17. package/dist/core/cloud/cloud-api.js.map +1 -1
  18. package/dist/core/cloud/delivery-contract.d.ts +1 -1
  19. package/dist/core/cloud/delivery-contract.js +25 -15
  20. package/dist/core/cloud/delivery-contract.js.map +1 -1
  21. package/dist/core/cloud/store.js +6 -0
  22. package/dist/core/cloud/store.js.map +1 -1
  23. package/dist/core/cloud/tracker.d.ts +2 -0
  24. package/dist/core/cloud/tracker.js +140 -37
  25. package/dist/core/cloud/tracker.js.map +1 -1
  26. package/dist/core/cloud/types.d.ts +9 -1
  27. package/dist/core/cloud/types.js.map +1 -1
  28. package/dist/core/comms/dispatch.d.ts +5 -0
  29. package/dist/core/comms/dispatch.js +12 -1
  30. package/dist/core/comms/dispatch.js.map +1 -1
  31. package/dist/core/comms/requests.d.ts +27 -1
  32. package/dist/core/comms/requests.js +50 -1
  33. package/dist/core/comms/requests.js.map +1 -1
  34. package/dist/core/daemon/loop.d.ts +14 -0
  35. package/dist/core/daemon/loop.js +35 -0
  36. package/dist/core/daemon/loop.js.map +1 -1
  37. package/dist/core/fabric/claude-usage.js +23 -1
  38. package/dist/core/fabric/claude-usage.js.map +1 -1
  39. package/dist/core/fleet/dispatch-router.d.ts +7 -0
  40. package/dist/core/fleet/dispatch-router.js +4 -1
  41. package/dist/core/fleet/dispatch-router.js.map +1 -1
  42. package/dist/core/fleet/tick-hooks-live.d.ts +5 -1
  43. package/dist/core/fleet/tick-hooks-live.js +10 -1
  44. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  45. package/dist/core/local-runtime/llama/config.d.ts +14 -0
  46. package/dist/core/local-runtime/llama/config.js +20 -2
  47. package/dist/core/local-runtime/llama/config.js.map +1 -1
  48. package/dist/core/local-runtime/llama/process.d.ts +19 -0
  49. package/dist/core/local-runtime/llama/process.js +67 -17
  50. package/dist/core/local-runtime/llama/process.js.map +1 -1
  51. package/dist/core/local-runtime/llama/supervisor.js +14 -3
  52. package/dist/core/local-runtime/llama/supervisor.js.map +1 -1
  53. package/dist/core/observability/rollup.d.ts +12 -0
  54. package/dist/core/observability/rollup.js +37 -2
  55. package/dist/core/observability/rollup.js.map +1 -1
  56. package/dist/core/observability/usage-source.js +49 -1
  57. package/dist/core/observability/usage-source.js.map +1 -1
  58. package/dist/core/resources/connection-monitor.js +47 -4
  59. package/dist/core/resources/connection-monitor.js.map +1 -1
  60. package/dist/core/resources/engineering-mission-store.d.ts +1 -1
  61. package/dist/core/routing/headroom.js +7 -2
  62. package/dist/core/routing/headroom.js.map +1 -1
  63. package/dist/core/routing/router.d.ts +48 -0
  64. package/dist/core/routing/router.js +129 -13
  65. package/dist/core/routing/router.js.map +1 -1
  66. package/dist/core/run/best-of-n.d.ts +7 -0
  67. package/dist/core/run/best-of-n.js +3 -0
  68. package/dist/core/run/best-of-n.js.map +1 -1
  69. package/dist/core/run/harness-dispatch.d.ts +147 -0
  70. package/dist/core/run/harness-dispatch.js +234 -0
  71. package/dist/core/run/harness-dispatch.js.map +1 -0
  72. package/dist/core/run/orchestrator.js +3 -0
  73. package/dist/core/run/orchestrator.js.map +1 -1
  74. package/dist/core/run/provider-client.d.ts +8 -0
  75. package/dist/core/run/provider-client.js +4 -0
  76. package/dist/core/run/provider-client.js.map +1 -1
  77. package/dist/core/run/sandboxed-engine.d.ts +8 -0
  78. package/dist/core/run/sandboxed-engine.js +60 -7
  79. package/dist/core/run/sandboxed-engine.js.map +1 -1
  80. package/dist/core/types.d.ts +14 -0
  81. package/dist/core/types.js.map +1 -1
  82. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  83. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +188 -6
  84. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +187 -5
  85. package/dist/core/universe/firm-demo.d.ts +1 -1
  86. package/dist/core/universe/firm-graph.d.ts +2 -2
  87. package/dist/core/util/scrub.js +16 -3
  88. package/dist/core/util/scrub.js.map +1 -1
  89. package/dist/core/verse/accounts.d.ts +9 -1
  90. package/dist/core/verse/accounts.js +52 -11
  91. package/dist/core/verse/accounts.js.map +1 -1
  92. package/dist/core/verse/apps-api.d.ts +12 -0
  93. package/dist/core/verse/apps-api.js +22 -4
  94. package/dist/core/verse/apps-api.js.map +1 -1
  95. package/dist/core/verse/apps.js +22 -12
  96. package/dist/core/verse/apps.js.map +1 -1
  97. package/dist/core/verse/local-models.js +3 -7
  98. package/dist/core/verse/local-models.js.map +1 -1
  99. package/dist/core/verse/model-display-name.d.ts +34 -0
  100. package/dist/core/verse/model-display-name.js +125 -0
  101. package/dist/core/verse/model-display-name.js.map +1 -0
  102. package/dist/core/verse/seats.d.ts +11 -2
  103. package/dist/core/verse/seats.js +42 -18
  104. package/dist/core/verse/seats.js.map +1 -1
  105. package/dist/core/verse/transient-events.d.ts +21 -0
  106. package/dist/core/verse/transient-events.js +12 -0
  107. package/dist/core/verse/transient-events.js.map +1 -0
  108. package/dist/core/verse/types.d.ts +6 -13
  109. package/dist/core/verse/types.js +5 -36
  110. package/dist/core/verse/types.js.map +1 -1
  111. package/dist/core/web/public/next/assets/ActionMenu-B4-39f2S.js +2 -0
  112. package/dist/core/web/public/next/assets/{ActionMenu-FxXeRbPx.js.map → ActionMenu-B4-39f2S.js.map} +1 -1
  113. package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js +2 -0
  114. package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js.map +1 -0
  115. package/dist/core/web/public/next/assets/App-E2zCDRxm.js +7 -0
  116. package/dist/core/web/public/next/assets/App-E2zCDRxm.js.map +1 -0
  117. package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js +2 -0
  118. package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js.map +1 -0
  119. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js +2 -0
  120. package/dist/core/web/public/next/assets/{AreaTrend-CDxrQU4b.js.map → AreaTrend-BFimExYn.js.map} +1 -1
  121. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js +2 -0
  122. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js.map +1 -0
  123. package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +1 -0
  124. package/dist/core/web/public/next/assets/AutonomySection-B46igJKR.js +2 -0
  125. package/dist/core/web/public/next/assets/{AutonomySection-DuQkHGD_.js.map → AutonomySection-B46igJKR.js.map} +1 -1
  126. package/dist/core/web/public/next/assets/BranchBar-BRkrEQGs.js +2 -0
  127. package/dist/core/web/public/next/assets/{BranchBar-CLsvOcyK.js.map → BranchBar-BRkrEQGs.js.map} +1 -1
  128. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js +2 -0
  129. package/dist/core/web/public/next/assets/{BudgetControl-TL3FeZ1D.js.map → BudgetControl-T_RjPrw9.js.map} +1 -1
  130. package/dist/core/web/public/next/assets/{Button-HHXgoXGr.js → Button-BhO-WKPp.js} +2 -2
  131. package/dist/core/web/public/next/assets/{Button-HHXgoXGr.js.map → Button-BhO-WKPp.js.map} +1 -1
  132. package/dist/core/web/public/next/assets/CapacityStrip-CkFz5vq2.js +2 -0
  133. package/dist/core/web/public/next/assets/{CapacityStrip-qReu0RaF.js.map → CapacityStrip-CkFz5vq2.js.map} +1 -1
  134. package/dist/core/web/public/next/assets/{useChartWidth-BW6SwYIK.css → ChartFrame-BVuBe6RP.css} +1 -1
  135. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js +2 -0
  136. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js.map +1 -0
  137. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js +3 -0
  138. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js.map +1 -0
  139. package/dist/core/web/public/next/assets/CloudBudgetForm-Bd91iStN.js +2 -0
  140. package/dist/core/web/public/next/assets/CloudBudgetForm-Bd91iStN.js.map +1 -0
  141. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js +2 -0
  142. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js.map +1 -0
  143. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +1 -0
  144. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js +2 -0
  145. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js.map +1 -0
  146. package/dist/core/web/public/next/assets/ConfirmDialog-Bv4hdK2T.js +2 -0
  147. package/dist/core/web/public/next/assets/{ConfirmDialog-DLrLKM0c.js.map → ConfirmDialog-Bv4hdK2T.js.map} +1 -1
  148. package/dist/core/web/public/next/assets/DeleteChatDialog-CH1Ix8Eh.js +2 -0
  149. package/dist/core/web/public/next/assets/DeleteChatDialog-CH1Ix8Eh.js.map +1 -0
  150. package/dist/core/web/public/next/assets/Dialog-BSsIFNqD.js +2 -0
  151. package/dist/core/web/public/next/assets/{Dialog-BS9Dxi3G.js.map → Dialog-BSsIFNqD.js.map} +1 -1
  152. package/dist/core/web/public/next/assets/DiffPane-BpNuJmth.js +2 -0
  153. package/dist/core/web/public/next/assets/{DiffPane-TOmUf3b2.js.map → DiffPane-BpNuJmth.js.map} +1 -1
  154. package/dist/core/web/public/next/assets/DiffViewer-CJarUvs0.js +2 -0
  155. package/dist/core/web/public/next/assets/{DiffViewer-BpH56302.js.map → DiffViewer-CJarUvs0.js.map} +1 -1
  156. package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js +2 -0
  157. package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js.map +1 -0
  158. package/dist/core/web/public/next/assets/{EmptyState-BqR5YAmf.js → EmptyState-DPrd2aak.js} +2 -2
  159. package/dist/core/web/public/next/assets/{EmptyState-BqR5YAmf.js.map → EmptyState-DPrd2aak.js.map} +1 -1
  160. package/dist/core/web/public/next/assets/{Epistemic-dhvDTwAZ.js → Epistemic-D7MxSmED.js} +2 -2
  161. package/dist/core/web/public/next/assets/{Epistemic-dhvDTwAZ.js.map → Epistemic-D7MxSmED.js.map} +1 -1
  162. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js +3 -0
  163. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js.map +1 -0
  164. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js +2 -0
  165. package/dist/core/web/public/next/assets/{Funnel-D2u7Wlzc.js.map → Funnel-BeNQZWv2.js.map} +1 -1
  166. package/dist/core/web/public/next/assets/GearTray-CIPtzeIx.js +2 -0
  167. package/dist/core/web/public/next/assets/{GearTray-Cb2npoxM.js.map → GearTray-CIPtzeIx.js.map} +1 -1
  168. package/dist/core/web/public/next/assets/GrowthSection-iiQg6wvK.js +2 -0
  169. package/dist/core/web/public/next/assets/{GrowthSection-C5aDPs8B.js.map → GrowthSection-iiQg6wvK.js.map} +1 -1
  170. package/dist/core/web/public/next/assets/HandoffDialog-DrQ6ofuy.js +2 -0
  171. package/dist/core/web/public/next/assets/{HandoffDialog-BF3AYg-X.js.map → HandoffDialog-DrQ6ofuy.js.map} +1 -1
  172. package/dist/core/web/public/next/assets/Input-C0MQxEM6.js +2 -0
  173. package/dist/core/web/public/next/assets/{Input-B5dmGLZx.js.map → Input-C0MQxEM6.js.map} +1 -1
  174. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js +2 -0
  175. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js.map +1 -0
  176. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js +2 -0
  177. package/dist/core/web/public/next/assets/{MatrixHeatmap-BgEUs2Eu.js.map → MatrixHeatmap-DZvZeWXL.js.map} +1 -1
  178. package/dist/core/web/public/next/assets/McpSection-BRuCcTjT.js +2 -0
  179. package/dist/core/web/public/next/assets/{McpSection-DZkiOuoq.js.map → McpSection-BRuCcTjT.js.map} +1 -1
  180. package/dist/core/web/public/next/assets/MessageMarkdown-bRvD5nSc.js +3 -0
  181. package/dist/core/web/public/next/assets/{MessageMarkdown-BauY8ZTY.js.map → MessageMarkdown-bRvD5nSc.js.map} +1 -1
  182. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DLBNLfsn.js → MessageMarkdownRenderer-FjjkPKA2.js} +4 -4
  183. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DLBNLfsn.js.map → MessageMarkdownRenderer-FjjkPKA2.js.map} +1 -1
  184. package/dist/core/web/public/next/assets/{Meter-DNeocJnD.js → Meter-CFNLpwA-.js} +2 -2
  185. package/dist/core/web/public/next/assets/{Meter-DNeocJnD.js.map → Meter-CFNLpwA-.js.map} +1 -1
  186. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js +2 -0
  187. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js.map +1 -0
  188. package/dist/core/web/public/next/assets/MutationTokenDialog-T7gv3a9r.js +2 -0
  189. package/dist/core/web/public/next/assets/{MutationTokenDialog-mxrw0Yvy.js.map → MutationTokenDialog-T7gv3a9r.js.map} +1 -1
  190. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js +2 -0
  191. package/dist/core/web/public/next/assets/{NeedsYouDrawer-CO-Balfp.js.map → NeedsYouDrawer-lYN4G_aM.js.map} +1 -1
  192. package/dist/core/web/public/next/assets/NeedsYouList-BgH8ezqf.js +2 -0
  193. package/dist/core/web/public/next/assets/{NeedsYouList-CzDZbzRD.js.map → NeedsYouList-BgH8ezqf.js.map} +1 -1
  194. package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js +3 -0
  195. package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js.map +1 -0
  196. package/dist/core/web/public/next/assets/OnboardingFlow-HUNQGQuU.css +1 -0
  197. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js +2 -0
  198. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js.map +1 -0
  199. package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js +3 -0
  200. package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js.map +1 -0
  201. package/dist/core/web/public/next/assets/PreviewPane-BPBbcROb.js +2 -0
  202. package/dist/core/web/public/next/assets/{PreviewPane-BS-CleCd.js.map → PreviewPane-BPBbcROb.js.map} +1 -1
  203. package/dist/core/web/public/next/assets/{ProviderLogo-C5mBg8i0.js → ProviderLogo-CT2cSfkg.js} +2 -2
  204. package/dist/core/web/public/next/assets/{ProviderLogo-C5mBg8i0.js.map → ProviderLogo-CT2cSfkg.js.map} +1 -1
  205. package/dist/core/web/public/next/assets/RailStatus-Vgl0GYtd.js +2 -0
  206. package/dist/core/web/public/next/assets/{RailStatus-cPRyOmrk.js.map → RailStatus-Vgl0GYtd.js.map} +1 -1
  207. package/dist/core/web/public/next/assets/{RefreshIndicator-CMwSCiz5.js → RefreshIndicator-CSyqpY_q.js} +2 -2
  208. package/dist/core/web/public/next/assets/{RefreshIndicator-CMwSCiz5.js.map → RefreshIndicator-CSyqpY_q.js.map} +1 -1
  209. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BFi1opsC.js → ResourcePoolConsoleApp-BX2nkdmZ.js} +4 -4
  210. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BFi1opsC.js.map → ResourcePoolConsoleApp-BX2nkdmZ.js.map} +1 -1
  211. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js +3 -0
  212. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js.map +1 -0
  213. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +1 -0
  214. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js +2 -0
  215. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js.map +1 -0
  216. package/dist/core/web/public/next/assets/RouteErrorBoundary-BaC7YVzR.js +2 -0
  217. package/dist/core/web/public/next/assets/{RouteErrorBoundary-DYtwc2ja.js.map → RouteErrorBoundary-BaC7YVzR.js.map} +1 -1
  218. package/dist/core/web/public/next/assets/RunInCloudAction-D5PDHJPE.js +2 -0
  219. package/dist/core/web/public/next/assets/{RunInCloudAction-BEGEEM8O.js.map → RunInCloudAction-D5PDHJPE.js.map} +1 -1
  220. package/dist/core/web/public/next/assets/SeatSelector-Cg75LInq.js +3 -0
  221. package/dist/core/web/public/next/assets/{SeatSelector-CYHRR7Wp.js.map → SeatSelector-Cg75LInq.js.map} +1 -1
  222. package/dist/core/web/public/next/assets/Segmented-CametjLt.js +2 -0
  223. package/dist/core/web/public/next/assets/{Segmented-BE53BenI.js.map → Segmented-CametjLt.js.map} +1 -1
  224. package/dist/core/web/public/next/assets/Select-De52fghU.js +2 -0
  225. package/dist/core/web/public/next/assets/{Select-BwSGkHCS.js.map → Select-De52fghU.js.map} +1 -1
  226. package/dist/core/web/public/next/assets/SessionGate-CzlcNq3O.js +2 -0
  227. package/dist/core/web/public/next/assets/{SessionGate-e0dFJm9d.js.map → SessionGate-CzlcNq3O.js.map} +1 -1
  228. package/dist/core/web/public/next/assets/SessionInsightChip-Bk_Owa7u.js +2 -0
  229. package/dist/core/web/public/next/assets/{SessionInsightChip-CxlSyueJ.js.map → SessionInsightChip-Bk_Owa7u.js.map} +1 -1
  230. package/dist/core/web/public/next/assets/SessionSearch-C6C8DHN8.js +2 -0
  231. package/dist/core/web/public/next/assets/{SessionSearch-_yp7S2TP.js.map → SessionSearch-C6C8DHN8.js.map} +1 -1
  232. package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js +2 -0
  233. package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js.map +1 -0
  234. package/dist/core/web/public/next/assets/Sheet-CJhK9Dqv.js +2 -0
  235. package/dist/core/web/public/next/assets/{Sheet-DVP2Mgy6.js.map → Sheet-CJhK9Dqv.js.map} +1 -1
  236. package/dist/core/web/public/next/assets/ShortcutsOverlay-DDW-i9Fc.js +2 -0
  237. package/dist/core/web/public/next/assets/{ShortcutsOverlay-BcIcoClX.js.map → ShortcutsOverlay-DDW-i9Fc.js.map} +1 -1
  238. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js +3 -0
  239. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js.map +1 -0
  240. package/dist/core/web/public/next/assets/Slider-Bwd9HfXl.js +2 -0
  241. package/dist/core/web/public/next/assets/{Slider-BypUWjpH.js.map → Slider-Bwd9HfXl.js.map} +1 -1
  242. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js +2 -0
  243. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js.map +1 -0
  244. package/dist/core/web/public/next/assets/{StatusBadge-HCZp416_.js → StatusBadge-DHKRtttH.js} +2 -2
  245. package/dist/core/web/public/next/assets/{StatusBadge-HCZp416_.js.map → StatusBadge-DHKRtttH.js.map} +1 -1
  246. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js +2 -0
  247. package/dist/core/web/public/next/assets/{StepBand-Duz1PUes.js.map → StepBand-DQykLkk_.js.map} +1 -1
  248. package/dist/core/web/public/next/assets/Surface-D--LXgQm.js +2 -0
  249. package/dist/core/web/public/next/assets/Surface-D--LXgQm.js.map +1 -0
  250. package/dist/core/web/public/next/assets/Surface-e1z6GdZt.css +1 -0
  251. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js +2 -0
  252. package/dist/core/web/public/next/assets/{Swimlane-DGcIcnNA.js.map → Swimlane-BzH6OCee.js.map} +1 -1
  253. package/dist/core/web/public/next/assets/{Switch-iveI-8NY.js → Switch-PMixU6b0.js} +2 -2
  254. package/dist/core/web/public/next/assets/{Switch-iveI-8NY.js.map → Switch-PMixU6b0.js.map} +1 -1
  255. package/dist/core/web/public/next/assets/{Tag-DH15CUJp.js → Tag-fordBsrJ.js} +2 -2
  256. package/dist/core/web/public/next/assets/{Tag-DH15CUJp.js.map → Tag-fordBsrJ.js.map} +1 -1
  257. package/dist/core/web/public/next/assets/TerminalPane-BSnGdUuF.js +7 -0
  258. package/dist/core/web/public/next/assets/TerminalPane-BSnGdUuF.js.map +1 -0
  259. package/dist/core/web/public/next/assets/UniverseConsoleApp-DtXFhAhw.js +2 -0
  260. package/dist/core/web/public/next/assets/{UniverseConsoleApp-C8yQ0AaR.js.map → UniverseConsoleApp-DtXFhAhw.js.map} +1 -1
  261. package/dist/core/web/public/next/assets/{UniverseView-_nPURPqe.js → UniverseView-sWm3pnTW.js} +3 -3
  262. package/dist/core/web/public/next/assets/{UniverseView-_nPURPqe.js.map → UniverseView-sWm3pnTW.js.map} +1 -1
  263. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js +3 -0
  264. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js.map +1 -0
  265. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js +3 -0
  266. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js.map +1 -0
  267. package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js +10 -0
  268. package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js.map +1 -0
  269. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +1 -0
  270. package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js +2 -0
  271. package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js.map +1 -0
  272. package/dist/core/web/public/next/assets/apps-model-DlwnfqwJ.js +2 -0
  273. package/dist/core/web/public/next/assets/apps-model-DlwnfqwJ.js.map +1 -0
  274. package/dist/core/web/public/next/assets/authority-model-BFuPezSo.js +2 -0
  275. package/dist/core/web/public/next/assets/authority-model-BFuPezSo.js.map +1 -0
  276. package/dist/core/web/public/next/assets/binding-left-DZpq5sLf.js +2 -0
  277. package/dist/core/web/public/next/assets/binding-left-DZpq5sLf.js.map +1 -0
  278. package/dist/core/web/public/next/assets/{budget-queries-V3wcJVK_.js → budget-queries-DsAjH8ac.js} +2 -2
  279. package/dist/core/web/public/next/assets/{budget-queries-V3wcJVK_.js.map → budget-queries-DsAjH8ac.js.map} +1 -1
  280. package/dist/core/web/public/next/assets/capacity-strip-model-Dn1cNOhz.js +2 -0
  281. package/dist/core/web/public/next/assets/capacity-strip-model-Dn1cNOhz.js.map +1 -0
  282. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js +2 -0
  283. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js.map +1 -0
  284. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +1 -0
  285. package/dist/core/web/public/next/assets/clipboard-DkZdqlxf.js +2 -0
  286. package/dist/core/web/public/next/assets/clipboard-DkZdqlxf.js.map +1 -0
  287. package/dist/core/web/public/next/assets/cloud-D-HXms6q.css +1 -0
  288. package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js +2 -0
  289. package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js.map +1 -0
  290. package/dist/core/web/public/next/assets/cloud-queries-QAhpExlz.js +2 -0
  291. package/dist/core/web/public/next/assets/cloud-queries-QAhpExlz.js.map +1 -0
  292. package/dist/core/web/public/next/assets/cloud.module-DOP-N4Ch.js +2 -0
  293. package/dist/core/web/public/next/assets/cloud.module-DOP-N4Ch.js.map +1 -0
  294. package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js +2 -0
  295. package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js.map +1 -0
  296. package/dist/core/web/public/next/assets/context-model-Co4wh3SM.js +2 -0
  297. package/dist/core/web/public/next/assets/context-model-Co4wh3SM.js.map +1 -0
  298. package/dist/core/web/public/next/assets/context-model-DV1zCfAm.js +3 -0
  299. package/dist/core/web/public/next/assets/context-model-DV1zCfAm.js.map +1 -0
  300. package/dist/core/web/public/next/assets/{context-queries-CrPcHWTz.js → context-queries-CktFQqSS.js} +2 -2
  301. package/dist/core/web/public/next/assets/{context-queries-CrPcHWTz.js.map → context-queries-CktFQqSS.js.map} +1 -1
  302. package/dist/core/web/public/next/assets/{control-queries-CmgBgKV7.js → control-queries-DAvlh_YM.js} +2 -2
  303. package/dist/core/web/public/next/assets/{control-queries-CmgBgKV7.js.map → control-queries-DAvlh_YM.js.map} +1 -1
  304. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js +2 -0
  305. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js.map +1 -0
  306. package/dist/core/web/public/next/assets/dock-icons-BFuBbqJl.js +2 -0
  307. package/dist/core/web/public/next/assets/{dock-icons-CUh8dOxJ.js.map → dock-icons-BFuBbqJl.js.map} +1 -1
  308. package/dist/core/web/public/next/assets/fleet-model-Dfd5JyLR.js +2 -0
  309. package/dist/core/web/public/next/assets/fleet-model-Dfd5JyLR.js.map +1 -0
  310. package/dist/core/web/public/next/assets/fleet-queries-RtMTd5rR.js +2 -0
  311. package/dist/core/web/public/next/assets/fleet-queries-RtMTd5rR.js.map +1 -0
  312. package/dist/core/web/public/next/assets/{focus-trap-HtcoXeEq.js → focus-trap-BdrbWfC4.js} +2 -2
  313. package/dist/core/web/public/next/assets/{focus-trap-HtcoXeEq.js.map → focus-trap-BdrbWfC4.js.map} +1 -1
  314. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js +2 -0
  315. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js.map +1 -0
  316. package/dist/core/web/public/next/assets/{git-model-bk_RXh3y.js → git-model-_BnI_Ogh.js} +2 -2
  317. package/dist/core/web/public/next/assets/{git-model-bk_RXh3y.js.map → git-model-_BnI_Ogh.js.map} +1 -1
  318. package/dist/core/web/public/next/assets/global-CNNGMril.js +2 -0
  319. package/dist/core/web/public/next/assets/{global-oEl9Qj8u.js.map → global-CNNGMril.js.map} +1 -1
  320. package/dist/core/web/public/next/assets/{guarded-runners-LHLXmXIk.js → guarded-runners-DPh2d32e.js} +2 -2
  321. package/dist/core/web/public/next/assets/{guarded-runners-LHLXmXIk.js.map → guarded-runners-DPh2d32e.js.map} +1 -1
  322. package/dist/core/web/public/next/assets/icons-0haWy6nh.js +2 -0
  323. package/dist/core/web/public/next/assets/icons-0haWy6nh.js.map +1 -0
  324. package/dist/core/web/public/next/assets/{index-BVxOlseC.js → index-QesfXBsb.js} +3 -3
  325. package/dist/core/web/public/next/assets/{index-BVxOlseC.js.map → index-QesfXBsb.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js +2 -0
  327. package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js.map +1 -0
  328. package/dist/core/web/public/next/assets/local-model-C9xNi9fN.js +2 -0
  329. package/dist/core/web/public/next/assets/local-model-C9xNi9fN.js.map +1 -0
  330. package/dist/core/web/public/next/assets/mind.module-BrK2nFOL.js +2 -0
  331. package/dist/core/web/public/next/assets/{mind.module-gTGAuJt1.js.map → mind.module-BrK2nFOL.js.map} +1 -1
  332. package/dist/core/web/public/next/assets/mutations-DTCtKCn_.js +2 -0
  333. package/dist/core/web/public/next/assets/{mutations-C5S7okTW.js.map → mutations-DTCtKCn_.js.map} +1 -1
  334. package/dist/core/web/public/next/assets/nav-KmGX0CVz.js +2 -0
  335. package/dist/core/web/public/next/assets/{nav-NVtnuG7A.js.map → nav-KmGX0CVz.js.map} +1 -1
  336. package/dist/core/web/public/next/assets/{overnight-queries-DGm3qL1b.js → overnight-queries-mlO0xzsr.js} +2 -2
  337. package/dist/core/web/public/next/assets/{overnight-queries-DGm3qL1b.js.map → overnight-queries-mlO0xzsr.js.map} +1 -1
  338. package/dist/core/web/public/next/assets/primitives-D0Fb3TtS.js +1 -0
  339. package/dist/core/web/public/next/assets/{queries-CYisSAAB.js → queries-CyBE8nsW.js} +2 -2
  340. package/dist/core/web/public/next/assets/{queries-CYisSAAB.js.map → queries-CyBE8nsW.js.map} +1 -1
  341. package/dist/core/web/public/next/assets/reasoning-pref-CaoA4_Vl.js +2 -0
  342. package/dist/core/web/public/next/assets/{reasoning-pref-BUcFF_5G.js.map → reasoning-pref-CaoA4_Vl.js.map} +1 -1
  343. package/dist/core/web/public/next/assets/{reveal-anchor-D-tV8xau.js → reveal-anchor-BP1VqnPU.js} +2 -2
  344. package/dist/core/web/public/next/assets/{reveal-anchor-D-tV8xau.js.map → reveal-anchor-BP1VqnPU.js.map} +1 -1
  345. package/dist/core/web/public/next/assets/seat-subscription-C5Tvr0WQ.js +2 -0
  346. package/dist/core/web/public/next/assets/{seat-subscription-B-f9ViU2.js.map → seat-subscription-C5Tvr0WQ.js.map} +1 -1
  347. package/dist/core/web/public/next/assets/{sidebar-model-DQ-FyBHW.js → sidebar-model-B5Qk95k_.js} +2 -2
  348. package/dist/core/web/public/next/assets/{sidebar-model-DQ-FyBHW.js.map → sidebar-model-B5Qk95k_.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/slots-DHKQDoE6.js +3 -0
  350. package/dist/core/web/public/next/assets/{slots-BhP8b8tf.js.map → slots-DHKQDoE6.js.map} +1 -1
  351. package/dist/core/web/public/next/assets/surface-data-CchClvHo.js +2 -0
  352. package/dist/core/web/public/next/assets/surface-data-CchClvHo.js.map +1 -0
  353. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js +2 -0
  354. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js.map +1 -0
  355. package/dist/core/web/public/next/assets/{tasks-model-BKDNqmmt.js → tasks-model-D6WFVULI.js} +2 -2
  356. package/dist/core/web/public/next/assets/{tasks-model-BKDNqmmt.js.map → tasks-model-D6WFVULI.js.map} +1 -1
  357. package/dist/core/web/public/next/assets/{terminal-icons-D2xe-aM1.js → terminal-icons-BvCvuXk2.js} +2 -2
  358. package/dist/core/web/public/next/assets/{terminal-icons-D2xe-aM1.js.map → terminal-icons-BvCvuXk2.js.map} +1 -1
  359. package/dist/core/web/public/next/assets/transient-events-nTLhMBND.js +2 -0
  360. package/dist/core/web/public/next/assets/transient-events-nTLhMBND.js.map +1 -0
  361. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +1 -1
  362. package/dist/core/web/public/next/assets/{usage-queries-BZuAANlI.js → usage-queries-D1SU1t7r.js} +2 -2
  363. package/dist/core/web/public/next/assets/{usage-queries-BZuAANlI.js.map → usage-queries-D1SU1t7r.js.map} +1 -1
  364. package/dist/core/web/public/next/assets/{use-guarded-action-Cf4MeNBa.js → use-guarded-action-BZmBv7CJ.js} +2 -2
  365. package/dist/core/web/public/next/assets/{use-guarded-action-Cf4MeNBa.js.map → use-guarded-action-BZmBv7CJ.js.map} +1 -1
  366. package/dist/core/web/public/next/assets/{use-ticker-D9yi49my.js → use-ticker-CkJ4-0wU.js} +2 -2
  367. package/dist/core/web/public/next/assets/{use-ticker-D9yi49my.js.map → use-ticker-CkJ4-0wU.js.map} +1 -1
  368. package/dist/core/web/public/next/assets/{use-token-gate-DqrSXdX6.js → use-token-gate-CYcfk_GS.js} +2 -2
  369. package/dist/core/web/public/next/assets/{use-token-gate-DqrSXdX6.js.map → use-token-gate-CYcfk_GS.js.map} +1 -1
  370. package/dist/core/web/public/next/assets/useOnboarding-CujRS6PK.js +2 -0
  371. package/dist/core/web/public/next/assets/useOnboarding-CujRS6PK.js.map +1 -0
  372. package/dist/core/web/public/next/assets/useSeatsRefresh-BEaQdkZs.js +2 -0
  373. package/dist/core/web/public/next/assets/useSeatsRefresh-BEaQdkZs.js.map +1 -0
  374. package/dist/core/web/public/next/assets/useVerseTranscript-BQ0J6Xhx.js +2 -0
  375. package/dist/core/web/public/next/assets/{useVerseTranscript-CDYrrWOO.js.map → useVerseTranscript-BQ0J6Xhx.js.map} +1 -1
  376. package/dist/core/web/public/next/assets/verse-icons-DndgEgKS.js +2 -0
  377. package/dist/core/web/public/next/assets/verse-icons-DndgEgKS.js.map +1 -0
  378. package/dist/core/web/public/next/assets/verse-model-MMySehjj.js +2 -0
  379. package/dist/core/web/public/next/assets/verse-model-MMySehjj.js.map +1 -0
  380. package/dist/core/web/public/next/assets/verse-store-DNVRuiJL.js +2 -0
  381. package/dist/core/web/public/next/assets/verse-store-DNVRuiJL.js.map +1 -0
  382. package/dist/core/web/public/next/assets/warmup-CNEH_-be.js +3 -0
  383. package/dist/core/web/public/next/assets/{warmup-HG5vYbsN.js.map → warmup-CNEH_-be.js.map} +1 -1
  384. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js +2 -0
  385. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js.map +1 -0
  386. package/dist/core/web/public/next/assets/{workspace-model-CbhdPhei.js → workspace-model-Dukb2wwv.js} +2 -2
  387. package/dist/core/web/public/next/assets/{workspace-model-CbhdPhei.js.map → workspace-model-Dukb2wwv.js.map} +1 -1
  388. package/dist/core/web/public/next/index.html +1 -1
  389. package/dist/release-dependency-inventory.json +1 -1
  390. package/docs/README.md +2 -1
  391. package/package.json +1 -1
  392. package/dist/core/web/public/next/assets/ActionMenu-FxXeRbPx.js +0 -2
  393. package/dist/core/web/public/next/assets/Advanced-D_eS4472.js +0 -2
  394. package/dist/core/web/public/next/assets/Advanced-D_eS4472.js.map +0 -1
  395. package/dist/core/web/public/next/assets/App-Cj4zKbG3.js +0 -7
  396. package/dist/core/web/public/next/assets/App-Cj4zKbG3.js.map +0 -1
  397. package/dist/core/web/public/next/assets/AppsSection-Ddu_RCQE.js +0 -2
  398. package/dist/core/web/public/next/assets/AppsSection-Ddu_RCQE.js.map +0 -1
  399. package/dist/core/web/public/next/assets/AreaTrend-CDxrQU4b.js +0 -2
  400. package/dist/core/web/public/next/assets/AutonomySection-DuQkHGD_.js +0 -2
  401. package/dist/core/web/public/next/assets/BranchBar-CLsvOcyK.js +0 -2
  402. package/dist/core/web/public/next/assets/BudgetControl-TL3FeZ1D.js +0 -2
  403. package/dist/core/web/public/next/assets/BurnDown-sFXkUGdB.js +0 -2
  404. package/dist/core/web/public/next/assets/BurnDown-sFXkUGdB.js.map +0 -1
  405. package/dist/core/web/public/next/assets/CapacityStrip-qReu0RaF.js +0 -2
  406. package/dist/core/web/public/next/assets/ChatSection-DZuZfTaC.js +0 -3
  407. package/dist/core/web/public/next/assets/ChatSection-DZuZfTaC.js.map +0 -1
  408. package/dist/core/web/public/next/assets/CloudBudgetForm-DJbiT1wi.js +0 -2
  409. package/dist/core/web/public/next/assets/CloudBudgetForm-DJbiT1wi.js.map +0 -1
  410. package/dist/core/web/public/next/assets/CommandPalette-zYLFZRnj.js +0 -2
  411. package/dist/core/web/public/next/assets/CommandPalette-zYLFZRnj.js.map +0 -1
  412. package/dist/core/web/public/next/assets/CommandSection-rIeMK5Ch.js +0 -2
  413. package/dist/core/web/public/next/assets/CommandSection-rIeMK5Ch.js.map +0 -1
  414. package/dist/core/web/public/next/assets/ConfirmDialog-DLrLKM0c.js +0 -2
  415. package/dist/core/web/public/next/assets/Dialog-BS9Dxi3G.js +0 -2
  416. package/dist/core/web/public/next/assets/DiffPane-TOmUf3b2.js +0 -2
  417. package/dist/core/web/public/next/assets/DiffViewer-BpH56302.js +0 -2
  418. package/dist/core/web/public/next/assets/DockHost-DzkzR-HD.js +0 -2
  419. package/dist/core/web/public/next/assets/DockHost-DzkzR-HD.js.map +0 -1
  420. package/dist/core/web/public/next/assets/FleetSection-ViAb549H.js +0 -3
  421. package/dist/core/web/public/next/assets/FleetSection-ViAb549H.js.map +0 -1
  422. package/dist/core/web/public/next/assets/Funnel-D2u7Wlzc.js +0 -2
  423. package/dist/core/web/public/next/assets/GearTray-Cb2npoxM.js +0 -2
  424. package/dist/core/web/public/next/assets/GrowthSection-C5aDPs8B.js +0 -2
  425. package/dist/core/web/public/next/assets/HandoffDialog-BF3AYg-X.js +0 -2
  426. package/dist/core/web/public/next/assets/Input-B5dmGLZx.js +0 -2
  427. package/dist/core/web/public/next/assets/LeaderCard-DZrmjDbI.js +0 -2
  428. package/dist/core/web/public/next/assets/LeaderCard-DZrmjDbI.js.map +0 -1
  429. package/dist/core/web/public/next/assets/MatrixHeatmap-BgEUs2Eu.js +0 -2
  430. package/dist/core/web/public/next/assets/McpSection-DZkiOuoq.js +0 -2
  431. package/dist/core/web/public/next/assets/MessageMarkdown-BauY8ZTY.js +0 -3
  432. package/dist/core/web/public/next/assets/MindSection-BvJXFjyX.js +0 -2
  433. package/dist/core/web/public/next/assets/MindSection-BvJXFjyX.js.map +0 -1
  434. package/dist/core/web/public/next/assets/MutationTokenDialog-mxrw0Yvy.js +0 -2
  435. package/dist/core/web/public/next/assets/NeedsYouDrawer-CO-Balfp.js +0 -2
  436. package/dist/core/web/public/next/assets/NeedsYouList-CzDZbzRD.js +0 -2
  437. package/dist/core/web/public/next/assets/NewChatDialog-B8eJjlFf.js +0 -3
  438. package/dist/core/web/public/next/assets/NewChatDialog-B8eJjlFf.js.map +0 -1
  439. package/dist/core/web/public/next/assets/OnboardingFlow-Cij6KWat.js +0 -2
  440. package/dist/core/web/public/next/assets/OnboardingFlow-Cij6KWat.js.map +0 -1
  441. package/dist/core/web/public/next/assets/OnboardingFlow-DSpPj8UE.css +0 -1
  442. package/dist/core/web/public/next/assets/PreviewPane-BS-CleCd.js +0 -2
  443. package/dist/core/web/public/next/assets/RailStatus-cPRyOmrk.js +0 -2
  444. package/dist/core/web/public/next/assets/ResourcesChrome-BJCauW_t.js +0 -3
  445. package/dist/core/web/public/next/assets/ResourcesChrome-BJCauW_t.js.map +0 -1
  446. package/dist/core/web/public/next/assets/ResourcesDrawer-BDecg6nO.js +0 -2
  447. package/dist/core/web/public/next/assets/ResourcesDrawer-BDecg6nO.js.map +0 -1
  448. package/dist/core/web/public/next/assets/ResourcesDrawer-CSKIO_wZ.css +0 -1
  449. package/dist/core/web/public/next/assets/RouteErrorBoundary-DYtwc2ja.js +0 -2
  450. package/dist/core/web/public/next/assets/RunInCloudAction-BEGEEM8O.js +0 -2
  451. package/dist/core/web/public/next/assets/SeatSelector-CYHRR7Wp.js +0 -3
  452. package/dist/core/web/public/next/assets/Segmented-BE53BenI.js +0 -2
  453. package/dist/core/web/public/next/assets/Select-BwSGkHCS.js +0 -2
  454. package/dist/core/web/public/next/assets/SessionGate-e0dFJm9d.js +0 -2
  455. package/dist/core/web/public/next/assets/SessionInsightChip-CxlSyueJ.js +0 -2
  456. package/dist/core/web/public/next/assets/SessionSearch-_yp7S2TP.js +0 -2
  457. package/dist/core/web/public/next/assets/SettingsSection-wGnpWeGW.js +0 -2
  458. package/dist/core/web/public/next/assets/SettingsSection-wGnpWeGW.js.map +0 -1
  459. package/dist/core/web/public/next/assets/Sheet-DVP2Mgy6.js +0 -2
  460. package/dist/core/web/public/next/assets/ShortcutsOverlay-BcIcoClX.js +0 -2
  461. package/dist/core/web/public/next/assets/Sidebar-DjQOqPbm.js +0 -3
  462. package/dist/core/web/public/next/assets/Sidebar-DjQOqPbm.js.map +0 -1
  463. package/dist/core/web/public/next/assets/Slider-BypUWjpH.js +0 -2
  464. package/dist/core/web/public/next/assets/StepBand-Duz1PUes.js +0 -2
  465. package/dist/core/web/public/next/assets/Surface-B75lVfzm.js +0 -2
  466. package/dist/core/web/public/next/assets/Surface-B75lVfzm.js.map +0 -1
  467. package/dist/core/web/public/next/assets/Surface-DMca0gAe.css +0 -1
  468. package/dist/core/web/public/next/assets/Swimlane-DGcIcnNA.js +0 -2
  469. package/dist/core/web/public/next/assets/TerminalPane-MQT-veKZ.js +0 -7
  470. package/dist/core/web/public/next/assets/TerminalPane-MQT-veKZ.js.map +0 -1
  471. package/dist/core/web/public/next/assets/UniverseConsoleApp-C8yQ0AaR.js +0 -2
  472. package/dist/core/web/public/next/assets/UsageSection-CqxRGJ40.js +0 -2
  473. package/dist/core/web/public/next/assets/UsageSection-CqxRGJ40.js.map +0 -1
  474. package/dist/core/web/public/next/assets/VerseConsoleApp-DTjDpGCd.js +0 -3
  475. package/dist/core/web/public/next/assets/VerseConsoleApp-DTjDpGCd.js.map +0 -1
  476. package/dist/core/web/public/next/assets/Workspace-DfcFGzME.js +0 -10
  477. package/dist/core/web/public/next/assets/Workspace-DfcFGzME.js.map +0 -1
  478. package/dist/core/web/public/next/assets/actions-Ddfg2iLl.css +0 -1
  479. package/dist/core/web/public/next/assets/actions-tWevL9HV.js +0 -2
  480. package/dist/core/web/public/next/assets/actions-tWevL9HV.js.map +0 -1
  481. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js +0 -2
  482. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js.map +0 -1
  483. package/dist/core/web/public/next/assets/capacity-strip-model-BDbmQ3e3.js +0 -2
  484. package/dist/core/web/public/next/assets/capacity-strip-model-BDbmQ3e3.js.map +0 -1
  485. package/dist/core/web/public/next/assets/charts-CfAjuKMv.js +0 -2
  486. package/dist/core/web/public/next/assets/charts-CfAjuKMv.js.map +0 -1
  487. package/dist/core/web/public/next/assets/charts-uSX6xVYN.css +0 -1
  488. package/dist/core/web/public/next/assets/cloud-C1KPNRHC.css +0 -1
  489. package/dist/core/web/public/next/assets/cloud-queries-Br_r0UAz.js +0 -2
  490. package/dist/core/web/public/next/assets/cloud-queries-Br_r0UAz.js.map +0 -1
  491. package/dist/core/web/public/next/assets/cloud.module-ascz58c3.js +0 -2
  492. package/dist/core/web/public/next/assets/cloud.module-ascz58c3.js.map +0 -1
  493. package/dist/core/web/public/next/assets/command-bus-xYZoK9nQ.js +0 -2
  494. package/dist/core/web/public/next/assets/command-bus-xYZoK9nQ.js.map +0 -1
  495. package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js +0 -2
  496. package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js.map +0 -1
  497. package/dist/core/web/public/next/assets/composer-keys-su0g1h9o.js +0 -2
  498. package/dist/core/web/public/next/assets/composer-keys-su0g1h9o.js.map +0 -1
  499. package/dist/core/web/public/next/assets/context-model-BC-HOmPo.js +0 -2
  500. package/dist/core/web/public/next/assets/context-model-BC-HOmPo.js.map +0 -1
  501. package/dist/core/web/public/next/assets/context-model-CIBmSugV.js +0 -2
  502. package/dist/core/web/public/next/assets/context-model-CIBmSugV.js.map +0 -1
  503. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js +0 -2
  504. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js.map +0 -1
  505. package/dist/core/web/public/next/assets/dock-icons-CUh8dOxJ.js +0 -2
  506. package/dist/core/web/public/next/assets/dock-store-B2vlxqPu.js +0 -2
  507. package/dist/core/web/public/next/assets/dock-store-B2vlxqPu.js.map +0 -1
  508. package/dist/core/web/public/next/assets/fleet-model-7i-FbzKI.js +0 -2
  509. package/dist/core/web/public/next/assets/fleet-model-7i-FbzKI.js.map +0 -1
  510. package/dist/core/web/public/next/assets/fleet-queries-DzGoqq8X.js +0 -2
  511. package/dist/core/web/public/next/assets/fleet-queries-DzGoqq8X.js.map +0 -1
  512. package/dist/core/web/public/next/assets/format-BkWdOQDL.js +0 -2
  513. package/dist/core/web/public/next/assets/format-BkWdOQDL.js.map +0 -1
  514. package/dist/core/web/public/next/assets/global-oEl9Qj8u.js +0 -2
  515. package/dist/core/web/public/next/assets/guarded-action-OzqcPjmh.js +0 -3
  516. package/dist/core/web/public/next/assets/guarded-action-OzqcPjmh.js.map +0 -1
  517. package/dist/core/web/public/next/assets/icon-base-DvM1eI5V.js +0 -2
  518. package/dist/core/web/public/next/assets/icon-base-DvM1eI5V.js.map +0 -1
  519. package/dist/core/web/public/next/assets/icons-DEQa2rTx.js +0 -2
  520. package/dist/core/web/public/next/assets/icons-DEQa2rTx.js.map +0 -1
  521. package/dist/core/web/public/next/assets/live-model-bmsJgnYD.js +0 -2
  522. package/dist/core/web/public/next/assets/live-model-bmsJgnYD.js.map +0 -1
  523. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js +0 -2
  524. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js.map +0 -1
  525. package/dist/core/web/public/next/assets/mind.module-gTGAuJt1.js +0 -2
  526. package/dist/core/web/public/next/assets/mutations-C5S7okTW.js +0 -2
  527. package/dist/core/web/public/next/assets/nav-NVtnuG7A.js +0 -2
  528. package/dist/core/web/public/next/assets/preloaded-Cwf9rsnZ.js +0 -2
  529. package/dist/core/web/public/next/assets/preloaded-Cwf9rsnZ.js.map +0 -1
  530. package/dist/core/web/public/next/assets/primitives-DyCKYSBG.js +0 -1
  531. package/dist/core/web/public/next/assets/reasoning-pref-BUcFF_5G.js +0 -2
  532. package/dist/core/web/public/next/assets/seat-subscription-B-f9ViU2.js +0 -2
  533. package/dist/core/web/public/next/assets/section-visibility-Yctxu-if.js +0 -2
  534. package/dist/core/web/public/next/assets/section-visibility-Yctxu-if.js.map +0 -1
  535. package/dist/core/web/public/next/assets/slots-BhP8b8tf.js +0 -3
  536. package/dist/core/web/public/next/assets/surface-data-DTI7LjvH.js +0 -2
  537. package/dist/core/web/public/next/assets/surface-data-DTI7LjvH.js.map +0 -1
  538. package/dist/core/web/public/next/assets/surface-prefetch-CdUEBFrl.js +0 -2
  539. package/dist/core/web/public/next/assets/surface-prefetch-CdUEBFrl.js.map +0 -1
  540. package/dist/core/web/public/next/assets/useChartWidth-owwodNVz.js +0 -2
  541. package/dist/core/web/public/next/assets/useChartWidth-owwodNVz.js.map +0 -1
  542. package/dist/core/web/public/next/assets/useSeatsRefresh-DgFy-Ph4.js +0 -2
  543. package/dist/core/web/public/next/assets/useSeatsRefresh-DgFy-Ph4.js.map +0 -1
  544. package/dist/core/web/public/next/assets/useVerseTranscript-CDYrrWOO.js +0 -2
  545. package/dist/core/web/public/next/assets/verse-icons-F9VwX07_.js +0 -2
  546. package/dist/core/web/public/next/assets/verse-icons-F9VwX07_.js.map +0 -1
  547. package/dist/core/web/public/next/assets/verse-model-DyCwZF-M.js +0 -2
  548. package/dist/core/web/public/next/assets/verse-model-DyCwZF-M.js.map +0 -1
  549. package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js +0 -3
  550. package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js.map +0 -1
  551. package/dist/core/web/public/next/assets/verse-ui-store-62DxpVHS.js +0 -3
  552. package/dist/core/web/public/next/assets/verse-ui-store-62DxpVHS.js.map +0 -1
  553. package/dist/core/web/public/next/assets/viewport-nTubFCwf.js +0 -2
  554. package/dist/core/web/public/next/assets/viewport-nTubFCwf.js.map +0 -1
  555. package/dist/core/web/public/next/assets/warmup-HG5vYbsN.js +0 -3
  556. package/dist/core/web/public/next/assets/workbench-types-DzN-5trg.js +0 -2
  557. package/dist/core/web/public/next/assets/workbench-types-DzN-5trg.js.map +0 -1
  558. /package/dist/core/web/public/next/assets/{BurnDown-BuLMsJMx.css → StatTile-BuLMsJMx.css} +0 -0
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SessionSearch-_yp7S2TP.js","assets/index-BVxOlseC.js","assets/global-oEl9Qj8u.js","assets/global-BlI2BYa1.css","assets/verse-model-DyCwZF-M.js","assets/VerseConsoleApp-DTjDpGCd.js","assets/RouteErrorBoundary-DYtwc2ja.js","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/command-catalog-Bb_PxC5w.js","assets/workbench-types-DzN-5trg.js","assets/guarded-action-OzqcPjmh.js","assets/preloaded-Cwf9rsnZ.js","assets/viewport-nTubFCwf.js","assets/verse-ui-store-62DxpVHS.js","assets/dock-store-B2vlxqPu.js","assets/composer-keys-su0g1h9o.js","assets/command-bus-xYZoK9nQ.js","assets/section-visibility-Yctxu-if.js","assets/icon-base-DvM1eI5V.js","assets/VerseConsoleApp-Cxqr-3qc.css","assets/compaction-point-VL9oegWS.js","assets/context-queries-CrPcHWTz.js","assets/verse-store-b_Lek_c5.js","assets/format-BkWdOQDL.js","assets/format-DKrNjdwD.js","assets/context-model-BC-HOmPo.js","assets/use-token-gate-DqrSXdX6.js","assets/context.module-BijAfoJw.js","assets/context-DiToyj6s.css"])))=>i.map(i=>d[i]);
2
- import{a as e,n as t,s as n,t as r}from"./index-BVxOlseC.js";import{i,p as a}from"./global-oEl9Qj8u.js";import{t as o}from"./Dialog-BS9Dxi3G.js";import{t as s}from"./RefreshIndicator-CMwSCiz5.js";import{T as c,Z as l,c as u,g as d,h as f,o as p,v as m}from"./VerseConsoleApp-DTjDpGCd.js";import{_ as h,c as g,g as _,y as v}from"./verse-model-DyCwZF-M.js";import{n as y}from"./seat-subscription-B-f9ViU2.js";import{_ as b,c as x,f as S,g as C,h as w,i as T,l as E,n as D,r as O,t as k,v as A}from"./workspace-model-CbhdPhei.js";import{n as j,t as M}from"./folder-picker-C8zo3A56.js";import{t as N}from"./Button-HHXgoXGr.js";import{t as P}from"./ActionMenu-FxXeRbPx.js";import{a as F,c as I,d as L,o as R,s as z,t as B,u as V}from"./dock-icons-CUh8dOxJ.js";import{n as H,r as U,t as W}from"./sidebar-model-DQ-FyBHW.js";import{i as G,o as K,s as q}from"./verse-icons-F9VwX07_.js";var J=n(e(),1),Y={width:`_width_ifku5_4`,form:`_form_ifku5_6`,field:`_field_ifku5_7`,label:`_label_ifku5_8`,select:`_select_ifku5_17`,input:`_input_ifku5_18`,hint:`_hint_ifku5_38`,error:`_error_ifku5_39`,rootRow:`_rootRow_ifku5_49`,rowButton:`_rowButton_ifku5_58`,addRoot:`_addRoot_ifku5_59`,checkbox:`_checkbox_ifku5_76`,priorityRow:`_priorityRow_ifku5_84`,priorityPath:`_priorityPath_ifku5_90`,actions:`_actions_ifku5_101`,spacer:`_spacer_ifku5_102`,confirm:`_confirm_ifku5_103`,cancel:`_cancel_ifku5_105`,save:`_save_ifku5_106`,remove:`_remove_ifku5_107`,danger:`_danger_ifku5_108`},X=t();function ee(e){let{open:t,workspace:n,initialRoots:r,priorities:i,focusSectionId:a=null,onClose:s,onSaved:c,onDeleted:l}=e,h=(0,J.useId)(),g=(0,J.useId)(),[v,y]=(0,J.useState)(``),[C,A]=(0,J.useState)([``]),[N,P]=(0,J.useState)(!1),[F,I]=(0,J.useState)(!1),[L,R]=(0,J.useState)({}),[z,B]=(0,J.useState)(!1),[V,H]=(0,J.useState)(!1),[U,W]=(0,J.useState)(null);(0,J.useEffect)(()=>{if(!t)return;let e=n;y(e?.name??``),A(e?b(e):[...r??[]].filter(e=>e.length>0)),P(e?.section??!1),I(e!==null&&a===e.id),R({}),B(!1),H(!1),W(null)},[t]);let G=C.length===0?[``]:C,K=M();function q(e,t){A(G.map((n,r)=>r===e?t:n))}async function ee(e){let t=await j();t!==null&&t.length>0&&q(e,t)}function Z(e){return L[e]??E(e,i)}async function te(e){e.preventDefault();let t=w(v,G);if(!t.ok){W(t.error);return}H(!0),W(null);try{let e=n===null?await p({name:t.name,roots:t.roots,section:N}):await m(n.id,{name:t.name,roots:t.roots,section:N});for(let e of t.roots){let t=L[e];t!==void 0&&t!==E(e,i)&&await d(e,t)}let r=n!==null&&a===n.id;N&&F!==r&&await f(F?e.id:null),c?.(e),s()}catch(e){W(e instanceof Error?e.message:String(e))}finally{H(!1)}}async function Q(){if(n!==null){H(!0),W(null);try{await u(n.id),l?.(n.id),s()}catch(e){W(e instanceof Error?e.message:String(e)),H(!1)}}}return(0,X.jsx)(o,{open:t,onClose:s,titleId:h,title:n===null?`Save a project`:`Edit project`,description:`Saved projects stay in the picker — they do not need a chat on them first.`,widthClassName:Y.width,children:(0,X.jsxs)(`form`,{className:Y.form,onSubmit:e=>void te(e),noValidate:!0,children:[(0,X.jsxs)(`label`,{className:Y.field,htmlFor:g,children:[(0,X.jsx)(`span`,{className:Y.label,children:`Name`}),(0,X.jsx)(`input`,{id:g,className:Y.input,value:v,onChange:e=>y(e.target.value),placeholder:`Defaults to the folder’s own name`,maxLength:120,autoComplete:`off`})]}),(0,X.jsxs)(`div`,{className:Y.field,children:[(0,X.jsx)(`span`,{className:Y.label,children:`Folders`}),(0,X.jsx)(`p`,{className:Y.hint,children:`The first folder is the primary: it is the chat’s working directory. Move a folder to the top to make it the primary.`}),G.map((e,t)=>(0,X.jsxs)(`div`,{className:Y.rootRow,children:[(0,X.jsx)(`input`,{className:Y.input,value:e,title:e||void 0,onChange:e=>q(t,e.target.value),placeholder:`/absolute/path/to/folder`,"aria-label":S(t),autoComplete:`off`,spellCheck:!1}),K?(0,X.jsx)(`button`,{type:`button`,className:Y.rowButton,onClick:()=>void ee(t),"aria-label":`Choose ${S(t).toLowerCase()}`,children:`Choose folder…`}):null,(0,X.jsx)(`button`,{type:`button`,className:Y.rowButton,disabled:t===0,onClick:()=>A(x(G,t,`up`)),"aria-label":`Move ${S(t).toLowerCase()} up`,title:`Move ${S(t).toLowerCase()} up`,children:(0,X.jsx)(`span`,{"aria-hidden":`true`,children:`↑`})}),(0,X.jsx)(`button`,{type:`button`,className:Y.rowButton,disabled:t===G.length-1,onClick:()=>A(x(G,t,`down`)),"aria-label":`Move ${S(t).toLowerCase()} down`,title:`Move ${S(t).toLowerCase()} down`,children:(0,X.jsx)(`span`,{"aria-hidden":`true`,children:`↓`})}),(0,X.jsx)(`button`,{type:`button`,className:Y.rowButton,disabled:G.length===1,onClick:()=>A(G.filter((e,n)=>n!==t)),"aria-label":`Remove ${S(t).toLowerCase()}`,children:`Remove`})]},t)),G.length<8?(0,X.jsx)(`button`,{type:`button`,className:Y.addRoot,onClick:()=>A([...G,``]),children:`Add a folder`}):null,G.length>1?(0,X.jsx)(`p`,{className:Y.hint,children:k}):null]}),(0,X.jsxs)(`div`,{className:Y.field,children:[(0,X.jsxs)(`label`,{className:Y.checkbox,children:[(0,X.jsx)(`input`,{type:`checkbox`,checked:N,onChange:e=>P(e.target.checked)}),(0,X.jsx)(`span`,{children:`Offer this project to the autonomous lane as a section`})]}),N?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(`label`,{className:Y.checkbox,children:[(0,X.jsx)(`input`,{type:`checkbox`,checked:F,onChange:e=>I(e.target.checked)}),(0,X.jsx)(`span`,{children:`Focus the fleet on this section`})]}),(0,X.jsx)(`p`,{className:Y.hint,children:O}),G.filter(e=>e.trim().length>0).map((e,t)=>(0,X.jsxs)(`div`,{className:Y.priorityRow,children:[(0,X.jsx)(`span`,{className:Y.priorityPath,title:e,children:_(e.trim())}),(0,X.jsx)(`select`,{className:Y.select,"aria-label":`Priority for ${e}`,value:Z(e.trim()),onChange:t=>R({...L,[e.trim()]:t.target.value}),children:T.map(e=>(0,X.jsx)(`option`,{value:e,children:D[e]},e))})]},`${e}-${t}`))]}):null]}),U?(0,X.jsx)(`p`,{role:`alert`,className:Y.error,children:U}):null,(0,X.jsxs)(`div`,{className:Y.actions,children:[n===null?null:z?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`span`,{className:Y.confirm,children:`Forget this project? Chats already on it are untouched.`}),(0,X.jsx)(`button`,{type:`button`,className:Y.danger,onClick:()=>void Q(),disabled:V,children:`Forget`}),(0,X.jsx)(`button`,{type:`button`,className:Y.cancel,onClick:()=>B(!1),children:`Keep`})]}):(0,X.jsx)(`button`,{type:`button`,className:Y.remove,onClick:()=>B(!0),disabled:V,children:`Forget project`}),(0,X.jsx)(`span`,{className:Y.spacer}),(0,X.jsx)(`button`,{type:`button`,className:Y.cancel,onClick:s,children:`Cancel`}),(0,X.jsx)(`button`,{type:`submit`,className:Y.save,disabled:V,children:V?`Saving…`:`Save project`})]})]})})}var Z={projects:`_projects_izay2_4`,head:`_head_izay2_10`,headText:`_headText_izay2_23`,add:`_add_izay2_25`,list:`_list_izay2_39`,project:`_project_izay2_4`,name:`_name_izay2_55`,summary:`_summary_izay2_64`,empty:`_empty_izay2_72`};function te(){let e=a(c),t=e.data?.workspaces??[],[n,r]=(0,J.useState)({open:!1,workspace:null});return(0,X.jsxs)(`section`,{className:Z.projects,"aria-label":`Saved projects`,children:[(0,X.jsxs)(`h2`,{className:Z.head,children:[(0,X.jsx)(`span`,{className:Z.headText,children:`Projects`}),(0,X.jsx)(`button`,{type:`button`,className:Z.add,title:`Save a project`,"aria-label":`Save a project`,onClick:()=>r({open:!0,workspace:null}),children:(0,X.jsx)(G,{})})]}),t.length>0?(0,X.jsx)(`ul`,{className:Z.list,children:t.map(e=>{let t=C(e)??``;return(0,X.jsx)(`li`,{children:(0,X.jsxs)(`button`,{type:`button`,className:Z.project,title:t?`${e.name}\n${t}`:e.name,"aria-label":`Edit project ${e.name}`,onClick:()=>r({open:!0,workspace:e}),children:[(0,X.jsx)(`span`,{className:Z.name,children:e.name}),(0,X.jsx)(`span`,{className:Z.summary,children:A(e)})]})},e.id)})}):e.status===`error`?null:(0,X.jsx)(`p`,{className:Z.empty,children:`No saved projects yet. Press + to keep a folder you work in.`}),(0,X.jsx)(ee,{open:n.open,workspace:n.workspace,priorities:e.data?.priorities,focusSectionId:e.data?.focusSectionId??null,onClose:()=>r({open:!1,workspace:null})})]})}var Q={sidebar:`_sidebar_3wi59_1`,head:`_head_3wi59_9`,headDragStrip:`_headDragStrip_3wi59_40`,search:`_search_3wi59_51`,searchIcon:`_searchIcon_3wi59_58`,iconButton:`_iconButton_3wi59_80`,scroll:`_scroll_3wi59_98`,skeleton:`_skeleton_3wi59_105`,error:`_error_3wi59_106`,empty:`_empty_3wi59_125`,emptyTitle:`_emptyTitle_3wi59_131`,emptyCompact:`_emptyCompact_3wi59_135`,emptyAction:`_emptyAction_3wi59_138`,emptyKey:`_emptyKey_3wi59_153`,group:`_group_3wi59_163`,groupTitle:`_groupTitle_3wi59_167`,groupName:`_groupName_3wi59_177`,enrolled:`_enrolled_3wi59_178`,groupCount:`_groupCount_3wi59_182`,list:`_list_3wi59_192`,session:`_session_3wi59_195`,marker:`_marker_3wi59_247`,"engine-claude":`_engine-claude_3wi59_253`,"engine-codex":`_engine-codex_3wi59_254`,"engine-grok":`_engine-grok_3wi59_255`,"engine-local":`_engine-local_3wi59_256`,sessionText:`_sessionText_3wi59_195`,running:`_running_3wi59_267`,"verse-pulse":`_verse-pulse_3wi59_1`,errored:`_errored_3wi59_274`,seatSpent:`_seatSpent_3wi59_291`,time:`_time_3wi59_304`,footer:`_footer_3wi59_325`,footerButton:`_footerButton_3wi59_332`,confirmActions:`_confirmActions_3wi59_345`,filters:`_filters_3wi59_362`,filter:`_filter_3wi59_362`,filterCount:`_filterCount_3wi59_391`,groupToggle:`_groupToggle_3wi59_400`,twist:`_twist_3wi59_416`,row:`_row_3wi59_428`,sessionBody:`_sessionBody_3wi59_431`,liveLine:`_liveLine_3wi59_437`,statusRunning:`_statusRunning_3wi59_449`,elapsed:`_elapsed_3wi59_454`,unread:`_unread_3wi59_460`,rowMore:`_rowMore_3wi59_469`,renameRow:`_renameRow_3wi59_495`,renameInput:`_renameInput_3wi59_496`},ne=new Map,re=(0,J.lazy)(()=>r(()=>import(`./SessionSearch-_yp7S2TP.js`).then(e=>({default:e.SessionSearch})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28])));function ie(e){let{sessions:t,sessionsStatus:n,sessionsError:r,projects:a,seats:c,selectedId:u,query:d,onQuery:f,onSelect:p,onNew:m,onRetry:h,onCollapse:g,onDisconnect:_,activity:v=null,meta:y=null,localSeen:b=ne,actions:x}=e,S=(0,J.useId)(),[C,w]=(0,J.useState)(`all`),[T,E]=(0,J.useState)(!1),[D,O]=(0,J.useState)(null),[k,A]=(0,J.useState)(null),[j,M]=(0,J.useState)(!1),F=(0,J.useId)(),I=(0,J.useRef)(null),L=(0,J.useMemo)(()=>U({sessions:t,projects:a,query:d,filter:C,activity:v,meta:y,localSeen:b,selectedId:u}),[t,a,d,C,v,y,b,u]),R=n===`loading`||n===`idle`&&t.length===0,z=d.trim().length>0,B=(0,J.useRef)(null);function V(e){if(e.key!==`ArrowDown`)return;let t=B.current?.querySelector($);t&&(e.preventDefault(),t.focus())}function H(e,t,n){x&&A({row:e,anchor:t,from:n})}return(0,X.jsxs)(`nav`,{className:Q.sidebar,"aria-label":`Chats`,children:[(0,X.jsxs)(`div`,{className:Q.head,children:[(0,X.jsx)(`div`,{className:Q.headDragStrip,"aria-hidden":`true`}),(0,X.jsxs)(`label`,{className:Q.search,htmlFor:S,children:[(0,X.jsx)(`span`,{className:Q.searchIcon,"aria-hidden":`true`,children:(0,X.jsx)(K,{})}),(0,X.jsx)(`span`,{className:`visually-hidden`,children:`Search chats and messages`}),(0,X.jsx)(`input`,{id:S,type:`search`,value:d,placeholder:`Search chats`,autoComplete:`off`,onChange:e=>f(e.target.value),onKeyDown:V})]}),(0,X.jsx)(l,{label:`New chat`,shortcut:`⌘N`,placement:`bottom`,children:(0,X.jsx)(`button`,{type:`button`,className:Q.iconButton,onClick:m,"aria-label":`New chat`,children:(0,X.jsx)(G,{})})}),(0,X.jsx)(l,{label:`Hide chat list`,shortcut:`⌘B`,placement:`bottom`,children:(0,X.jsx)(`button`,{type:`button`,className:Q.iconButton,onClick:g,"aria-label":`Hide chat list`,children:(0,X.jsx)(q,{})})}),n===`refreshing`?(0,X.jsx)(s,{label:`Refreshing chats`}):null]}),(0,X.jsx)(ce,{value:C,counts:L.counts,onChange:w}),(0,X.jsxs)(`div`,{ref:B,className:Q.scroll,onKeyDown:ae,children:[(0,X.jsx)(te,{}),R?(0,X.jsxs)(`div`,{className:Q.skeleton,"aria-busy":`true`,children:[(0,X.jsx)(i,{width:`48%`}),(0,X.jsx)(i,{width:`86%`}),(0,X.jsx)(i,{width:`74%`}),(0,X.jsx)(i,{width:`40%`}),(0,X.jsx)(i,{width:`80%`})]}):n===`error`&&t.length===0?(0,X.jsxs)(`div`,{role:`alert`,className:Q.error,children:[(0,X.jsx)(`p`,{children:r??`Could not load chats.`}),(0,X.jsx)(`button`,{type:`button`,onClick:h,children:`Retry`})]}):L.groups.length===0?(0,X.jsx)(le,{query:d,filter:C,hasSessions:t.length>0,onClearQuery:()=>f(``),onClearFilter:()=>w(`all`),onNew:m}):L.groups.map(e=>(0,X.jsx)(ue,{group:e,seats:c,selectedId:u,renaming:D,open:e.kind!==`archived`||T||z||C!==`all`,onToggle:e.kind===`archived`?()=>E(e=>!e):void 0,onSelect:p,onMenu:x?H:void 0,onRenameDone:async(e,t)=>{O(null),x&&t&&t!==e.session.title&&await x.rename(e.session.id,t)}},e.id)),z?(0,X.jsx)(J.Suspense,{fallback:null,children:(0,X.jsx)(re,{query:d,onOpenSession:p,selectedId:u})}):null]}),(0,X.jsx)(`footer`,{className:Q.footer,children:(0,X.jsx)(l,{label:`Signs this window out: clears cached chats and unsent drafts here. Chats stay on the hub.`,placement:`top`,children:(0,X.jsx)(`button`,{type:`button`,onClick:()=>M(!0),className:Q.footerButton,"aria-haspopup":`dialog`,children:`Disconnect from hub`})})}),(0,X.jsx)(o,{open:j,onClose:()=>M(!1),titleId:F,title:`Disconnect from this hub?`,initialFocusRef:I,description:`Unsent drafts in open chats will be cleared. Your chats stay on the hub; you will need the read token to reconnect.`,children:(0,X.jsxs)(`div`,{className:Q.confirmActions,children:[(0,X.jsx)(N,{ref:I,variant:`subtle`,onClick:()=>M(!1),children:`Cancel`}),(0,X.jsx)(N,{variant:`danger`,onClick:()=>{M(!1),_()},children:`Disconnect`})]})}),k&&x?(0,X.jsx)(P,{label:`Actions for ${k.row.session.title||`Untitled chat`}`,anchor:k.anchor,returnFocus:k.from,onClose:()=>A(null),items:se(k.row,x,L.metaAvailable,()=>O(k.row.session.id))}):null]})}var $=`[data-focus-key^="verse-session:"]`;function ae(e){if(e.altKey||e.metaKey||e.ctrlKey||e.shiftKey)return;let t=e.target;if(!t.matches($))return;let n=[...e.currentTarget.querySelectorAll($)],r=n.indexOf(t),i;if(e.key===`ArrowDown`)i=n[r+1];else if(e.key===`ArrowUp`)i=n[r-1];else if(e.key===`Home`)i=n[0];else if(e.key===`End`)i=n[n.length-1];else return;e.preventDefault(),i?.focus()}function oe(e){switch(e.kind){case`running`:return`Running`;case`failed`:return`Last turn failed`;case`unread`:return`${e.newTurns} new turn${e.newTurns===1?``:`s`}`;default:return null}}function se(e,t,n,r){let i=e.session.id,a=e.status.kind===`running`,o=t.dispatchEnabled?null:`This server was started without dispatch.`,s=o??(n?null:`Not available on this server yet.`);return[{id:`pin`,label:e.pinned?`Unpin`:`Pin`,icon:(0,X.jsx)(z,{size:14}),disabled:s!==null,reason:s,onSelect:()=>t.setPinned(i,!e.pinned)},{id:`archive`,label:e.archived?`Unarchive`:`Archive`,icon:(0,X.jsx)(B,{size:14}),disabled:s!==null,reason:s,onSelect:()=>t.setArchived(i,!e.archived)},{id:`rename`,label:`Rename`,icon:(0,X.jsx)(I,{size:14}),disabled:o!==null,reason:o,onSelect:r},{id:`handoff`,label:`Continue in a fresh chat…`,icon:(0,X.jsx)(F,{size:14}),disabled:o!==null||a,reason:o??(a?`Available when its turn finishes.`:null),onSelect:()=>t.handoff(i)},{id:`delete`,label:`Delete…`,icon:(0,X.jsx)(V,{size:14}),danger:!0,separated:!0,disabled:o!==null||a,reason:o??(a?`Stop its turn before deleting.`:null),onSelect:()=>t.requestDelete(i)}]}function ce({value:e,counts:t,onChange:n}){let r=(0,J.useRef)(new Map);function i(t){let i=W.indexOf(e),a;t.key===`ArrowRight`||t.key===`ArrowDown`?a=W[(i+1)%W.length]:t.key===`ArrowLeft`||t.key===`ArrowUp`?a=W[(i-1+W.length)%W.length]:t.key===`Home`?a=W[0]:t.key===`End`&&(a=W[W.length-1]),a&&(t.preventDefault(),n(a),r.current.get(a)?.focus())}return(0,X.jsx)(`div`,{className:Q.filters,role:`radiogroup`,"aria-label":`Show chats`,onKeyDown:i,children:W.map(i=>{let a=t[i],o=i===e;return(0,X.jsxs)(`button`,{ref:e=>{e?r.current.set(i,e):r.current.delete(i)},type:`button`,role:`radio`,"aria-checked":o,tabIndex:o?0:-1,className:Q.filter,"data-filter":i,onClick:()=>n(i),children:[H[i],i!==`all`&&a>0?(0,X.jsx)(`span`,{className:Q.filterCount,children:a}):null]},i)})})}function le({query:e,filter:t,hasSessions:n,onClearQuery:r,onClearFilter:i,onNew:a}){if(e.trim())return(0,X.jsxs)(`div`,{className:`${Q.empty} ${Q.emptyCompact}`,children:[(0,X.jsxs)(`p`,{className:Q.emptyTitle,children:[`No chat titles match “`,e,`”`]}),(0,X.jsx)(`p`,{children:`Titles and projects match as you type. Chats whose messages match, if any, are listed below.`}),(0,X.jsx)(`button`,{type:`button`,className:Q.emptyAction,onClick:r,children:`Clear search`})]});if(t!==`all`&&n){let e=t===`running`?`No chat is running`:t===`needs-you`?`Nothing needs you`:`No pinned chats`;return(0,X.jsxs)(`div`,{className:`${Q.empty} ${Q.emptyCompact}`,children:[(0,X.jsx)(`p`,{className:Q.emptyTitle,children:e}),t===`pinned`?(0,X.jsx)(`p`,{children:`Pin a chat from its row menu — hover it, or right-click.`}):null,(0,X.jsx)(`button`,{type:`button`,className:Q.emptyAction,onClick:i,children:`Show all chats`})]})}return(0,X.jsxs)(`div`,{className:Q.empty,children:[(0,X.jsx)(`p`,{className:Q.emptyTitle,children:`No chats yet`}),(0,X.jsx)(`p`,{children:`Start one on any project with any seat.`}),(0,X.jsxs)(`button`,{type:`button`,className:Q.emptyAction,onClick:a,children:[`Start your first chat `,(0,X.jsx)(`kbd`,{className:Q.emptyKey,children:`⌘N`})]})]})}function ue({group:e,seats:t,selectedId:n,renaming:r,open:i,onToggle:a,onSelect:o,onMenu:s,onRenameDone:c}){let l=(0,J.useId)();return(0,X.jsxs)(`section`,{className:Q.group,"aria-label":e.label,"data-group":e.kind,children:[(0,X.jsxs)(`h2`,{className:Q.groupTitle,title:e.projectPath??void 0,children:[a?(0,X.jsxs)(`button`,{type:`button`,className:Q.groupToggle,"aria-expanded":i,"aria-controls":l,onClick:a,children:[(0,X.jsx)(`span`,{className:Q.twist,"data-open":i||void 0,"aria-hidden":`true`}),(0,X.jsx)(`span`,{className:Q.groupName,children:e.label})]}):(0,X.jsx)(`span`,{className:Q.groupName,children:e.label}),e.enrolled?(0,X.jsx)(`span`,{className:Q.enrolled,children:`enrolled`}):null,(0,X.jsx)(`span`,{className:Q.groupCount,"aria-hidden":`true`,children:e.rows.length})]}),(0,X.jsx)(`ul`,{id:l,className:Q.list,hidden:!i,children:i?e.rows.map(e=>(0,X.jsx)(`li`,{children:r===e.session.id?(0,X.jsx)(pe,{row:e,onDone:t=>{c(e,t)}}):(0,X.jsx)(de,{row:e,seats:t,selected:e.session.id===n,onSelect:o,onMenu:s})},e.session.id)):null})]})}function de({row:e,seats:t,selected:n,onSelect:r,onMenu:i}){let{session:a,status:o}=e,s=h(t,a.seatId),c=s===void 0?null:y(s),u=o.kind===`running`&&c?.cls===`blocked`,d=[a.title||`Untitled chat`,v(t,a),c===null||c.cls===`ready`||c.cls===`unread`?null:c.summary,oe(o)].filter(e=>e!==null).join(` · `),f=(0,J.useRef)(null);function p(t){i&&(t.preventDefault(),i(e,{x:t.clientX,y:t.clientY},t.currentTarget))}function m(t){if(i&&(t.key===`ContextMenu`||t.key===`F10`&&t.shiftKey)){t.preventDefault();let n=t.currentTarget.getBoundingClientRect();i(e,{x:n.left+24,y:n.bottom},t.currentTarget)}}return(0,X.jsxs)(`div`,{className:Q.row,"data-selected":n||void 0,children:[(0,X.jsx)(l,{label:d,placement:`right`,children:(0,X.jsxs)(`button`,{ref:f,type:`button`,className:`${Q.session} ${Q[`engine-${a.engine}`]??``}`,"aria-current":n?`true`:void 0,"data-focus-key":`verse-session:${a.id}`,"data-engine":a.engine,"data-status":o.kind,"aria-haspopup":i?`menu`:void 0,"aria-keyshortcuts":i?`Shift+F10`:void 0,onClick:()=>r(a.id),onContextMenu:p,onKeyDown:m,children:[(0,X.jsx)(`span`,{className:Q.marker,"aria-hidden":`true`}),(0,X.jsxs)(`span`,{className:Q.sessionBody,children:[(0,X.jsx)(`span`,{className:Q.sessionText,children:a.title||`Untitled chat`}),e.live?(0,X.jsx)(`span`,{className:Q.liveLine,title:e.live.text,children:e.live.text}):null]}),u&&c!==null?(0,X.jsx)(`span`,{className:Q.seatSpent,role:`img`,"aria-label":`Seat limit reached: ${c.summary}`,children:`▮`}):null,(0,X.jsx)(fe,{row:e})]})}),i?(0,X.jsx)(`button`,{type:`button`,className:Q.rowMore,tabIndex:-1,"aria-hidden":`true`,title:`Chat actions`,onClick:t=>{let n=t.currentTarget.getBoundingClientRect();i(e,{x:n.right-220,y:n.bottom+4},f.current??t.currentTarget)},children:(0,X.jsx)(R,{size:14})}):null]})}function fe({row:e}){let{status:t,session:n}=e,r=oe(t)??void 0;switch(t.kind){case`running`:return(0,X.jsxs)(`span`,{className:Q.statusRunning,children:[(0,X.jsx)(`span`,{className:Q.running,role:`img`,"aria-label":r}),t.startedAt?(0,X.jsx)(L,{className:Q.elapsed,since:t.startedAt}):null]});case`failed`:return(0,X.jsx)(`span`,{className:Q.errored,role:`img`,"aria-label":r,children:`!`});case`unread`:return(0,X.jsx)(`span`,{className:Q.unread,role:`img`,"aria-label":r});default:return(0,X.jsx)(`time`,{className:Q.time,dateTime:n.updatedAt,children:g(n.updatedAt)})}}function pe({row:e,onDone:t}){let[n,r]=(0,J.useState)(e.session.title),i=(0,J.useRef)(null),a=(0,J.useRef)(!1);(0,J.useEffect)(()=>{i.current?.focus(),i.current?.select()},[]);let o=e=>{a.current||(a.current=!0,t(e.trim()))};return(0,X.jsx)(`div`,{className:`${Q.row} ${Q.renameRow}`,children:(0,X.jsx)(`input`,{ref:i,className:Q.renameInput,value:n,maxLength:120,"aria-label":`Chat title`,onChange:e=>r(e.target.value),onBlur:()=>o(n),onKeyDown:t=>{t.key===`Enter`?(t.preventDefault(),o(n)):t.key===`Escape`&&(t.preventDefault(),o(e.session.title))}})})}export{ie as Sidebar};
3
- //# sourceMappingURL=Sidebar-DjQOqPbm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/workspaces/SavedProjectDialog.tsx","../../../../../../src/web-ui/routes/verse/workspaces/SavedProjects.tsx","../../../../../../src/web-ui/routes/verse/Sidebar.tsx"],"sourcesContent":["/**\n * routes/verse/workspaces/SavedProjectDialog.tsx — create, rename, reorder and\n * delete a SAVED PROJECT (a workspace in `~/.ashlr/verse/workspaces.json`).\n *\n * Why this dialog exists: the workspace routes were complete and nothing in\n * the console ever called them, so the only way to get a saved project was to\n * hand-edit a JSON file. A folder the operator typed into the new-chat dialog\n * came back only AFTER a chat had been created on it. Now a folder can be kept\n * before any chat exists, which is what \"open my project again tomorrow\"\n * actually requires.\n *\n * Three honesty rules are load-bearing here:\n *\n * - THE FIRST FOLDER IS THE PRIMARY. It is the session's cwd, and it is the\n * only folder a Grok seat can reach, so the reorder buttons are not\n * cosmetic and the first row says \"Primary folder\" rather than \"Folder 1\".\n * - PRIORITY ORDERS, IT NEVER GRANTS. `ROOT_PRIORITY_NOTE` is rendered at the\n * point of the choice; ranking a repo `critical` does not enrol it.\n * - NO SEAT IS CHOSEN HERE, so no per-seat caveat can be honest. The dialog\n * states the engine rule flatly instead (`MULTI_ROOT_ENGINE_NOTE`); the\n * seat-specific warning belongs in the new-chat dialog, where a seat exists.\n */\nimport { useEffect, useId, useState, type FormEvent } from 'react';\nimport type { VerseRootPriority, VerseWorkspace } from '../../../data/api-types.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { nativePickerAvailable, pickDirectory } from '../folder-picker.js';\nimport { projectName } from '../verse-model.js';\nimport {\n createVerseWorkspace,\n deleteVerseWorkspace,\n setVerseFocusSection,\n setVerseRootPriority,\n updateVerseWorkspace,\n} from '../verse-queries.js';\nimport {\n MAX_WORKSPACE_ROOTS,\n MULTI_ROOT_ENGINE_NOTE,\n moveRoot,\n priorityOf,\n ROOT_PRIORITY_LABEL,\n ROOT_PRIORITY_NOTE,\n ROOT_PRIORITY_ORDER,\n rootRowLabel,\n validateWorkspaceDraft,\n workspaceRootPaths,\n} from '../workspace-model.js';\nimport styles from './SavedProjectDialog.module.css';\n\nexport interface SavedProjectDialogProps {\n open: boolean;\n /** The project being edited, or null to create a new one. */\n workspace: VerseWorkspace | null;\n /** Folder set to pre-fill a NEW project with (primary first). */\n initialRoots?: readonly string[];\n /** Per-path priority as the server holds it. Absent key means `normal`. */\n priorities?: Readonly<Record<string, VerseRootPriority>>;\n /** The section the autonomous lane is focused on, if any. */\n focusSectionId?: string | null;\n onClose: () => void;\n onSaved?: (workspace: VerseWorkspace) => void;\n onDeleted?: (id: string) => void;\n}\n\nexport function SavedProjectDialog(props: SavedProjectDialogProps) {\n const { open, workspace, initialRoots, priorities, focusSectionId = null, onClose, onSaved, onDeleted } = props;\n const titleId = useId();\n const nameId = useId();\n const [name, setName] = useState('');\n const [roots, setRoots] = useState<string[]>(['']);\n const [section, setSection] = useState(false);\n const [focused, setFocused] = useState(false);\n const [priorityDraft, setPriorityDraft] = useState<Record<string, VerseRootPriority>>({});\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Reset on the OPEN transition only, for the same reason NewChatDialog does:\n // the workspace list is a fresh array on every invalidation, and re-running\n // this on it would wipe a half-typed path.\n useEffect(() => {\n if (!open) return;\n const existing = workspace;\n setName(existing?.name ?? '');\n setRoots(existing ? workspaceRootPaths(existing) : [...(initialRoots ?? [])].filter((r) => r.length > 0));\n setSection(existing?.section ?? false);\n setFocused(existing !== null && focusSectionId === existing.id);\n setPriorityDraft({});\n setConfirmingDelete(false);\n setBusy(false);\n setError(null);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- open transition only; the inputs are read once, on purpose.\n }, [open]);\n\n // Always at least one row, so there is somewhere to type the primary folder.\n const rows = roots.length === 0 ? [''] : roots;\n const showPicker = nativePickerAvailable();\n\n function setRow(index: number, value: string) {\n setRoots(rows.map((r, i) => (i === index ? value : r)));\n }\n\n async function choose(index: number) {\n const picked = await pickDirectory();\n if (picked !== null && picked.length > 0) setRow(index, picked);\n }\n\n function priorityFor(path: string): VerseRootPriority {\n return priorityDraft[path] ?? priorityOf(path, priorities);\n }\n\n async function submit(event: FormEvent) {\n event.preventDefault();\n const draft = validateWorkspaceDraft(name, rows);\n if (!draft.ok) {\n setError(draft.error);\n return;\n }\n setBusy(true);\n setError(null);\n try {\n const saved = workspace === null\n ? await createVerseWorkspace({ name: draft.name, roots: draft.roots, section })\n : await updateVerseWorkspace(workspace.id, { name: draft.name, roots: draft.roots, section });\n // Priority is an attribute OF THE REPO, held once per path, so it is a\n // separate call per changed path rather than part of the workspace body.\n for (const path of draft.roots) {\n const next = priorityDraft[path];\n if (next !== undefined && next !== priorityOf(path, priorities)) {\n await setVerseRootPriority(path, next);\n }\n }\n const wasFocused = workspace !== null && focusSectionId === workspace.id;\n if (section && focused !== wasFocused) {\n await setVerseFocusSection(focused ? saved.id : null);\n }\n onSaved?.(saved);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n }\n\n async function remove() {\n if (workspace === null) return;\n setBusy(true);\n setError(null);\n try {\n await deleteVerseWorkspace(workspace.id);\n onDeleted?.(workspace.id);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n setBusy(false);\n }\n }\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n titleId={titleId}\n title={workspace === null ? 'Save a project' : 'Edit project'}\n description=\"Saved projects stay in the picker — they do not need a chat on them first.\"\n widthClassName={styles.width}\n >\n <form className={styles.form} onSubmit={(event) => void submit(event)} noValidate>\n <label className={styles.field} htmlFor={nameId}>\n <span className={styles.label}>Name</span>\n <input id={nameId} className={styles.input} value={name} onChange={(event) => setName(event.target.value)}\n placeholder=\"Defaults to the folder’s own name\" maxLength={120} autoComplete=\"off\" />\n </label>\n\n <div className={styles.field}>\n <span className={styles.label}>Folders</span>\n <p className={styles.hint}>\n The first folder is the primary: it is the chat’s working directory. Move a folder to the top to make it\n the primary.\n </p>\n {rows.map((root, index) => (\n <div key={index} className={styles.rootRow}>\n <input\n className={styles.input}\n value={root}\n // A long path is cut with an ellipsis while the field is idle; the tooltip keeps it whole.\n title={root || undefined}\n onChange={(event) => setRow(index, event.target.value)}\n placeholder=\"/absolute/path/to/folder\"\n aria-label={rootRowLabel(index)}\n autoComplete=\"off\"\n spellCheck={false}\n />\n {showPicker ? (\n <button type=\"button\" className={styles.rowButton} onClick={() => void choose(index)}\n aria-label={`Choose ${rootRowLabel(index).toLowerCase()}`}>Choose folder…</button>\n ) : null}\n {/* Glyph-only: the accessible name AND the tooltip both say what the arrow does. */}\n <button type=\"button\" className={styles.rowButton} disabled={index === 0}\n onClick={() => setRoots(moveRoot(rows, index, 'up'))}\n aria-label={`Move ${rootRowLabel(index).toLowerCase()} up`}\n title={`Move ${rootRowLabel(index).toLowerCase()} up`}><span aria-hidden=\"true\">↑</span></button>\n <button type=\"button\" className={styles.rowButton} disabled={index === rows.length - 1}\n onClick={() => setRoots(moveRoot(rows, index, 'down'))}\n aria-label={`Move ${rootRowLabel(index).toLowerCase()} down`}\n title={`Move ${rootRowLabel(index).toLowerCase()} down`}><span aria-hidden=\"true\">↓</span></button>\n <button type=\"button\" className={styles.rowButton} disabled={rows.length === 1}\n onClick={() => setRoots(rows.filter((_, i) => i !== index))}\n aria-label={`Remove ${rootRowLabel(index).toLowerCase()}`}>Remove</button>\n </div>\n ))}\n {rows.length < MAX_WORKSPACE_ROOTS ? (\n <button type=\"button\" className={styles.addRoot} onClick={() => setRoots([...rows, ''])}>Add a folder</button>\n ) : null}\n {rows.length > 1 ? <p className={styles.hint}>{MULTI_ROOT_ENGINE_NOTE}</p> : null}\n </div>\n\n <div className={styles.field}>\n <label className={styles.checkbox}>\n <input type=\"checkbox\" checked={section} onChange={(event) => setSection(event.target.checked)} />\n <span>Offer this project to the autonomous lane as a section</span>\n </label>\n {section ? (\n <>\n <label className={styles.checkbox}>\n <input type=\"checkbox\" checked={focused} onChange={(event) => setFocused(event.target.checked)} />\n <span>Focus the fleet on this section</span>\n </label>\n <p className={styles.hint}>{ROOT_PRIORITY_NOTE}</p>\n {rows.filter((r) => r.trim().length > 0).map((root, index) => (\n <div key={`${root}-${index}`} className={styles.priorityRow}>\n {/* The folder's own name; the full path is the tooltip (and the select's accessible name). */}\n <span className={styles.priorityPath} title={root}>{projectName(root.trim())}</span>\n <select\n className={styles.select}\n aria-label={`Priority for ${root}`}\n value={priorityFor(root.trim())}\n onChange={(event) =>\n setPriorityDraft({ ...priorityDraft, [root.trim()]: event.target.value as VerseRootPriority })}\n >\n {ROOT_PRIORITY_ORDER.map((p) => (\n <option key={p} value={p}>{ROOT_PRIORITY_LABEL[p]}</option>\n ))}\n </select>\n </div>\n ))}\n </>\n ) : null}\n </div>\n\n {error ? <p role=\"alert\" className={styles.error}>{error}</p> : null}\n\n <div className={styles.actions}>\n {workspace === null ? null : confirmingDelete ? (\n <>\n <span className={styles.confirm}>Forget this project? Chats already on it are untouched.</span>\n <button type=\"button\" className={styles.danger} onClick={() => void remove()} disabled={busy}>Forget</button>\n <button type=\"button\" className={styles.cancel} onClick={() => setConfirmingDelete(false)}>Keep</button>\n </>\n ) : (\n <button type=\"button\" className={styles.remove} onClick={() => setConfirmingDelete(true)} disabled={busy}>\n Forget project\n </button>\n )}\n <span className={styles.spacer} />\n <button type=\"button\" className={styles.cancel} onClick={onClose}>Cancel</button>\n <button type=\"submit\" className={styles.save} disabled={busy}>{busy ? 'Saving…' : 'Save project'}</button>\n </div>\n </form>\n </Dialog>\n );\n}\n","/**\n * routes/verse/workspaces/SavedProjects.tsx — the sidebar's \"Projects\"\n * section: every saved project, and the one button that creates one.\n *\n * SELF-SUPPLIED ON PURPOSE. It reads `verseWorkspacesQuery` itself rather\n * than taking the list as a prop, because the sidebar's props are owned by the\n * chat section and this list has exactly one consumer. The key is the same one\n * the new-chat dialog's list is read from, so the cache serves both from one\n * request and the picker and this list can never disagree.\n *\n * Quiet when the read fails: an older server has no /api/verse/workspaces at\n * all, and a permanent red line in the sidebar for a feature that server does\n * not have would be noise, not honesty. The \"Save a project\" button stays —\n * pressing it surfaces the real refusal from the server, in the dialog.\n */\nimport { useState } from 'react';\nimport type { VerseWorkspace } from '../../../data/api-types.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { PlusIcon } from '../verse-icons.js';\nimport { verseWorkspacesQuery } from '../verse-queries.js';\nimport { workspacePrimary, workspaceSummary } from '../workspace-model.js';\nimport { SavedProjectDialog } from './SavedProjectDialog.js';\nimport styles from './SavedProjects.module.css';\n\nexport function SavedProjects() {\n const query = useQuery(verseWorkspacesQuery);\n const workspaces = query.data?.workspaces ?? [];\n const [editing, setEditing] = useState<{ open: boolean; workspace: VerseWorkspace | null }>(\n { open: false, workspace: null },\n );\n\n return (\n <section className={styles.projects} aria-label=\"Saved projects\">\n <h2 className={styles.head}>\n <span className={styles.headText}>Projects</span>\n <button\n type=\"button\"\n className={styles.add}\n title=\"Save a project\"\n aria-label=\"Save a project\"\n onClick={() => setEditing({ open: true, workspace: null })}\n >\n <PlusIcon />\n </button>\n </h2>\n\n {workspaces.length > 0 ? (\n <ul className={styles.list}>\n {workspaces.map((workspace) => {\n const primary = workspacePrimary(workspace) ?? '';\n return (\n <li key={workspace.id}>\n <button\n type=\"button\"\n className={styles.project}\n // The name truncates to one line, so the tooltip carries it in\n // full, then the primary folder — which costs no pixels here.\n title={primary ? `${workspace.name}\\n${primary}` : workspace.name}\n aria-label={`Edit project ${workspace.name}`}\n onClick={() => setEditing({ open: true, workspace })}\n >\n <span className={styles.name}>{workspace.name}</span>\n <span className={styles.summary}>{workspaceSummary(workspace)}</span>\n </button>\n </li>\n );\n })}\n </ul>\n ) : query.status === 'error' ? null : (\n <p className={styles.empty}>No saved projects yet. Press + to keep a folder you work in.</p>\n )}\n\n <SavedProjectDialog\n open={editing.open}\n workspace={editing.workspace}\n priorities={query.data?.priorities}\n focusSectionId={query.data?.focusSectionId ?? null}\n onClose={() => setEditing({ open: false, workspace: null })}\n />\n </section>\n );\n}\n","/**\n * routes/verse/Sidebar.tsx — the chat list (3.10, SPEC-310C §2; model:\n * chat/sidebar-model.ts).\n *\n * [search…………………………] [+] [⫿]\n * (All) (Running 2) (Needs you 1) (Pinned 3)\n * SAVED PROJECTS …\n * PINNED\n * │ Fix the login bug ● 1m 02s\n * │ npm test\n * HUB\n * │ Write the docs • ← unread\n * │ Migrate the store ! ← failed\n * ▸ ARCHIVED 12\n *\n * One row is a 2px engine tick, the title and ONE status — the most urgent\n * that applies: a pulse with the elapsed time (running), a failure mark, an\n * unread dot, or how long ago. A running row adds a muted second line from\n * activity: the command it is running, or the tail of what it is thinking.\n * Every status is a glyph with an accessible name, at least 11px, and never\n * colour alone (DESIGN §6). The row's tooltip spells the status out too\n * (\"… · Last turn failed\"), so the \"!\" is explained to a sighted pointer user\n * as well as to a screen reader.\n *\n * Group headings are the project's display name as it is on disk (never\n * upper-cased: a folder slug shouted in caps is a different-looking name),\n * with the full path as their tooltip. ↑/↓ move between chats, Home/End jump\n * to the ends, Enter opens; ↓ from the search field lands on the first chat.\n *\n * Hover a row (or right-click it, or press Shift+F10 / the menu key on it)\n * for pin, archive, rename, hand off and delete. Pin and archive need C1's\n * session-meta route; on a server without it they are shown disabled with\n * the reason, rather than hidden.\n *\n * ONE SEARCH FIELD, TWO ANSWERS (V3.9): titles and projects filter instantly\n * on the client; underneath, SessionSearch lists chats whose MESSAGES match\n * (a scan on this machine, nothing sent to a model).\n *\n * Saved projects sit above the chats: the registry the operator writes\n * deliberately (workspaces/SavedProjects.tsx).\n */\nimport { lazy, Suspense, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent, type MouseEvent as ReactMouseEvent } from 'react';\nimport type { VerseProject, VerseSeat, VerseSession } from '../../data/api-types.js';\nimport type { VerseActivityResponse, VerseSessionMetaResponse } from '../../../core/verse/workbench-types.js';\nimport type { QueryStatus } from '../../data/cache.js';\nimport { Button } from '../../components/primitives/Button.js';\nimport { Dialog } from '../../components/primitives/Dialog.js';\nimport { RefreshIndicator } from '../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../components/primitives/Skeleton.js';\nimport { Tooltip } from '../../components/primitives/Tooltip.js';\nimport { ActionMenu, type ActionMenuItem, type MenuAnchor } from './chat/ActionMenu.js';\nimport { LiveTimer } from './chat/LiveTimer.js';\nimport {\n buildSidebar,\n SIDEBAR_FILTERS,\n SIDEBAR_FILTER_LABEL,\n type SidebarFilter,\n type SidebarGroup,\n type SidebarRow,\n} from './chat/sidebar-model.js';\nimport { ArchiveGlyph, HandoffGlyph, MoreGlyph, PinGlyph, RenameGlyph, TrashGlyph } from './dock/dock-icons.js';\nimport { PlusIcon, SearchIcon, SidebarIcon } from './verse-icons.js';\nimport { seatSubscription } from './seat-subscription.js';\nimport { formatRelative, seatById, seatPillLabel } from './verse-model.js';\nimport { SavedProjects } from './workspaces/SavedProjects.js';\nimport styles from './Sidebar.module.css';\n\nexport interface SidebarProps {\n sessions: readonly VerseSession[];\n sessionsStatus: QueryStatus;\n sessionsError: string | null;\n projects: readonly VerseProject[];\n seats: readonly VerseSeat[];\n selectedId: string | null;\n query: string;\n onQuery: (value: string) => void;\n onSelect: (id: string) => void;\n onNew: () => void;\n onRetry: () => void;\n onCollapse: () => void;\n /** Called only once the operator confirms the footer's \"Disconnect from hub\" dialog. */\n onDisconnect: () => void;\n /** 3.10 — C1's activity (null: not on this server / not answered yet). */\n activity?: VerseActivityResponse | null;\n /** 3.10 — C1's per-chat meta (null: not on this server / not answered yet). */\n meta?: VerseSessionMetaResponse | null;\n /** Turn counts this tab has seen, per chat. */\n localSeen?: ReadonlyMap<string, number>;\n /** Row actions (3.10). Absent → the row menu is not offered. */\n actions?: SidebarRowActions;\n}\n\nexport interface SidebarRowActions {\n setPinned: (sessionId: string, pinned: boolean) => void;\n setArchived: (sessionId: string, archived: boolean) => void;\n rename: (sessionId: string, title: string) => Promise<boolean>;\n handoff: (sessionId: string) => void;\n requestDelete: (sessionId: string) => void;\n /** False on a read-only server: every write is shown disabled with this reason. */\n dispatchEnabled: boolean;\n}\n\nconst NO_SEEN: ReadonlyMap<string, number> = new Map();\n\n// Message search loads with the first query, not with the chat list.\nconst SessionSearch = lazy(() => import('./context/SessionSearch.js').then((m) => ({ default: m.SessionSearch })));\n\nexport function Sidebar(props: SidebarProps) {\n const { sessions, sessionsStatus, sessionsError, projects, seats, selectedId, query, onQuery, onSelect, onNew,\n onRetry, onCollapse, onDisconnect, activity = null, meta = null, localSeen = NO_SEEN, actions } = props;\n const searchId = useId();\n const [filter, setFilter] = useState<SidebarFilter>('all');\n const [archivedOpen, setArchivedOpen] = useState(false);\n const [renaming, setRenaming] = useState<string | null>(null);\n const [menu, setMenu] = useState<{ row: SidebarRow; anchor: MenuAnchor; from: HTMLElement } | null>(null);\n const [confirmDisconnect, setConfirmDisconnect] = useState(false);\n const disconnectTitleId = useId();\n const disconnectCancelRef = useRef<HTMLButtonElement>(null);\n const model = useMemo(\n () => buildSidebar({ sessions, projects, query, filter, activity, meta, localSeen, selectedId }),\n [sessions, projects, query, filter, activity, meta, localSeen, selectedId],\n );\n const loading = sessionsStatus === 'loading' || (sessionsStatus === 'idle' && sessions.length === 0);\n const searching = query.trim().length > 0;\n const scrollRef = useRef<HTMLDivElement>(null);\n\n /** ↓ from the search field: into the list, on its first chat. */\n function onSearchKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n if (event.key !== 'ArrowDown') return;\n const first = scrollRef.current?.querySelector<HTMLElement>(ROW_SELECTOR);\n if (!first) return;\n event.preventDefault();\n first.focus();\n }\n\n function openMenu(row: SidebarRow, anchor: MenuAnchor, from: HTMLElement) {\n if (!actions) return;\n setMenu({ row, anchor, from });\n }\n\n return (\n <nav className={styles.sidebar} aria-label=\"Chats\">\n <div className={styles.head}>\n {/* Draggable strip under the overlay title bar; zero-height in a browser. */}\n <div className={styles.headDragStrip} aria-hidden=\"true\" />\n <label className={styles.search} htmlFor={searchId}>\n <span className={styles.searchIcon} aria-hidden=\"true\"><SearchIcon /></span>\n <span className=\"visually-hidden\">Search chats and messages</span>\n <input id={searchId} type=\"search\" value={query} placeholder=\"Search chats\" autoComplete=\"off\"\n onChange={(event) => onQuery(event.target.value)} onKeyDown={onSearchKeyDown} />\n </label>\n <Tooltip label=\"New chat\" shortcut=\"⌘N\" placement=\"bottom\">\n <button type=\"button\" className={styles.iconButton} onClick={onNew} aria-label=\"New chat\">\n <PlusIcon />\n </button>\n </Tooltip>\n <Tooltip label=\"Hide chat list\" shortcut=\"⌘B\" placement=\"bottom\">\n <button type=\"button\" className={styles.iconButton} onClick={onCollapse} aria-label=\"Hide chat list\">\n <SidebarIcon />\n </button>\n </Tooltip>\n {sessionsStatus === 'refreshing' ? <RefreshIndicator label=\"Refreshing chats\" /> : null}\n </div>\n\n <FilterChips value={filter} counts={model.counts} onChange={setFilter} />\n\n <div ref={scrollRef} className={styles.scroll} onKeyDown={onRowsKeyDown}>\n <SavedProjects />\n {loading ? (\n <div className={styles.skeleton} aria-busy=\"true\">\n <SkeletonLine width=\"48%\" /><SkeletonLine width=\"86%\" /><SkeletonLine width=\"74%\" />\n <SkeletonLine width=\"40%\" /><SkeletonLine width=\"80%\" />\n </div>\n ) : sessionsStatus === 'error' && sessions.length === 0 ? (\n <div role=\"alert\" className={styles.error}>\n <p>{sessionsError ?? 'Could not load chats.'}</p>\n <button type=\"button\" onClick={onRetry}>Retry</button>\n </div>\n ) : model.groups.length === 0 ? (\n <EmptyList query={query} filter={filter} hasSessions={sessions.length > 0} onClearQuery={() => onQuery('')}\n onClearFilter={() => setFilter('all')} onNew={onNew} />\n ) : model.groups.map((group) => (\n <GroupView key={group.id} group={group} seats={seats} selectedId={selectedId} renaming={renaming}\n open={group.kind !== 'archived' || archivedOpen || searching || filter !== 'all'}\n onToggle={group.kind === 'archived' ? () => setArchivedOpen((v) => !v) : undefined}\n onSelect={onSelect} onMenu={actions ? openMenu : undefined}\n onRenameDone={async (row, title) => {\n setRenaming(null);\n if (!actions || !title || title === row.session.title) return;\n await actions.rename(row.session.id, title);\n }} />\n ))}\n {searching ? (\n <Suspense fallback={null}>\n <SessionSearch query={query} onOpenSession={onSelect} selectedId={selectedId} />\n </Suspense>\n ) : null}\n </div>\n\n <footer className={styles.footer}>\n {/* clearReadSession (data/auth-store.ts): ends this window's read\n session — the cookie, the remembered token, the mutation hold,\n cached data and the composer's drafts — and shows the token screen\n again. The chats themselves stay on the hub. Said in the label and\n the tooltip, because \"Disconnect\" alone reads like a network blip.\n It throws away unsent drafts, so — like Settings ▸ Connection — it\n asks first; onDisconnect runs only from the dialog's red button. */}\n <Tooltip label=\"Signs this window out: clears cached chats and unsent drafts here. Chats stay on the hub.\" placement=\"top\">\n <button type=\"button\" onClick={() => setConfirmDisconnect(true)} className={styles.footerButton}\n aria-haspopup=\"dialog\">Disconnect from hub</button>\n </Tooltip>\n </footer>\n\n {/* The same confirm as Settings ▸ Connection (ConnectionPanel.tsx): the\n Dialog primitive, focus on CANCEL so Enter-Enter keeps the session,\n Escape and the backdrop cancel, and focus returns to the footer\n button. */}\n <Dialog open={confirmDisconnect} onClose={() => setConfirmDisconnect(false)} titleId={disconnectTitleId}\n title=\"Disconnect from this hub?\" initialFocusRef={disconnectCancelRef}\n description=\"Unsent drafts in open chats will be cleared. Your chats stay on the hub; you will need the read token to reconnect.\">\n <div className={styles.confirmActions}>\n <Button ref={disconnectCancelRef} variant=\"subtle\" onClick={() => setConfirmDisconnect(false)}>Cancel</Button>\n <Button variant=\"danger\" onClick={() => {\n setConfirmDisconnect(false);\n onDisconnect();\n }}>Disconnect</Button>\n </div>\n </Dialog>\n\n {menu && actions ? (\n <ActionMenu label={`Actions for ${menu.row.session.title || 'Untitled chat'}`} anchor={menu.anchor}\n returnFocus={menu.from} onClose={() => setMenu(null)}\n items={rowMenuItems(menu.row, actions, model.metaAvailable, () => setRenaming(menu.row.session.id))} />\n ) : null}\n </nav>\n );\n}\n\n/** Every chat row in the list (search results and saved projects are not rows). */\nconst ROW_SELECTOR = '[data-focus-key^=\"verse-session:\"]';\n\n/** ↑/↓ between chat rows, Home/End to the ends. Enter is the row button's own. */\nfunction onRowsKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (event.altKey || event.metaKey || event.ctrlKey || event.shiftKey) return;\n const target = event.target as HTMLElement;\n if (!target.matches(ROW_SELECTOR)) return;\n const rows = [...event.currentTarget.querySelectorAll<HTMLElement>(ROW_SELECTOR)];\n const at = rows.indexOf(target);\n let next: HTMLElement | undefined;\n if (event.key === 'ArrowDown') next = rows[at + 1];\n else if (event.key === 'ArrowUp') next = rows[at - 1];\n else if (event.key === 'Home') next = rows[0];\n else if (event.key === 'End') next = rows[rows.length - 1];\n else return;\n event.preventDefault();\n next?.focus();\n}\n\n/** The row's status in words, for its tooltip (the glyph's accessible name, said to everyone). */\nfunction rowStatusWords(status: SidebarRow['status']): string | null {\n switch (status.kind) {\n case 'running': return 'Running';\n case 'failed': return 'Last turn failed';\n case 'unread': return `${status.newTurns} new turn${status.newTurns === 1 ? '' : 's'}`;\n default: return null;\n }\n}\n\nfunction rowMenuItems(row: SidebarRow, actions: SidebarRowActions, metaAvailable: boolean, startRename: () => void): ActionMenuItem[] {\n const id = row.session.id;\n const running = row.status.kind === 'running';\n const writeReason = !actions.dispatchEnabled ? 'This server was started without dispatch.' : null;\n const metaReason = writeReason ?? (metaAvailable ? null : 'Not available on this server yet.');\n return [\n {\n id: 'pin',\n label: row.pinned ? 'Unpin' : 'Pin',\n icon: <PinGlyph size={14} />,\n disabled: metaReason !== null,\n reason: metaReason,\n onSelect: () => actions.setPinned(id, !row.pinned),\n },\n {\n id: 'archive',\n label: row.archived ? 'Unarchive' : 'Archive',\n icon: <ArchiveGlyph size={14} />,\n disabled: metaReason !== null,\n reason: metaReason,\n onSelect: () => actions.setArchived(id, !row.archived),\n },\n { id: 'rename', label: 'Rename', icon: <RenameGlyph size={14} />, disabled: writeReason !== null, reason: writeReason, onSelect: startRename },\n {\n id: 'handoff',\n label: 'Continue in a fresh chat…',\n icon: <HandoffGlyph size={14} />,\n disabled: writeReason !== null || running,\n reason: writeReason ?? (running ? 'Available when its turn finishes.' : null),\n onSelect: () => actions.handoff(id),\n },\n {\n id: 'delete',\n label: 'Delete…',\n icon: <TrashGlyph size={14} />,\n danger: true,\n separated: true,\n disabled: writeReason !== null || running,\n reason: writeReason ?? (running ? 'Stop its turn before deleting.' : null),\n onSelect: () => actions.requestDelete(id),\n },\n ];\n}\n\n/**\n * All / Running / Needs you / Pinned — one radio group, ONE tab stop, ←/→\n * between the options (the list below is where Tab should go next).\n */\nfunction FilterChips({ value, counts, onChange }: { value: SidebarFilter; counts: Record<SidebarFilter, number>; onChange: (f: SidebarFilter) => void }) {\n const refs = useRef(new Map<SidebarFilter, HTMLButtonElement>());\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const i = SIDEBAR_FILTERS.indexOf(value);\n let next: SidebarFilter | undefined;\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') next = SIDEBAR_FILTERS[(i + 1) % SIDEBAR_FILTERS.length];\n else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') next = SIDEBAR_FILTERS[(i - 1 + SIDEBAR_FILTERS.length) % SIDEBAR_FILTERS.length];\n else if (event.key === 'Home') next = SIDEBAR_FILTERS[0];\n else if (event.key === 'End') next = SIDEBAR_FILTERS[SIDEBAR_FILTERS.length - 1];\n if (!next) return;\n event.preventDefault();\n onChange(next);\n refs.current.get(next)?.focus();\n }\n return (\n <div className={styles.filters} role=\"radiogroup\" aria-label=\"Show chats\" onKeyDown={onKeyDown}>\n {SIDEBAR_FILTERS.map((f) => {\n const n = counts[f];\n const checked = f === value;\n return (\n <button key={f} ref={(node) => { if (node) refs.current.set(f, node); else refs.current.delete(f); }}\n type=\"button\" role=\"radio\" aria-checked={checked} tabIndex={checked ? 0 : -1} className={styles.filter}\n data-filter={f} onClick={() => onChange(f)}>\n {SIDEBAR_FILTER_LABEL[f]}\n {f !== 'all' && n > 0 ? <span className={styles.filterCount}>{n}</span> : null}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction EmptyList({ query, filter, hasSessions, onClearQuery, onClearFilter, onNew }: {\n query: string;\n filter: SidebarFilter;\n hasSessions: boolean;\n onClearQuery: () => void;\n onClearFilter: () => void;\n onNew: () => void;\n}) {\n if (query.trim()) {\n return (\n <div className={`${styles.empty} ${styles.emptyCompact}`}>\n <p className={styles.emptyTitle}>No chat titles match “{query}”</p>\n <p>Titles and projects match as you type. Chats whose messages match, if any, are listed below.</p>\n <button type=\"button\" className={styles.emptyAction} onClick={onClearQuery}>Clear search</button>\n </div>\n );\n }\n if (filter !== 'all' && hasSessions) {\n const what = filter === 'running' ? 'No chat is running' : filter === 'needs-you' ? 'Nothing needs you' : 'No pinned chats';\n return (\n <div className={`${styles.empty} ${styles.emptyCompact}`}>\n <p className={styles.emptyTitle}>{what}</p>\n {filter === 'pinned' ? <p>Pin a chat from its row menu — hover it, or right-click.</p> : null}\n <button type=\"button\" className={styles.emptyAction} onClick={onClearFilter}>Show all chats</button>\n </div>\n );\n }\n return (\n <div className={styles.empty}>\n <p className={styles.emptyTitle}>No chats yet</p>\n <p>Start one on any project with any seat.</p>\n {/* Not named \"New chat\": the header already has a control by that name. */}\n <button type=\"button\" className={styles.emptyAction} onClick={onNew}>\n Start your first chat <kbd className={styles.emptyKey}>⌘N</kbd>\n </button>\n </div>\n );\n}\n\nfunction GroupView({ group, seats, selectedId, renaming, open, onToggle, onSelect, onMenu, onRenameDone }: {\n group: SidebarGroup;\n seats: readonly VerseSeat[];\n selectedId: string | null;\n renaming: string | null;\n open: boolean;\n onToggle?: () => void;\n onSelect: (id: string) => void;\n onMenu?: (row: SidebarRow, anchor: MenuAnchor, from: HTMLElement) => void;\n onRenameDone: (row: SidebarRow, title: string) => Promise<void>;\n}) {\n const listId = useId();\n return (\n <section className={styles.group} aria-label={group.label} data-group={group.kind}>\n <h2 className={styles.groupTitle} title={group.projectPath ?? undefined}>\n {onToggle ? (\n <button type=\"button\" className={styles.groupToggle} aria-expanded={open} aria-controls={listId} onClick={onToggle}>\n <span className={styles.twist} data-open={open || undefined} aria-hidden=\"true\" />\n <span className={styles.groupName}>{group.label}</span>\n </button>\n ) : <span className={styles.groupName}>{group.label}</span>}\n {group.enrolled ? <span className={styles.enrolled}>enrolled</span> : null}\n <span className={styles.groupCount} aria-hidden=\"true\">{group.rows.length}</span>\n </h2>\n <ul id={listId} className={styles.list} hidden={!open}>\n {open ? group.rows.map((row) => (\n <li key={row.session.id}>\n {renaming === row.session.id ? (\n <RenameRow row={row} onDone={(title) => { void onRenameDone(row, title); }} />\n ) : (\n <SessionRowView row={row} seats={seats} selected={row.session.id === selectedId} onSelect={onSelect} onMenu={onMenu} />\n )}\n </li>\n )) : null}\n </ul>\n </section>\n );\n}\n\nfunction SessionRowView({ row, seats, selected, onSelect, onMenu }: {\n row: SidebarRow;\n seats: readonly VerseSeat[];\n selected: boolean;\n onSelect: (id: string) => void;\n onMenu?: (row: SidebarRow, anchor: MenuAnchor, from: HTMLElement) => void;\n}) {\n const { session, status } = row;\n const seat = seatById(seats, session.seatId);\n const capacity = seat === undefined ? null : seatSubscription(seat);\n // Quiet by default: a marker only where it changes what the operator would\n // do — a turn in flight on a seat whose binding window is spent.\n const spentWhileRunning = status.kind === 'running' && capacity?.cls === 'blocked';\n const tip = [\n session.title || 'Untitled chat',\n seatPillLabel(seats, session),\n capacity === null || capacity.cls === 'ready' || capacity.cls === 'unread' ? null : capacity.summary,\n rowStatusWords(status),\n ].filter((part) => part !== null).join(' · ');\n const rowRef = useRef<HTMLButtonElement>(null);\n\n function onContextMenu(event: ReactMouseEvent<HTMLButtonElement>) {\n if (!onMenu) return;\n event.preventDefault();\n onMenu(row, { x: event.clientX, y: event.clientY }, event.currentTarget);\n }\n function onKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n if (!onMenu) return;\n if (event.key === 'ContextMenu' || (event.key === 'F10' && event.shiftKey)) {\n event.preventDefault();\n const rect = event.currentTarget.getBoundingClientRect();\n onMenu(row, { x: rect.left + 24, y: rect.bottom }, event.currentTarget);\n }\n }\n\n return (\n <div className={styles.row} data-selected={selected || undefined}>\n <Tooltip label={tip} placement=\"right\">\n <button ref={rowRef} type=\"button\" className={`${styles.session} ${styles[`engine-${session.engine}`] ?? ''}`}\n aria-current={selected ? 'true' : undefined}\n data-focus-key={`verse-session:${session.id}`} data-engine={session.engine} data-status={status.kind}\n aria-haspopup={onMenu ? 'menu' : undefined} aria-keyshortcuts={onMenu ? 'Shift+F10' : undefined}\n onClick={() => onSelect(session.id)} onContextMenu={onContextMenu} onKeyDown={onKeyDown}>\n <span className={styles.marker} aria-hidden=\"true\" />\n <span className={styles.sessionBody}>\n <span className={styles.sessionText}>{session.title || 'Untitled chat'}</span>\n {row.live ? <span className={styles.liveLine} title={row.live.text}>{row.live.text}</span> : null}\n </span>\n {spentWhileRunning && capacity !== null ? (\n <span className={styles.seatSpent} role=\"img\" aria-label={`Seat limit reached: ${capacity.summary}`}>▮</span>\n ) : null}\n <RowStatus row={row} />\n </button>\n </Tooltip>\n {onMenu ? (\n // A pointer affordance only, hidden from assistive tech: the row itself\n // announces its menu (aria-haspopup) and opens it with Shift+F10 or\n // the menu key, so a screen reader hears ONE control per chat.\n <button type=\"button\" className={styles.rowMore} tabIndex={-1} aria-hidden=\"true\" title=\"Chat actions\"\n onClick={(event) => {\n const rect = event.currentTarget.getBoundingClientRect();\n onMenu(row, { x: rect.right - 220, y: rect.bottom + 4 }, rowRef.current ?? event.currentTarget);\n }}>\n <MoreGlyph size={14} />\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction RowStatus({ row }: { row: SidebarRow }) {\n const { status, session } = row;\n // One wording for the glyph's name and the row's tooltip (rowStatusWords).\n const words = rowStatusWords(status) ?? undefined;\n switch (status.kind) {\n case 'running':\n return (\n <span className={styles.statusRunning}>\n <span className={styles.running} role=\"img\" aria-label={words} />\n {status.startedAt ? <LiveTimer className={styles.elapsed} since={status.startedAt} /> : null}\n </span>\n );\n case 'failed':\n return <span className={styles.errored} role=\"img\" aria-label={words}>!</span>;\n case 'unread':\n return <span className={styles.unread} role=\"img\" aria-label={words} />;\n default:\n return <time className={styles.time} dateTime={session.updatedAt}>{formatRelative(session.updatedAt)}</time>;\n }\n}\n\nfunction RenameRow({ row, onDone }: { row: SidebarRow; onDone: (title: string) => void }) {\n const [value, setValue] = useState(row.session.title);\n const input = useRef<HTMLInputElement>(null);\n const done = useRef(false);\n useEffect(() => { input.current?.focus(); input.current?.select(); }, []);\n const finish = (title: string) => {\n if (done.current) return;\n done.current = true;\n onDone(title.trim());\n };\n return (\n <div className={`${styles.row} ${styles.renameRow}`}>\n <input ref={input} className={styles.renameInput} value={value} maxLength={120} aria-label=\"Chat title\"\n onChange={(event) => setValue(event.target.value)}\n onBlur={() => finish(value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') { event.preventDefault(); finish(value); }\n else if (event.key === 'Escape') { event.preventDefault(); finish(row.session.title); }\n }} />\n </div>\n );\n}\n"],"file":"Sidebar-DjQOqPbm.js"}
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,s as n}from"./index-BVxOlseC.js";var r=n(e(),1),i={field:`_field_228wn_1`,label:`_label_228wn_8`,row:`_row_228wn_15`,value:`_value_228wn_22`,input:`_input_228wn_32`},a=t();function o({label:e,value:t,min:n=0,max:o=100,valueLabel:s,valueText:c,trackImage:l,className:u,id:d,...f}){let p=(0,r.useId)(),m=d??p,h=Math.max(1,o-n),g=Math.round((t-n)/h*100);return(0,a.jsxs)(`div`,{className:`${i.field} ${u??``}`,children:[e?(0,a.jsx)(`label`,{className:i.label,htmlFor:m,children:e}):null,(0,a.jsxs)(`div`,{className:i.row,children:[(0,a.jsx)(`input`,{...f,id:m,type:`range`,className:i.input,value:t,min:n,max:o,"aria-valuetext":c,style:{"--slider-fill":`${g}%`,...l?{"--slider-track-image":l}:{}},"data-custom-track":l?`true`:void 0}),s===void 0?null:(0,a.jsx)(`span`,{className:i.value,children:s})]})]})}export{o as t};
2
- //# sourceMappingURL=Slider-BypUWjpH.js.map
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,s as n}from"./index-BVxOlseC.js";import{D as r,L as i,S as a,T as ee,_ as o,c as s,d as c,f as te,h as l,i as ne,l as re,m as ie,n as ae,o as oe,r as se,s as ce,t as le,u,w as ue,x as d}from"./useChartWidth-owwodNVz.js";import{c as f,i as p,l as m,m as h,n as de,p as fe,r as pe}from"./colors-BZ3a9wFf.js";import{l as me,n as g,o as _,t as he}from"./format-DKrNjdwD.js";var v=n(e(),1),y=t(),b=8,x=16,S=2,C=28,w=16,T=4,E=[`Mon`,``,`Wed`,``,`Fri`,``,``],D=[``,`Mon`,``,`Wed`,``,`Fri`,``];function O({title:e,description:t,caveat:n,status:r,days:i,weekStart:a=1,width:ee,formatValue:o=he,unit:c=``,ariaLabel:te}){let ie=(0,v.useRef)(null),se=le(ie,ee),u=(0,v.useId)(),ue=fe((0,v.useId)()),f=(0,v.useMemo)(()=>l(i,a),[i,a]),[p,m]=(0,v.useState)(null),de=Math.max(0,...i.map(e=>e.value??0)),pe=i.some(e=>e.value!==null),me=r??(i.length===0?{kind:`empty`}:pe?{kind:`ready`}:{kind:`unknown`}),_=se-C,O=Math.max(1,Math.floor((_+S)/10)),k=Math.min(f.weeks,O),A=f.weeks-k,j=Math.max(b,Math.min(x,Math.floor((_+S)/Math.max(1,k))-S)),M=A,N=f.cells.filter(e=>e.week>=M),P=C+k*(j+S),F=w+7*(j+S),I=e=>C+(e.week-M)*(j+S),L=e=>w+e.weekday*(j+S),R=c?` ${c}`:``,z=e=>`${g(e.day)}: ${e.value===null?`no data`:`${o(e.value)}${R}`}`,B=[];for(let e of f.months){if(e.week<M)continue;let t=B[B.length-1];t&&e.week-t.week<3||B.push(e)}let V=N.filter(e=>!e.outside),H=p===null?void 0:V[p];function U(e){if(V.length===0)return;let t=p??V.length-1,n=e.key===`ArrowLeft`?-7:e.key===`ArrowRight`?7:e.key===`ArrowUp`?-1:e.key===`ArrowDown`?1:null,r=null;n===null?e.key===`Home`?r=0:e.key===`End`&&(r=V.length-1):r=t+n,r!==null&&(e.preventDefault(),m(Math.max(0,Math.min(V.length-1,r))))}let W=i.filter(e=>e.value!==null),ge=W.reduce((e,t)=>e+(t.value??0),0),G=W.reduce((e,t)=>!e||(t.value??0)>(e.value??0)?t:e,null),K=te??`${e}: ${i.length} days, ${o(ge)}${R} in total`+(G&&(G.value??0)>0?`, busiest ${g(G.day)} with ${o(G.value)}`:``)+(i.length-W.length>0?`, ${i.length-W.length} days without data`:``)+`.`,_e=[{key:`day`,label:`Day`,render:e=>g(e.day)},{key:`value`,label:c?c[0].toUpperCase()+c.slice(1):`Value`,numeric:!0,render:e=>e.value===null?`—`:o(e.value)}],ve=(0,y.jsxs)(`div`,{className:s.legend,"aria-hidden":`true`,children:[(0,y.jsx)(`span`,{className:s.legendItem,children:`Less`}),Array.from({length:5},(e,t)=>(0,y.jsx)(`span`,{className:s.swatch,style:{background:h(t)}},t)),(0,y.jsx)(`span`,{className:s.legendItem,children:`More`}),(0,y.jsxs)(`span`,{className:s.legendItem,children:[(0,y.jsx)(`span`,{className:s.swatchHatch}),`no data`]})]});return(0,y.jsx)(ae,{title:e,description:t,caveat:n,status:me,table:(0,y.jsx)(re,{caption:e,columns:_e,rows:[...i].sort((e,t)=>e.day.localeCompare(t.day)),rowKey:e=>e.day}),footer:(0,y.jsxs)(y.Fragment,{children:[ve,A>0?(0,y.jsxs)(`p`,{className:s.note,children:[`Showing the latest `,k,` weeks; `,A,` earlier weeks are in the table.`]}):null]}),children:(0,y.jsxs)(`div`,{ref:ie,className:`${s.plotWrap} ${s.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the arrow keys to move between days.`,"aria-describedby":u,onFocus:()=>m(e=>e??(V.length?V.length-1:null)),onBlur:()=>m(null),onKeyDown:U,children:[(0,y.jsxs)(`svg`,{className:s.svg,width:P,height:F,viewBox:`0 0 ${P} ${F}`,role:`img`,"aria-label":K,children:[(0,y.jsx)(`defs`,{children:(0,y.jsx)(oe,{id:ue})}),B.map(e=>(0,y.jsx)(`text`,{className:s.tick,x:C+(e.week-M)*(j+S),y:11,children:e.label},`${e.week}${e.label}`)),(a===1?E:D).map((e,t)=>e&&j>=10?(0,y.jsx)(`text`,{className:s.tick,x:0,y:w+t*(j+S)+j/2,dy:`0.32em`,children:e},t):null),N.map(e=>{if(e.outside)return null;let t=d(e.value,de,T),n=H?.day===e.day;return(0,y.jsx)(`rect`,{"data-day":e.day,"data-bucket":t===null?`unknown`:t,x:I(e),y:L(e),width:j,height:j,rx:2,className:t===null?s.unknownMark:void 0,fill:t===null?`url(#${ue})`:h(t),style:n?{stroke:`var(--border-focus)`,strokeWidth:2,strokeDasharray:`none`}:void 0,onPointerEnter:()=>m(V.indexOf(e)),onPointerLeave:()=>m(null)},e.day)})]}),(0,y.jsx)(`span`,{id:u,className:s.srOnly,"aria-live":`polite`,children:H?z(H):``}),H?(0,y.jsx)(ne,{left:ce(I(H)+j/2,P,60),top:L(H),title:g(H.day),rows:[{key:`v`,label:c||`Value`,value:H.value===null?null:o(H.value)}]}):null]})})}var k={band:`_band_1rlew_3`,focusRing:`_focusRing_1rlew_8`};function A(e){return e.estimate===null||e.low===null||e.high===null?`unknown`:e.low>0?`positive`:e.high<0?`negative`:`none`}var j={positive:`helped (interval above zero)`,negative:`hurt (interval below zero)`,none:`no clear effect (interval crosses zero)`,unknown:`unknown`};function M(e){return e===`positive`?p:e===`negative`?pe:`var(--text-secondary)`}function N(e,t){return e>0?`+${t(e)}`:t(e)}var P=e=>Math.abs(e)>=10?e.toFixed(0):e.toFixed(1),F=28,I=22,L=12,R=480;function z({title:e,description:t,caveat:n,status:i,rows:a,unit:ee=``,gate:o,formatValue:c,unknownText:l=`not enough pairs yet`,width:ne,ariaLabel:ce}){let u=c??P,ue=(0,v.useRef)(null),d=le(ue,ne),[f,m]=(0,v.useState)(null),h=(0,v.useId)(),me=fe((0,v.useId)()),g=ee?` ${ee}`:``,_=a.filter(e=>A(e)!==`unknown`),he=i??(a.length===0?{kind:`empty`,message:`No experiments have run yet.`}:{kind:`ready`}),b=d<R,x=Math.max(84,Math.min(180,Math.round(d*(b?.3:.26)))),S=b?0:118,C=x+8,w=Math.max(C+40,d-S-L),T=_.flatMap(e=>[e.low,e.high]),E=Math.min(0,o?.value??0,...T),D=Math.max(0,o?.value??0,...T),O=ie(E,D===E?E+1:D,{count:b?3:5,integer:te([...T,o?.value??0]),format:c?e=>e===0?`0`:N(e,c):void 0}),z=O.ticks,B=c?O.labels:O.labels.map((e,t)=>z[t]>0?`+${e}`:e),V=r(z[0],z[z.length-1],C,w),H=a.length*F,U=H+I,W=e=>{let t=A(e);return t===`unknown`?`${e.label}: ${l}`:`${e.label}: ${N(e.estimate,u)}${g}, 95% interval ${N(e.low,u)} to ${N(e.high,u)}; ${j[t]}`},ge=_.filter(e=>A(e)===`positive`).length,G=ce??`${e}: ${a.length} experiment${a.length===1?``:`s`}, ${ge} with an interval above zero.`;function K(e){if(a.length===0)return;let t=f??0,n=e.key===`ArrowDown`?t+1:e.key===`ArrowUp`?t-1:e.key===`Home`?0:e.key===`End`?a.length-1:null;n!==null&&(e.preventDefault(),m(Math.max(0,Math.min(a.length-1,n))))}let _e=[{key:`label`,label:`Experiment`,render:e=>e.label},{key:`est`,label:`Estimate${g}`,numeric:!0,render:e=>e.estimate===null?`—`:N(e.estimate,u)},{key:`ci`,label:`95% interval`,numeric:!0,render:e=>e.low===null||e.high===null?`—`:`${N(e.low,u)} to ${N(e.high,u)}`},{key:`n`,label:`Pairs`,numeric:!0,render:e=>e.n===null||e.n===void 0?`—`:String(e.n)},{key:`verdict`,label:`Reading`,render:e=>A(e)===`unknown`?l:j[A(e)]},...a.some(e=>e.detail)?[{key:`detail`,label:`Status`,render:e=>e.detail??``}]:[]],ve=f===null?void 0:a[f],q=Math.floor(x/7);return(0,y.jsx)(ae,{title:e,description:t,caveat:n,status:he,table:(0,y.jsx)(re,{caption:e,columns:_e,rows:a,rowKey:e=>e.id}),footer:(0,y.jsx)(se,{min:1,items:[{label:`Helped`,color:p},{label:`Hurt`,color:pe},{label:`No clear effect`,color:`var(--text-secondary)`},...a.length>_.length?[{label:l,kind:`hatch`}]:[]]}),children:(0,y.jsxs)(`div`,{ref:ue,className:`${s.plotWrap} ${s.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the up and down arrow keys to read each experiment.`,"aria-describedby":h,onFocus:()=>m(e=>e??(a.length?0:null)),onBlur:()=>m(null),onKeyDown:K,children:[(0,y.jsxs)(`svg`,{className:s.svg,width:d,height:U,viewBox:`0 0 ${d} ${U}`,role:`img`,"aria-label":G,children:[(0,y.jsx)(`defs`,{children:(0,y.jsx)(oe,{id:me})}),z.map((e,t)=>(0,y.jsxs)(`g`,{children:[(0,y.jsx)(`line`,{className:s.grid,x1:V(e),x2:V(e),y1:0,y2:H}),(0,y.jsx)(`text`,{className:s.tick,x:V(e),y:U-6,textAnchor:`middle`,children:B[t]})]},e)),(0,y.jsx)(`line`,{"data-role":`zero`,x1:V(0),x2:V(0),y1:0,y2:H,stroke:de,strokeWidth:1.5}),o&&o.value!==0?(0,y.jsx)(`g`,{"data-role":`gate`,children:(0,y.jsx)(`line`,{className:s.reference,x1:V(o.value),x2:V(o.value),y1:0,y2:H})}):null,a.map((e,t)=>{let n=t*F+F/2,r=A(e),i=M(r),a=f===t;return(0,y.jsxs)(`g`,{"data-row":e.id,"data-verdict":r,opacity:f!==null&&!a?.55:1,children:[t%2==1?(0,y.jsx)(`rect`,{className:k.band,x:0,y:t*F,width:d,height:F}):null,(0,y.jsx)(`text`,{className:s.label,x,y:n,dy:`0.32em`,textAnchor:`end`,children:e.label.length>q?`${e.label.slice(0,q-1)}…`:e.label}),r===`unknown`?(0,y.jsxs)(`g`,{"data-role":`unknown`,children:[(0,y.jsx)(`rect`,{className:s.unknownMark,fill:`url(#${me})`,x:C+.5,y:n-5,width:Math.max(1,w-C-1),height:10,rx:2}),b?null:(0,y.jsx)(`text`,{className:s.tick,x:d-L,y:n,dy:`0.32em`,textAnchor:`end`,children:l})]}):(0,y.jsxs)(`g`,{children:[(0,y.jsx)(`line`,{"data-role":`ci`,x1:V(e.low),x2:V(e.high),y1:n,y2:n,stroke:i,strokeWidth:2,strokeLinecap:`round`}),(0,y.jsx)(`line`,{x1:V(e.low),x2:V(e.low),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,y.jsx)(`line`,{x1:V(e.high),x2:V(e.high),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,y.jsx)(`rect`,{"data-role":`estimate`,className:s.marker,x:V(e.estimate)-5,y:n-5,width:10,height:10,rx:2,fill:i}),b?null:(0,y.jsxs)(`text`,{className:s.tick,x:d-L,y:n,dy:`0.32em`,textAnchor:`end`,children:[N(e.estimate,u),` [`,N(e.low,u),`, `,N(e.high,u),`]`]})]}),a?(0,y.jsx)(`rect`,{className:k.focusRing,x:1,y:t*F+1,width:d-2,height:26,rx:3}):null]},e.id)})]}),(0,y.jsx)(`span`,{id:h,className:s.srOnly,"aria-live":`polite`,children:ve?W(ve):``})]})})}function B(e,t){let n=[...e].filter(e=>Number.isFinite(e.at)).sort((e,t)=>e.at-t.at);return n.map((e,r)=>({...e,until:Math.max(e.at,r+1<n.length?n[r+1].at:t)}))}var V=18,H=26,U=14,W=864e5,ge=e=>Math.abs(e)>=10?e.toFixed(0):e.toFixed(1);function G(e,t){return e>0?`+${t(e)}`:t(e)}function K({title:e,description:t,caveat:n,status:l,steps:d,markers:p=[],now:h,from:de,baseline:g,unit:he=``,formatValue:b,formatTime:x,height:S=200,width:C,ariaLabel:w}){let T=b??ge,E=e=>a(e)?(x??_)(e):`—`,D=(0,v.useRef)(null),O=le(D,C),k=u(),[A,j]=(0,v.useState)(null),M=(0,v.useId)(),N=fe((0,v.useId)()),P=he?` ${he}`:``,F=h??Date.now(),I=B(d,F),L=p.filter(e=>a(e.at)),R=I.filter(e=>e.value!==null),z=l??(I.length===0?{kind:`empty`,message:`No versions yet — the compiled defaults are in force.`}:R.length===0?{kind:`unknown`,reason:`no version has a measured value yet.`}:{kind:`ready`}),K=[...I.map(e=>e.at),...L.map(e=>e.at)].filter(a),_e=Math.max(a(F)?F:0,...K,...I.map(e=>e.until).filter(a)),ve=de!==void 0&&a(de)?de:K.length?Math.min(...K):_e-W,[q,ye]=o(ve,_e,c,`end`),be=R.flatMap(e=>[e.value,e.low??e.value,e.high??e.value]),xe=Math.min(g?.value??0,...be),Se=Math.max(g?.value??0,...be),Ce=ie(xe,Se===xe?xe+1:Se,{count:4,integer:te([...be,g?.value??0]),format:b?e=>e===0?`0`:G(e,b):void 0}),we=Ce.ticks,Te=b?Ce.labels:Ce.labels.map((e,t)=>we[t]>0?`+${e}`:e),J=i(Te,30,56,k),Y=Math.max(40,O-J-U),Ee=S-V-H,De=r(q,ye,J,J+Y),X=r(we[0],we[we.length-1],V+Ee,V),Z=e=>Math.min(J+Y,Math.max(J,De(e))),Oe=me(q,ye,x,[q,ye]),ke=ee([{key:`start`,x:J,anchor:`start`,priority:2,variants:Oe.map(e=>e(q))},{key:`end`,x:J+Y,anchor:`end`,priority:3,variants:Oe.map(e=>e(ye))}],{min:J,max:J+Y,charPx:ue(k)}),Ae=[],Q=[],je=null;for(let e of I){if(e.value===null){Q.length&&Ae.push(Q.join(` `)),Q=[],je=null;continue}let t=X(e.value),n=Z(e.at),r=Z(e.until);Q.push(je===null?`M${n.toFixed(1)},${t.toFixed(1)}`:`L${n.toFixed(1)},${t.toFixed(1)}`),Q.push(`L${r.toFixed(1)},${t.toFixed(1)}`),je=t}Q.length&&Ae.push(Q.join(` `));let Me=e=>`${e.label}${e.detail?` (${e.detail})`:``}, ${E(e.at)} to ${E(e.until)}: `+(e.value===null?`not measured`:`${G(e.value,T)}${P}`+(e.low!==null&&e.low!==void 0&&e.high!==null&&e.high!==void 0?`, 95% interval ${G(e.low,T)} to ${G(e.high,T)}`:``)),Ne=R[R.length-1],Pe=L.filter(e=>e.kind===`rollback`).length,Fe=w??`${e}: ${I.length} step${I.length===1?``:`s`}`+(Ne?`, now ${G(Ne.value,T)}${P}`:``)+(Pe?`, ${Pe} rollback${Pe===1?``:`s`}`:``)+`.`;function Ie(e){if(I.length===0)return;let t=A??I.length-1,n=e.key===`ArrowLeft`?t-1:e.key===`ArrowRight`?t+1:e.key===`Home`?0:e.key===`End`?I.length-1:null;n!==null&&(e.preventDefault(),j(Math.max(0,Math.min(I.length-1,n))))}let Le=[...I.map(e=>({id:`s:${e.id}`,when:e.at,what:`${e.label}${e.detail?` · ${e.detail}`:``}`,value:e.value===null?`—`:G(e.value,T),interval:e.low===null||e.low===void 0||e.high===null||e.high===void 0?`—`:`${G(e.low,T)} to ${G(e.high,T)}`})),...L.map(e=>({id:`m:${e.id}`,when:e.at,what:`${e.kind===`rollback`?`▼ Rolled back`:`▲ Adopted`}: ${e.label}`,value:``,interval:``}))].sort((e,t)=>e.when-t.when),Re=[{key:`when`,label:`When`,render:e=>E(e.when)},{key:`what`,label:`Step`,render:e=>e.what},{key:`value`,label:`Level${P}`,numeric:!0,render:e=>e.value},{key:`ci`,label:`95% interval`,numeric:!0,render:e=>e.interval}],$=A===null?void 0:I[A];return(0,y.jsx)(ae,{title:e,description:t,caveat:n,status:z,table:(0,y.jsx)(re,{caption:e,columns:Re,rows:Le,rowKey:e=>e.id}),footer:(0,y.jsx)(se,{items:[{label:`Level`,color:f,kind:`line`},{label:`95% interval`,color:m},...Pe?[{label:`▼ rollback`,color:pe}]:[],...I.some(e=>e.value===null)?[{label:`not measured`,kind:`hatch`}]:[]]}),children:(0,y.jsxs)(`div`,{ref:D,className:`${s.plotWrap} ${s.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the left and right arrow keys to read each step.`,"aria-describedby":M,onFocus:()=>j(e=>e??(I.length?I.length-1:null)),onBlur:()=>j(null),onKeyDown:Ie,children:[(0,y.jsxs)(`svg`,{className:s.svg,width:O,height:S,viewBox:`0 0 ${O} ${S}`,role:`img`,"aria-label":Fe,children:[(0,y.jsx)(`defs`,{children:(0,y.jsx)(oe,{id:N})}),we.map((e,t)=>(0,y.jsxs)(`g`,{children:[(0,y.jsx)(`line`,{className:s.grid,x1:J,x2:J+Y,y1:X(e),y2:X(e)}),(0,y.jsx)(`text`,{className:s.tick,x:J-6,y:X(e),dy:`0.32em`,textAnchor:`end`,children:Te[t]})]},e)),ke.map(e=>(0,y.jsx)(`text`,{"data-axis-label":e.key,className:s.tick,x:e.x,y:S-8,textAnchor:e.anchor,children:e.text},e.key)),g?(0,y.jsxs)(`g`,{"data-role":`baseline`,children:[(0,y.jsx)(`line`,{className:s.reference,x1:J,x2:J+Y,y1:X(g.value),y2:X(g.value)}),(0,y.jsx)(`text`,{className:`${s.tick} ${s.halo}`,x:J+4,y:X(g.value)-5,children:g.label})]}):null,I.map((e,t)=>{let n=Z(e.at),r=Math.max(n+1,Z(e.until));if(e.value===null)return(0,y.jsx)(`rect`,{"data-step":e.id,"data-unknown":`true`,className:s.unknownMark,fill:`url(#${N})`,x:n,y:V,width:r-n,height:Ee,opacity:.6},e.id);let i=e.low!==null&&e.low!==void 0&&e.high!==null&&e.high!==void 0;return(0,y.jsx)(`g`,{"data-step":e.id,opacity:A!==null&&A!==t?.6:1,children:i?(0,y.jsx)(`rect`,{"data-role":`band`,x:n,y:X(e.high),width:r-n,height:Math.max(1,X(e.low)-X(e.high)),fill:m,opacity:.35}):null},e.id)}),Ae.map((e,t)=>(0,y.jsx)(`path`,{"data-role":`level`,className:s.line,stroke:f,d:e},t)),I.map(e=>e.value===null?null:(0,y.jsx)(`circle`,{className:s.marker,cx:Z(e.at),cy:X(e.value),r:3.5,fill:f},`p${e.id}`)),L.map(e=>{let t=Z(e.at),n=e.kind===`rollback`?`M${t-5},8 L${t+5},8 L${t},16 Z`:`M${t-5},16 L${t+5},16 L${t},8 Z`;return(0,y.jsx)(`path`,{"data-marker":e.kind,d:n,fill:e.kind===`rollback`?pe:f,children:(0,y.jsx)(`title`,{children:`${e.kind===`rollback`?`Rolled back`:`Adopted`}: ${e.label} · ${E(e.at)}`})},e.id)})]}),(0,y.jsx)(`span`,{id:M,className:s.srOnly,"aria-live":`polite`,children:$?Me($):``}),$?(0,y.jsx)(ne,{left:ce((Z($.at)+Z($.until))/2,O),top:$.value===null?V+Ee/2:X($.high??$.value),title:`${$.label}${$.detail?` · ${$.detail}`:``}`,rows:[{key:`v`,label:`Level`,value:$.value===null?null:`${G($.value,T)}${P}`},{key:`ci`,label:`95% interval`,value:$.low===null||$.low===void 0||$.high===null||$.high===void 0?null:`${G($.low,T)} to ${G($.high,T)}`},{key:`t`,label:`From`,value:E($.at)}]}):null]})})}export{z as n,O as r,K as t};
2
- //# sourceMappingURL=StepBand-Duz1PUes.js.map
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,s as n}from"./index-BVxOlseC.js";import{n as r}from"./viewport-nTubFCwf.js";var i=n(e(),1),a={surface:`_surface_1nwjs_6`,strip:`_strip_1nwjs_14`,title:`_title_1nwjs_29`,stripActions:`_stripActions_1nwjs_39`,scroll:`_scroll_1nwjs_45`,body:`_body_1nwjs_53`,grid:`_grid_1nwjs_62`,cell:`_cell_1nwjs_69`,card:`_card_1nwjs_82`,cardHead:`_cardHead_1nwjs_98`,cardHeading:`_cardHeading_1nwjs_105`,cardTitle:`_cardTitle_1nwjs_113`,cardCaption:`_cardCaption_1nwjs_121`,cardActions:`_cardActions_1nwjs_127`,note:`_note_1nwjs_134`,micro:`_micro_1nwjs_155`},o=t();function s(e,t){let n=Math.max(1,Math.min(12,Math.round(t)));return e===`compact`?12:e===`medium`?n<=6?6:12:n}function c({title:e,actions:t,lead:n,children:s}){let c=(0,i.useId)(),{viewport:l}=r();return(0,o.jsxs)(`section`,{className:a.surface,"aria-labelledby":c,"data-viewport":l,children:[(0,o.jsxs)(`header`,{className:a.strip,"data-app-region":`drag`,children:[(0,o.jsx)(`h2`,{id:c,className:a.title,children:e}),t?(0,o.jsx)(`div`,{className:a.stripActions,children:t}):null]}),(0,o.jsx)(`div`,{className:a.scroll,children:(0,o.jsxs)(`div`,{className:a.body,children:[n,(0,o.jsx)(`div`,{className:a.grid,children:s})]})})]})}function l({span:e,children:t,className:n,id:i}){let{viewport:c}=r(),l={gridColumn:`span ${s(c,e)}`};return(0,o.jsx)(`div`,{id:i,className:`${a.cell} ${n??``}`,style:l,"data-span":e,children:t})}function u({title:e,caption:t,actions:n,children:r,tone:s,labelledBy:c}){let l=(0,i.useId)(),u=c??l;return(0,o.jsxs)(`section`,{className:a.card,"aria-labelledby":u,"data-tone":s,children:[(0,o.jsxs)(`header`,{className:a.cardHead,children:[(0,o.jsxs)(`span`,{className:a.cardHeading,children:[(0,o.jsx)(`h3`,{id:u,className:a.cardTitle,children:e}),t?(0,o.jsx)(`span`,{className:a.cardCaption,children:t}):null]}),n?(0,o.jsx)(`span`,{className:a.cardActions,children:n}):null]}),r]})}function d({children:e,tone:t=`muted`}){return(0,o.jsx)(`p`,{className:a.note,"data-tone":t,role:t===`danger`?`alert`:`note`,children:e})}function f({children:e}){return(0,o.jsx)(`span`,{className:a.micro,children:e})}export{c as a,f as i,d as n,l as r,u as t};
2
- //# sourceMappingURL=Surface-B75lVfzm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Surface-B75lVfzm.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/surface.module.css","../../../../../../src/web-ui/routes/verse/command/Surface.tsx"],"sourcesContent":["/*\n * routes/verse/command/surface.module.css — the shared chrome of the four\n * 3.10 surfaces: strip, scroll region, 12-column grid, card frame. Tokens\n * only (style-scan-310: no raw hex, no px font sizes).\n */\n.surface {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--bg-canvas);\n}\n\n.strip {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n height: var(--strip-height);\n padding: 0 var(--space-5);\n /* Desktop shell: only the traffic-light overlap past the rail is owed. */\n padding-left: max(var(--space-5), calc(var(--app-traffic-light-inset, 0px) - var(--rail-width, 56px)));\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n/* Surface title: Grotesk 20/28, −0.02em (SPEC-310C §6). */\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 font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display);\n color: var(--text-primary);\n}\n\n.stripActions {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n}\n\n.scroll {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-gutter: stable;\n}\n\n.body {\n display: flex;\n flex-direction: column;\n gap: var(--surface-gap);\n max-width: 1440px;\n margin: 0 auto;\n padding: var(--space-5) var(--space-5) var(--space-16);\n}\n\n.grid {\n display: grid;\n grid-template-columns: repeat(var(--surface-columns), minmax(0, 1fr));\n gap: var(--surface-gap);\n align-items: start;\n}\n\n.cell {\n min-width: 0;\n}\n\n.surface[data-viewport='compact'] .body {\n padding: var(--space-4) var(--space-4) var(--space-12);\n}\n\n.surface[data-viewport='compact'] .strip {\n padding: 0 var(--space-4);\n}\n\n/* Card frame — identical to ChartFrame so chart and non-chart cards read as one set. */\n.card {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n min-width: 0;\n padding: var(--card-pad);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n}\n\n.card[data-tone='attention'] {\n border-color: var(--border-default);\n box-shadow: inset 0 1px 0 var(--hairline-lift, transparent);\n}\n\n.cardHead {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--space-3);\n}\n\n.cardHeading {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n/* Card title 13/18, 600. */\n.cardTitle {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.cardCaption {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.cardActions {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n flex: none;\n}\n\n.note {\n margin: 0;\n padding: var(--space-3);\n border-radius: var(--radius-md);\n background: var(--bg-hover);\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line-relaxed);\n}\n\n.note[data-tone='unknown'] {\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n}\n\n.note[data-tone='danger'] {\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n\n/* Micro-label 11/14 uppercase (SPEC-310C §6). */\n.micro {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n","/**\n * routes/verse/command/Surface.tsx — the layout every 3.10 surface shares\n * (Command, Fleet, Growth, Mind; SPEC-310C §5 + DESIGN.md §13.4).\n *\n * - a 48px strip with the surface title (Grotesk 20/28) and its actions;\n * - one scroll region;\n * - a 12-column grid (`--surface-columns`) with 16px gaps and\n * `align-items: start` — a card is never stretched to the tallest card\n * in its row (the 3.9 harness showed half-empty chart cards);\n * - spans come from the viewport class, never a hard-coded breakpoint:\n * wide uses the span as written, medium folds a span ≤ 6 to half width\n * and anything wider to full width, compact (375) is one column in DOM\n * order — which is why every surface writes its cards in the order the\n * phone should show them.\n */\nimport { useId, type CSSProperties, type ReactNode } from 'react';\nimport { useViewport, type ViewportClass } from '../shell/viewport.js';\nimport styles from './surface.module.css';\n\n/** The grid span a card gets at a viewport class. Pure (tested). */\nexport function spanFor(viewport: ViewportClass, span: number): number {\n const s = Math.max(1, Math.min(12, Math.round(span)));\n if (viewport === 'compact') return 12;\n if (viewport === 'medium') return s <= 6 ? 6 : 12;\n return s;\n}\n\nexport interface SurfaceProps {\n /** Accessible name and visible title (\"Command\"). */\n title: string;\n /** Right side of the strip (refresh indicator, etc.). */\n actions?: ReactNode;\n /** Rendered above the grid, full width (the Command top bar, the verdict). */\n lead?: ReactNode;\n children: ReactNode;\n}\n\nexport function Surface({ title, actions, lead, children }: SurfaceProps) {\n const titleId = useId();\n const { viewport } = useViewport();\n return (\n <section className={styles.surface} aria-labelledby={titleId} data-viewport={viewport}>\n <header className={styles.strip} data-app-region=\"drag\">\n <h2 id={titleId} className={styles.title}>{title}</h2>\n {actions ? <div className={styles.stripActions}>{actions}</div> : null}\n </header>\n <div className={styles.scroll}>\n <div className={styles.body}>\n {lead}\n <div className={styles.grid}>{children}</div>\n </div>\n </div>\n </section>\n );\n}\n\n/** One grid cell. `span` is the 1440 layout's column count (SPEC-310C §5 table). */\nexport function Cell({ span, children, className, id }: { span: number; children: ReactNode; className?: string; id?: string }) {\n const { viewport } = useViewport();\n const style: CSSProperties = { gridColumn: `span ${spanFor(viewport, span)}` };\n return (\n <div id={id} className={`${styles.cell} ${className ?? ''}`} style={style} data-span={span}>\n {children}\n </div>\n );\n}\n\n/**\n * A non-chart card with the same frame as ChartFrame: title (13/18 600),\n * one caption line, then the body. Charts bring their own frame.\n */\nexport function Card({\n title,\n caption,\n actions,\n children,\n tone,\n labelledBy,\n}: {\n title: ReactNode;\n caption?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n /** A quiet emphasis for the one card that needs the operator (Needs you). */\n tone?: 'attention';\n labelledBy?: string;\n}) {\n const ownId = useId();\n const titleId = labelledBy ?? ownId;\n return (\n <section className={styles.card} aria-labelledby={titleId} data-tone={tone}>\n <header className={styles.cardHead}>\n <span className={styles.cardHeading}>\n <h3 id={titleId} className={styles.cardTitle}>{title}</h3>\n {caption ? <span className={styles.cardCaption}>{caption}</span> : null}\n </span>\n {actions ? <span className={styles.cardActions}>{actions}</span> : null}\n </header>\n {children}\n </section>\n );\n}\n\n/** A designed not-available / unknown line inside a card. */\nexport function CardNote({ children, tone = 'muted' }: { children: ReactNode; tone?: 'muted' | 'unknown' | 'danger' }) {\n return (\n <p className={styles.note} data-tone={tone} role={tone === 'danger' ? 'alert' : 'note'}>\n {children}\n </p>\n );\n}\n\n/** The micro-label (11/14 uppercase) used for group headings inside cards. */\nexport function MicroLabel({ children }: { children: ReactNode }) {\n return <span className={styles.micro}>{children}</span>;\n}\n"],"mappings":"2jBCoBA,SAAgB,EAAQ,EAAyB,EAAsB,CACrE,IAAM,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,KAAK,MAAM,CAAI,CAAC,CAAC,EAGpD,OAFI,IAAa,UAAkB,GAC/B,IAAa,SAAiB,GAAK,EAAI,EAAI,GACxC,CACT,CAYA,SAAgB,EAAQ,CAAE,QAAO,UAAS,OAAM,YAA0B,CACxE,IAAM,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,CAAE,YAAa,EAAY,EACjC,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,QAAS,kBAAiB,EAAS,gBAAe,EAA7E,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,MAAO,kBAAgB,OAAjD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAW,EAAO,MAAQ,SAAA,CAAU,CAAA,EACpD,GAAU,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,aAAe,SAAA,CAAa,CAAA,EAAI,IAC5D,CACR,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OACrB,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,CACG,GACD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAO,UAAc,CAAA,CACzC,GACF,CAAA,CACE,GAEb,CAGA,SAAgB,EAAK,CAAE,OAAM,WAAU,YAAW,MAA8E,CAC9H,GAAM,CAAE,YAAa,EAAY,EAC3B,EAAuB,CAAE,WAAY,QAAQ,EAAQ,EAAU,CAAI,GAAI,EAC7E,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAS,KAAI,UAAW,GAAG,EAAO,KAAK,GAAG,GAAa,KAAa,QAAO,YAAW,EACnF,UACE,CAAA,CAET,CAMA,SAAgB,EAAK,CACnB,QACA,UACA,UACA,WACA,OACA,cASC,CACD,IAAM,GAAA,EAAQ,EAAA,MAAA,CAAM,EACd,EAAU,GAAc,EAC9B,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,KAAM,kBAAiB,EAAS,YAAW,EAAtE,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,SAA1B,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAW,EAAO,UAAY,SAAA,CAAU,CAAA,EACxD,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAc,SAAA,CAAc,CAAA,EAAI,IAC/D,CACL,CAAA,EAAA,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAc,SAAA,CAAc,CAAA,EAAI,IAC7D,CACP,CAAA,EAAA,CACM,GAEb,CAGA,SAAgB,EAAS,CAAE,WAAU,OAAO,SAA2E,CACrH,OACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAM,YAAW,EAAM,KAAM,IAAS,SAAW,QAAU,OAC7E,UACA,CAAA,CAEP,CAGA,SAAgB,EAAW,CAAE,YAAqC,CAChE,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,UAAe,CAAA,CACxD"}
@@ -1 +0,0 @@
1
- ._surface_1nwjs_6{background:var(--bg-canvas);flex-direction:column;height:100%;min-height:0;display:flex}._strip_1nwjs_14{justify-content:space-between;align-items:center;gap:var(--space-3);height:var(--strip-height);padding:0 var(--space-5);padding-left:max(var(--space-5), calc(var(--app-traffic-light-inset,0px) - var(--rail-width,56px)));border-bottom:1px solid var(--border-subtle);background:var(--bg-surface);flex-shrink:0;display:flex}._title_1nwjs_29{font-family:var(--font-display);font-size:var(--text-xl-size);line-height:var(--text-xl-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-display);color:var(--text-primary);margin:0}._stripActions_1nwjs_39{align-items:center;gap:var(--space-2);display:flex}._scroll_1nwjs_45{scrollbar-gutter:stable;flex:1;min-height:0;overflow:hidden auto}._body_1nwjs_53{gap:var(--surface-gap);max-width:1440px;padding:var(--space-5) var(--space-5) var(--space-16);flex-direction:column;margin:0 auto;display:flex}._grid_1nwjs_62{grid-template-columns:repeat(var(--surface-columns), minmax(0, 1fr));gap:var(--surface-gap);align-items:start;display:grid}._cell_1nwjs_69{min-width:0}._surface_1nwjs_6[data-viewport=compact] ._body_1nwjs_53{padding:var(--space-4) var(--space-4) var(--space-12)}._surface_1nwjs_6[data-viewport=compact] ._strip_1nwjs_14{padding:0 var(--space-4)}._card_1nwjs_82{gap:var(--space-3);min-width:0;padding:var(--card-pad);border:1px solid var(--border-subtle);border-radius:var(--radius-lg);background:var(--bg-surface);flex-direction:column;display:flex}._card_1nwjs_82[data-tone=attention]{border-color:var(--border-default);box-shadow:inset 0 1px 0 var(--hairline-lift,transparent)}._cardHead_1nwjs_98{justify-content:space-between;align-items:flex-start;gap:var(--space-3);display:flex}._cardHeading_1nwjs_105{flex-direction:column;gap:2px;min-width:0;display:flex}._cardTitle_1nwjs_113{font-size:var(--text-sm-size);line-height:var(--text-sm-line);font-weight:var(--font-weight-semibold);color:var(--text-primary);margin:0}._cardCaption_1nwjs_121{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary)}._cardActions_1nwjs_127{align-items:center;gap:var(--space-2);flex:none;display:inline-flex}._note_1nwjs_134{padding:var(--space-3);border-radius:var(--radius-md);background:var(--bg-hover);color:var(--text-secondary);font-size:var(--text-sm-size);line-height:var(--text-sm-line-relaxed);margin:0}._note_1nwjs_134[data-tone=unknown]{background:var(--status-unknown-bg);color:var(--status-unknown-fg)}._note_1nwjs_134[data-tone=danger]{background:var(--status-danger-bg);color:var(--status-danger-fg)}._micro_1nwjs_155{font-family:var(--font-display);font-size:var(--text-2xs-size);line-height:var(--text-2xs-line);letter-spacing:var(--tracking-label);text-transform:uppercase;color:var(--text-tertiary)}
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,s as n}from"./index-BVxOlseC.js";import{D as r,S as i,T as a,_ as o,a as s,c,d as l,i as u,l as d,n as f,o as p,r as m,s as h,t as g,u as ee,w as te}from"./useChartWidth-owwodNVz.js";import{p as ne,s as re,v as _}from"./colors-BZ3a9wFf.js";var v={sparkline:`_sparkline_kr10w_1`,line:`_line_kr10w_6`,dot:`_dot_kr10w_14`,area:`_area_kr10w_18`,flat:`_flat_kr10w_25`},y=t();function b(e,t){let n=e.filter(e=>e!==null&&Number.isFinite(e));if(n.length===0)return`no data`;let r=n[0],i=n[n.length-1],a=e.length-n.length;return`from ${t(r)} to ${t(i)}, range ${t(Math.min(...n))} to ${t(Math.max(...n))}`+(a>0?`, ${a} point${a===1?``:`s`} without data`:``)}function x({points:e,width:t=72,height:n=24,ariaLabel:r,area:i=!1,describe:a}){let o=a?`${r}: ${b(e,a)}`:r,s=e.filter(e=>e!==null);if(s.length<2)return(0,y.jsx)(`svg`,{className:v.sparkline,width:t,height:n,viewBox:`0 0 ${t} ${n}`,role:`img`,"aria-label":o,children:(0,y.jsx)(`line`,{className:v.flat,x1:1,x2:t-1,y1:n-1.5,y2:n-1.5})});let c=Math.min(...s,0),l=Math.max(...s,0)-c||1,u=t/Math.max(1,e.length-1),d=e=>n-(e-c)/l*(n-2)-1,f=[],p=[];e.forEach((e,t)=>{if(e===null){p.length&&f.push(p),p=[];return}p.push({x:t*u,y:d(e)})}),p.length&&f.push(p);let m=e.map(e=>e!==null).lastIndexOf(!0),h=m>=0?{x:m*u,y:d(e[m])}:null,g=d(Math.max(c,0));return(0,y.jsxs)(`svg`,{className:v.sparkline,width:t,height:n,viewBox:`0 0 ${t} ${n}`,role:`img`,"aria-label":o,children:[i?f.map((e,t)=>e.length>1?(0,y.jsx)(`path`,{className:v.area,d:`${e.map((e,t)=>`${t===0?`M`:`L`}${e.x.toFixed(1)},${e.y.toFixed(1)}`).join(` `)} L${e[e.length-1].x.toFixed(1)},${g.toFixed(1)} L${e[0].x.toFixed(1)},${g.toFixed(1)} Z`},`a${t}`):null):null,f.map((e,t)=>(0,y.jsx)(`path`,{className:v.line,d:e.map((e,t)=>`${t===0?`M`:`L`}${e.x.toFixed(1)},${e.y.toFixed(1)}`).join(` `)},t)),h?(0,y.jsx)(`circle`,{className:v.dot,cx:h.x,cy:h.y,r:2}):null]})}var S=n(e(),1),C={scroller:`_scroller_1b51y_1`,band:`_band_1b51y_7`,bar:`_bar_1b51y_12`,stale:`_stale_1b51y_18`,open:`_open_1b51y_22`,now:`_now_1b51y_27`,laneStops:`_laneStops_1b51y_33`,laneStop:`_laneStop_1b51y_33`,outline:`_outline_1b51y_51`},w=new Set([`queued`,`parked`,`waiting`]);function T(e){return e.outline??w.has(e.status.toLowerCase())}var ie=14,ae=6,E=22,D=3,O={done:`success`,success:`success`,merged:`success`,failed:`danger`,error:`danger`,aborted:`neutral`,cancelled:`neutral`,running:`running`,queued:`neutral`,parked:`neutral`};function oe(e){return O[e.toLowerCase()]??`unknown`}function se(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleString(`en-US`,{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`})}function ce(e,t){let n=t-e>1296e5;return e=>{let t=new Date(e);return Number.isNaN(t.getTime())?``:n?t.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`}):t.toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`})}}function le(e,t){return e.length>t?`${e.slice(0,Math.max(1,t-1))}…`:e}function k(e){if(!Number.isFinite(e)||e<0)return`—`;let t=Math.round(e/6e4);if(t<1)return`<1m`;if(t<60)return`${t}m`;let n=Math.floor(t/60);return n<48?`${n}h ${t%60}m`:`${Math.round(n/24)}d`}function ue({title:e,description:t,caveat:n,status:v,lanes:b,from:x,to:w,now:O,width:ue,toneOf:A=oe,formatTime:j=se,formatTick:de,ariaLabel:fe}){let M=b.flatMap(e=>e.items.flatMap(e=>[e.start,e.end??NaN])).filter(i),pe=i(w)?w:O!==void 0&&i(O)?O:M.length?Math.max(...M):Date.now(),me=i(x)?x:M.length?Math.min(...M):pe-864e5,[N,P]=o(me,pe,l,`end`),he=de??ce(N,P),F=(0,S.useRef)(null),I=g(F,ue),L=ee(),[R,ge]=(0,S.useState)(0),[z,B]=(0,S.useState)(null),V=(0,S.useId)(),H=ne((0,S.useId)()),U=O??P,W=b.reduce((e,t)=>e+t.items.length,0),_e=v??(W===0?{kind:`empty`,message:`No runs in this window.`}:{kind:`ready`}),ve=b.some(e=>e.engine!==void 0)?18:0,G=Math.max(72,Math.min(160,Math.round(I*.24)))+ve,ye=Math.floor((G-ve)/(7*L)),K=Math.max(40,I-G-8),q=r(N,Math.max(P,N+1),G,G+K),J=b.length>50,Y=J?Math.max(0,Math.floor(R/24)-ae):0,X=J?Math.min(b.length,Math.ceil(R/24)+ie+ae):b.length,Z=b.length*24,be=(0,S.useMemo)(()=>{let e=new Map;for(let t of b)for(let n of t.items){let t=A(n.status),r=T(n)?`outline`:t===`unknown`?`hatch`:t,i=r===`outline`?{kind:`empty`}:r===`hatch`?{kind:`hatch`}:{color:_(t)};e.has(r)||e.set(r,{item:i,names:new Set}),e.get(r).names.add(n.status.toLowerCase())}return[...e.values()].map(({item:e,names:t})=>({...e,label:[...t].sort().join(` / `)}))},[b,A]),xe=b.some(e=>e.engine!==void 0),Q=(0,S.useMemo)(()=>{let e=Math.max(2,Math.floor(K/90)),t=(P-N)/Math.max(1,e);return Array.from({length:e+1},(e,n)=>N+t*n)},[N,P,K]),Se=(0,S.useMemo)(()=>b.flatMap(e=>e.items.map(t=>({...t,lane:e.label,engine:e.engine}))),[b]);function Ce(e){let t=new Map;for(let n of e.items)t.set(n.status,(t.get(n.status)??0)+1);let n=[...t.entries()].sort((e,t)=>t[1]-e[1]).map(([e,t])=>`${t} ${e}`),r=e.engine?` (${e.engine})`:``;return`${e.label}${r}: ${e.items.length} run${e.items.length===1?``:`s`}${n.length?` (${n.join(`, `)})`:``}`}let we=fe??`${e}: ${W} runs across ${b.length} lanes from ${j(N)} to ${j(P)}.`,Te=[{key:`lane`,label:`Lane`,render:e=>e.lane},...xe?[{key:`engine`,label:`Engine`,render:e=>e.engine??`—`}]:[],{key:`status`,label:`Status`,render:e=>`${e.status}${e.stale?` (stale)`:``}`},{key:`start`,label:`Started`,render:e=>j(e.start)},{key:`dur`,label:`Duration`,numeric:!0,render:e=>e.end===null?`${k(U-e.start)}+`:k(e.end-e.start)},{key:`detail`,label:`Detail`,render:e=>e.detail??``}],$=z?b[z.lane]?.items[z.item]:void 0;function Ee(e,t){let n=t*24;return(0,y.jsxs)(`g`,{"data-lane":e.id,children:[t%2==1?(0,y.jsx)(`rect`,{className:C.band,x:0,y:n,width:I,height:24}):null,e.engine?(0,y.jsx)(s,{engine:e.engine,x:2,y:n+5,height:14}):null,(0,y.jsx)(`text`,{className:c.label,x:G-8,y:n+12,dy:`0.32em`,textAnchor:`end`,children:le(e.label,ye)}),e.items.map((e,r)=>{let i=Math.max(N,e.start),a=Math.min(P,e.end??U);if(a<N||i>P)return null;let o=q(i),s=Math.max(D,q(Math.max(a,i))-o),l=A(e.status),u=T(e),d=!u&&l===`unknown`;return(0,y.jsx)(`rect`,{"data-item":e.id,"data-status":e.status,"data-open":e.end===null?`true`:void 0,"data-style":u?`outline`:d?`hatch`:`fill`,className:`${C.bar} ${e.stale?C.stale:``} ${e.end===null?C.open:``} ${u?C.outline:``} ${d?c.unknownMark:``}`,x:u?o+.5:o,y:u?n+5.5:n+5,width:u?Math.max(D,s-1):s,height:u?13:14,rx:3,fill:u?`none`:d?`url(#${H})`:_(l),stroke:u?re:void 0,onPointerEnter:()=>B({lane:t,item:r}),onPointerLeave:()=>B(e=>e&&e.lane===t&&e.item===r?null:e)},e.id)})]},e.id)}let De=a(Q.map((e,t)=>({key:String(t),x:q(e),anchor:t===0?`start`:t===Q.length-1?`end`:`middle`,priority:t===Q.length-1?3:t===0?2:1,required:t===0||t===Q.length-1,variants:[he(e)]})),{min:G,max:G+K,charPx:te(L)}),Oe=(0,y.jsxs)(`svg`,{className:c.svg,width:I,height:E,viewBox:`0 0 ${I} ${E}`,"aria-hidden":`true`,children:[(0,y.jsx)(`line`,{className:c.axis,x1:G,x2:G+K,y1:21,y2:21}),De.map(e=>(0,y.jsx)(`text`,{"data-axis-label":e.key,className:c.tick,x:e.x,y:15,textAnchor:e.anchor,children:e.text},e.key))]});return(0,y.jsx)(f,{title:e,description:t,caveat:n,status:_e,table:(0,y.jsx)(d,{caption:e,columns:Te,rows:Se,rowKey:e=>e.id}),footer:(0,y.jsx)(m,{min:1,items:be}),children:(0,y.jsxs)(`div`,{ref:F,className:c.plotWrap,children:[Oe,(0,y.jsxs)(`div`,{className:J?C.scroller:void 0,style:J?{height:336}:void 0,onScroll:J?e=>ge(e.currentTarget.scrollTop):void 0,"data-virtualized":J?`true`:void 0,children:[(0,y.jsxs)(`svg`,{className:c.svg,width:I,height:Z,viewBox:`0 0 ${I} ${Z}`,role:`img`,"aria-label":we,children:[(0,y.jsx)(`defs`,{children:(0,y.jsx)(p,{id:H})}),Q.map(e=>(0,y.jsx)(`line`,{className:c.grid,x1:q(e),x2:q(e),y1:0,y2:Z},e)),U>=N&&U<=P?(0,y.jsx)(`line`,{className:C.now,x1:q(U),x2:q(U),y1:0,y2:Z}):null,b.slice(Y,X).map((e,t)=>Ee(e,Y+t))]}),(0,y.jsx)(`ul`,{className:C.laneStops,style:{height:Z},"aria-label":`${e} lanes`,"aria-describedby":V,children:b.slice(Y,X).map((e,t)=>(0,y.jsx)(`li`,{tabIndex:0,className:`${C.laneStop} ${c.focusable}`,style:{top:(Y+t)*24,height:24},"aria-label":Ce(e),onFocus:()=>B(e.items.length?{lane:Y+t,item:e.items.length-1}:null),onBlur:()=>B(null)},e.id))})]}),(0,y.jsx)(`span`,{id:V,className:c.srOnly,children:`Each lane lists its runs by status; open the Table view for every run.`}),z&&$?(0,y.jsx)(u,{left:h(q(Math.max(N,$.start)),I),top:E+z.lane*24-(J?R:0),title:b[z.lane].label,rows:[{key:`s`,label:`Status`,value:`${$.status}${$.stale?` (stale)`:``}`,...T($)||A($.status)===`unknown`?{}:{color:_(A($.status))}},{key:`t`,label:`Started`,value:j($.start)},{key:`d`,label:`Duration`,value:$.end===null?`${k(U-$.start)} so far`:k($.end-$.start)},...$.detail?[{key:`x`,label:`Detail`,value:$.detail}]:[]]}):null]})})}export{x as n,ue as t};
2
- //# sourceMappingURL=Swimlane-DGcIcnNA.js.map
@@ -1,7 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/xterm-B1njb2Cr.css"])))=>i.map(i=>d[i]);
2
- import{a as e,n as t,s as n,t as r}from"./index-BVxOlseC.js";import{D as i,F as a,O as o,c as s,i as c,j as l,l as u,o as d}from"./global-oEl9Qj8u.js";import{a as f,c as ee,l as p,o as m,s as h}from"./command-catalog-Bb_PxC5w.js";import{v as g}from"./workbench-types-DzN-5trg.js";import{n as te}from"./viewport-nTubFCwf.js";import{i as ne,r as re}from"./section-visibility-Yctxu-if.js";import{g as ie}from"./verse-model-DyCwZF-M.js";import{n as _,t as v}from"./Button-HHXgoXGr.js";import{n as ae,t as oe}from"./ActionMenu-FxXeRbPx.js";import{c as se,h as ce,v as le,x as ue}from"./icons-DEQa2rTx.js";import{t as y}from"./EmptyState-BqR5YAmf.js";import{f as de,r as fe,u as pe}from"./terminal-icons-D2xe-aM1.js";import{t as me}from"./pane-chrome.module-D7o-fVd0.js";var b=n(e(),1),x=class extends Error{constructor(){super(`Unlock actions with the mutation token to use the terminal.`),this.name=`TerminalLockedError`}};async function S(e,t){let n=i();if(!n)throw new x;let r=await u(e,t,n);return a(),r}function C(e,t){return`${g}/${encodeURIComponent(e)}/${t}`}var w={list:e=>s(g,e),create:async e=>(await S(g,e)).tab,input:(e,t)=>S(C(e,`input`),{dataBase64:t}),resize:(e,t,n)=>S(C(e,`resize`),{cols:t,rows:n}),kill:async e=>{await S(C(e,`kill`),{})},openExternal:async(e,t)=>{await S(`${g}/open-external`,t===void 0?{sessionId:e}:{sessionId:e,root:t})}};function T(e,t){let n=Number.isSafeInteger(t)&&t>0?`?after=${t}`:``;return`${C(e,`stream`)}${n}`}function he(e){let t=``;for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));return btoa(t)}function ge(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function _e(e){let t=e.replace(/\s+$/,``),n=Math.max(0,...Array.from(t.matchAll(/`+/g),e=>e[0].length)),r="`".repeat(Math.max(3,n+1));return`${r}\n${t}\n${r}`}function ve(e,t={}){let n=t.maxBytes??16384,r=new TextEncoder,i=[],a=0,o=null,s=!1,c=()=>{let e=new Uint8Array(a),t=0;for(let n of i)e.set(n,t),t+=n.length;let r=e.subarray(0,Math.min(n,e.length)),o=e.subarray(r.length);return i=o.length>0?[o]:[],a=o.length,r},l=async()=>{for(;!s&&a>0;){let n=c();try{await e(he(n))}catch(e){i=[],a=0,t.onError?.(e)}}o=null},u=e=>{s||e.length===0||(i.push(e),a+=e.length,o||=l())};return{pushText(e){u(r.encode(e))},pushBinary(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;u(t)},idle(){return o??Promise.resolve()},dispose(){s=!0,i=[],a=0}}}function E(e){return Math.min(250*2**e,8e3)}function ye(e){let t=``;for(let n of e.split(`
3
- `))n.startsWith(`data:`)&&(t+=n.slice(n.startsWith(`data: `)?6:5));if(!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(typeof n!=`object`||!n)return null;let r=n;return r.type===`output`&&typeof r.seq==`number`&&typeof r.dataBase64==`string`?{type:`output`,seq:r.seq,dataBase64:r.dataBase64}:r.type===`title`&&typeof r.title==`string`?{type:`title`,title:r.title}:r.type===`exit`?{type:`exit`,code:typeof r.code==`number`?r.code:null,signal:typeof r.signal==`string`?r.signal:null}:null}function be(e,t,n,r={}){let i=r.fetch??((e,t)=>fetch(e,t)),a=r.renew??l,s=r.proof??o,c=r.backoffMs??E,u=!1,d=null,f=null,ee=0,p=!1,m=e=>{(!u||e===`closed`)&&n.onState?.(e)},h=()=>{u||(m(`reconnecting`),f=setTimeout(()=>{f=null,g()},c(ee++)))};async function g(){if(u)return;d=new AbortController;let r;try{r=await i(T(e,t()),{method:`GET`,credentials:`same-origin`,headers:{"x-ashlr-read-client":s(),Accept:`text/event-stream`},signal:d.signal,cache:`no-store`})}catch{h();return}if(u)return;if(r.status===404){m(`gone`),u=!0;return}if(r.status===401){if(!p&&await a().catch(()=>!1)){p=!0,g();return}m(`expired`),u=!0;return}if(!r.ok||!r.body){h();return}p=!1,m(`open`);let o=r.body.getReader(),c=new TextDecoder,l=``;try{for(;;){let{value:e,done:t}=await o.read();if(t)break;ee=0,l+=c.decode(e,{stream:!0});let r;for(;(r=l.indexOf(`
4
-
5
- `))!==-1;){let e=l.slice(0,r);l=l.slice(r+2);let t=ye(e);t&&!u&&n.onFrame(t)}}}catch{}h()}return m(`connecting`),g(),{close(){u||(u=!0,f&&clearTimeout(f),d?.abort(),n.onState?.(`closed`))}}}var xe=5e3,D=null;function Se(){return D||(D=Promise.all([r(()=>import(`./xterm-ScmBfeDI.js`),[]),r(()=>import(`./addon-fit-DIOBYJe3.js`),[]),r(()=>Promise.resolve({}),__vite__mapDeps([0]))]).then(([e,t])=>[e,t]),D.catch(()=>{D=null})),D}var O=async e=>{let[{Terminal:t},{FitAddon:n}]=await Se(),r=new t({fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:1.2,cursorBlink:!0,cursorStyle:`bar`,scrollback:xe,theme:e.theme,screenReaderMode:e.screenReaderMode,macOptionIsMeta:!0,minimumContrastRatio:3,allowProposedApi:!1}),i=new n;r.loadAddon(i);let a=!1;return{get cols(){return r.cols},get rows(){return r.rows},open(e){a||(a=!0,r.open(e))},write(e){r.write(e)},reset(){r.reset()},focus(){r.focus()},fit(){let e=i.proposeDimensions();return!e||!Number.isFinite(e.cols)||!Number.isFinite(e.rows)||e.cols<2||e.rows<2?null:(i.fit(),{cols:r.cols,rows:r.rows})},onData:e=>r.onData(e),onBinary:e=>r.onBinary(e),onSelectionChange:e=>r.onSelectionChange(e),hasSelection:()=>r.hasSelection(),getSelection:()=>r.getSelection(),paste(e){r.paste(e)},bracketedPaste:()=>r.modes.bracketedPasteMode,setTheme(e){r.options.theme=e},setScreenReaderMode(e){r.options.screenReaderMode=e},setKeyFilter(e){r.attachCustomKeyEventHandler(e)},dispose(){r.dispose()}}},Ce={foreground:`--term-fg`,background:`--term-bg`,cursor:`--term-cursor`,cursorAccent:`--term-bg`,selectionBackground:`--term-selection`,selectionForeground:`--term-fg`,selectionInactiveBackground:`--term-selection-inactive`,scrollbarSliderBackground:`--term-scrollbar`,scrollbarSliderHoverBackground:`--term-scrollbar-hover`,scrollbarSliderActiveBackground:`--term-scrollbar-hover`,overviewRulerBorder:`--term-bg`,black:`--term-black`,red:`--term-red`,green:`--term-green`,yellow:`--term-yellow`,blue:`--term-blue`,magenta:`--term-magenta`,cyan:`--term-cyan`,white:`--term-white`,brightBlack:`--term-bright-black`,brightRed:`--term-bright-red`,brightGreen:`--term-bright-green`,brightYellow:`--term-bright-yellow`,brightBlue:`--term-bright-blue`,brightMagenta:`--term-bright-magenta`,brightCyan:`--term-bright-cyan`,brightWhite:`--term-bright-white`},k;function A(e){if(typeof document>`u`)return e;if(k===void 0)try{let e=document.createElement(`canvas`);e.width=1,e.height=1,k=e.getContext(`2d`,{willReadFrequently:!0})}catch{k=null}let t=k;if(!t)return e;try{t.clearRect(0,0,1,1),t.fillStyle=e,t.fillRect(0,0,1,1);let[n,r,i,a]=t.getImageData(0,0,1,1).data;return a===void 0?e:a===255?`rgb(${n}, ${r}, ${i})`:`rgba(${n}, ${r}, ${i}, ${(a/255).toFixed(3)})`}catch{return e}}function we(e){let t=document.createElement(`span`);t.style.display=`none`,e.appendChild(t);let n={};try{for(let[r,i]of Object.entries(Ce)){if(!getComputedStyle(e).getPropertyValue(i).trim())continue;t.style.color=``,t.style.color=`var(${i})`;let a=getComputedStyle(t).color;a&&(n[r]=A(a))}}finally{t.remove()}return n}function Te(e){let t=getComputedStyle(e),n=Number.parseFloat(t.fontSize);return{fontFamily:t.fontFamily||`ui-monospace, Menlo, monospace`,fontSize:Number.isFinite(n)&&n>=11?n:13}}function Ee(e){if(typeof window>`u`)return()=>{};let t=document.documentElement,n=typeof MutationObserver==`function`?new MutationObserver(()=>e()):null;n?.observe(t,{attributes:!0,attributeFilter:[`data-theme`,`data-accent`,`class`,`style`]});let r=typeof window.matchMedia==`function`?window.matchMedia(`(prefers-color-scheme: dark)`):null,i=()=>e();return r?.addEventListener?.(`change`,i),()=>{n?.disconnect(),r?.removeEventListener?.(`change`,i)}}var j={pane:`_pane_7fww7_15`,loading:`_loading_7fww7_91`,strip:`_strip_7fww7_100`,tabs:`_tabs_7fww7_109`,tab:`_tab_7fww7_109`,tabButton:`_tabButton_7fww7_142`,tabClose:`_tabClose_7fww7_159`,noticeClose:`_noticeClose_7fww7_160`,tabTitle:`_tabTitle_7fww7_165`,tabExited:`_tabExited_7fww7_171`,unseen:`_unseen_7fww7_180`,stripActions:`_stripActions_7fww7_215`,cwd:`_cwd_7fww7_227`,headerStatus:`_headerStatus_7fww7_229`,notice:`_notice_7fww7_160`,inlineNotice:`_inlineNotice_7fww7_267`,body:`_body_7fww7_275`,panel:`_panel_7fww7_285`,viewport:`_viewport_7fww7_294`,host:`_host_7fww7_301`,viewLoading:`_viewLoading_7fww7_318`,exitBar:`_exitBar_7fww7_323`,header:`_header_7fww7_229`},M=t(),De={api:w,createView:O,openStream:be,platform:f(),writeClipboard:async e=>{await navigator.clipboard.writeText(e)}},Oe=3e3,N=`ashlr.verse.terminal.screenReader`,P=0;function F(){P=0}function ke(){try{return localStorage.getItem(N)===`1`}catch{return!1}}function Ae(e){try{localStorage.setItem(N,e?`1`:`0`)}catch{}}function je(e,t){if(e.type!==`keydown`||!p(e,[`chat`,`global`],t))return!1;let n=m(e),r=e.ctrlKey&&(n==="`"||n===`tab`);return t===`mac`?e.metaKey||r:r||e.ctrlKey&&e.shiftKey}function I(e,t){if(e instanceof x)return e.message;if(e instanceof d){if(e.status===401)return`Unlock actions with the mutation token to use the terminal.`;if(e.detail)return e.detail.endsWith(`.`)?e.detail:`${e.detail}.`}return t}function L({sessionId:e,roots:t,request:n,onSendToChat:r,visible:i,deps:a}){let o=(0,b.useMemo)(()=>({...De,...a}),[a]),s=ne(),l=i&&s,u=te().compact,[f,p]=(0,b.useState)(null),[m,g]=(0,b.useState)(null),[x,S]=(0,b.useState)(null),[C,w]=(0,b.useState)(null),[T,he]=(0,b.useState)(!1),[E,ye]=(0,b.useState)(null),[be,xe]=(0,b.useState)(!1),[D,Se]=(0,b.useState)(!1),[O,Ce]=(0,b.useState)(ke),[k,A]=(0,b.useState)(!1),[N,F]=(0,b.useState)(()=>new Set),[L,Me]=(0,b.useState)(null),[Ne,Pe]=(0,b.useState)(()=>new Map),R=(0,b.useRef)(new Map),z=(0,b.useRef)(new Map),Fe=(0,b.useRef)(new Set),B=(0,b.useRef)(!1),V=(0,b.useRef)(null),Ie=(0,b.useRef)(null),Le=(0,b.useRef)(new Map),H=(0,b.useRef)(null),U=(0,b.useRef)(null),W=(0,b.useRef)(null),G=(0,b.useRef)(!0),Re=(0,b.useRef)(!1),K=(0,b.useMemo)(()=>f?.tabs??[],[f]),ze=(0,b.useRef)(new Set);ze.current=new Set(K.filter(e=>e.exited).map(e=>e.id));let q=(0,b.useMemo)(()=>K.filter(t=>t.sessionId===e),[K,e]),J=q.find(e=>e.id===x)??null,Be=K.length-q.length,Y=(0,b.useCallback)(async()=>{try{let e=await o.api.list();if(!G.current)return;p(e),g(null)}catch(e){if(!G.current)return;g(I(e,`The terminal list could not be loaded.`))}},[o.api]);(0,b.useEffect)(()=>(G.current=!0,Y(),()=>{G.current=!1}),[Y]),re(()=>{Y()},Oe,{enabled:i}),(0,b.useEffect)(()=>{f&&(x&&q.some(e=>e.id===x)||S(q.at(-1)?.id??null))},[f,q,x]),(0,b.useEffect)(()=>{if(!f)return;let e=new Set(f.tabs.map(e=>e.id));for(let[t,n]of R.current)e.has(t)||(Ve(n),R.current.delete(t),F(e=>{let n=new Set(e);return n.delete(t),n}))},[f]),(0,b.useEffect)(()=>{J&&l&&Pe(e=>e.get(J.id)===J.lastActivityAt?e:new Map(e).set(J.id,J.lastActivityAt))},[J,l]),(0,b.useEffect)(()=>()=>{for(let e of R.current.values())Ve(e);R.current.clear();for(let e of[H,U,W])e.current&&clearTimeout(e.current)},[]);function Ve(e){e.queue.dispose();for(let t of e.disposers)try{t.dispose()}catch{}try{e.view.dispose()}catch{}}let He=(0,b.useCallback)(()=>{for(let e of R.current.values())if(e.view.cols>1&&e.view.rows>1)return{cols:e.view.cols,rows:e.view.rows};return{cols:80,rows:24}},[]),X=(0,b.useCallback)(async(t={})=>{he(!0),w(null);try{let n=await o.api.create({sessionId:e,...t.root?{root:t.root}:{},...t.appId?{appId:t.appId}:{},...t.appId&&t.via?{via:t.via}:{},...t.appId&&t.model?{model:t.model}:{},...t.devServerId?{devServerId:t.devServerId}:{},...He()});return G.current?(p(e=>e&&{...e,tabs:[...e.tabs.filter(e=>e.id!==n.id),n]}),S(n.id),n):n}catch(e){return G.current&&w({tone:`error`,text:I(e,`The terminal could not be opened.`)}),null}finally{G.current&&he(!1)}},[o.api,e,He]),Z=(0,b.useCallback)(async e=>{try{await o.api.kill(e.id)}catch(e){if(!(e instanceof d&&e.status===404)){w({tone:`error`,text:I(e,`The terminal could not be closed.`)});return}}let t=R.current.get(e.id);if(t&&(Ve(t),R.current.delete(e.id)),p(t=>t&&{...t,tabs:t.tabs.filter(t=>t.id!==e.id)}),x===e.id){let t=q.findIndex(t=>t.id===e.id),n=q[t+1]??q[t-1]??null;S(n?.id??null)}},[x,o.api,q]),Ue=(0,b.useCallback)(async e=>{await X({root:e.root})&&await Z(e)},[Z,X]),We=(0,b.useRef)(e);We.current!==e&&(We.current=e,B.current=!1),(0,b.useEffect)(()=>{f&&f.available&&l&&!B.current&&!T&&(n&&n.nonce>P||(B.current=!0,q.length===0&&X({})))},[f,l,q.length,T,X,n]);let Ge=(0,b.useCallback)(async(e,t)=>{if(!(R.current.has(e)||Fe.current.has(e))){Fe.current.add(e);try{let n=await o.createView({...Te(t),theme:we(t),screenReaderMode:ke()});if(!G.current||!z.current.has(e)){n.dispose();return}n.open(t);let r=ve(t=>o.api.input(e,t),{onError:e=>{G.current&&w({tone:`error`,text:I(e,`That input did not reach the shell.`)})}}),i={view:n,host:t,lastSeq:0,queue:r,disposers:[]};i.disposers.push(n.onData(t=>{ze.current.has(e)||r.pushText(t)})),i.disposers.push(n.onBinary(t=>{ze.current.has(e)||r.pushBinary(t)})),i.disposers.push(n.onSelectionChange(()=>{let e=n.hasSelection();xe(e),e&&(W.current&&clearTimeout(W.current),W.current=setTimeout(()=>{let e=n.getSelection();e&&o.writeClipboard(e).then(()=>{G.current&&(Se(!0),U.current&&clearTimeout(U.current),U.current=setTimeout(()=>Se(!1),1200))},()=>{})},150))})),n.setKeyFilter(e=>!je(e,o.platform)),R.current.set(e,i),A(!1),F(t=>new Set(t).add(e))}catch(e){console.error(`[verse] terminal view failed to load`,e),G.current&&A(!0)}finally{Fe.current.delete(e)}}},[o]),Ke=(0,b.useRef)(Ge);Ke.current=Ge;let qe=(0,b.useRef)(new Map),Je=e=>{let t=qe.current.get(e);return t||(t=t=>{t?(z.current.set(e,t),Ke.current(e,t)):(z.current.delete(e),qe.current.delete(e))},qe.current.set(e,t)),t},Ye=(0,b.useCallback)(()=>{if(!x)return;let e=R.current.get(x);if(!e)return;let t={cols:e.view.cols,rows:e.view.rows},n=e.view.fit();if(!n||n.cols===t.cols&&n.rows===t.rows&&J&&J.cols===n.cols&&J.rows===n.rows)return;H.current&&clearTimeout(H.current);let r=x;H.current=setTimeout(()=>{o.api.resize(r,n.cols,n.rows).catch(()=>{})},100)},[J,x,o.api]);(0,b.useEffect)(()=>{if(!l||!x||!N.has(x))return;Ye();let e=Ie.current;if(!e||typeof ResizeObserver>`u`)return;let t=0,n=new ResizeObserver(()=>{cancelAnimationFrame(t),t=requestAnimationFrame(Ye)});return n.observe(e),()=>{cancelAnimationFrame(t),n.disconnect()}},[l,x,N,Ye]),(0,b.useEffect)(()=>Ee(()=>{for(let e of R.current.values())e.view.setTheme(we(e.host))}),[]);let Q=(0,b.useCallback)(e=>{let t=V.current;if(!t||t.tabId!==e)return;let n=R.current.get(e);if(!n)return;V.current=null;let r=t.text.replace(/[\r\n]+$/,``);r.includes(`
6
- `)&&!n.view.bracketedPaste()?o.writeClipboard(r).then(()=>w({tone:`info`,text:`That command has several lines, so it was copied instead: paste it with ⌘V.`}),()=>w({tone:`error`,text:`That command has several lines and could not be pasted safely.`})):n.view.paste(r),n.view.focus()},[o]);(0,b.useEffect)(()=>{if(!l||!x||!N.has(x)){ye(null);return}let e=R.current.get(x);if(!e)return;let t=x,n=!0,r=o.openStream(t,()=>e.lastSeq,{onFrame:r=>{if(r.type===`output`){if(r.seq<=e.lastSeq)return;e.lastSeq>0&&r.seq>e.lastSeq+1&&e.view.reset(),e.view.write(ge(r.dataBase64)),e.lastSeq=r.seq,n&&(n=!1,V.current?.tabId===t&&setTimeout(()=>Q(t),120));return}p(e=>e&&{...e,tabs:e.tabs.map(e=>e.id===t?r.type===`title`?e.title===r.title?e:{...e,title:r.title}:{...e,exited:{code:r.code,signal:r.signal,at:new Date().toISOString()}}:e)})},onState:e=>{G.current&&(ye(e),e===`gone`&&Y())}});return V.current?.tabId===t&&e.lastSeq>0&&setTimeout(()=>Q(t),0),()=>r.close()},[l,x,N,o,Y,Q]);let Xe=(0,b.useCallback)(async e=>{let n=e.root??J?.root??t[0],r=e.newTab===!0||!!e.appId||!!e.devServerId,i=null;if(r||(i=(J&&!J.exited&&(!e.root||J.root===e.root)?J:null)??q.find(t=>!t.exited&&(!e.root||t.root===e.root))??null),i?S(i.id):i=await X({...n?{root:n}:{},...e.appId?{appId:e.appId}:{},...e.via?{via:e.via}:{},...e.model?{model:e.model}:{},...e.devServerId?{devServerId:e.devServerId}:{}}),i){if(e.paste){V.current={tabId:i.id,text:e.paste};let t=R.current.get(i.id);t&&t.lastSeq>0&&Q(i.id)}else R.current.get(i.id)?.view.focus()}},[J,Q,X,t,q]);(0,b.useEffect)(()=>{!n||!f||n.nonce<=P||(P=n.nonce,B.current=!0,f.available&&Xe(n))},[n,f,Xe]),(0,b.useEffect)(()=>{l&&x&&N.has(x)&&R.current.get(x)?.view.focus()},[l,x,N]);let Ze=()=>{if(!x)return;let e=R.current.get(x)?.view.getSelection()??``;e.trim()&&r(_e(e))},Qe=()=>{let e=!O;Ce(e),Ae(e);for(let t of R.current.values())t.view.setScreenReaderMode(e)},$e=async()=>{try{await o.api.openExternal(e,J?.root??t[0]),w({tone:`info`,text:`Opened in Terminal.`})}catch(e){w({tone:`error`,text:I(e,`Terminal could not be opened.`)})}},et=e=>{Re.current=!0,X(e).finally(()=>{Re.current=!1})},tt=()=>{et(J?.root?{root:J.root}:{})},nt=(e,t)=>{let n=-1;if(e.key===`ArrowRight`?n=(t+1)%q.length:e.key===`ArrowLeft`?n=(t-1+q.length)%q.length:e.key===`Home`?n=0:e.key===`End`&&(n=q.length-1),n<0)return;e.preventDefault();let r=q[n];S(r.id),Le.current.get(r.id)?.focus()};if(!f)return m?(0,M.jsx)(`div`,{className:j.pane,children:(0,M.jsx)(y,{compact:!0,tone:`error`,title:`Terminal is not reachable`,body:m,action:(0,M.jsx)(v,{size:`sm`,variant:`subtle`,onClick:()=>void Y(),children:`Try again`})})}):(0,M.jsxs)(`div`,{className:j.pane,"aria-busy":`true`,children:[(0,M.jsx)(`div`,{className:j.strip,"aria-hidden":`true`}),(0,M.jsxs)(`div`,{className:j.loading,children:[(0,M.jsx)(c,{width:`40%`}),(0,M.jsx)(c,{width:`70%`})]})]});if(!f.available)return(0,M.jsxs)(`div`,{className:j.pane,children:[(0,M.jsx)(y,{compact:!0,icon:(0,M.jsx)(de,{size:20}),title:`Terminal needs the desktop app`,body:`This Verse server has no built-in terminal. Open the project in Terminal instead, or use the Ashlr desktop app.`,action:o.platform===`mac`?(0,M.jsx)(v,{size:`sm`,variant:`subtle`,icon:(0,M.jsx)(se,{}),onClick:()=>void $e(),children:`Open in Terminal`}):void 0}),C?(0,M.jsx)(`p`,{className:j.inlineNotice,role:C.tone===`error`?`alert`:`status`,children:C.text}):null]});let rt=t.length>1,it=h(`dock.terminal-new`)?.keys[0],$=it?ee(it,o.platform):null,at=q.length===0&&!k&&(!B.current||T&&!Re.current),ot=J?.root??q.at(-1)?.root??(at?t[0]??null:null);return(0,M.jsxs)(`div`,{className:j.pane,"data-compact":u||void 0,children:[(0,M.jsxs)(`div`,{className:j.strip,children:[(0,M.jsx)(`div`,{className:j.tabs,role:`tablist`,"aria-label":`Terminals`,children:q.map((e,t)=>{let n=e.id===x,r=!n&&(Ne.get(e.id)??e.createdAt)<e.lastActivityAt;return(0,M.jsxs)(`div`,{className:j.tab,"data-selected":n||void 0,role:`presentation`,children:[(0,M.jsxs)(`button`,{ref:t=>{t?Le.current.set(e.id,t):Le.current.delete(e.id)},type:`button`,role:`tab`,id:`terminal-tab-${e.id}`,"aria-selected":n,"aria-controls":`terminal-panel-${e.id}`,tabIndex:n?0:-1,className:j.tabButton,title:`${e.title} — ${e.root}`,onClick:()=>S(e.id),onKeyDown:e=>nt(e,t),children:[(0,M.jsx)(`span`,{className:j.tabTitle,children:e.title}),e.exited?(0,M.jsx)(`span`,{className:j.tabExited,children:`exited`}):null,r&&!e.exited?(0,M.jsx)(`span`,{className:j.unseen,"aria-label":`new output`,role:`img`}):null]}),(0,M.jsx)(`button`,{type:`button`,className:j.tabClose,"aria-label":`Close terminal ${e.title}`,title:`Close terminal`,onClick:()=>void Z(e),children:(0,M.jsx)(ue,{size:12})})]},e.id)})}),(0,M.jsxs)(`div`,{className:j.stripActions,children:[(0,M.jsx)(_,{variant:`ghost`,size:`sm`,icon:(0,M.jsx)(ce,{}),"aria-label":`New terminal tab`,title:$?`New terminal tab (${$})`:`New terminal tab`,busy:T,onClick:tt}),rt?(0,M.jsx)(_,{variant:`ghost`,size:`sm`,icon:(0,M.jsx)(fe,{}),"aria-label":`New terminal in…`,"aria-haspopup":`menu`,"aria-expanded":L!==null,title:`Choose the folder`,onClick:e=>Me({anchor:ae(e.currentTarget),from:e.currentTarget})}):null]})]}),ot===null?null:(0,M.jsxs)(`div`,{className:`${me.header} ${j.header}`,children:[(0,M.jsx)(`span`,{className:`${me.title} ${j.cwd}`,title:ot,children:ie(ot)}),(0,M.jsx)(`span`,{className:j.headerStatus,role:`status`,"aria-live":`polite`,children:E===`reconnecting`?`Reconnecting…`:E===`expired`?`Session expired — reload to reconnect`:D?`Copied`:``}),(0,M.jsxs)(`div`,{className:me.actions,children:[(0,M.jsx)(v,{variant:`ghost`,size:`sm`,icon:(0,M.jsx)(le,{}),disabled:!be,"aria-label":`Send selection to chat`,title:be?`Send the selected text to the chat as a code block`:`Select text in the terminal first`,onClick:Ze,children:u?null:`Send to chat`}),(0,M.jsx)(_,{variant:`ghost`,size:`sm`,icon:(0,M.jsx)(pe,{}),"aria-label":`Screen reader mode`,"aria-pressed":O,title:O?`Screen reader mode is on`:`Screen reader mode`,onClick:Qe}),o.platform===`mac`?(0,M.jsx)(_,{variant:`ghost`,size:`sm`,icon:(0,M.jsx)(se,{}),"aria-label":`Open in Terminal.app`,title:`Open this folder in Terminal.app`,onClick:()=>void $e()}):null]})]}),C?(0,M.jsxs)(`div`,{className:j.notice,"data-tone":C.tone,role:C.tone===`error`?`alert`:`status`,children:[(0,M.jsx)(`span`,{children:C.text}),(0,M.jsx)(`button`,{type:`button`,className:j.noticeClose,"aria-label":`Dismiss`,title:`Dismiss`,onClick:()=>w(null),children:(0,M.jsx)(ue,{size:12})})]}):null,(0,M.jsxs)(`div`,{className:j.body,ref:Ie,children:[k?(0,M.jsx)(y,{compact:!0,tone:`error`,title:`The terminal could not load`,body:`The rest of the chat still works.`,action:(0,M.jsx)(v,{size:`sm`,variant:`subtle`,onClick:()=>{A(!1);for(let[e,t]of z.current)Ge(e,t)},children:`Try again`})}):null,at?(0,M.jsx)(`div`,{className:j.loading,role:`status`,"aria-label":`Opening a shell`,children:(0,M.jsx)(c,{width:`30%`})}):null,q.length===0&&!k&&!at?(0,M.jsx)(y,{compact:!0,icon:(0,M.jsx)(de,{size:20}),title:`No terminal open`,body:`Click New terminal${$?` or press ${$}`:``} to open a login shell in this chat's folder.${Be>0?` ${Be} ${Be===1?`terminal is`:`terminals are`} open in other chats.`:``}`,action:(0,M.jsx)(v,{size:`sm`,variant:`subtle`,icon:(0,M.jsx)(ce,{}),busy:T,onClick:tt,children:`New terminal`})}):null,q.map(e=>{let t=e.id===x;return(0,M.jsxs)(`div`,{id:`terminal-panel-${e.id}`,role:`tabpanel`,"aria-labelledby":`terminal-tab-${e.id}`,className:j.panel,hidden:!t,children:[(0,M.jsxs)(`div`,{className:j.viewport,children:[(0,M.jsx)(`div`,{className:j.host,ref:Je(e.id),"data-testid":`terminal-host-${e.id}`}),!N.has(e.id)&&!k?(0,M.jsx)(`div`,{className:j.viewLoading,"aria-hidden":`true`,children:(0,M.jsx)(c,{width:`30%`})}):null]}),e.exited?(0,M.jsxs)(`div`,{className:j.exitBar,role:`status`,children:[(0,M.jsx)(`span`,{children:e.exited.signal&&e.exited.code===null?`Shell ended (${e.exited.signal}).`:`Shell exited${e.exited.code===null?``:` with code ${e.exited.code}`}.`}),(0,M.jsx)(v,{size:`sm`,variant:`subtle`,onClick:()=>void Ue(e),children:`Restart`}),(0,M.jsx)(v,{size:`sm`,variant:`ghost`,onClick:()=>void Z(e),children:`Close`})]}):null]},e.id)})]}),L?(0,M.jsx)(oe,{label:`New terminal in`,anchor:L.anchor,returnFocus:L.from,onClose:()=>Me(null),items:t.map(e=>({id:e,label:ie(e),description:e,onSelect:()=>{et({root:e})}}))}):null]})}export{Oe as TERMINAL_LIST_POLL_MS,L as TerminalPane,je as keyPassesToPage,F as resetTerminalPaneForTest};
7
- //# sourceMappingURL=TerminalPane-MQT-veKZ.js.map