@ashlr/hub 3.10.0 → 3.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/dist/authority-surface.json +43 -23
  3. package/dist/build-identity.json +2 -2
  4. package/dist/core/daemon/capacity-publisher.d.ts +19 -0
  5. package/dist/core/daemon/capacity-publisher.js +49 -2
  6. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  7. package/dist/core/daemon/overnight-status.d.ts +13 -0
  8. package/dist/core/daemon/overnight-status.js +93 -8
  9. package/dist/core/daemon/overnight-status.js.map +1 -1
  10. package/dist/core/fleet/dispatch-router.js +26 -9
  11. package/dist/core/fleet/dispatch-router.js.map +1 -1
  12. package/dist/core/fleet/fleet-runtime-journal.js +12 -5
  13. package/dist/core/fleet/fleet-runtime-journal.js.map +1 -1
  14. package/dist/core/fleet/fleet-types.d.ts +13 -0
  15. package/dist/core/routing/budget-store.js +11 -5
  16. package/dist/core/routing/budget-store.js.map +1 -1
  17. package/dist/core/routing/capacity-history-api.d.ts +30 -0
  18. package/dist/core/routing/capacity-history-api.js +147 -0
  19. package/dist/core/routing/capacity-history-api.js.map +1 -0
  20. package/dist/core/routing/capacity-history-types.d.ts +63 -0
  21. package/dist/core/routing/capacity-history-types.js +18 -0
  22. package/dist/core/routing/capacity-history-types.js.map +1 -0
  23. package/dist/core/routing/capacity-history.d.ts +130 -0
  24. package/dist/core/routing/capacity-history.js +654 -0
  25. package/dist/core/routing/capacity-history.js.map +1 -0
  26. package/dist/core/routing/headroom.d.ts +5 -1
  27. package/dist/core/routing/headroom.js +82 -41
  28. package/dist/core/routing/headroom.js.map +1 -1
  29. package/dist/core/routing/router.d.ts +8 -1
  30. package/dist/core/routing/router.js +49 -16
  31. package/dist/core/routing/router.js.map +1 -1
  32. package/dist/core/routing/seat-reasons.d.ts +35 -0
  33. package/dist/core/routing/seat-reasons.js +48 -0
  34. package/dist/core/routing/seat-reasons.js.map +1 -0
  35. package/dist/core/routing/types.d.ts +37 -0
  36. package/dist/core/routing/types.js.map +1 -1
  37. package/dist/core/verse/fleet-history-types.d.ts +12 -4
  38. package/dist/core/verse/fleet-history-types.js +4 -2
  39. package/dist/core/verse/fleet-history-types.js.map +1 -1
  40. package/dist/core/verse/fleet-live-api.d.ts +14 -1
  41. package/dist/core/verse/fleet-live-api.js +31 -11
  42. package/dist/core/verse/fleet-live-api.js.map +1 -1
  43. package/dist/core/verse/preferences.d.ts +3 -1
  44. package/dist/core/verse/preferences.js +5 -2
  45. package/dist/core/verse/preferences.js.map +1 -1
  46. package/dist/core/verse/types.d.ts +5 -1
  47. package/dist/core/verse/types.js.map +1 -1
  48. package/dist/core/verse/verse-api.js +2 -1
  49. package/dist/core/verse/verse-api.js.map +1 -1
  50. package/dist/core/web/public/next/assets/{ActionMenu-DhbNne-M.js → ActionMenu-BBB7VYjz.js} +2 -2
  51. package/dist/core/web/public/next/assets/{ActionMenu-DhbNne-M.js.map → ActionMenu-BBB7VYjz.js.map} +1 -1
  52. package/dist/core/web/public/next/assets/Advanced-Bywv_iYR.css +1 -0
  53. package/dist/core/web/public/next/assets/Advanced-xVYFAeA8.js +2 -0
  54. package/dist/core/web/public/next/assets/Advanced-xVYFAeA8.js.map +1 -0
  55. package/dist/core/web/public/next/assets/{App-DyBg1v_q.js → App-CbDCLAxn.js} +5 -5
  56. package/dist/core/web/public/next/assets/{App-DyBg1v_q.js.map → App-CbDCLAxn.js.map} +1 -1
  57. package/dist/core/web/public/next/assets/AppsSection-B5HWJi9I.js +2 -0
  58. package/dist/core/web/public/next/assets/AppsSection-B5HWJi9I.js.map +1 -0
  59. package/dist/core/web/public/next/assets/AreaTrend-BgnK0wAy.js +2 -0
  60. package/dist/core/web/public/next/assets/AreaTrend-BgnK0wAy.js.map +1 -0
  61. package/dist/core/web/public/next/assets/AutonomySection-BF5UCsMv.js +2 -0
  62. package/dist/core/web/public/next/assets/{AutonomySection-CoMngwNB.js.map → AutonomySection-BF5UCsMv.js.map} +1 -1
  63. package/dist/core/web/public/next/assets/BranchBar-BZNQ50YE.css +1 -0
  64. package/dist/core/web/public/next/assets/BranchBar-nfSb59Kv.js +2 -0
  65. package/dist/core/web/public/next/assets/BranchBar-nfSb59Kv.js.map +1 -0
  66. package/dist/core/web/public/next/assets/BudgetControl-BESM12dO.js +2 -0
  67. package/dist/core/web/public/next/assets/BudgetControl-BESM12dO.js.map +1 -0
  68. package/dist/core/web/public/next/assets/BurnDown-D1AfskPT.js +2 -0
  69. package/dist/core/web/public/next/assets/BurnDown-D1AfskPT.js.map +1 -0
  70. package/dist/core/web/public/next/assets/{Button-0-nNbv1h.js → Button-Cr_qkQEc.js} +2 -2
  71. package/dist/core/web/public/next/assets/{Button-0-nNbv1h.js.map → Button-Cr_qkQEc.js.map} +1 -1
  72. package/dist/core/web/public/next/assets/CapacityStrip-Cc28CyWk.css +1 -0
  73. package/dist/core/web/public/next/assets/CapacityStrip-DqqYnLek.js +2 -0
  74. package/dist/core/web/public/next/assets/CapacityStrip-DqqYnLek.js.map +1 -0
  75. package/dist/core/web/public/next/assets/ChatSection-DoqjyVoj.js +3 -0
  76. package/dist/core/web/public/next/assets/{ChatSection-B9cdRKUh.js.map → ChatSection-DoqjyVoj.js.map} +1 -1
  77. package/dist/core/web/public/next/assets/{CommandPalette-GpeCSrPy.js → CommandPalette-lLV-OR63.js} +2 -2
  78. package/dist/core/web/public/next/assets/{CommandPalette-GpeCSrPy.js.map → CommandPalette-lLV-OR63.js.map} +1 -1
  79. package/dist/core/web/public/next/assets/CommandSection-fiZ4DJpM.js +2 -0
  80. package/dist/core/web/public/next/assets/CommandSection-fiZ4DJpM.js.map +1 -0
  81. package/dist/core/web/public/next/assets/Composer-ByzxOJK6.css +1 -0
  82. package/dist/core/web/public/next/assets/Composer.module-C8U73KdQ.js +2 -0
  83. package/dist/core/web/public/next/assets/{Composer.module-DJMdrqNt.js.map → Composer.module-C8U73KdQ.js.map} +1 -1
  84. package/dist/core/web/public/next/assets/DiffPane-BAvvbBsf.css +1 -0
  85. package/dist/core/web/public/next/assets/DiffPane-BVxhK-cy.js +2 -0
  86. package/dist/core/web/public/next/assets/DiffPane-BVxhK-cy.js.map +1 -0
  87. package/dist/core/web/public/next/assets/{DiffViewer-tOGWk0CA.js → DiffViewer-yCdw9J-Y.js} +2 -2
  88. package/dist/core/web/public/next/assets/{DiffViewer-tOGWk0CA.js.map → DiffViewer-yCdw9J-Y.js.map} +1 -1
  89. package/dist/core/web/public/next/assets/DockHost-B4RaYOET.css +1 -0
  90. package/dist/core/web/public/next/assets/DockHost-BZReKwos.js +2 -0
  91. package/dist/core/web/public/next/assets/DockHost-BZReKwos.js.map +1 -0
  92. package/dist/core/web/public/next/assets/{EmptyState-DdJ4CxtO.js → EmptyState-D1GDxVZy.js} +2 -2
  93. package/dist/core/web/public/next/assets/{EmptyState-DdJ4CxtO.js.map → EmptyState-D1GDxVZy.js.map} +1 -1
  94. package/dist/core/web/public/next/assets/{Epistemic-BLjM5y_y.js → Epistemic-DRp4dBfB.js} +2 -2
  95. package/dist/core/web/public/next/assets/{Epistemic-BLjM5y_y.js.map → Epistemic-DRp4dBfB.js.map} +1 -1
  96. package/dist/core/web/public/next/assets/FleetSection-CFiWeOEs.css +1 -0
  97. package/dist/core/web/public/next/assets/FleetSection-rPLy_NPo.js +3 -0
  98. package/dist/core/web/public/next/assets/FleetSection-rPLy_NPo.js.map +1 -0
  99. package/dist/core/web/public/next/assets/Funnel-zvDj3He4.js +2 -0
  100. package/dist/core/web/public/next/assets/Funnel-zvDj3He4.js.map +1 -0
  101. package/dist/core/web/public/next/assets/GearTray-CkviqjYr.js +2 -0
  102. package/dist/core/web/public/next/assets/GearTray-CkviqjYr.js.map +1 -0
  103. package/dist/core/web/public/next/assets/GrowthSection-Bg5sW0jI.js +2 -0
  104. package/dist/core/web/public/next/assets/GrowthSection-Bg5sW0jI.js.map +1 -0
  105. package/dist/core/web/public/next/assets/HandoffDialog-DcPj1ri9.js +2 -0
  106. package/dist/core/web/public/next/assets/HandoffDialog-DcPj1ri9.js.map +1 -0
  107. package/dist/core/web/public/next/assets/{Input-CTu0CycC.js → Input-Ci7TD96x.js} +2 -2
  108. package/dist/core/web/public/next/assets/{Input-CTu0CycC.js.map → Input-Ci7TD96x.js.map} +1 -1
  109. package/dist/core/web/public/next/assets/{LeaderCard-BuSDeATv.js → LeaderCard-BSFTlMRF.js} +2 -2
  110. package/dist/core/web/public/next/assets/{LeaderCard-BuSDeATv.js.map → LeaderCard-BSFTlMRF.js.map} +1 -1
  111. package/dist/core/web/public/next/assets/{MatrixHeatmap-9dKgJ_pT.css → MatrixHeatmap-Bmnvo1l1.css} +1 -1
  112. package/dist/core/web/public/next/assets/MatrixHeatmap-DojKZe9L.js +2 -0
  113. package/dist/core/web/public/next/assets/MatrixHeatmap-DojKZe9L.js.map +1 -0
  114. package/dist/core/web/public/next/assets/McpSection-CvcYu1X_.js +2 -0
  115. package/dist/core/web/public/next/assets/{McpSection-1UncWBpW.js.map → McpSection-CvcYu1X_.js.map} +1 -1
  116. package/dist/core/web/public/next/assets/MessageMarkdown-BrLCrb73.js +3 -0
  117. package/dist/core/web/public/next/assets/{MessageMarkdown-C4pl9LI5.js.map → MessageMarkdown-BrLCrb73.js.map} +1 -1
  118. package/dist/core/web/public/next/assets/MessageMarkdown-Cgh5f1-Q.css +1 -0
  119. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CZsF77ZM.js → MessageMarkdownRenderer-CjmdBw2p.js} +2 -2
  120. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CZsF77ZM.js.map → MessageMarkdownRenderer-CjmdBw2p.js.map} +1 -1
  121. package/dist/core/web/public/next/assets/{Meter-C18ciKz4.js → Meter-DTHbmhQg.js} +2 -2
  122. package/dist/core/web/public/next/assets/{Meter-C18ciKz4.js.map → Meter-DTHbmhQg.js.map} +1 -1
  123. package/dist/core/web/public/next/assets/MindSection-DcO9fmYe.js +2 -0
  124. package/dist/core/web/public/next/assets/MindSection-DcO9fmYe.js.map +1 -0
  125. package/dist/core/web/public/next/assets/MutationTokenDialog-Cqn2uPV6.js +2 -0
  126. package/dist/core/web/public/next/assets/MutationTokenDialog-Cqn2uPV6.js.map +1 -0
  127. package/dist/core/web/public/next/assets/NeedsYouDrawer-BpvidnM2.css +1 -0
  128. package/dist/core/web/public/next/assets/NeedsYouDrawer-hiTINupk.js +2 -0
  129. package/dist/core/web/public/next/assets/NeedsYouDrawer-hiTINupk.js.map +1 -0
  130. package/dist/core/web/public/next/assets/NeedsYouList-B4Z37Phx.js +2 -0
  131. package/dist/core/web/public/next/assets/NeedsYouList-B4Z37Phx.js.map +1 -0
  132. package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +1 -0
  133. package/dist/core/web/public/next/assets/NewChatDialog-utSckh7C.js +3 -0
  134. package/dist/core/web/public/next/assets/{NewChatDialog-B_BsS9pr.js.map → NewChatDialog-utSckh7C.js.map} +1 -1
  135. package/dist/core/web/public/next/assets/OnboardingFlow-7N3YSUHN.js +2 -0
  136. package/dist/core/web/public/next/assets/{OnboardingFlow-CtCPpgoX.js.map → OnboardingFlow-7N3YSUHN.js.map} +1 -1
  137. package/dist/core/web/public/next/assets/PreviewPane-CqzkaAjG.js +2 -0
  138. package/dist/core/web/public/next/assets/PreviewPane-CqzkaAjG.js.map +1 -0
  139. package/dist/core/web/public/next/assets/PreviewPane-DoMsJSG3.css +1 -0
  140. package/dist/core/web/public/next/assets/RailStatus-sZhApA8k.js +2 -0
  141. package/dist/core/web/public/next/assets/RailStatus-sZhApA8k.js.map +1 -0
  142. package/dist/core/web/public/next/assets/{RefreshIndicator-CnhEovMZ.js → RefreshIndicator-C1uQIegT.js} +2 -2
  143. package/dist/core/web/public/next/assets/{RefreshIndicator-CnhEovMZ.js.map → RefreshIndicator-C1uQIegT.js.map} +1 -1
  144. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-28gLwmwV.js → ResourcePoolConsoleApp-DXjjV6Sh.js} +4 -4
  145. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-28gLwmwV.js.map → ResourcePoolConsoleApp-DXjjV6Sh.js.map} +1 -1
  146. package/dist/core/web/public/next/assets/{RouteErrorBoundary-AyUPCIb3.js → RouteErrorBoundary-D1LZxQjN.js} +2 -2
  147. package/dist/core/web/public/next/assets/{RouteErrorBoundary-AyUPCIb3.js.map → RouteErrorBoundary-D1LZxQjN.js.map} +1 -1
  148. package/dist/core/web/public/next/assets/SeatSelector-CT92PqM_.js +3 -0
  149. package/dist/core/web/public/next/assets/{SeatSelector-DaUO-zoK.js.map → SeatSelector-CT92PqM_.js.map} +1 -1
  150. package/dist/core/web/public/next/assets/{Segmented-B_8c_83S.js → Segmented-BMvq-FfD.js} +2 -2
  151. package/dist/core/web/public/next/assets/{Segmented-B_8c_83S.js.map → Segmented-BMvq-FfD.js.map} +1 -1
  152. package/dist/core/web/public/next/assets/{Select-Bl5g5Dt_.js → Select-DkdeoSQn.js} +2 -2
  153. package/dist/core/web/public/next/assets/{Select-Bl5g5Dt_.js.map → Select-DkdeoSQn.js.map} +1 -1
  154. package/dist/core/web/public/next/assets/{SessionInsightChip-w0I21q0c.js → SessionInsightChip-CwlakUYU.js} +2 -2
  155. package/dist/core/web/public/next/assets/{SessionInsightChip-w0I21q0c.js.map → SessionInsightChip-CwlakUYU.js.map} +1 -1
  156. package/dist/core/web/public/next/assets/SessionSearch-DFByh2NZ.js +2 -0
  157. package/dist/core/web/public/next/assets/{SessionSearch-B5aQ0BCM.js.map → SessionSearch-DFByh2NZ.js.map} +1 -1
  158. package/dist/core/web/public/next/assets/SettingsSection-DgSaHFK4.js +2 -0
  159. package/dist/core/web/public/next/assets/SettingsSection-DgSaHFK4.js.map +1 -0
  160. package/dist/core/web/public/next/assets/{Sheet-CVjk-cLI.js → Sheet-C7APkGPt.js} +2 -2
  161. package/dist/core/web/public/next/assets/{Sheet-CVjk-cLI.js.map → Sheet-C7APkGPt.js.map} +1 -1
  162. package/dist/core/web/public/next/assets/{ShortcutsOverlay-BiBjnBcc.js → ShortcutsOverlay-ZPyXUS_I.js} +2 -2
  163. package/dist/core/web/public/next/assets/{ShortcutsOverlay-BiBjnBcc.js.map → ShortcutsOverlay-ZPyXUS_I.js.map} +1 -1
  164. package/dist/core/web/public/next/assets/Sidebar-BRc1vGDF.css +1 -0
  165. package/dist/core/web/public/next/assets/Sidebar-Chsgazmk.js +3 -0
  166. package/dist/core/web/public/next/assets/Sidebar-Chsgazmk.js.map +1 -0
  167. package/dist/core/web/public/next/assets/{Slider-BS9MU5ZV.js → Slider-B0kjW7cd.js} +2 -2
  168. package/dist/core/web/public/next/assets/{Slider-BS9MU5ZV.js.map → Slider-B0kjW7cd.js.map} +1 -1
  169. package/dist/core/web/public/next/assets/{StatusBadge-DAf-ArKE.js → StatusBadge-wv4e6f8b.js} +2 -2
  170. package/dist/core/web/public/next/assets/{StatusBadge-DAf-ArKE.js.map → StatusBadge-wv4e6f8b.js.map} +1 -1
  171. package/dist/core/web/public/next/assets/StepBand-Db8WPw8J.js +2 -0
  172. package/dist/core/web/public/next/assets/StepBand-Db8WPw8J.js.map +1 -0
  173. package/dist/core/web/public/next/assets/{Surface-CiYOdNKQ.js → Surface-BkDrQ4t3.js} +2 -2
  174. package/dist/core/web/public/next/assets/{Surface-CiYOdNKQ.js.map → Surface-BkDrQ4t3.js.map} +1 -1
  175. package/dist/core/web/public/next/assets/Swimlane-Dcve56cP.js +2 -0
  176. package/dist/core/web/public/next/assets/Swimlane-Dcve56cP.js.map +1 -0
  177. package/dist/core/web/public/next/assets/{Switch-BzRXtNPt.js → Switch-DamlpSMY.js} +2 -2
  178. package/dist/core/web/public/next/assets/{Switch-BzRXtNPt.js.map → Switch-DamlpSMY.js.map} +1 -1
  179. package/dist/core/web/public/next/assets/{Tag-DEEbDz7T.js → Tag-Cs4tudBN.js} +2 -2
  180. package/dist/core/web/public/next/assets/{Tag-DEEbDz7T.js.map → Tag-Cs4tudBN.js.map} +1 -1
  181. package/dist/core/web/public/next/assets/TerminalPane-BDkKFych.js +7 -0
  182. package/dist/core/web/public/next/assets/TerminalPane-BDkKFych.js.map +1 -0
  183. package/dist/core/web/public/next/assets/TerminalPane-BwfMbnJz.css +1 -0
  184. package/dist/core/web/public/next/assets/UniverseConsoleApp-BE72VyBL.js +2 -0
  185. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DKqAf-eD.js.map → UniverseConsoleApp-BE72VyBL.js.map} +1 -1
  186. package/dist/core/web/public/next/assets/{UniverseView-D6081LQL.js → UniverseView-BbmYY2P4.js} +2 -2
  187. package/dist/core/web/public/next/assets/{UniverseView-D6081LQL.js.map → UniverseView-BbmYY2P4.js.map} +1 -1
  188. package/dist/core/web/public/next/assets/UsageSection-DsB-Jqyl.css +1 -0
  189. package/dist/core/web/public/next/assets/UsageSection-DsC5WmLk.js +2 -0
  190. package/dist/core/web/public/next/assets/UsageSection-DsC5WmLk.js.map +1 -0
  191. package/dist/core/web/public/next/assets/VerseConsoleApp-CXJWDiEM.css +1 -0
  192. package/dist/core/web/public/next/assets/VerseConsoleApp-Dq_hREXs.js +3 -0
  193. package/dist/core/web/public/next/assets/VerseConsoleApp-Dq_hREXs.js.map +1 -0
  194. package/dist/core/web/public/next/assets/Workspace-BYW9dm90.css +1 -0
  195. package/dist/core/web/public/next/assets/Workspace-CKvVEPFq.js +10 -0
  196. package/dist/core/web/public/next/assets/Workspace-CKvVEPFq.js.map +1 -0
  197. package/dist/core/web/public/next/assets/actions-BnjZy8a-.js +2 -0
  198. package/dist/core/web/public/next/assets/actions-BnjZy8a-.js.map +1 -0
  199. package/dist/core/web/public/next/assets/actions-Ddfg2iLl.css +1 -0
  200. package/dist/core/web/public/next/assets/{budget-queries-Dacv1VYP.js → budget-queries-Cp6vO7FH.js} +2 -2
  201. package/dist/core/web/public/next/assets/{budget-queries-Dacv1VYP.js.map → budget-queries-Cp6vO7FH.js.map} +1 -1
  202. package/dist/core/web/public/next/assets/calendar-day-BxBYHfX1.js +2 -0
  203. package/dist/core/web/public/next/assets/calendar-day-BxBYHfX1.js.map +1 -0
  204. package/dist/core/web/public/next/assets/capacity-strip-model-9-Yb211u.js +2 -0
  205. package/dist/core/web/public/next/assets/capacity-strip-model-9-Yb211u.js.map +1 -0
  206. package/dist/core/web/public/next/assets/charts-BmbKhjqw.js +2 -0
  207. package/dist/core/web/public/next/assets/charts-BmbKhjqw.js.map +1 -0
  208. package/dist/core/web/public/next/assets/colors-BZ3a9wFf.js +2 -0
  209. package/dist/core/web/public/next/assets/colors-BZ3a9wFf.js.map +1 -0
  210. package/dist/core/web/public/next/assets/{command-bus-CpYuam1F.js → command-bus-DHJJLWh8.js} +2 -2
  211. package/dist/core/web/public/next/assets/{command-bus-CpYuam1F.js.map → command-bus-DHJJLWh8.js.map} +1 -1
  212. package/dist/core/web/public/next/assets/context-model-BGznyHNQ.js +2 -0
  213. package/dist/core/web/public/next/assets/context-model-BGznyHNQ.js.map +1 -0
  214. package/dist/core/web/public/next/assets/context-model-DeJ28uSZ.js +2 -0
  215. package/dist/core/web/public/next/assets/context-model-DeJ28uSZ.js.map +1 -0
  216. package/dist/core/web/public/next/assets/context-queries-_mEgy4eg.js +2 -0
  217. package/dist/core/web/public/next/assets/context-queries-_mEgy4eg.js.map +1 -0
  218. package/dist/core/web/public/next/assets/context.module-BijAfoJw.js +2 -0
  219. package/dist/core/web/public/next/assets/context.module-BijAfoJw.js.map +1 -0
  220. package/dist/core/web/public/next/assets/{control-queries-BGjarMm9.js → control-queries-C4TG8blN.js} +2 -2
  221. package/dist/core/web/public/next/assets/{control-queries-BGjarMm9.js.map → control-queries-C4TG8blN.js.map} +1 -1
  222. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js +2 -0
  223. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js.map +1 -0
  224. package/dist/core/web/public/next/assets/dock-icons-BB7Fi6hT.js +2 -0
  225. package/dist/core/web/public/next/assets/dock-icons-BB7Fi6hT.js.map +1 -0
  226. package/dist/core/web/public/next/assets/dock-panes-mnIwSpRp.js +2 -0
  227. package/dist/core/web/public/next/assets/{dock-panes-BNTLvX7G.js.map → dock-panes-mnIwSpRp.js.map} +1 -1
  228. package/dist/core/web/public/next/assets/{dock-store-_E5h6TEq.js → dock-store-CdHQRP8s.js} +2 -2
  229. package/dist/core/web/public/next/assets/{dock-store-_E5h6TEq.js.map → dock-store-CdHQRP8s.js.map} +1 -1
  230. package/dist/core/web/public/next/assets/fleet-model-B4FKC7fH.js +2 -0
  231. package/dist/core/web/public/next/assets/fleet-model-B4FKC7fH.js.map +1 -0
  232. package/dist/core/web/public/next/assets/format-DKrNjdwD.js +2 -0
  233. package/dist/core/web/public/next/assets/format-DKrNjdwD.js.map +1 -0
  234. package/dist/core/web/public/next/assets/format-lW58rL2y.js +2 -0
  235. package/dist/core/web/public/next/assets/format-lW58rL2y.js.map +1 -0
  236. package/dist/core/web/public/next/assets/{git-model-5v5xGobf.js → git-model-DaGw1SzS.js} +2 -2
  237. package/dist/core/web/public/next/assets/{git-model-5v5xGobf.js.map → git-model-DaGw1SzS.js.map} +1 -1
  238. package/dist/core/web/public/next/assets/global-DG1fmn4y.js +2 -0
  239. package/dist/core/web/public/next/assets/global-DG1fmn4y.js.map +1 -0
  240. package/dist/core/web/public/next/assets/{guarded-action-vOPc8v75.js → guarded-action--lguLXfz.js} +2 -2
  241. package/dist/core/web/public/next/assets/{guarded-action-vOPc8v75.js.map → guarded-action--lguLXfz.js.map} +1 -1
  242. package/dist/core/web/public/next/assets/{icons-DWb24OA6.js → icons-YPgbel-I.js} +2 -2
  243. package/dist/core/web/public/next/assets/{icons-DWb24OA6.js.map → icons-YPgbel-I.js.map} +1 -1
  244. package/dist/core/web/public/next/assets/{index-afDA8cwW.js → index-Dk8R-3a7.js} +3 -3
  245. package/dist/core/web/public/next/assets/{index-afDA8cwW.js.map → index-Dk8R-3a7.js.map} +1 -1
  246. package/dist/core/web/public/next/assets/live-model-44wEU6I8.js +2 -0
  247. package/dist/core/web/public/next/assets/live-model-44wEU6I8.js.map +1 -0
  248. package/dist/core/web/public/next/assets/mind-B9PzLcl0.css +1 -0
  249. package/dist/core/web/public/next/assets/mind.module-BOABBdi_.js +2 -0
  250. package/dist/core/web/public/next/assets/mind.module-BOABBdi_.js.map +1 -0
  251. package/dist/core/web/public/next/assets/mutations-DjXM3IDg.js +2 -0
  252. package/dist/core/web/public/next/assets/{mutations-C6E10SPX.js.map → mutations-DjXM3IDg.js.map} +1 -1
  253. package/dist/core/web/public/next/assets/{overnight-queries-CCGfiS-g.js → overnight-queries-Be_eossf.js} +2 -2
  254. package/dist/core/web/public/next/assets/{overnight-queries-CCGfiS-g.js.map → overnight-queries-Be_eossf.js.map} +1 -1
  255. package/dist/core/web/public/next/assets/pane-chrome-8JmEhHVD.css +1 -0
  256. package/dist/core/web/public/next/assets/pane-chrome.module-D7o-fVd0.js +2 -0
  257. package/dist/core/web/public/next/assets/pane-chrome.module-D7o-fVd0.js.map +1 -0
  258. package/dist/core/web/public/next/assets/primitives-Dl3SEQvh.js +1 -0
  259. package/dist/core/web/public/next/assets/{queries-BuYIEHst.js → queries-CYEVCq5r.js} +2 -2
  260. package/dist/core/web/public/next/assets/{queries-BuYIEHst.js.map → queries-CYEVCq5r.js.map} +1 -1
  261. package/dist/core/web/public/next/assets/{reasoning-pref-BVzGczV7.js → reasoning-pref-a_ZP6GzU.js} +2 -2
  262. package/dist/core/web/public/next/assets/{reasoning-pref-BVzGczV7.js.map → reasoning-pref-a_ZP6GzU.js.map} +1 -1
  263. package/dist/core/web/public/next/assets/seat-subscription-CRigL-GE.js +2 -0
  264. package/dist/core/web/public/next/assets/seat-subscription-CRigL-GE.js.map +1 -0
  265. package/dist/core/web/public/next/assets/{section-visibility-CSrsTcwK.js → section-visibility-u7q-Q9AA.js} +2 -2
  266. package/dist/core/web/public/next/assets/{section-visibility-CSrsTcwK.js.map → section-visibility-u7q-Q9AA.js.map} +1 -1
  267. package/dist/core/web/public/next/assets/{sidebar-model-C8fyqSQY.js → sidebar-model-i4WRuQ6j.js} +2 -2
  268. package/dist/core/web/public/next/assets/{sidebar-model-C8fyqSQY.js.map → sidebar-model-i4WRuQ6j.js.map} +1 -1
  269. package/dist/core/web/public/next/assets/slots-CV9ZuLQU.js +3 -0
  270. package/dist/core/web/public/next/assets/{slots-W8gkmdfE.js.map → slots-CV9ZuLQU.js.map} +1 -1
  271. package/dist/core/web/public/next/assets/surface-data-DLvmUX9z.js +2 -0
  272. package/dist/core/web/public/next/assets/surface-data-DLvmUX9z.js.map +1 -0
  273. package/dist/core/web/public/next/assets/surface-prefetch-Ct2JwXvL.js +2 -0
  274. package/dist/core/web/public/next/assets/surface-prefetch-Ct2JwXvL.js.map +1 -0
  275. package/dist/core/web/public/next/assets/tasks-model-DWs5u9RO.js +2 -0
  276. package/dist/core/web/public/next/assets/{tasks-model-CnYQzgxk.js.map → tasks-model-DWs5u9RO.js.map} +1 -1
  277. package/dist/core/web/public/next/assets/{terminal-icons-CxUYaWX9.js → terminal-icons-Ct9cZsEK.js} +2 -2
  278. package/dist/core/web/public/next/assets/{terminal-icons-CxUYaWX9.js.map → terminal-icons-Ct9cZsEK.js.map} +1 -1
  279. package/dist/core/web/public/next/assets/{tool-semantics-CTRuLF5j.js → tool-semantics-GX8ScuSH.js} +2 -2
  280. package/dist/core/web/public/next/assets/{tool-semantics-CTRuLF5j.js.map → tool-semantics-GX8ScuSH.js.map} +1 -1
  281. package/dist/core/web/public/next/assets/{turn-files-BvB5LLNw.js → turn-files-BPHQzYuH.js} +2 -2
  282. package/dist/core/web/public/next/assets/{turn-files-BvB5LLNw.js.map → turn-files-BPHQzYuH.js.map} +1 -1
  283. package/dist/core/web/public/next/assets/{usage-queries-CQOpeE1H.js → usage-queries-CI_y9oWZ.js} +2 -2
  284. package/dist/core/web/public/next/assets/{usage-queries-CQOpeE1H.js.map → usage-queries-CI_y9oWZ.js.map} +1 -1
  285. package/dist/core/web/public/next/assets/use-guarded-action-DVCtLzSo.js +2 -0
  286. package/dist/core/web/public/next/assets/use-guarded-action-DVCtLzSo.js.map +1 -0
  287. package/dist/core/web/public/next/assets/{use-ticker-hryPXnyp.js → use-ticker-C3LQ2IYs.js} +2 -2
  288. package/dist/core/web/public/next/assets/{use-ticker-hryPXnyp.js.map → use-ticker-C3LQ2IYs.js.map} +1 -1
  289. package/dist/core/web/public/next/assets/use-token-gate-B5gOFkeH.js +2 -0
  290. package/dist/core/web/public/next/assets/use-token-gate-B5gOFkeH.js.map +1 -0
  291. package/dist/core/web/public/next/assets/{useActivity-Cg_9-7nt.js → useActivity-C3R1Sudh.js} +2 -2
  292. package/dist/core/web/public/next/assets/{useActivity-Cg_9-7nt.js.map → useActivity-C3R1Sudh.js.map} +1 -1
  293. package/dist/core/web/public/next/assets/useChartWidth-0APW0BR3.js +2 -0
  294. package/dist/core/web/public/next/assets/useChartWidth-0APW0BR3.js.map +1 -0
  295. package/dist/core/web/public/next/assets/useChartWidth-BAtVgn2n.css +1 -0
  296. package/dist/core/web/public/next/assets/{useSeatsRefresh-4Ov9eT1F.js → useSeatsRefresh-BN8bso-n.js} +2 -2
  297. package/dist/core/web/public/next/assets/{useSeatsRefresh-4Ov9eT1F.js.map → useSeatsRefresh-BN8bso-n.js.map} +1 -1
  298. package/dist/core/web/public/next/assets/verse-model-yHPwjf-7.js +2 -0
  299. package/dist/core/web/public/next/assets/verse-model-yHPwjf-7.js.map +1 -0
  300. package/dist/core/web/public/next/assets/{verse-queries-BjQoOTwv.js → verse-queries-2PxoBISm.js} +2 -2
  301. package/dist/core/web/public/next/assets/{verse-queries-BjQoOTwv.js.map → verse-queries-2PxoBISm.js.map} +1 -1
  302. package/dist/core/web/public/next/assets/verse-store-DHTuZpYa.js +3 -0
  303. package/dist/core/web/public/next/assets/verse-store-DHTuZpYa.js.map +1 -0
  304. package/dist/core/web/public/next/assets/verse-ui-store-Dy4HuDBV.js +3 -0
  305. package/dist/core/web/public/next/assets/{verse-ui-store-KTTKfv-T.js.map → verse-ui-store-Dy4HuDBV.js.map} +1 -1
  306. package/dist/core/web/public/next/assets/{viewport-ZB86jdES.js → viewport-DDoJ_xVq.js} +2 -2
  307. package/dist/core/web/public/next/assets/{viewport-ZB86jdES.js.map → viewport-DDoJ_xVq.js.map} +1 -1
  308. package/dist/core/web/public/next/assets/warmup-BsL2LdR-.js +3 -0
  309. package/dist/core/web/public/next/assets/warmup-BsL2LdR-.js.map +1 -0
  310. package/dist/core/web/public/next/assets/{workspace-model-4hq_Mv3N.js → workspace-model-Dd3LmIym.js} +2 -2
  311. package/dist/core/web/public/next/assets/{workspace-model-4hq_Mv3N.js.map → workspace-model-Dd3LmIym.js.map} +1 -1
  312. package/dist/core/web/public/next/index.html +1 -1
  313. package/dist/release-dependency-inventory.json +1 -1
  314. package/package.json +1 -1
  315. package/dist/core/web/public/next/assets/Advanced-CHjxJt2z.css +0 -1
  316. package/dist/core/web/public/next/assets/Advanced-DM0DYibH.js +0 -2
  317. package/dist/core/web/public/next/assets/Advanced-DM0DYibH.js.map +0 -1
  318. package/dist/core/web/public/next/assets/AppsSection-CXxbfPJQ.js +0 -2
  319. package/dist/core/web/public/next/assets/AppsSection-CXxbfPJQ.js.map +0 -1
  320. package/dist/core/web/public/next/assets/AreaTrend-gUVXkfhf.js +0 -2
  321. package/dist/core/web/public/next/assets/AreaTrend-gUVXkfhf.js.map +0 -1
  322. package/dist/core/web/public/next/assets/AutonomySection-CoMngwNB.js +0 -2
  323. package/dist/core/web/public/next/assets/BranchBar-C-NovaXr.js +0 -2
  324. package/dist/core/web/public/next/assets/BranchBar-C-NovaXr.js.map +0 -1
  325. package/dist/core/web/public/next/assets/BranchBar-C9BpPVLr.css +0 -1
  326. package/dist/core/web/public/next/assets/BudgetControl-P5lMxHvQ.js +0 -2
  327. package/dist/core/web/public/next/assets/BudgetControl-P5lMxHvQ.js.map +0 -1
  328. package/dist/core/web/public/next/assets/BurnDown-4P1LDoCL.js +0 -2
  329. package/dist/core/web/public/next/assets/BurnDown-4P1LDoCL.js.map +0 -1
  330. package/dist/core/web/public/next/assets/CapacityStrip-D6Yyg4a1.js +0 -2
  331. package/dist/core/web/public/next/assets/CapacityStrip-D6Yyg4a1.js.map +0 -1
  332. package/dist/core/web/public/next/assets/CapacityStrip-wgFP9MUA.css +0 -1
  333. package/dist/core/web/public/next/assets/ChatSection-B9cdRKUh.js +0 -3
  334. package/dist/core/web/public/next/assets/CommandSection-BC0uXim_.js +0 -2
  335. package/dist/core/web/public/next/assets/CommandSection-BC0uXim_.js.map +0 -1
  336. package/dist/core/web/public/next/assets/Composer-CkcwbQhG.css +0 -1
  337. package/dist/core/web/public/next/assets/Composer.module-DJMdrqNt.js +0 -2
  338. package/dist/core/web/public/next/assets/DiffPane-5uLKa0au.js +0 -2
  339. package/dist/core/web/public/next/assets/DiffPane-5uLKa0au.js.map +0 -1
  340. package/dist/core/web/public/next/assets/DiffPane-Csboxnn0.css +0 -1
  341. package/dist/core/web/public/next/assets/DockHost-BGnTgdIb.css +0 -1
  342. package/dist/core/web/public/next/assets/DockHost-CBV_6Ehi.js +0 -2
  343. package/dist/core/web/public/next/assets/DockHost-CBV_6Ehi.js.map +0 -1
  344. package/dist/core/web/public/next/assets/FleetSection-DuJcQCGg.js +0 -3
  345. package/dist/core/web/public/next/assets/FleetSection-DuJcQCGg.js.map +0 -1
  346. package/dist/core/web/public/next/assets/FleetSection-w9AjqfTR.css +0 -1
  347. package/dist/core/web/public/next/assets/Funnel-qX3Hlbce.js +0 -2
  348. package/dist/core/web/public/next/assets/Funnel-qX3Hlbce.js.map +0 -1
  349. package/dist/core/web/public/next/assets/GearTray-kVGP1coG.js +0 -2
  350. package/dist/core/web/public/next/assets/GearTray-kVGP1coG.js.map +0 -1
  351. package/dist/core/web/public/next/assets/GrowthSection-CYxJ9MH5.js +0 -2
  352. package/dist/core/web/public/next/assets/GrowthSection-CYxJ9MH5.js.map +0 -1
  353. package/dist/core/web/public/next/assets/HandoffDialog-DHZo3Ev0.js +0 -2
  354. package/dist/core/web/public/next/assets/HandoffDialog-DHZo3Ev0.js.map +0 -1
  355. package/dist/core/web/public/next/assets/MatrixHeatmap-B_JWCjZx.js +0 -2
  356. package/dist/core/web/public/next/assets/MatrixHeatmap-B_JWCjZx.js.map +0 -1
  357. package/dist/core/web/public/next/assets/McpSection-1UncWBpW.js +0 -2
  358. package/dist/core/web/public/next/assets/MessageMarkdown-C4pl9LI5.js +0 -3
  359. package/dist/core/web/public/next/assets/MessageMarkdown-Czcl3L_Q.css +0 -1
  360. package/dist/core/web/public/next/assets/MindSection-C3fCw_fD.js +0 -2
  361. package/dist/core/web/public/next/assets/MindSection-C3fCw_fD.js.map +0 -1
  362. package/dist/core/web/public/next/assets/MutationTokenDialog-Dn0tzCrh.js +0 -2
  363. package/dist/core/web/public/next/assets/MutationTokenDialog-Dn0tzCrh.js.map +0 -1
  364. package/dist/core/web/public/next/assets/NeedsYouDrawer-CuNYJCJ0.js +0 -2
  365. package/dist/core/web/public/next/assets/NeedsYouDrawer-CuNYJCJ0.js.map +0 -1
  366. package/dist/core/web/public/next/assets/NeedsYouDrawer-SkhvvdLb.css +0 -1
  367. package/dist/core/web/public/next/assets/NewChatDialog-B_BsS9pr.js +0 -3
  368. package/dist/core/web/public/next/assets/OnboardingFlow-CtCPpgoX.js +0 -2
  369. package/dist/core/web/public/next/assets/PreviewPane-Cx6RRwzM.js +0 -2
  370. package/dist/core/web/public/next/assets/PreviewPane-Cx6RRwzM.js.map +0 -1
  371. package/dist/core/web/public/next/assets/PreviewPane-WQJFjSXe.css +0 -1
  372. package/dist/core/web/public/next/assets/RailStatus-BWs6xevj.js +0 -2
  373. package/dist/core/web/public/next/assets/RailStatus-BWs6xevj.js.map +0 -1
  374. package/dist/core/web/public/next/assets/SeatSelector-DaUO-zoK.js +0 -3
  375. package/dist/core/web/public/next/assets/SessionSearch-B5aQ0BCM.js +0 -2
  376. package/dist/core/web/public/next/assets/SettingsSection-CuESA30a.js +0 -2
  377. package/dist/core/web/public/next/assets/SettingsSection-CuESA30a.js.map +0 -1
  378. package/dist/core/web/public/next/assets/Sidebar-DfD8MNZt.css +0 -1
  379. package/dist/core/web/public/next/assets/Sidebar-q11dtYZf.js +0 -3
  380. package/dist/core/web/public/next/assets/Sidebar-q11dtYZf.js.map +0 -1
  381. package/dist/core/web/public/next/assets/StepBand-B1W7rU70.js +0 -2
  382. package/dist/core/web/public/next/assets/StepBand-B1W7rU70.js.map +0 -1
  383. package/dist/core/web/public/next/assets/Swimlane-BR40WVcj.js +0 -2
  384. package/dist/core/web/public/next/assets/Swimlane-BR40WVcj.js.map +0 -1
  385. package/dist/core/web/public/next/assets/TerminalPane-CPKUTD9K.js +0 -7
  386. package/dist/core/web/public/next/assets/TerminalPane-CPKUTD9K.js.map +0 -1
  387. package/dist/core/web/public/next/assets/TerminalPane-CmE2QL-Q.css +0 -1
  388. package/dist/core/web/public/next/assets/UniverseConsoleApp-DKqAf-eD.js +0 -2
  389. package/dist/core/web/public/next/assets/UsageSection-B6fR3cru.js +0 -2
  390. package/dist/core/web/public/next/assets/UsageSection-B6fR3cru.js.map +0 -1
  391. package/dist/core/web/public/next/assets/UsageSection-DwgNOYvi.css +0 -1
  392. package/dist/core/web/public/next/assets/VerseConsoleApp-C0V221WL.css +0 -1
  393. package/dist/core/web/public/next/assets/VerseConsoleApp-bjARLPwN.js +0 -3
  394. package/dist/core/web/public/next/assets/VerseConsoleApp-bjARLPwN.js.map +0 -1
  395. package/dist/core/web/public/next/assets/Workspace-DQXMVDf7.css +0 -1
  396. package/dist/core/web/public/next/assets/Workspace-DtJb5tiM.js +0 -10
  397. package/dist/core/web/public/next/assets/Workspace-DtJb5tiM.js.map +0 -1
  398. package/dist/core/web/public/next/assets/actions-Bszsdpms.js +0 -2
  399. package/dist/core/web/public/next/assets/actions-Bszsdpms.js.map +0 -1
  400. package/dist/core/web/public/next/assets/actions-Dug8YIf0.css +0 -1
  401. package/dist/core/web/public/next/assets/capacity-strip-model-BR539Ci8.js +0 -2
  402. package/dist/core/web/public/next/assets/capacity-strip-model-BR539Ci8.js.map +0 -1
  403. package/dist/core/web/public/next/assets/charts-D4NaLaXA.js +0 -2
  404. package/dist/core/web/public/next/assets/charts-D4NaLaXA.js.map +0 -1
  405. package/dist/core/web/public/next/assets/colors-B-vHsX1S.js +0 -2
  406. package/dist/core/web/public/next/assets/colors-B-vHsX1S.js.map +0 -1
  407. package/dist/core/web/public/next/assets/context-model-Bto3LZn2.js +0 -2
  408. package/dist/core/web/public/next/assets/context-model-Bto3LZn2.js.map +0 -1
  409. package/dist/core/web/public/next/assets/context-queries-DVdSLrYy.js +0 -2
  410. package/dist/core/web/public/next/assets/context-queries-DVdSLrYy.js.map +0 -1
  411. package/dist/core/web/public/next/assets/context.module-B_k02HNU.js +0 -2
  412. package/dist/core/web/public/next/assets/context.module-B_k02HNU.js.map +0 -1
  413. package/dist/core/web/public/next/assets/dock-icons-oG8d7mNZ.js +0 -2
  414. package/dist/core/web/public/next/assets/dock-icons-oG8d7mNZ.js.map +0 -1
  415. package/dist/core/web/public/next/assets/dock-panes-BNTLvX7G.js +0 -2
  416. package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js +0 -2
  417. package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js.map +0 -1
  418. package/dist/core/web/public/next/assets/format-BNYWGJat.js +0 -2
  419. package/dist/core/web/public/next/assets/format-BNYWGJat.js.map +0 -1
  420. package/dist/core/web/public/next/assets/global-DVgMguLr.js +0 -2
  421. package/dist/core/web/public/next/assets/global-DVgMguLr.js.map +0 -1
  422. package/dist/core/web/public/next/assets/live-model-Dm6ITHvX.js +0 -2
  423. package/dist/core/web/public/next/assets/live-model-Dm6ITHvX.js.map +0 -1
  424. package/dist/core/web/public/next/assets/mind-B-lYfSUJ.css +0 -1
  425. package/dist/core/web/public/next/assets/mind.module-BzhAlg3e.js +0 -2
  426. package/dist/core/web/public/next/assets/mind.module-BzhAlg3e.js.map +0 -1
  427. package/dist/core/web/public/next/assets/mutations-C6E10SPX.js +0 -2
  428. package/dist/core/web/public/next/assets/primitives-DQvYikjm.js +0 -1
  429. package/dist/core/web/public/next/assets/seat-subscription-CrWOV4Qc.js +0 -2
  430. package/dist/core/web/public/next/assets/seat-subscription-CrWOV4Qc.js.map +0 -1
  431. package/dist/core/web/public/next/assets/slots-W8gkmdfE.js +0 -3
  432. package/dist/core/web/public/next/assets/surface-data-ZtCegYMQ.js +0 -2
  433. package/dist/core/web/public/next/assets/surface-data-ZtCegYMQ.js.map +0 -1
  434. package/dist/core/web/public/next/assets/tasks-model-CnYQzgxk.js +0 -2
  435. package/dist/core/web/public/next/assets/types-Dypu22dp.js +0 -3
  436. package/dist/core/web/public/next/assets/types-Dypu22dp.js.map +0 -1
  437. package/dist/core/web/public/next/assets/use-guarded-action-CO_aAsed.js +0 -2
  438. package/dist/core/web/public/next/assets/use-guarded-action-CO_aAsed.js.map +0 -1
  439. package/dist/core/web/public/next/assets/use-token-gate-DYA2-ALC.js +0 -2
  440. package/dist/core/web/public/next/assets/use-token-gate-DYA2-ALC.js.map +0 -1
  441. package/dist/core/web/public/next/assets/useChartWidth-B8E5mJgM.css +0 -1
  442. package/dist/core/web/public/next/assets/useChartWidth-MEXvDxDL.js +0 -2
  443. package/dist/core/web/public/next/assets/useChartWidth-MEXvDxDL.js.map +0 -1
  444. package/dist/core/web/public/next/assets/verse-model-E98kXngO.js +0 -2
  445. package/dist/core/web/public/next/assets/verse-model-E98kXngO.js.map +0 -1
  446. package/dist/core/web/public/next/assets/verse-store-BgKx_YGs.js +0 -2
  447. package/dist/core/web/public/next/assets/verse-store-BgKx_YGs.js.map +0 -1
  448. package/dist/core/web/public/next/assets/verse-ui-store-KTTKfv-T.js +0 -3
@@ -1 +0,0 @@
1
- ._width_jrygt_4{width:min(620px,100vw - 32px)}._form_jrygt_6{gap:var(--space-4);display:grid}._field_jrygt_7{gap:var(--space-1);min-width:0;display:grid}._label_jrygt_8{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary)}._select_jrygt_17,._input_jrygt_18{width:100%;min-height:var(--control-h);padding:0 var(--space-2);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-input);color:var(--text-primary);font-size:var(--text-sm-size);text-overflow:ellipsis;transition:border-color var(--duration-fast) var(--ease-standard), box-shadow var(--duration-fast) var(--ease-standard)}._input_jrygt_18::placeholder{color:var(--text-tertiary)}._select_jrygt_17:hover:not(:disabled),._input_jrygt_18:hover:not(:disabled){border-color:var(--border-strong)}._select_jrygt_17:focus-visible,._input_jrygt_18:focus-visible{border-color:var(--border-focus);box-shadow:var(--shadow-focus-ring)}._hint_jrygt_36{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary)}._error_jrygt_37{padding-left:var(--space-3);border-left:2px solid var(--status-danger-solid);color:var(--status-danger-fg);font-size:var(--text-sm-size);line-height:var(--text-sm-line)}._rootRow_jrygt_47{gap:var(--space-2);margin-top:var(--space-2);flex-wrap:wrap;align-items:center;display:flex}._rootRow_jrygt_47 ._input_jrygt_18{flex:220px;min-width:0}._rowButton_jrygt_56,._addRoot_jrygt_57{min-height:var(--control-h-sm);padding:var(--space-1) var(--space-2);border:1px solid var(--border-subtle);border-radius:var(--radius-sm);background:var(--surface-raised);color:var(--text-secondary);font-size:var(--text-xs-size);cursor:pointer;transition:border-color var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);flex:none}._rowButton_jrygt_56:hover:not(:disabled),._addRoot_jrygt_57:hover{border-color:var(--border-strong);color:var(--text-primary)}._rowButton_jrygt_56:disabled{opacity:.4;cursor:not-allowed}._addRoot_jrygt_57{margin-top:var(--space-2);justify-self:start}._checkbox_jrygt_74{align-items:center;gap:var(--space-2);font-size:var(--text-sm-size);color:var(--text-secondary);display:flex}._priorityRow_jrygt_82{gap:var(--space-2);margin-top:var(--space-2);align-items:center;display:flex}._priorityPath_jrygt_88{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--text-xs-size);color:var(--text-tertiary);flex:auto;overflow:hidden}._priorityRow_jrygt_82 ._select_jrygt_17{flex:none;width:auto;min-width:120px}._actions_jrygt_99{align-items:center;gap:var(--space-2);flex-wrap:wrap;display:flex}._spacer_jrygt_100{flex:auto}._confirm_jrygt_101{font-size:var(--text-xs-size);color:var(--text-secondary)}._cancel_jrygt_103,._save_jrygt_104,._remove_jrygt_105,._danger_jrygt_106{min-height:var(--control-h);padding:0 var(--space-4);border-radius:var(--radius-sm);font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);transition:background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);border:1px solid #0000}._cancel_jrygt_103,._remove_jrygt_105{color:var(--text-secondary)}._cancel_jrygt_103:hover,._remove_jrygt_105:hover{background:var(--bg-hover);color:var(--text-primary)}._danger_jrygt_106{color:var(--status-danger-fg);border-color:var(--status-danger-solid)}._danger_jrygt_106:hover:not(:disabled){background:var(--bg-hover)}._save_jrygt_104{background:var(--accent-600);color:var(--accent-contrast)}._save_jrygt_104:hover:not(:disabled){background:var(--accent-700)}._save_jrygt_104:disabled,._danger_jrygt_106:disabled,._remove_jrygt_105:disabled{opacity:.4;cursor:not-allowed}._projects_izay2_4{padding:var(--space-3) 0 var(--space-2);border-bottom:1px solid var(--border-subtle);flex-shrink:0}._head_izay2_10{font-family:var(--font-display);align-items:center;gap:var(--space-2);padding:0 var(--space-2) var(--space-1) var(--space-3);font-size:var(--text-2xs-size,11px);line-height:1.4;font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary);display:flex}._headText_izay2_23{flex:auto;min-width:0}._add_izay2_25{width:var(--control-h-xs,20px);height:var(--control-h-xs,20px);border-radius:var(--radius-sm);color:var(--text-tertiary);transition:color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard);flex:none;justify-content:center;align-items:center;display:flex}._add_izay2_25:hover{color:var(--text-primary);background:var(--bg-hover)}._add_izay2_25:active{background:var(--bg-active)}._list_izay2_39{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}._project_izay2_4{align-items:baseline;gap:var(--space-2);width:100%;min-height:var(--density-row,32px);padding:0 var(--space-3);color:var(--text-secondary);text-align:left;transition:background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);display:flex}._project_izay2_4:hover{background:var(--bg-hover);color:var(--text-primary)}._project_izay2_4:active{background:var(--bg-active)}._name_izay2_55{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--text-sm-size);line-height:var(--text-sm-line);flex:auto;overflow:hidden}._summary_izay2_64{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);color:var(--text-tertiary);flex:none}._project_izay2_4:hover ._summary_izay2_64{color:var(--text-secondary)}._empty_izay2_72{padding:var(--space-1) var(--space-3) var(--space-1);color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:var(--text-xs-line)}._sidebar_1vjkz_1{background:var(--bg-canvas);flex-direction:column;min-height:0;display:flex}._head_1vjkz_9{align-items:center;gap:var(--space-1);height:var(--strip-height);padding:0 var(--space-2) 0 var(--space-3);border-bottom:1px solid var(--border-subtle);height:calc(var(--strip-height) + var(--app-titlebar-height,0px));padding-top:var(--app-titlebar-height,0px);flex-shrink:0;display:flex;position:relative}._headDragStrip_1vjkz_40{height:var(--app-titlebar-height,0px);-webkit-app-region:drag;app-region:drag;pointer-events:auto;position:absolute;top:0;left:0;right:0}._search_1vjkz_51{flex:1;align-items:center;min-width:0;display:flex;position:relative}._searchIcon_1vjkz_58{color:var(--text-tertiary);pointer-events:none;display:flex;position:absolute;left:0}._search_1vjkz_51 input{width:100%;height:var(--control-h-sm);padding:0 var(--space-2) 0 22px;color:var(--text-primary);font-size:var(--text-sm-size);background:0 0;border:0}._search_1vjkz_51 input::placeholder{color:var(--text-tertiary)}._search_1vjkz_51 input::-webkit-search-cancel-button{appearance:none}._search_1vjkz_51:focus-within ._searchIcon_1vjkz_58{color:var(--accent-500)}._iconButton_1vjkz_80{width:var(--control-h-sm);height:var(--control-h-sm);border-radius:var(--radius-sm);color:var(--text-tertiary);transition:color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard);flex-shrink:0;justify-content:center;align-items:center;display:flex}._iconButton_1vjkz_80:hover:not(:disabled){color:var(--text-primary);background:var(--bg-hover)}._iconButton_1vjkz_80:active:not(:disabled){background:var(--bg-active)}._iconButton_1vjkz_80:disabled{color:var(--text-disabled);cursor:not-allowed}._scroll_1vjkz_98{min-height:0;padding-bottom:var(--space-4);scrollbar-gutter:stable;flex:1;overflow-y:auto}._skeleton_1vjkz_105{gap:var(--space-3);padding:var(--space-4) var(--space-3);flex-direction:column;display:flex}._error_1vjkz_106{gap:var(--space-2);padding:var(--space-4) var(--space-3);color:var(--status-danger-fg);font-size:var(--text-sm-size);justify-items:start;display:grid}._error_1vjkz_106 button{min-height:var(--control-h-sm);padding:0 var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--text-primary);font-size:var(--text-xs-size);transition:background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard)}._error_1vjkz_106 button:hover{background:var(--bg-hover);border-color:var(--border-strong)}._error_1vjkz_106 button:active{background:var(--bg-active)}._empty_1vjkz_125{padding:var(--space-8) var(--space-4);color:var(--text-tertiary);font-size:var(--text-sm-size);line-height:var(--text-sm-line)}._emptyTitle_1vjkz_131{color:var(--text-secondary);font-weight:var(--font-weight-medium);margin-bottom:var(--space-1)}._emptyCompact_1vjkz_135{padding:var(--space-4) var(--space-3) 0}._emptyAction_1vjkz_138{align-items:center;gap:var(--space-2);min-height:var(--control-h-sm);margin-top:var(--space-3);padding:0 var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--text-primary);font-size:var(--text-xs-size);transition:background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard);display:inline-flex}._emptyAction_1vjkz_138:hover{background:var(--bg-hover);border-color:var(--border-strong)}._emptyAction_1vjkz_138:active{background:var(--bg-active)}._emptyKey_1vjkz_153{padding:0 var(--space-1);border:1px solid var(--border-default);border-radius:var(--radius-xs);background:var(--bg-hover);color:var(--text-secondary);font-family:var(--font-display);font-size:var(--text-2xs-size,11px)}._group_1vjkz_163{padding-top:var(--space-4)}._groupTitle_1vjkz_164{font-family:var(--font-display);align-items:baseline;gap:var(--space-2);padding:0 var(--space-3) var(--space-1);font-size:var(--text-2xs-size,11px);line-height:1.4;font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary);display:flex}._groupName_1vjkz_177{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._enrolled_1vjkz_178{color:var(--text-tertiary);opacity:.7;font-weight:var(--font-weight-regular);flex-shrink:0}._groupCount_1vjkz_182{font-variant-numeric:tabular-nums;letter-spacing:0;color:var(--text-tertiary);font-weight:var(--font-weight-regular);flex-shrink:0;margin-left:auto}._list_1vjkz_191{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}._list_1vjkz_191>li{min-width:0;display:block}._list_1vjkz_191>li>span:not([role=tooltip]),._list_1vjkz_191>li>span>span:not([role=tooltip]){width:100%;min-width:0;display:block}._session_1vjkz_194{align-items:center;gap:var(--space-2);width:100%;min-height:var(--density-row,32px);padding:0 var(--space-3) 0 var(--space-3);color:var(--text-secondary);text-align:left;transition:background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);grid-template-columns:2px minmax(0,1fr) auto auto;display:grid;position:relative}._session_1vjkz_194:hover{background:var(--bg-hover);color:var(--text-primary)}._session_1vjkz_194:active{background:var(--bg-active)}._session_1vjkz_194[aria-current]{background:var(--bg-selected);color:var(--text-primary);font-weight:var(--font-weight-medium)}._session_1vjkz_194[aria-current]:before{content:"";background:var(--accent-500);width:2px;position:absolute;inset-block:0;inset-inline-start:0}._marker_1vjkz_246{width:2px;height:var(--engine-marker-h);background:var(--verse-engine,var(--text-tertiary));border-radius:1px}._engine-claude_1vjkz_252{--verse-engine:var(--engine-claude,#c96442)}._engine-codex_1vjkz_253{--verse-engine:var(--engine-codex,#10a37f)}._engine-grok_1vjkz_254{--verse-engine:var(--engine-grok,#6b7280)}._engine-local_1vjkz_255{--verse-engine:var(--engine-local,#7c5cff)}._sessionText_1vjkz_194{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm-size);line-height:var(--text-sm-line);overflow:hidden}._running_1vjkz_266{border-radius:var(--radius-full);background:var(--status-running-solid);width:6px;height:6px;animation:1.8s ease-out infinite _verse-pulse_1vjkz_1}._errored_1vjkz_273{border-radius:var(--radius-full);background:var(--status-danger-bg);width:14px;height:14px;color:var(--status-danger-fg);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-bold);justify-content:center;align-items:center;line-height:1;display:flex}._seatSpent_1vjkz_290{width:12px;height:12px;color:var(--status-danger-fg);font-size:var(--text-2xs-size);flex:none;justify-content:center;align-items:center;line-height:1;display:flex}._time_1vjkz_303{text-align:right;min-width:3ch;font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-variant-numeric:tabular-nums;color:var(--text-tertiary);flex-shrink:0}._session_1vjkz_194:hover ._time_1vjkz_303,._session_1vjkz_194[aria-current] ._time_1vjkz_303{color:var(--text-secondary)}._footer_1vjkz_322{height:var(--control-h);padding:0 var(--space-3);border-top:1px solid var(--border-subtle);flex-shrink:0;align-items:center;display:flex}._footerButton_1vjkz_330{min-height:var(--control-h-xs);padding:0 var(--space-2);margin-left:calc(-1 * var(--space-2));border-radius:var(--radius-xs);color:var(--text-tertiary);font-size:var(--text-2xs-size,11px);transition:color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard)}._footerButton_1vjkz_330:hover{color:var(--text-primary);background:var(--bg-hover)}._footerButton_1vjkz_330:active{background:var(--bg-active)}@keyframes _verse-pulse_1vjkz_1{0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--status-running-solid) 55%, transparent)}to{box-shadow:0 0 0 5px #0000}}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._running_1vjkz_266{animation:none}}:root[data-motion=reduce] ._running_1vjkz_266{animation:none}._filters_1vjkz_357{gap:var(--space-1);padding:var(--space-2) var(--space-3) 0;flex-wrap:wrap;flex-shrink:0;display:flex}._filter_1vjkz_357{align-items:center;gap:var(--space-1);min-height:var(--control-h-xs);padding:0 var(--space-2);border:1px solid var(--border-subtle);border-radius:var(--radius-full);color:var(--text-secondary);font-size:var(--text-2xs-size);font-weight:var(--font-weight-medium);white-space:nowrap;transition:background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);background:0 0;display:inline-flex}._filter_1vjkz_357:hover{background:var(--bg-hover);color:var(--text-primary)}._filter_1vjkz_357[aria-checked=true]{border-color:var(--border-strong);background:var(--bg-selected);color:var(--text-primary)}._filter_1vjkz_357:focus-visible{box-shadow:var(--shadow-focus-ring);outline:none}._filterCount_1vjkz_386{font-family:var(--font-display);font-variant-numeric:tabular-nums;color:var(--text-tertiary)}._filter_1vjkz_357[data-filter=running] ._filterCount_1vjkz_386{color:var(--status-running-fg)}._filter_1vjkz_357[data-filter=needs-you] ._filterCount_1vjkz_386{color:var(--status-danger-fg)}._groupToggle_1vjkz_395{align-items:center;gap:var(--space-1);min-width:0;color:inherit;font:inherit;letter-spacing:inherit;text-transform:inherit;cursor:pointer;background:0 0;border:0;padding:0;display:inline-flex}._groupToggle_1vjkz_395:hover{color:var(--text-secondary)}._groupToggle_1vjkz_395:focus-visible{box-shadow:var(--shadow-focus-ring);border-radius:var(--radius-xs);outline:none}._twist_1vjkz_411{width:0;height:0;transition:transform var(--duration-fast) var(--ease-standard);border-top:4px solid #0000;border-bottom:4px solid #0000;border-left:5px solid}._twist_1vjkz_411[data-open]{transform:rotate(90deg)}._list_1vjkz_191[hidden]{display:none}._row_1vjkz_423{min-width:0;position:relative}._row_1vjkz_423>span:not([role=tooltip]),._row_1vjkz_423>span>span:not([role=tooltip]){width:100%;min-width:0;display:block}._sessionBody_1vjkz_426{min-width:0;padding:var(--space-1) 0;flex-direction:column;display:flex}._liveLine_1vjkz_432{text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:var(--text-2xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary);overflow:hidden}._session_1vjkz_194:hover ._liveLine_1vjkz_432,._session_1vjkz_194[aria-current] ._liveLine_1vjkz_432{color:var(--text-secondary)}._statusRunning_1vjkz_444{align-items:center;gap:var(--space-1);display:inline-flex}._elapsed_1vjkz_449{font-family:var(--font-display);font-size:var(--text-2xs-size);font-variant-numeric:tabular-nums;color:var(--status-running-fg)}._unread_1vjkz_455{border-radius:var(--radius-full);background:var(--status-info-solid);width:8px;height:8px;margin:0 3px}._rowMore_1vjkz_464{top:50%;right:var(--space-2);width:var(--control-h-xs);height:var(--control-h-xs);border-radius:var(--radius-xs);background:var(--bg-surface-raised);color:var(--text-secondary);opacity:0;pointer-events:none;transition:opacity var(--duration-fast) var(--ease-standard);border:0;justify-content:center;align-items:center;padding:0;display:flex;position:absolute;transform:translateY(-50%)}._row_1vjkz_423:hover ._rowMore_1vjkz_464,._row_1vjkz_423:focus-within ._rowMore_1vjkz_464{opacity:1;pointer-events:auto}._rowMore_1vjkz_464:hover{color:var(--text-primary);background:var(--bg-active)}@media (hover:none){._rowMore_1vjkz_464{opacity:1;pointer-events:auto;background:0 0}}._renameRow_1vjkz_490{padding:var(--space-1) var(--space-3)}._renameInput_1vjkz_491{width:100%;height:var(--control-h-sm);padding:0 var(--space-2);border:1px solid var(--border-focus);border-radius:var(--radius-sm);background:var(--bg-input);color:var(--text-primary);font-size:var(--text-sm-size)}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._twist_1vjkz_411,:root:not([data-motion=full]) ._rowMore_1vjkz_464{transition:none}}
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SessionSearch-B5aQ0BCM.js","assets/index-afDA8cwW.js","assets/global-DVgMguLr.js","assets/global-_tOCFt9y.css","assets/context-queries-DVdSLrYy.js","assets/verse-queries-BjQoOTwv.js","assets/workbench-types-DzN-5trg.js","assets/verse-store-BgKx_YGs.js","assets/types-Dypu22dp.js","assets/verse-model-E98kXngO.js","assets/use-token-gate-DYA2-ALC.js","assets/context.module-B_k02HNU.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-afDA8cwW.js";import{a as i,m as a}from"./global-DVgMguLr.js";import{n as o}from"./MutationTokenDialog-Dn0tzCrh.js";import{t as s}from"./RefreshIndicator-CnhEovMZ.js";import{T as c,c as l,g as u,h as d,o as f,v as p}from"./verse-queries-BjQoOTwv.js";import{a as m,c as h,u as g,w as _}from"./VerseConsoleApp-bjARLPwN.js";import{_ as v,c as y,h as b}from"./verse-model-E98kXngO.js";import{t as x}from"./seat-subscription-CrWOV4Qc.js";import{_ as S,c as C,f as w,g as T,h as E,i as D,l as O,n as k,r as A,t as j,v as M}from"./workspace-model-4hq_Mv3N.js";import{n as N,t as P}from"./folder-picker-C8zo3A56.js";import{t as F}from"./ActionMenu-DhbNne-M.js";import{a as I,c as L,d as R,o as z,s as B,t as V,u as H}from"./dock-icons-oG8d7mNZ.js";import{n as U,r as W,t as G}from"./sidebar-model-C8fyqSQY.js";var K=n(e(),1),q={width:`_width_jrygt_4`,form:`_form_jrygt_6`,field:`_field_jrygt_7`,label:`_label_jrygt_8`,select:`_select_jrygt_17`,input:`_input_jrygt_18`,hint:`_hint_jrygt_36`,error:`_error_jrygt_37`,rootRow:`_rootRow_jrygt_47`,rowButton:`_rowButton_jrygt_56`,addRoot:`_addRoot_jrygt_57`,checkbox:`_checkbox_jrygt_74`,priorityRow:`_priorityRow_jrygt_82`,priorityPath:`_priorityPath_jrygt_88`,actions:`_actions_jrygt_99`,spacer:`_spacer_jrygt_100`,confirm:`_confirm_jrygt_101`,cancel:`_cancel_jrygt_103`,save:`_save_jrygt_104`,remove:`_remove_jrygt_105`,danger:`_danger_jrygt_106`},J=t();function Y(e){let{open:t,workspace:n,initialRoots:r,priorities:i,focusSectionId:a=null,onClose:s,onSaved:c,onDeleted:m}=e,h=(0,K.useId)(),g=(0,K.useId)(),[_,v]=(0,K.useState)(``),[y,b]=(0,K.useState)([``]),[x,T]=(0,K.useState)(!1),[M,F]=(0,K.useState)(!1),[I,L]=(0,K.useState)({}),[R,z]=(0,K.useState)(!1),[B,V]=(0,K.useState)(!1),[H,U]=(0,K.useState)(null);(0,K.useEffect)(()=>{if(!t)return;let e=n;v(e?.name??``),b(e?S(e):[...r??[]].filter(e=>e.length>0)),T(e?.section??!1),F(e!==null&&a===e.id),L({}),z(!1),V(!1),U(null)},[t]);let W=y.length===0?[``]:y,G=P();function Y(e,t){b(W.map((n,r)=>r===e?t:n))}async function X(e){let t=await N();t!==null&&t.length>0&&Y(e,t)}function Z(e){return I[e]??O(e,i)}async function Q(e){e.preventDefault();let t=E(_,W);if(!t.ok){U(t.error);return}V(!0),U(null);try{let e=n===null?await f({name:t.name,roots:t.roots,section:x}):await p(n.id,{name:t.name,roots:t.roots,section:x});for(let e of t.roots){let t=I[e];t!==void 0&&t!==O(e,i)&&await u(e,t)}let r=n!==null&&a===n.id;x&&M!==r&&await d(M?e.id:null),c?.(e),s()}catch(e){U(e instanceof Error?e.message:String(e))}finally{V(!1)}}async function $(){if(n!==null){V(!0),U(null);try{await l(n.id),m?.(n.id),s()}catch(e){U(e instanceof Error?e.message:String(e)),V(!1)}}}return(0,J.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:q.width,children:(0,J.jsxs)(`form`,{className:q.form,onSubmit:e=>void Q(e),noValidate:!0,children:[(0,J.jsxs)(`label`,{className:q.field,htmlFor:g,children:[(0,J.jsx)(`span`,{className:q.label,children:`Name`}),(0,J.jsx)(`input`,{id:g,className:q.input,value:_,onChange:e=>v(e.target.value),placeholder:`Defaults to the folder’s own name`,maxLength:120,autoComplete:`off`})]}),(0,J.jsxs)(`div`,{className:q.field,children:[(0,J.jsx)(`span`,{className:q.label,children:`Folders`}),(0,J.jsx)(`p`,{className:q.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.`}),W.map((e,t)=>(0,J.jsxs)(`div`,{className:q.rootRow,children:[(0,J.jsx)(`input`,{className:q.input,value:e,onChange:e=>Y(t,e.target.value),placeholder:`/absolute/path/to/folder`,"aria-label":w(t),autoComplete:`off`,spellCheck:!1}),G?(0,J.jsx)(`button`,{type:`button`,className:q.rowButton,onClick:()=>void X(t),"aria-label":`Choose ${w(t).toLowerCase()}`,children:`Choose folder…`}):null,(0,J.jsx)(`button`,{type:`button`,className:q.rowButton,disabled:t===0,onClick:()=>b(C(W,t,`up`)),"aria-label":`Move ${w(t).toLowerCase()} up`,children:`↑`}),(0,J.jsx)(`button`,{type:`button`,className:q.rowButton,disabled:t===W.length-1,onClick:()=>b(C(W,t,`down`)),"aria-label":`Move ${w(t).toLowerCase()} down`,children:`↓`}),(0,J.jsx)(`button`,{type:`button`,className:q.rowButton,disabled:W.length===1,onClick:()=>b(W.filter((e,n)=>n!==t)),"aria-label":`Remove ${w(t).toLowerCase()}`,children:`Remove`})]},t)),W.length<8?(0,J.jsx)(`button`,{type:`button`,className:q.addRoot,onClick:()=>b([...W,``]),children:`Add a folder`}):null,W.length>1?(0,J.jsx)(`p`,{className:q.hint,children:j}):null]}),(0,J.jsxs)(`div`,{className:q.field,children:[(0,J.jsxs)(`label`,{className:q.checkbox,children:[(0,J.jsx)(`input`,{type:`checkbox`,checked:x,onChange:e=>T(e.target.checked)}),(0,J.jsx)(`span`,{children:`Offer this project to the autonomous lane as a section`})]}),x?(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(`label`,{className:q.checkbox,children:[(0,J.jsx)(`input`,{type:`checkbox`,checked:M,onChange:e=>F(e.target.checked)}),(0,J.jsx)(`span`,{children:`Focus the fleet on this section`})]}),(0,J.jsx)(`p`,{className:q.hint,children:A}),W.filter(e=>e.trim().length>0).map((e,t)=>(0,J.jsxs)(`div`,{className:q.priorityRow,children:[(0,J.jsx)(`span`,{className:q.priorityPath,title:e,children:e}),(0,J.jsx)(`select`,{className:q.select,"aria-label":`Priority for ${e}`,value:Z(e.trim()),onChange:t=>L({...I,[e.trim()]:t.target.value}),children:D.map(e=>(0,J.jsx)(`option`,{value:e,children:k[e]},e))})]},`${e}-${t}`))]}):null]}),H?(0,J.jsx)(`p`,{role:`alert`,className:q.error,children:H}):null,(0,J.jsxs)(`div`,{className:q.actions,children:[n===null?null:R?(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`span`,{className:q.confirm,children:`Forget this project? Chats already on it are untouched.`}),(0,J.jsx)(`button`,{type:`button`,className:q.danger,onClick:()=>void $(),disabled:B,children:`Forget`}),(0,J.jsx)(`button`,{type:`button`,className:q.cancel,onClick:()=>z(!1),children:`Keep`})]}):(0,J.jsx)(`button`,{type:`button`,className:q.remove,onClick:()=>z(!0),disabled:B,children:`Forget project`}),(0,J.jsx)(`span`,{className:q.spacer}),(0,J.jsx)(`button`,{type:`button`,className:q.cancel,onClick:s,children:`Cancel`}),(0,J.jsx)(`button`,{type:`submit`,className:q.save,disabled:B,children:B?`Saving…`:`Save project`})]})]})})}var X={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 Z(){let e=a(c),t=e.data?.workspaces??[],[n,r]=(0,K.useState)({open:!1,workspace:null});return(0,J.jsxs)(`section`,{className:X.projects,"aria-label":`Saved projects`,children:[(0,J.jsxs)(`h2`,{className:X.head,children:[(0,J.jsx)(`span`,{className:X.headText,children:`Projects`}),(0,J.jsx)(`button`,{type:`button`,className:X.add,title:`Save a project`,"aria-label":`Save a project`,onClick:()=>r({open:!0,workspace:null}),children:(0,J.jsx)(m,{})})]}),t.length>0?(0,J.jsx)(`ul`,{className:X.list,children:t.map(e=>{let t=T(e)??``;return(0,J.jsx)(`li`,{children:(0,J.jsxs)(`button`,{type:`button`,className:X.project,title:t,"aria-label":`Edit project ${e.name}`,onClick:()=>r({open:!0,workspace:e}),children:[(0,J.jsx)(`span`,{className:X.name,children:e.name}),(0,J.jsx)(`span`,{className:X.summary,children:M(e)})]})},e.id)})}):e.status===`error`?null:(0,J.jsx)(`p`,{className:X.empty,children:`No saved projects yet.`}),(0,J.jsx)(Y,{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_1vjkz_1`,head:`_head_1vjkz_9`,headDragStrip:`_headDragStrip_1vjkz_40`,search:`_search_1vjkz_51`,searchIcon:`_searchIcon_1vjkz_58`,iconButton:`_iconButton_1vjkz_80`,scroll:`_scroll_1vjkz_98`,skeleton:`_skeleton_1vjkz_105`,error:`_error_1vjkz_106`,empty:`_empty_1vjkz_125`,emptyTitle:`_emptyTitle_1vjkz_131`,emptyCompact:`_emptyCompact_1vjkz_135`,emptyAction:`_emptyAction_1vjkz_138`,emptyKey:`_emptyKey_1vjkz_153`,group:`_group_1vjkz_163`,groupTitle:`_groupTitle_1vjkz_164`,groupName:`_groupName_1vjkz_177`,enrolled:`_enrolled_1vjkz_178`,groupCount:`_groupCount_1vjkz_182`,list:`_list_1vjkz_191`,session:`_session_1vjkz_194`,marker:`_marker_1vjkz_246`,"engine-claude":`_engine-claude_1vjkz_252`,"engine-codex":`_engine-codex_1vjkz_253`,"engine-grok":`_engine-grok_1vjkz_254`,"engine-local":`_engine-local_1vjkz_255`,sessionText:`_sessionText_1vjkz_194`,running:`_running_1vjkz_266`,"verse-pulse":`_verse-pulse_1vjkz_1`,errored:`_errored_1vjkz_273`,seatSpent:`_seatSpent_1vjkz_290`,time:`_time_1vjkz_303`,footer:`_footer_1vjkz_322`,footerButton:`_footerButton_1vjkz_330`,filters:`_filters_1vjkz_357`,filter:`_filter_1vjkz_357`,filterCount:`_filterCount_1vjkz_386`,groupToggle:`_groupToggle_1vjkz_395`,twist:`_twist_1vjkz_411`,row:`_row_1vjkz_423`,sessionBody:`_sessionBody_1vjkz_426`,liveLine:`_liveLine_1vjkz_432`,statusRunning:`_statusRunning_1vjkz_444`,elapsed:`_elapsed_1vjkz_449`,unread:`_unread_1vjkz_455`,rowMore:`_rowMore_1vjkz_464`,renameRow:`_renameRow_1vjkz_490`,renameInput:`_renameInput_1vjkz_491`},$=new Map,ee=(0,K.lazy)(()=>r(()=>import(`./SessionSearch-B5aQ0BCM.js`).then(e=>({default:e.SessionSearch})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12])));function te(e){let{sessions:t,sessionsStatus:n,sessionsError:r,projects:a,seats:o,selectedId:c,query:l,onQuery:u,onSelect:d,onNew:f,onRetry:p,onCollapse:v,onDisconnect:y,activity:b=null,meta:x=null,localSeen:S=$,actions:C}=e,w=(0,K.useId)(),[T,E]=(0,K.useState)(`all`),[D,O]=(0,K.useState)(!1),[k,A]=(0,K.useState)(null),[j,M]=(0,K.useState)(null),N=(0,K.useMemo)(()=>W({sessions:t,projects:a,query:l,filter:T,activity:b,meta:x,localSeen:S,selectedId:c}),[t,a,l,T,b,x,S,c]),P=n===`loading`||n===`idle`&&t.length===0,I=l.trim().length>0;function L(e,t,n){C&&M({row:e,anchor:t,from:n})}return(0,J.jsxs)(`nav`,{className:Q.sidebar,"aria-label":`Chats`,children:[(0,J.jsxs)(`div`,{className:Q.head,children:[(0,J.jsx)(`div`,{className:Q.headDragStrip,"aria-hidden":`true`}),(0,J.jsxs)(`label`,{className:Q.search,htmlFor:w,children:[(0,J.jsx)(`span`,{className:Q.searchIcon,"aria-hidden":`true`,children:(0,J.jsx)(h,{})}),(0,J.jsx)(`span`,{className:`visually-hidden`,children:`Search chats and messages`}),(0,J.jsx)(`input`,{id:w,type:`search`,value:l,placeholder:`Search chats`,autoComplete:`off`,onChange:e=>u(e.target.value)})]}),(0,J.jsx)(_,{label:`New chat`,shortcut:`⌘N`,placement:`bottom`,children:(0,J.jsx)(`button`,{type:`button`,className:Q.iconButton,onClick:f,"aria-label":`New chat`,children:(0,J.jsx)(m,{})})}),(0,J.jsx)(_,{label:`Hide chat list`,shortcut:`⌘B`,placement:`bottom`,children:(0,J.jsx)(`button`,{type:`button`,className:Q.iconButton,onClick:v,"aria-label":`Hide chat list`,children:(0,J.jsx)(g,{})})}),n===`refreshing`?(0,J.jsx)(s,{label:`Refreshing chats`}):null]}),(0,J.jsx)(re,{value:T,counts:N.counts,onChange:E}),(0,J.jsxs)(`div`,{className:Q.scroll,children:[(0,J.jsx)(Z,{}),P?(0,J.jsxs)(`div`,{className:Q.skeleton,"aria-busy":`true`,children:[(0,J.jsx)(i,{width:`48%`}),(0,J.jsx)(i,{width:`86%`}),(0,J.jsx)(i,{width:`74%`}),(0,J.jsx)(i,{width:`40%`}),(0,J.jsx)(i,{width:`80%`})]}):n===`error`&&t.length===0?(0,J.jsxs)(`div`,{role:`alert`,className:Q.error,children:[(0,J.jsx)(`p`,{children:r??`Could not load chats.`}),(0,J.jsx)(`button`,{type:`button`,onClick:p,children:`Retry`})]}):N.groups.length===0?(0,J.jsx)(ie,{query:l,filter:T,hasSessions:t.length>0,onClearQuery:()=>u(``),onClearFilter:()=>E(`all`),onNew:f}):N.groups.map(e=>(0,J.jsx)(ae,{group:e,seats:o,selectedId:c,renaming:k,open:e.kind!==`archived`||D||I||T!==`all`,onToggle:e.kind===`archived`?()=>O(e=>!e):void 0,onSelect:d,onMenu:C?L:void 0,onRenameDone:async(e,t)=>{A(null),C&&t&&t!==e.session.title&&await C.rename(e.session.id,t)}},e.id)),I?(0,J.jsx)(K.Suspense,{fallback:null,children:(0,J.jsx)(ee,{query:l,onOpenSession:d,selectedId:c})}):null]}),(0,J.jsx)(`footer`,{className:Q.footer,children:(0,J.jsx)(`button`,{type:`button`,onClick:y,className:Q.footerButton,children:`Disconnect`})}),j&&C?(0,J.jsx)(F,{label:`Actions for ${j.row.session.title||`Untitled chat`}`,anchor:j.anchor,returnFocus:j.from,onClose:()=>M(null),items:ne(j.row,C,N.metaAvailable,()=>A(j.row.session.id))}):null]})}function ne(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,J.jsx)(B,{size:14}),disabled:s!==null,reason:s,onSelect:()=>t.setPinned(i,!e.pinned)},{id:`archive`,label:e.archived?`Unarchive`:`Archive`,icon:(0,J.jsx)(V,{size:14}),disabled:s!==null,reason:s,onSelect:()=>t.setArchived(i,!e.archived)},{id:`rename`,label:`Rename`,icon:(0,J.jsx)(L,{size:14}),disabled:o!==null,reason:o,onSelect:r},{id:`handoff`,label:`Continue in a fresh chat…`,icon:(0,J.jsx)(I,{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,J.jsx)(H,{size:14}),danger:!0,separated:!0,disabled:o!==null||a,reason:o??(a?`Stop its turn before deleting.`:null),onSelect:()=>t.requestDelete(i)}]}function re({value:e,counts:t,onChange:n}){let r=(0,K.useRef)(new Map);function i(t){let i=G.indexOf(e),a;t.key===`ArrowRight`||t.key===`ArrowDown`?a=G[(i+1)%G.length]:t.key===`ArrowLeft`||t.key===`ArrowUp`?a=G[(i-1+G.length)%G.length]:t.key===`Home`?a=G[0]:t.key===`End`&&(a=G[G.length-1]),a&&(t.preventDefault(),n(a),r.current.get(a)?.focus())}return(0,J.jsx)(`div`,{className:Q.filters,role:`radiogroup`,"aria-label":`Show chats`,onKeyDown:i,children:G.map(i=>{let a=t[i],o=i===e;return(0,J.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:[U[i],i!==`all`&&a>0?(0,J.jsx)(`span`,{className:Q.filterCount,children:a}):null]},i)})})}function ie({query:e,filter:t,hasSessions:n,onClearQuery:r,onClearFilter:i,onNew:a}){if(e.trim())return(0,J.jsxs)(`div`,{className:`${Q.empty} ${Q.emptyCompact}`,children:[(0,J.jsxs)(`p`,{className:Q.emptyTitle,children:[`No chat titles match “`,e,`”`]}),(0,J.jsx)(`p`,{children:`Titles and projects match as you type. Chats whose messages match, if any, are listed below.`}),(0,J.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,J.jsxs)(`div`,{className:`${Q.empty} ${Q.emptyCompact}`,children:[(0,J.jsx)(`p`,{className:Q.emptyTitle,children:e}),t===`pinned`?(0,J.jsx)(`p`,{children:`Pin a chat from its row menu — hover it, or right-click.`}):null,(0,J.jsx)(`button`,{type:`button`,className:Q.emptyAction,onClick:i,children:`Show all chats`})]})}return(0,J.jsxs)(`div`,{className:Q.empty,children:[(0,J.jsx)(`p`,{className:Q.emptyTitle,children:`No chats yet`}),(0,J.jsx)(`p`,{children:`Start one on any project with any seat.`}),(0,J.jsxs)(`button`,{type:`button`,className:Q.emptyAction,onClick:a,children:[`Start your first chat `,(0,J.jsx)(`kbd`,{className:Q.emptyKey,children:`⌘N`})]})]})}function ae({group:e,seats:t,selectedId:n,renaming:r,open:i,onToggle:a,onSelect:o,onMenu:s,onRenameDone:c}){let l=(0,K.useId)();return(0,J.jsxs)(`section`,{className:Q.group,"aria-label":e.label,"data-group":e.kind,children:[(0,J.jsxs)(`h2`,{className:Q.groupTitle,title:e.projectPath??void 0,children:[a?(0,J.jsxs)(`button`,{type:`button`,className:Q.groupToggle,"aria-expanded":i,"aria-controls":l,onClick:a,children:[(0,J.jsx)(`span`,{className:Q.twist,"data-open":i||void 0,"aria-hidden":`true`}),(0,J.jsx)(`span`,{className:Q.groupName,children:e.label})]}):(0,J.jsx)(`span`,{className:Q.groupName,children:e.label}),e.enrolled?(0,J.jsx)(`span`,{className:Q.enrolled,children:`enrolled`}):null,(0,J.jsx)(`span`,{className:Q.groupCount,"aria-hidden":`true`,children:e.rows.length})]}),(0,J.jsx)(`ul`,{id:l,className:Q.list,hidden:!i,children:i?e.rows.map(e=>(0,J.jsx)(`li`,{children:r===e.session.id?(0,J.jsx)(ce,{row:e,onDone:t=>{c(e,t)}}):(0,J.jsx)(oe,{row:e,seats:t,selected:e.session.id===n,onSelect:o,onMenu:s})},e.session.id)):null})]})}function oe({row:e,seats:t,selected:n,onSelect:r,onMenu:i}){let{session:a,status:o}=e,s=b(t,a.seatId),c=s===void 0?null:x(s),l=o.kind===`running`&&c?.cls===`blocked`,u=c===null||c.cls===`ready`||c.cls===`unread`?`${a.title} · ${v(t,a)}`:`${a.title} · ${v(t,a)} · ${c.summary}`,d=(0,K.useRef)(null);function f(t){i&&(t.preventDefault(),i(e,{x:t.clientX,y:t.clientY},t.currentTarget))}function p(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,J.jsxs)(`div`,{className:Q.row,"data-selected":n||void 0,children:[(0,J.jsx)(_,{label:u,placement:`right`,children:(0,J.jsxs)(`button`,{ref:d,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:f,onKeyDown:p,children:[(0,J.jsx)(`span`,{className:Q.marker,"aria-hidden":`true`}),(0,J.jsxs)(`span`,{className:Q.sessionBody,children:[(0,J.jsx)(`span`,{className:Q.sessionText,children:a.title||`Untitled chat`}),e.live?(0,J.jsx)(`span`,{className:Q.liveLine,title:e.live.text,children:e.live.text}):null]}),l&&c!==null?(0,J.jsx)(`span`,{className:Q.seatSpent,role:`img`,"aria-label":`Seat limit reached: ${c.summary}`,children:`▮`}):null,(0,J.jsx)(se,{row:e})]})}),i?(0,J.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},d.current??t.currentTarget)},children:(0,J.jsx)(z,{size:14})}):null]})}function se({row:e}){let{status:t,session:n}=e;switch(t.kind){case`running`:return(0,J.jsxs)(`span`,{className:Q.statusRunning,children:[(0,J.jsx)(`span`,{className:Q.running,role:`img`,"aria-label":`Running`}),t.startedAt?(0,J.jsx)(R,{className:Q.elapsed,since:t.startedAt}):null]});case`failed`:return(0,J.jsx)(`span`,{className:Q.errored,role:`img`,"aria-label":`Last turn failed`,children:`!`});case`unread`:return(0,J.jsx)(`span`,{className:Q.unread,role:`img`,"aria-label":`${t.newTurns} new turn${t.newTurns===1?``:`s`}`});default:return(0,J.jsx)(`time`,{className:Q.time,dateTime:n.updatedAt,children:y(n.updatedAt)})}}function ce({row:e,onDone:t}){let[n,r]=(0,K.useState)(e.session.title),i=(0,K.useRef)(null),a=(0,K.useRef)(!1);(0,K.useEffect)(()=>{i.current?.focus(),i.current?.select()},[]);let o=e=>{a.current||(a.current=!0,t(e.trim()))};return(0,J.jsx)(`div`,{className:`${Q.row} ${Q.renameRow}`,children:(0,J.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{te as Sidebar};
3
- //# sourceMappingURL=Sidebar-q11dtYZf.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 {\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 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 <button type=\"button\" className={styles.rowButton} disabled={index === 0}\n onClick={() => setRoots(moveRoot(rows, index, 'up'))}\n aria-label={`Move ${rootRowLabel(index).toLowerCase()} up`}>↑</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`}>↓</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 <span className={styles.priorityPath} title={root}>{root}</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 title={primary}\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.</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).\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 { 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 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 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\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)} />\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 className={styles.scroll}>\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 <button type=\"button\" onClick={onDisconnect} className={styles.footerButton}>Disconnect</button>\n </footer>\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\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 = capacity === null || capacity.cls === 'ready' || capacity.cls === 'unread'\n ? `${session.title} · ${seatPillLabel(seats, session)}`\n : `${session.title} · ${seatPillLabel(seats, session)} · ${capacity.summary}`;\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 switch (status.kind) {\n case 'running':\n return (\n <span className={styles.statusRunning}>\n <span className={styles.running} role=\"img\" aria-label=\"Running\" />\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=\"Last turn failed\">!</span>;\n case 'unread':\n return (\n <span className={styles.unread} role=\"img\"\n aria-label={`${status.newTurns} new turn${status.newTurns === 1 ? '' : 's'}`} />\n );\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-q11dtYZf.js"}
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,s as n}from"./index-afDA8cwW.js";import{A as r,C as i,D as a,E as o,S as ee,T as te,b as s,l as c,r as l,s as ne,t as re,u,v as ie,w as d,y as ae}from"./useChartWidth-MEXvDxDL.js";import{c as f,i as p,l as oe,m,n as h,p as se,r as g}from"./colors-B-vHsX1S.js";var _=n(e(),1),v=t(),y=8,b=16,x=2,S=28,C=16,w=4,T=[`Mon`,``,`Wed`,``,`Fri`,``,``],E=[``,`Mon`,``,`Wed`,``,`Fri`,``];function D({title:e,description:t,caveat:n,status:r,days:c,weekStart:u=1,width:ae,formatValue:f=o,unit:p=``,ariaLabel:oe}){let h=(0,_.useRef)(null),g=re(h,ae),D=(0,_.useId)(),O=se((0,_.useId)()),k=(0,_.useMemo)(()=>l(c,u),[c,u]),[A,j]=(0,_.useState)(null),M=Math.max(0,...c.map(e=>e.value??0)),N=c.some(e=>e.value!==null),ce=r??(c.length===0?{kind:`empty`}:N?{kind:`ready`}:{kind:`unknown`}),P=g-S,le=Math.max(1,Math.floor((P+x)/10)),F=Math.min(k.weeks,le),I=k.weeks-F,L=Math.max(y,Math.min(b,Math.floor((P+x)/Math.max(1,F))-x)),R=I,z=k.cells.filter(e=>e.week>=R),B=S+F*(L+x),V=C+7*(L+x),H=e=>S+(e.week-R)*(L+x),U=e=>C+e.weekday*(L+x),W=p?` ${p}`:``,G=e=>`${a(e.day)}: ${e.value===null?`no data`:`${f(e.value)}${W}`}`,K=[];for(let e of k.months){if(e.week<R)continue;let t=K[K.length-1];t&&e.week-t.week<3||K.push(e)}let q=z.filter(e=>!e.outside),J=A===null?void 0:q[A];function Y(e){if(q.length===0)return;let t=A??q.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=q.length-1):r=t+n,r!==null&&(e.preventDefault(),j(Math.max(0,Math.min(q.length-1,r))))}let X=c.filter(e=>e.value!==null),Z=X.reduce((e,t)=>e+(t.value??0),0),Q=X.reduce((e,t)=>!e||(t.value??0)>(e.value??0)?t:e,null),ue=oe??`${e}: ${c.length} days, ${f(Z)}${W} in total`+(Q&&(Q.value??0)>0?`, busiest ${a(Q.day)} with ${f(Q.value)}`:``)+(c.length-X.length>0?`, ${c.length-X.length} days without data`:``)+`.`,de=[{key:`day`,label:`Day`,render:e=>a(e.day)},{key:`value`,label:p?p[0].toUpperCase()+p.slice(1):`Value`,numeric:!0,render:e=>e.value===null?`—`:f(e.value)}],fe=(0,v.jsxs)(`div`,{className:d.legend,"aria-hidden":`true`,children:[(0,v.jsx)(`span`,{className:d.legendItem,children:`Less`}),Array.from({length:5},(e,t)=>(0,v.jsx)(`span`,{className:d.swatch,style:{background:m(t)}},t)),(0,v.jsx)(`span`,{className:d.legendItem,children:`More`}),(0,v.jsxs)(`span`,{className:d.legendItem,children:[(0,v.jsx)(`span`,{className:d.swatchHatch}),`no data`]})]});return(0,v.jsx)(ie,{title:e,description:t,caveat:n,status:ce,table:(0,v.jsx)(te,{caption:e,columns:de,rows:[...c].sort((e,t)=>e.day.localeCompare(t.day)),rowKey:e=>e.day}),footer:(0,v.jsxs)(v.Fragment,{children:[fe,I>0?(0,v.jsxs)(`p`,{className:d.note,children:[`Showing the latest `,F,` weeks; `,I,` earlier weeks are in the table.`]}):null]}),children:(0,v.jsxs)(`div`,{ref:h,className:`${d.plotWrap} ${d.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the arrow keys to move between days.`,"aria-describedby":D,onFocus:()=>j(e=>e??(q.length?q.length-1:null)),onBlur:()=>j(null),onKeyDown:Y,children:[(0,v.jsxs)(`svg`,{className:d.svg,width:B,height:V,viewBox:`0 0 ${B} ${V}`,role:`img`,"aria-label":ue,children:[(0,v.jsx)(`defs`,{children:(0,v.jsx)(ee,{id:O})}),K.map(e=>(0,v.jsx)(`text`,{className:d.tick,x:S+(e.week-R)*(L+x),y:11,children:e.label},`${e.week}${e.label}`)),(u===1?T:E).map((e,t)=>e&&L>=10?(0,v.jsx)(`text`,{className:d.tick,x:0,y:C+t*(L+x)+L/2,dy:`0.32em`,children:e},t):null),z.map(e=>{if(e.outside)return null;let t=ne(e.value,M,w),n=J?.day===e.day;return(0,v.jsx)(`rect`,{"data-day":e.day,"data-bucket":t===null?`unknown`:t,x:H(e),y:U(e),width:L,height:L,rx:2,className:t===null?d.unknownMark:void 0,fill:t===null?`url(#${O})`:m(t),style:n?{stroke:`var(--border-focus)`,strokeWidth:2,strokeDasharray:`none`}:void 0,onPointerEnter:()=>j(q.indexOf(e)),onPointerLeave:()=>j(null)},e.day)})]}),(0,v.jsx)(`span`,{id:D,className:d.srOnly,"aria-live":`polite`,children:J?G(J):``}),J?(0,v.jsx)(s,{left:i(H(J)+L/2,B,60),top:U(J),title:a(J.day),rows:[{key:`v`,label:p||`Value`,value:J.value===null?null:f(J.value)}]}):null]})})}var O={band:`_band_1rlew_3`,focusRing:`_focusRing_1rlew_8`};function k(e){return e.estimate===null||e.low===null||e.high===null?`unknown`:e.low>0?`positive`:e.high<0?`negative`:`none`}var A={positive:`helped (interval above zero)`,negative:`hurt (interval below zero)`,none:`no clear effect (interval crosses zero)`,unknown:`unknown`};function j(e){return e===`positive`?p:e===`negative`?g:`var(--text-secondary)`}function M(e,t){return e>0?`+${t(e)}`:t(e)}var N=28,ce=22,P=12,le=480;function F({title:e,description:t,caveat:n,status:r,rows:i,unit:a=``,gate:o,formatValue:s=e=>Math.abs(e)>=10?e.toFixed(0):e.toFixed(1),unknownText:l=`not enough pairs yet`,width:ne,ariaLabel:f}){let oe=(0,_.useRef)(null),m=re(oe,ne),[y,b]=(0,_.useState)(null),x=(0,_.useId)(),S=se((0,_.useId)()),C=a?` ${a}`:``,w=i.filter(e=>k(e)!==`unknown`),T=r??(i.length===0?{kind:`empty`,message:`No experiments have run yet.`}:{kind:`ready`}),E=m<le,D=Math.max(84,Math.min(180,Math.round(m*(E?.3:.26)))),F=E?0:118,I=D+8,L=Math.max(I+40,m-F-P),R=w.flatMap(e=>[e.low,e.high]),z=Math.min(0,o?.value??0,...R),B=Math.max(0,o?.value??0,...R),V=u(z,B===z?z+1:B,E?3:5),H=c(V[0],V[V.length-1],I,L),U=i.length*N,W=U+ce,G=e=>{let t=k(e);return t===`unknown`?`${e.label}: ${l}`:`${e.label}: ${M(e.estimate,s)}${C}, 95% interval ${M(e.low,s)} to ${M(e.high,s)}; ${A[t]}`},K=w.filter(e=>k(e)===`positive`).length,q=f??`${e}: ${i.length} experiment${i.length===1?``:`s`}, ${K} with an interval above zero.`;function J(e){if(i.length===0)return;let t=y??0,n=e.key===`ArrowDown`?t+1:e.key===`ArrowUp`?t-1:e.key===`Home`?0:e.key===`End`?i.length-1:null;n!==null&&(e.preventDefault(),b(Math.max(0,Math.min(i.length-1,n))))}let Y=[{key:`label`,label:`Experiment`,render:e=>e.label},{key:`est`,label:`Estimate${C}`,numeric:!0,render:e=>e.estimate===null?`—`:M(e.estimate,s)},{key:`ci`,label:`95% interval`,numeric:!0,render:e=>e.low===null||e.high===null?`—`:`${M(e.low,s)} to ${M(e.high,s)}`},{key:`n`,label:`Pairs`,numeric:!0,render:e=>e.n===null||e.n===void 0?`—`:String(e.n)},{key:`verdict`,label:`Reading`,render:e=>k(e)===`unknown`?l:A[k(e)]},...i.some(e=>e.detail)?[{key:`detail`,label:`Status`,render:e=>e.detail??``}]:[]],X=y===null?void 0:i[y],Z=Math.floor(D/7);return(0,v.jsx)(ie,{title:e,description:t,caveat:n,status:T,table:(0,v.jsx)(te,{caption:e,columns:Y,rows:i,rowKey:e=>e.id}),footer:(0,v.jsx)(ae,{min:1,items:[{label:`Helped`,color:p},{label:`Hurt`,color:g},{label:`No clear effect`,color:`var(--text-secondary)`},...i.length>w.length?[{label:l,kind:`hatch`}]:[]]}),children:(0,v.jsxs)(`div`,{ref:oe,className:`${d.plotWrap} ${d.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the up and down arrow keys to read each experiment.`,"aria-describedby":x,onFocus:()=>b(e=>e??(i.length?0:null)),onBlur:()=>b(null),onKeyDown:J,children:[(0,v.jsxs)(`svg`,{className:d.svg,width:m,height:W,viewBox:`0 0 ${m} ${W}`,role:`img`,"aria-label":q,children:[(0,v.jsx)(`defs`,{children:(0,v.jsx)(ee,{id:S})}),V.map(e=>(0,v.jsxs)(`g`,{children:[(0,v.jsx)(`line`,{className:d.grid,x1:H(e),x2:H(e),y1:0,y2:U}),(0,v.jsx)(`text`,{className:d.tick,x:H(e),y:W-6,textAnchor:`middle`,children:e===0?`0`:M(e,s)})]},e)),(0,v.jsx)(`line`,{"data-role":`zero`,x1:H(0),x2:H(0),y1:0,y2:U,stroke:h,strokeWidth:1.5}),o&&o.value!==0?(0,v.jsx)(`g`,{"data-role":`gate`,children:(0,v.jsx)(`line`,{className:d.reference,x1:H(o.value),x2:H(o.value),y1:0,y2:U})}):null,i.map((e,t)=>{let n=t*N+N/2,r=k(e),i=j(r),a=y===t;return(0,v.jsxs)(`g`,{"data-row":e.id,"data-verdict":r,opacity:y!==null&&!a?.55:1,children:[t%2==1?(0,v.jsx)(`rect`,{className:O.band,x:0,y:t*N,width:m,height:N}):null,(0,v.jsx)(`text`,{className:d.label,x:D,y:n,dy:`0.32em`,textAnchor:`end`,children:e.label.length>Z?`${e.label.slice(0,Z-1)}…`:e.label}),r===`unknown`?(0,v.jsxs)(`g`,{"data-role":`unknown`,children:[(0,v.jsx)(`rect`,{className:d.unknownMark,fill:`url(#${S})`,x:I+.5,y:n-5,width:Math.max(1,L-I-1),height:10,rx:2}),E?null:(0,v.jsx)(`text`,{className:d.tick,x:m-P,y:n,dy:`0.32em`,textAnchor:`end`,children:l})]}):(0,v.jsxs)(`g`,{children:[(0,v.jsx)(`line`,{"data-role":`ci`,x1:H(e.low),x2:H(e.high),y1:n,y2:n,stroke:i,strokeWidth:2,strokeLinecap:`round`}),(0,v.jsx)(`line`,{x1:H(e.low),x2:H(e.low),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,v.jsx)(`line`,{x1:H(e.high),x2:H(e.high),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,v.jsx)(`rect`,{"data-role":`estimate`,className:d.marker,x:H(e.estimate)-5,y:n-5,width:10,height:10,rx:2,fill:i}),E?null:(0,v.jsxs)(`text`,{className:d.tick,x:m-P,y:n,dy:`0.32em`,textAnchor:`end`,children:[M(e.estimate,s),` [`,M(e.low,s),`, `,M(e.high,s),`]`]})]}),a?(0,v.jsx)(`rect`,{className:O.focusRing,x:1,y:t*N+1,width:m-2,height:26,rx:3}):null]},e.id)})]}),(0,v.jsx)(`span`,{id:x,className:d.srOnly,"aria-live":`polite`,children:X?G(X):``})]})})}function I(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 L=18,R=26,z=14;function B(e,t){return e>0?`+${t(e)}`:t(e)}function V({title:e,description:t,caveat:n,status:a,steps:o,markers:l=[],now:ne,from:p,baseline:m,unit:h=``,formatValue:y=e=>Math.abs(e)>=10?e.toFixed(0):e.toFixed(1),formatTime:b=r,height:x=200,width:S,ariaLabel:C}){let w=(0,_.useRef)(null),T=re(w,S),[E,D]=(0,_.useState)(null),O=(0,_.useId)(),k=se((0,_.useId)()),A=h?` ${h}`:``,j=ne??Date.now(),M=I(o,j),N=M.filter(e=>e.value!==null),ce=a??(M.length===0?{kind:`empty`,message:`No versions yet — the compiled defaults are in force.`}:N.length===0?{kind:`unknown`,reason:`no version has a measured value yet.`}:{kind:`ready`}),P=p??M[0]?.at??j-1,le=Math.max(j,...M.map(e=>e.until),...l.map(e=>e.at),P+1),F=N.flatMap(e=>[e.value,e.low??e.value,e.high??e.value]),V=Math.min(m?.value??0,...F),H=Math.max(m?.value??0,...F),U=u(V,H===V?V+1:H,4),W=Math.min(56,Math.max(30,Math.max(...U.map(e=>B(e,y).length))*7+10)),G=Math.max(40,T-W-z),K=x-L-R,q=c(P,le,W,W+G),J=c(U[0],U[U.length-1],L+K,L),Y=e=>Math.min(W+G,Math.max(W,q(e))),X=[],Z=[],Q=null;for(let e of M){if(e.value===null){Z.length&&X.push(Z.join(` `)),Z=[],Q=null;continue}let t=J(e.value),n=Y(e.at),r=Y(e.until);Z.push(Q===null?`M${n.toFixed(1)},${t.toFixed(1)}`:`L${n.toFixed(1)},${t.toFixed(1)}`),Z.push(`L${r.toFixed(1)},${t.toFixed(1)}`),Q=t}Z.length&&X.push(Z.join(` `));let ue=e=>`${e.label}${e.detail?` (${e.detail})`:``}, ${b(e.at)} to ${b(e.until)}: `+(e.value===null?`not measured`:`${B(e.value,y)}${A}`+(e.low!==null&&e.low!==void 0&&e.high!==null&&e.high!==void 0?`, 95% interval ${B(e.low,y)} to ${B(e.high,y)}`:``)),de=N[N.length-1],fe=l.filter(e=>e.kind===`rollback`).length,pe=C??`${e}: ${M.length} step${M.length===1?``:`s`}`+(de?`, now ${B(de.value,y)}${A}`:``)+(fe?`, ${fe} rollback${fe===1?``:`s`}`:``)+`.`;function me(e){if(M.length===0)return;let t=E??M.length-1,n=e.key===`ArrowLeft`?t-1:e.key===`ArrowRight`?t+1:e.key===`Home`?0:e.key===`End`?M.length-1:null;n!==null&&(e.preventDefault(),D(Math.max(0,Math.min(M.length-1,n))))}let he=[...M.map(e=>({id:`s:${e.id}`,when:e.at,what:`${e.label}${e.detail?` · ${e.detail}`:``}`,value:e.value===null?`—`:B(e.value,y),interval:e.low===null||e.low===void 0||e.high===null||e.high===void 0?`—`:`${B(e.low,y)} to ${B(e.high,y)}`})),...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),ge=[{key:`when`,label:`When`,render:e=>b(e.when)},{key:`what`,label:`Step`,render:e=>e.what},{key:`value`,label:`Level${A}`,numeric:!0,render:e=>e.value},{key:`ci`,label:`95% interval`,numeric:!0,render:e=>e.interval}],$=E===null?void 0:M[E];return(0,v.jsx)(ie,{title:e,description:t,caveat:n,status:ce,table:(0,v.jsx)(te,{caption:e,columns:ge,rows:he,rowKey:e=>e.id}),footer:(0,v.jsx)(ae,{items:[{label:`Level`,color:f,kind:`line`},{label:`95% interval`,color:oe},...fe?[{label:`▼ rollback`,color:g}]:[],...M.some(e=>e.value===null)?[{label:`not measured`,kind:`hatch`}]:[]]}),children:(0,v.jsxs)(`div`,{ref:w,className:`${d.plotWrap} ${d.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the left and right arrow keys to read each step.`,"aria-describedby":O,onFocus:()=>D(e=>e??(M.length?M.length-1:null)),onBlur:()=>D(null),onKeyDown:me,children:[(0,v.jsxs)(`svg`,{className:d.svg,width:T,height:x,viewBox:`0 0 ${T} ${x}`,role:`img`,"aria-label":pe,children:[(0,v.jsx)(`defs`,{children:(0,v.jsx)(ee,{id:k})}),U.map(e=>(0,v.jsxs)(`g`,{children:[(0,v.jsx)(`line`,{className:d.grid,x1:W,x2:W+G,y1:J(e),y2:J(e)}),(0,v.jsx)(`text`,{className:d.tick,x:W-6,y:J(e),dy:`0.32em`,textAnchor:`end`,children:e===0?`0`:B(e,y)})]},e)),(0,v.jsx)(`text`,{className:d.tick,x:W,y:x-8,textAnchor:`start`,children:b(P)}),(0,v.jsx)(`text`,{className:d.tick,x:W+G,y:x-8,textAnchor:`end`,children:b(le)}),m?(0,v.jsxs)(`g`,{"data-role":`baseline`,children:[(0,v.jsx)(`line`,{className:d.reference,x1:W,x2:W+G,y1:J(m.value),y2:J(m.value)}),(0,v.jsx)(`text`,{className:`${d.tick} ${d.halo}`,x:W+4,y:J(m.value)-5,children:m.label})]}):null,M.map((e,t)=>{let n=Y(e.at),r=Math.max(n+1,Y(e.until));if(e.value===null)return(0,v.jsx)(`rect`,{"data-step":e.id,"data-unknown":`true`,className:d.unknownMark,fill:`url(#${k})`,x:n,y:L,width:r-n,height:K,opacity:.6},e.id);let i=e.low!==null&&e.low!==void 0&&e.high!==null&&e.high!==void 0;return(0,v.jsx)(`g`,{"data-step":e.id,opacity:E!==null&&E!==t?.6:1,children:i?(0,v.jsx)(`rect`,{"data-role":`band`,x:n,y:J(e.high),width:r-n,height:Math.max(1,J(e.low)-J(e.high)),fill:oe,opacity:.35}):null},e.id)}),X.map((e,t)=>(0,v.jsx)(`path`,{"data-role":`level`,className:d.line,stroke:f,d:e},t)),M.map(e=>e.value===null?null:(0,v.jsx)(`circle`,{className:d.marker,cx:Y(e.at),cy:J(e.value),r:3.5,fill:f},`p${e.id}`)),l.map(e=>{let t=Y(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,v.jsx)(`path`,{"data-marker":e.kind,d:n,fill:e.kind===`rollback`?g:f,children:(0,v.jsx)(`title`,{children:`${e.kind===`rollback`?`Rolled back`:`Adopted`}: ${e.label} · ${b(e.at)}`})},e.id)})]}),(0,v.jsx)(`span`,{id:O,className:d.srOnly,"aria-live":`polite`,children:$?ue($):``}),$?(0,v.jsx)(s,{left:i((Y($.at)+Y($.until))/2,T),top:$.value===null?L+K/2:J($.high??$.value),title:`${$.label}${$.detail?` · ${$.detail}`:``}`,rows:[{key:`v`,label:`Level`,value:$.value===null?null:`${B($.value,y)}${A}`},{key:`ci`,label:`95% interval`,value:$.low===null||$.low===void 0||$.high===null||$.high===void 0?null:`${B($.low,y)} to ${B($.high,y)}`},{key:`t`,label:`From`,value:b($.at)}]}):null]})})}export{F as n,D as r,V as t};
2
- //# sourceMappingURL=StepBand-B1W7rU70.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StepBand-B1W7rU70.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/CalendarHeatmap.tsx","../../../../../../src/web-ui/components/charts/ForestPlot.module.css","../../../../../../src/web-ui/components/charts/ForestPlot.tsx","../../../../../../src/web-ui/components/charts/StepBand.tsx"],"sourcesContent":["/**\n * components/charts/CalendarHeatmap.tsx — one value per day on a weeks ×\n * weekdays grid (activity by day across months). Sequential: ONE hue, four\n * steps light → dark mixed from the theme's own tokens, with a Less → More\n * key. A TRUE ZERO is the faint step-0 cell; UNKNOWN (null, or a day missing\n * from the data) is the 45° unknown hatch with an outline (V3.10) and its own\n * \"no data\" key entry — the two are never the same colour, and texture keeps\n * them apart under colour-blindness too.\n *\n * Width: the cell size adapts (8–16 px). When even 8 px cells cannot fit the\n * whole span at 375 px, the grid shows the most recent weeks that fit and says\n * how many are hidden; the Table view always has every day.\n *\n * Keyboard: the grid is one tab stop; ← → move a week, ↑ ↓ move a day (rows\n * are weekdays), Home/End jump to the ends; the focused day is announced.\n */\nimport { useId, useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport { hatchPatternId, heatColor } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartTooltip, HatchPattern, clampTooltipLeft } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { calendarGrid, heatBucket, type CalendarCell } from './chart-math.js';\nimport { formatCompact, formatDayLabel } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport plot from './plot.module.css';\n\nexport interface CalendarDatum {\n day: string;\n value: number | null;\n}\n\nexport interface CalendarHeatmapProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n days: CalendarDatum[];\n /** 1 = Monday (ISO, default), 0 = Sunday. */\n weekStart?: 0 | 1;\n width?: number;\n formatValue?: (v: number) => string;\n /** Unit for the spoken/tooltip text, e.g. \"runs\". */\n unit?: string;\n ariaLabel?: string;\n}\n\nconst MIN_CELL = 8;\nconst MAX_CELL = 16;\nconst GAP = 2;\nconst DAY_LABEL_W = 28;\nconst MONTH_H = 16;\nconst STEPS = 4;\nconst WEEKDAYS_MON = ['Mon', '', 'Wed', '', 'Fri', '', ''];\nconst WEEKDAYS_SUN = ['', 'Mon', '', 'Wed', '', 'Fri', ''];\n\nexport function CalendarHeatmap({\n title,\n description,\n caveat,\n status,\n days,\n weekStart = 1,\n width: fixedWidth,\n formatValue = formatCompact,\n unit = '',\n ariaLabel,\n}: CalendarHeatmapProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const grid = useMemo(() => calendarGrid(days, weekStart), [days, weekStart]);\n const [focus, setFocus] = useState<number | null>(null);\n\n const max = Math.max(0, ...days.map((d) => d.value ?? 0));\n const anyKnown = days.some((d) => d.value !== null);\n const resolvedStatus: ChartStatus = status ?? (days.length === 0 ? { kind: 'empty' } : anyKnown ? { kind: 'ready' } : { kind: 'unknown' });\n\n const avail = width - DAY_LABEL_W;\n const fitWeeks = Math.max(1, Math.floor((avail + GAP) / (MIN_CELL + GAP)));\n const shownWeeks = Math.min(grid.weeks, fitWeeks);\n const hiddenWeeks = grid.weeks - shownWeeks;\n const cell = Math.max(MIN_CELL, Math.min(MAX_CELL, Math.floor((avail + GAP) / Math.max(1, shownWeeks)) - GAP));\n const firstWeek = hiddenWeeks;\n const visible = grid.cells.filter((c) => c.week >= firstWeek);\n const svgW = DAY_LABEL_W + shownWeeks * (cell + GAP);\n const svgH = MONTH_H + 7 * (cell + GAP);\n const xOf = (c: CalendarCell) => DAY_LABEL_W + (c.week - firstWeek) * (cell + GAP);\n const yOf = (c: CalendarCell) => MONTH_H + c.weekday * (cell + GAP);\n const unitText = unit ? ` ${unit}` : '';\n const describe = (c: CalendarCell) => `${formatDayLabel(c.day)}: ${c.value === null ? 'no data' : `${formatValue(c.value)}${unitText}`}`;\n\n const monthLabels: { week: number; label: string }[] = [];\n for (const m of grid.months) {\n if (m.week < firstWeek) continue;\n const prev = monthLabels[monthLabels.length - 1];\n if (prev && m.week - prev.week < 3) continue;\n monthLabels.push(m);\n }\n\n const inside = visible.filter((c) => !c.outside);\n const focusCell = focus !== null ? inside[focus] : undefined;\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (inside.length === 0) return;\n const cur = focus ?? inside.length - 1;\n const delta = e.key === 'ArrowLeft' ? -7 : e.key === 'ArrowRight' ? 7 : e.key === 'ArrowUp' ? -1 : e.key === 'ArrowDown' ? 1 : null;\n let next: number | null = null;\n if (delta !== null) next = cur + delta;\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = inside.length - 1;\n if (next === null) return;\n e.preventDefault();\n setFocus(Math.max(0, Math.min(inside.length - 1, next)));\n }\n\n const knownDays = days.filter((d) => d.value !== null);\n const total = knownDays.reduce((s, d) => s + (d.value ?? 0), 0);\n const busiest = knownDays.reduce<CalendarDatum | null>((b, d) => (!b || (d.value ?? 0) > (b.value ?? 0) ? d : b), null);\n const summary = ariaLabel ?? `${title}: ${days.length} days, ${formatValue(total)}${unitText} in total` +\n (busiest && (busiest.value ?? 0) > 0 ? `, busiest ${formatDayLabel(busiest.day)} with ${formatValue(busiest.value!)}` : '') +\n (days.length - knownDays.length > 0 ? `, ${days.length - knownDays.length} days without data` : '') + '.';\n\n const columns: TableColumn<CalendarDatum>[] = [\n { key: 'day', label: 'Day', render: (d) => formatDayLabel(d.day) },\n { key: 'value', label: unit ? unit[0]!.toUpperCase() + unit.slice(1) : 'Value', numeric: true, render: (d) => (d.value === null ? '—' : formatValue(d.value)) },\n ];\n\n const legend = (\n <div className={plot.legend} aria-hidden=\"true\">\n <span className={plot.legendItem}>Less</span>\n {Array.from({ length: STEPS + 1 }, (_, i) => (\n <span key={i} className={plot.swatch} style={{ background: heatColor(i) }} />\n ))}\n <span className={plot.legendItem}>More</span>\n <span className={plot.legendItem}>\n <span className={plot.swatchHatch} />\n no data\n </span>\n </div>\n );\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={[...days].sort((a, b) => a.day.localeCompare(b.day))} rowKey={(d) => d.day} />}\n footer={\n <>\n {legend}\n {hiddenWeeks > 0 ? (\n <p className={plot.note}>Showing the latest {shownWeeks} weeks; {hiddenWeeks} earlier weeks are in the table.</p>\n ) : null}\n </>\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the arrow keys to move between days.`}\n aria-describedby={liveId}\n onFocus={() => setFocus((f) => f ?? (inside.length ? inside.length - 1 : null))}\n onBlur={() => setFocus(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={svgW} height={svgH} viewBox={`0 0 ${svgW} ${svgH}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {monthLabels.map((m) => (\n <text key={`${m.week}${m.label}`} className={plot.tick} x={DAY_LABEL_W + (m.week - firstWeek) * (cell + GAP)} y={11}>\n {m.label}\n </text>\n ))}\n {(weekStart === 1 ? WEEKDAYS_MON : WEEKDAYS_SUN).map((label, i) =>\n label && cell >= 10 ? (\n <text key={i} className={plot.tick} x={0} y={MONTH_H + i * (cell + GAP) + cell / 2} dy=\"0.32em\">{label}</text>\n ) : null,\n )}\n {visible.map((c) => {\n if (c.outside) return null;\n const bucket = heatBucket(c.value, max, STEPS);\n const isFocus = focusCell?.day === c.day;\n return (\n <rect\n key={c.day}\n data-day={c.day}\n data-bucket={bucket === null ? 'unknown' : bucket}\n x={xOf(c)}\n y={yOf(c)}\n width={cell}\n height={cell}\n rx={2}\n className={bucket === null ? plot.unknownMark : undefined}\n fill={bucket === null ? `url(#${hatchId})` : heatColor(bucket)}\n style={isFocus ? { stroke: 'var(--border-focus)', strokeWidth: 2, strokeDasharray: 'none' } : undefined}\n onPointerEnter={() => setFocus(inside.indexOf(c))}\n onPointerLeave={() => setFocus(null)}\n />\n );\n })}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">{focusCell ? describe(focusCell) : ''}</span>\n {focusCell ? (\n <ChartTooltip\n left={clampTooltipLeft(xOf(focusCell) + cell / 2, svgW, 60)}\n top={yOf(focusCell)}\n title={formatDayLabel(focusCell.day)}\n rows={[{ key: 'v', label: unit || 'Value', value: focusCell.value === null ? null : formatValue(focusCell.value) }]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n","/* ForestPlot — row banding and the keyboard focus ring. Colours are chart\n tokens only (style-scan-310 bans raw hex and px font sizes here). */\n.band {\n fill: var(--chart-grid);\n opacity: 0.35;\n}\n\n.focusRing {\n fill: none;\n stroke: var(--border-focus);\n stroke-width: 1.5;\n pointer-events: none;\n}\n","/**\n * components/charts/ForestPlot.tsx — one row per experiment: the point\n * estimate with its 95% confidence interval as a whisker, against a zero line\n * (V3.10, SPEC-310C §5 Growth; r5/visual.md §2 \"ForestPlot\").\n *\n * The question it answers is \"which changes REALLY helped?\", so the encoding\n * is about the interval, not the dot:\n * - interval entirely above zero → the positive diverging pole (azure),\n * - entirely below zero → the negative pole (danger),\n * - straddling zero → neutral ink (\"no detectable effect\"),\n * and the verdict is also written in words in every row's spoken label and\n * in the table — colour is never the only carrier.\n *\n * Honesty: a row whose estimate is still null (fewer pairs than the gate\n * needs) draws the unknown hatch across the plot with \"not enough pairs yet\",\n * never a dot at zero. An optional `gate` draws the adoption threshold as a\n * labelled dashed reference (the gate is \"CI low > gate\", SPEC-310B §5).\n *\n * Keyboard: the plot is one tab stop; ↑/↓ (Home/End) walk the rows and the\n * focused row is announced. Works at 375 px: the numeric column folds away\n * (it is in the table) and labels truncate with the full text spoken.\n */\nimport { useId, useRef, useState, type KeyboardEvent } from 'react';\nimport { CHART_DIVERGING_MID, CHART_DIVERGING_NEG, CHART_DIVERGING_POS, hatchPatternId } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend, HatchPattern } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { linearScale, niceTicks } from './chart-math.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport plot from './plot.module.css';\nimport styles from './ForestPlot.module.css';\n\nexport interface ForestRow {\n id: string;\n label: string;\n /** Point estimate (e.g. lift in percentage points); null = not estimable yet. */\n estimate: number | null;\n /** 95% CI bounds; null when the estimate is null. */\n low: number | null;\n high: number | null;\n /** Sample size behind the row (pairs); null = unknown. */\n n?: number | null;\n /** One short qualifier for the table (\"adopted\", \"running\", \"rejected\"). */\n detail?: string;\n}\n\nexport interface ForestPlotProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n rows: ForestRow[];\n /** Unit word after numbers in words and the table (\"pts\"). */\n unit?: string;\n /** A labelled reference the CI low must clear, e.g. { value: 0, label: 'Adoption gate' }. Drawn only when ≠ 0. */\n gate?: { value: number; label: string };\n formatValue?: (v: number) => string;\n /** What an unknown row says (default \"not enough pairs yet\"). */\n unknownText?: string;\n width?: number;\n ariaLabel?: string;\n}\n\nexport type ForestVerdict = 'positive' | 'negative' | 'none' | 'unknown';\n\n/** Where a row's interval sits relative to zero. */\nexport function forestVerdict(row: Pick<ForestRow, 'estimate' | 'low' | 'high'>): ForestVerdict {\n if (row.estimate === null || row.low === null || row.high === null) return 'unknown';\n if (row.low > 0) return 'positive';\n if (row.high < 0) return 'negative';\n return 'none';\n}\n\nconst VERDICT_WORDS: Record<ForestVerdict, string> = {\n positive: 'helped (interval above zero)',\n negative: 'hurt (interval below zero)',\n none: 'no clear effect (interval crosses zero)',\n unknown: 'unknown',\n};\n\nfunction verdictColor(verdict: ForestVerdict): string {\n if (verdict === 'positive') return CHART_DIVERGING_POS;\n if (verdict === 'negative') return CHART_DIVERGING_NEG;\n return 'var(--text-secondary)';\n}\n\nfunction signed(v: number, fmt: (v: number) => string): string {\n return v > 0 ? `+${fmt(v)}` : fmt(v);\n}\n\nconst ROW_H = 28;\nconst AXIS_H = 22;\nconst PAD_R = 12;\nconst NARROW = 480;\n\nexport function ForestPlot({\n title,\n description,\n caveat,\n status,\n rows,\n unit = '',\n gate,\n formatValue = (v) => (Math.abs(v) >= 10 ? v.toFixed(0) : v.toFixed(1)),\n unknownText = 'not enough pairs yet',\n width: fixedWidth,\n ariaLabel,\n}: ForestPlotProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const [active, setActive] = useState<number | null>(null);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const unitText = unit ? ` ${unit}` : '';\n\n const known = rows.filter((r) => forestVerdict(r) !== 'unknown');\n const resolvedStatus: ChartStatus = status ?? (rows.length === 0 ? { kind: 'empty', message: 'No experiments have run yet.' } : { kind: 'ready' });\n\n const narrow = width < NARROW;\n const labelW = Math.max(84, Math.min(180, Math.round(width * (narrow ? 0.3 : 0.26))));\n const valueW = narrow ? 0 : 118;\n const plotX0 = labelW + 8;\n const plotX1 = Math.max(plotX0 + 40, width - valueW - PAD_R);\n const bounds = known.flatMap((r) => [r.low!, r.high!]);\n const lo = Math.min(0, gate?.value ?? 0, ...bounds);\n const hi = Math.max(0, gate?.value ?? 0, ...bounds);\n const ticks = niceTicks(lo, hi === lo ? lo + 1 : hi, narrow ? 3 : 5);\n const xs = linearScale(ticks[0]!, ticks[ticks.length - 1]!, plotX0, plotX1);\n const bodyH = rows.length * ROW_H;\n const svgH = bodyH + AXIS_H;\n\n const spoken = (r: ForestRow): string => {\n const v = forestVerdict(r);\n if (v === 'unknown') return `${r.label}: ${unknownText}`;\n return `${r.label}: ${signed(r.estimate!, formatValue)}${unitText}, 95% interval ${signed(r.low!, formatValue)} to ${signed(r.high!, formatValue)}; ${VERDICT_WORDS[v]}`;\n };\n\n const positive = known.filter((r) => forestVerdict(r) === 'positive').length;\n const summary = ariaLabel ?? `${title}: ${rows.length} experiment${rows.length === 1 ? '' : 's'}, ${positive} with an interval above zero.`;\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (rows.length === 0) return;\n const cur = active ?? 0;\n const next = e.key === 'ArrowDown' ? cur + 1 : e.key === 'ArrowUp' ? cur - 1 : e.key === 'Home' ? 0 : e.key === 'End' ? rows.length - 1 : null;\n if (next === null) return;\n e.preventDefault();\n setActive(Math.max(0, Math.min(rows.length - 1, next)));\n }\n\n const columns: TableColumn<ForestRow>[] = [\n { key: 'label', label: 'Experiment', render: (r) => r.label },\n { key: 'est', label: `Estimate${unitText}`, numeric: true, render: (r) => (r.estimate === null ? '—' : signed(r.estimate, formatValue)) },\n {\n key: 'ci',\n label: '95% interval',\n numeric: true,\n render: (r) => (r.low === null || r.high === null ? '—' : `${signed(r.low, formatValue)} to ${signed(r.high, formatValue)}`),\n },\n { key: 'n', label: 'Pairs', numeric: true, render: (r) => (r.n === null || r.n === undefined ? '—' : String(r.n)) },\n { key: 'verdict', label: 'Reading', render: (r) => (forestVerdict(r) === 'unknown' ? unknownText : VERDICT_WORDS[forestVerdict(r)]) },\n ...(rows.some((r) => r.detail) ? [{ key: 'detail', label: 'Status', render: (r: ForestRow) => r.detail ?? '' }] : []),\n ];\n\n const activeRow = active !== null ? rows[active] : undefined;\n const labelChars = Math.floor(labelW / 7);\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={rows} rowKey={(r) => r.id} />}\n footer={\n <ChartLegend\n min={1}\n items={[\n { label: 'Helped', color: CHART_DIVERGING_POS },\n { label: 'Hurt', color: CHART_DIVERGING_NEG },\n { label: 'No clear effect', color: 'var(--text-secondary)' },\n ...(rows.length > known.length ? [{ label: unknownText, kind: 'hatch' as const }] : []),\n ]}\n />\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the up and down arrow keys to read each experiment.`}\n aria-describedby={liveId}\n onFocus={() => setActive((a) => a ?? (rows.length ? 0 : null))}\n onBlur={() => setActive(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={width} height={svgH} viewBox={`0 0 ${width} ${svgH}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {ticks.map((t) => (\n <g key={t}>\n <line className={plot.grid} x1={xs(t)} x2={xs(t)} y1={0} y2={bodyH} />\n <text className={plot.tick} x={xs(t)} y={svgH - 6} textAnchor=\"middle\">\n {t === 0 ? '0' : signed(t, formatValue)}\n </text>\n </g>\n ))}\n <line data-role=\"zero\" x1={xs(0)} x2={xs(0)} y1={0} y2={bodyH} stroke={CHART_DIVERGING_MID} strokeWidth={1.5} />\n {gate && gate.value !== 0 ? (\n <g data-role=\"gate\">\n <line className={plot.reference} x1={xs(gate.value)} x2={xs(gate.value)} y1={0} y2={bodyH} />\n </g>\n ) : null}\n {rows.map((r, i) => {\n const y = i * ROW_H + ROW_H / 2;\n const v = forestVerdict(r);\n const color = verdictColor(v);\n const isActive = active === i;\n return (\n <g key={r.id} data-row={r.id} data-verdict={v} opacity={active !== null && !isActive ? 0.55 : 1}>\n {i % 2 === 1 ? <rect className={styles.band} x={0} y={i * ROW_H} width={width} height={ROW_H} /> : null}\n <text className={plot.label} x={labelW} y={y} dy=\"0.32em\" textAnchor=\"end\">\n {r.label.length > labelChars ? `${r.label.slice(0, labelChars - 1)}…` : r.label}\n </text>\n {v === 'unknown' ? (\n <g data-role=\"unknown\">\n <rect\n className={plot.unknownMark}\n fill={`url(#${hatchId})`}\n x={plotX0 + 0.5}\n y={y - 5}\n width={Math.max(1, plotX1 - plotX0 - 1)}\n height={10}\n rx={2}\n />\n {!narrow ? (\n <text className={plot.tick} x={width - PAD_R} y={y} dy=\"0.32em\" textAnchor=\"end\">{unknownText}</text>\n ) : null}\n </g>\n ) : (\n <g>\n <line data-role=\"ci\" x1={xs(r.low!)} x2={xs(r.high!)} y1={y} y2={y} stroke={color} strokeWidth={2} strokeLinecap=\"round\" />\n <line x1={xs(r.low!)} x2={xs(r.low!)} y1={y - 5} y2={y + 5} stroke={color} strokeWidth={1.5} />\n <line x1={xs(r.high!)} x2={xs(r.high!)} y1={y - 5} y2={y + 5} stroke={color} strokeWidth={1.5} />\n <rect\n data-role=\"estimate\"\n className={plot.marker}\n x={xs(r.estimate!) - 5}\n y={y - 5}\n width={10}\n height={10}\n rx={2}\n fill={color}\n />\n {!narrow ? (\n <text className={plot.tick} x={width - PAD_R} y={y} dy=\"0.32em\" textAnchor=\"end\">\n {signed(r.estimate!, formatValue)} [{signed(r.low!, formatValue)}, {signed(r.high!, formatValue)}]\n </text>\n ) : null}\n </g>\n )}\n {isActive ? <rect className={styles.focusRing} x={1} y={i * ROW_H + 1} width={width - 2} height={ROW_H - 2} rx={3} /> : null}\n </g>\n );\n })}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">\n {activeRow ? spoken(activeRow) : ''}\n </span>\n </div>\n </ChartFrame>\n );\n}\n","/**\n * components/charts/StepBand.tsx — a value that changes in discrete steps,\n * with an uncertainty band around each step and markers for events (V3.10,\n * SPEC-310C §5 Growth: \"Harness StepBand with CI band and ▼ rollbacks\").\n *\n * The harness does not drift continuously — a version is adopted, holds,\n * and is replaced or rolled back — so a smoothed line would lie about WHEN\n * things changed. Each step holds its value flat from its own time until the\n * next step (the last one holds to `now`); the band is that step's 95%\n * interval, drawn as a soft wash of the quantity ramp; an event marker (▼ for\n * a rollback, ▲ for an adoption) sits on the top edge at its time, danger for\n * rollbacks, and every marker is also a row in the table.\n *\n * Honesty: a step whose value is null (a version with no measured lift yet)\n * is a GAP in the line with the unknown hatch across its span — never a\n * carried-over value. The baseline reference (usually 0 = \"the compiled\n * defaults\") is a labelled dashed line.\n *\n * Keyboard: one tab stop; ←/→ (Home/End) walk the steps, each announced\n * with its interval and span.\n */\nimport { useId, useRef, useState, type KeyboardEvent } from 'react';\nimport { CHART_DIVERGING_NEG, CHART_SEQUENTIAL, CHART_SEQUENTIAL_SOFT, hatchPatternId } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend, ChartTooltip, HatchPattern, clampTooltipLeft } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { linearScale, niceTicks } from './chart-math.js';\nimport { formatTimeLabel } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport plot from './plot.module.css';\n\nexport interface StepPoint {\n id: string;\n /** Epoch ms the step took effect. */\n at: number;\n /** The level from `at` until the next step; null = not measured. */\n value: number | null;\n /** 95% interval for this step; null / absent = no band. */\n low?: number | null;\n high?: number | null;\n /** Short name (\"h-0007\"). */\n label: string;\n /** One qualifier for the table and tooltip (\"adopted\", \"canary\"). */\n detail?: string;\n}\n\nexport interface StepMarker {\n id: string;\n at: number;\n kind: 'rollback' | 'adopt';\n label: string;\n}\n\nexport interface StepBandProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n steps: StepPoint[];\n markers?: StepMarker[];\n /** Right edge of the last step (default: now). */\n now?: number;\n /** Left edge (default: the first step). */\n from?: number;\n baseline?: { value: number; label: string };\n /** Unit word (\"pts\"). */\n unit?: string;\n formatValue?: (v: number) => string;\n formatTime?: (ms: number) => string;\n height?: number;\n width?: number;\n ariaLabel?: string;\n}\n\nexport interface StepSpan extends StepPoint {\n /** Where this step's flat segment ends (the next step's `at`, or `now`). */\n until: number;\n}\n\n/** Sort steps by time and give each the span it holds for. Pure. */\nexport function stepSpans(steps: ReadonlyArray<StepPoint>, now: number): StepSpan[] {\n const sorted = [...steps].filter((s) => Number.isFinite(s.at)).sort((a, b) => a.at - b.at);\n return sorted.map((s, i) => ({ ...s, until: Math.max(s.at, i + 1 < sorted.length ? sorted[i + 1]!.at : now) }));\n}\n\nconst PAD_T = 18;\nconst PAD_B = 26;\nconst PAD_R = 14;\n\nfunction signed(v: number, fmt: (v: number) => string): string {\n return v > 0 ? `+${fmt(v)}` : fmt(v);\n}\n\nexport function StepBand({\n title,\n description,\n caveat,\n status,\n steps,\n markers = [],\n now: nowProp,\n from: fromProp,\n baseline,\n unit = '',\n formatValue = (v) => (Math.abs(v) >= 10 ? v.toFixed(0) : v.toFixed(1)),\n formatTime = formatTimeLabel,\n height = 200,\n width: fixedWidth,\n ariaLabel,\n}: StepBandProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const [active, setActive] = useState<number | null>(null);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const unitText = unit ? ` ${unit}` : '';\n const now = nowProp ?? Date.now();\n const spans = stepSpans(steps, now);\n const known = spans.filter((s) => s.value !== null);\n const resolvedStatus: ChartStatus = status ?? (spans.length === 0\n ? { kind: 'empty', message: 'No versions yet — the compiled defaults are in force.' }\n : known.length === 0 ? { kind: 'unknown', reason: 'no version has a measured value yet.' } : { kind: 'ready' });\n\n const x0 = fromProp ?? spans[0]?.at ?? now - 1;\n const x1 = Math.max(now, ...spans.map((s) => s.until), ...markers.map((m) => m.at), x0 + 1);\n const ys0 = known.flatMap((s) => [s.value!, s.low ?? s.value!, s.high ?? s.value!]);\n const lo = Math.min(baseline?.value ?? 0, ...ys0);\n const hi = Math.max(baseline?.value ?? 0, ...ys0);\n const ticks = niceTicks(lo, hi === lo ? lo + 1 : hi, 4);\n const padL = Math.min(56, Math.max(30, Math.max(...ticks.map((t) => signed(t, formatValue).length)) * 7 + 10));\n const plotW = Math.max(40, width - padL - PAD_R);\n const plotH = height - PAD_T - PAD_B;\n const xs = linearScale(x0, x1, padL, padL + plotW);\n const ys = linearScale(ticks[0]!, ticks[ticks.length - 1]!, PAD_T + plotH, PAD_T);\n const cx = (t: number) => Math.min(padL + plotW, Math.max(padL, xs(t)));\n\n // One path per run of known steps; a null step breaks the line.\n const runs: string[] = [];\n let current: string[] = [];\n let prevY: number | null = null;\n for (const s of spans) {\n if (s.value === null) {\n if (current.length) runs.push(current.join(' '));\n current = [];\n prevY = null;\n continue;\n }\n const y = ys(s.value);\n const a = cx(s.at);\n const b = cx(s.until);\n current.push(prevY === null ? `M${a.toFixed(1)},${y.toFixed(1)}` : `L${a.toFixed(1)},${y.toFixed(1)}`);\n current.push(`L${b.toFixed(1)},${y.toFixed(1)}`);\n prevY = y;\n }\n if (current.length) runs.push(current.join(' '));\n\n const spoken = (s: StepSpan): string =>\n `${s.label}${s.detail ? ` (${s.detail})` : ''}, ${formatTime(s.at)} to ${formatTime(s.until)}: ` +\n (s.value === null\n ? 'not measured'\n : `${signed(s.value, formatValue)}${unitText}` +\n (s.low !== null && s.low !== undefined && s.high !== null && s.high !== undefined\n ? `, 95% interval ${signed(s.low, formatValue)} to ${signed(s.high, formatValue)}`\n : ''));\n\n const last = known[known.length - 1];\n const rollbacks = markers.filter((m) => m.kind === 'rollback').length;\n const summary = ariaLabel ?? `${title}: ${spans.length} step${spans.length === 1 ? '' : 's'}` +\n (last ? `, now ${signed(last.value!, formatValue)}${unitText}` : '') +\n (rollbacks ? `, ${rollbacks} rollback${rollbacks === 1 ? '' : 's'}` : '') + '.';\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (spans.length === 0) return;\n const cur = active ?? spans.length - 1;\n const next = e.key === 'ArrowLeft' ? cur - 1 : e.key === 'ArrowRight' ? cur + 1 : e.key === 'Home' ? 0 : e.key === 'End' ? spans.length - 1 : null;\n if (next === null) return;\n e.preventDefault();\n setActive(Math.max(0, Math.min(spans.length - 1, next)));\n }\n\n interface Row { id: string; when: number; what: string; value: string; interval: string }\n const tableRows: Row[] = [\n ...spans.map((s) => ({\n id: `s:${s.id}`,\n when: s.at,\n what: `${s.label}${s.detail ? ` · ${s.detail}` : ''}`,\n value: s.value === null ? '—' : signed(s.value, formatValue),\n interval: s.low === null || s.low === undefined || s.high === null || s.high === undefined ? '—' : `${signed(s.low, formatValue)} to ${signed(s.high, formatValue)}`,\n })),\n ...markers.map((m) => ({ id: `m:${m.id}`, when: m.at, what: `${m.kind === 'rollback' ? '▼ Rolled back' : '▲ Adopted'}: ${m.label}`, value: '', interval: '' })),\n ].sort((a, b) => a.when - b.when);\n const columns: TableColumn<Row>[] = [\n { key: 'when', label: 'When', render: (r) => formatTime(r.when) },\n { key: 'what', label: 'Step', render: (r) => r.what },\n { key: 'value', label: `Level${unitText}`, numeric: true, render: (r) => r.value },\n { key: 'ci', label: '95% interval', numeric: true, render: (r) => r.interval },\n ];\n\n const activeSpan = active !== null ? spans[active] : undefined;\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={tableRows} rowKey={(r) => r.id} />}\n footer={\n <ChartLegend\n items={[\n { label: 'Level', color: CHART_SEQUENTIAL, kind: 'line' },\n { label: '95% interval', color: CHART_SEQUENTIAL_SOFT },\n ...(rollbacks ? [{ label: '▼ rollback', color: CHART_DIVERGING_NEG }] : []),\n ...(spans.some((s) => s.value === null) ? [{ label: 'not measured', kind: 'hatch' as const }] : []),\n ]}\n />\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the left and right arrow keys to read each step.`}\n aria-describedby={liveId}\n onFocus={() => setActive((a) => a ?? (spans.length ? spans.length - 1 : null))}\n onBlur={() => setActive(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {ticks.map((t) => (\n <g key={t}>\n <line className={plot.grid} x1={padL} x2={padL + plotW} y1={ys(t)} y2={ys(t)} />\n <text className={plot.tick} x={padL - 6} y={ys(t)} dy=\"0.32em\" textAnchor=\"end\">{t === 0 ? '0' : signed(t, formatValue)}</text>\n </g>\n ))}\n <text className={plot.tick} x={padL} y={height - 8} textAnchor=\"start\">{formatTime(x0)}</text>\n <text className={plot.tick} x={padL + plotW} y={height - 8} textAnchor=\"end\">{formatTime(x1)}</text>\n {baseline ? (\n <g data-role=\"baseline\">\n <line className={plot.reference} x1={padL} x2={padL + plotW} y1={ys(baseline.value)} y2={ys(baseline.value)} />\n <text className={`${plot.tick} ${plot.halo}`} x={padL + 4} y={ys(baseline.value) - 5}>{baseline.label}</text>\n </g>\n ) : null}\n {spans.map((s, i) => {\n const a = cx(s.at);\n const b = Math.max(a + 1, cx(s.until));\n if (s.value === null) {\n return (\n <rect key={s.id} data-step={s.id} data-unknown=\"true\" className={plot.unknownMark} fill={`url(#${hatchId})`} x={a} y={PAD_T} width={b - a} height={plotH} opacity={0.6} />\n );\n }\n const hasBand = s.low !== null && s.low !== undefined && s.high !== null && s.high !== undefined;\n return (\n <g key={s.id} data-step={s.id} opacity={active !== null && active !== i ? 0.6 : 1}>\n {hasBand ? (\n <rect data-role=\"band\" x={a} y={ys(s.high!)} width={b - a} height={Math.max(1, ys(s.low!) - ys(s.high!))} fill={CHART_SEQUENTIAL_SOFT} opacity={0.35} />\n ) : null}\n </g>\n );\n })}\n {runs.map((d, i) => (\n <path key={i} data-role=\"level\" className={plot.line} stroke={CHART_SEQUENTIAL} d={d} />\n ))}\n {spans.map((s) =>\n s.value === null ? null : <circle key={`p${s.id}`} className={plot.marker} cx={cx(s.at)} cy={ys(s.value)} r={3.5} fill={CHART_SEQUENTIAL} />,\n )}\n {markers.map((m) => {\n const x = cx(m.at);\n const y = PAD_T - 2;\n const d = m.kind === 'rollback' ? `M${x - 5},${y - 8} L${x + 5},${y - 8} L${x},${y} Z` : `M${x - 5},${y} L${x + 5},${y} L${x},${y - 8} Z`;\n return (\n <path key={m.id} data-marker={m.kind} d={d} fill={m.kind === 'rollback' ? CHART_DIVERGING_NEG : CHART_SEQUENTIAL}>\n <title>{`${m.kind === 'rollback' ? 'Rolled back' : 'Adopted'}: ${m.label} · ${formatTime(m.at)}`}</title>\n </path>\n );\n })}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">{activeSpan ? spoken(activeSpan) : ''}</span>\n {activeSpan ? (\n <ChartTooltip\n left={clampTooltipLeft((cx(activeSpan.at) + cx(activeSpan.until)) / 2, width)}\n top={activeSpan.value === null ? PAD_T + plotH / 2 : ys(activeSpan.high ?? activeSpan.value)}\n title={`${activeSpan.label}${activeSpan.detail ? ` · ${activeSpan.detail}` : ''}`}\n rows={[\n { key: 'v', label: 'Level', value: activeSpan.value === null ? null : `${signed(activeSpan.value, formatValue)}${unitText}` },\n {\n key: 'ci',\n label: '95% interval',\n value: activeSpan.low === null || activeSpan.low === undefined || activeSpan.high === null || activeSpan.high === undefined\n ? null\n : `${signed(activeSpan.low, formatValue)} to ${signed(activeSpan.high, formatValue)}`,\n },\n { key: 't', label: 'From', value: formatTime(activeSpan.at) },\n ]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,s as n}from"./index-afDA8cwW.js";import{C as r,S as i,T as a,b as o,l as s,t as c,v as l,w as u,x as d,y as f}from"./useChartWidth-MEXvDxDL.js";import{_ as p,p as m,s as h}from"./colors-B-vHsX1S.js";var g={sparkline:`_sparkline_kr10w_1`,line:`_line_kr10w_6`,dot:`_dot_kr10w_14`,area:`_area_kr10w_18`,flat:`_flat_kr10w_25`},_=t();function v(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 y({points:e,width:t=72,height:n=24,ariaLabel:r,area:i=!1,describe:a}){let o=a?`${r}: ${v(e,a)}`:r,s=e.filter(e=>e!==null);if(s.length<2)return(0,_.jsx)(`svg`,{className:g.sparkline,width:t,height:n,viewBox:`0 0 ${t} ${n}`,role:`img`,"aria-label":o,children:(0,_.jsx)(`line`,{className:g.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,y=d(Math.max(c,0));return(0,_.jsxs)(`svg`,{className:g.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,_.jsx)(`path`,{className:g.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)},${y.toFixed(1)} L${e[0].x.toFixed(1)},${y.toFixed(1)} Z`},`a${t}`):null):null,f.map((e,t)=>(0,_.jsx)(`path`,{className:g.line,d:e.map((e,t)=>`${t===0?`M`:`L`}${e.x.toFixed(1)},${e.y.toFixed(1)}`).join(` `)},t)),h?(0,_.jsx)(`circle`,{className:g.dot,cx:h.x,cy:h.y,r:2}):null]})}var b=n(e(),1),x={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`},S=new Set([`queued`,`parked`,`waiting`]);function C(e){return e.outline??S.has(e.status.toLowerCase())}var ee=14,w=6,T=22,E=3,D={done:`success`,success:`success`,merged:`success`,failed:`danger`,error:`danger`,aborted:`neutral`,cancelled:`neutral`,running:`running`,queued:`neutral`,parked:`neutral`};function O(e){return D[e.toLowerCase()]??`unknown`}function te(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 ne(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 re(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 A({title:e,description:t,caveat:n,status:g,lanes:v,from:y,to:S,now:D,width:A,toneOf:j=O,formatTime:M=te,formatTick:ie,ariaLabel:ae}){let oe=ie??ne(y,S),N=(0,b.useRef)(null),P=c(N,A),[F,se]=(0,b.useState)(0),[I,L]=(0,b.useState)(null),R=(0,b.useId)(),z=m((0,b.useId)()),B=D??S,V=v.reduce((e,t)=>e+t.items.length,0),ce=g??(V===0?{kind:`empty`,message:`No runs in this window.`}:{kind:`ready`}),H=v.some(e=>e.engine!==void 0)?18:0,U=Math.max(72,Math.min(160,Math.round(P*.24)))+H,W=Math.floor((U-H)/7),G=Math.max(40,P-U-8),K=s(y,Math.max(S,y+1),U,U+G),q=v.length>50,J=q?Math.max(0,Math.floor(F/24)-w):0,Y=q?Math.min(v.length,Math.ceil(F/24)+ee+w):v.length,X=v.length*24,le=(0,b.useMemo)(()=>{let e=new Map;for(let t of v)for(let n of t.items){let t=j(n.status),r=C(n)?`outline`:t===`unknown`?`hatch`:t,i=r===`outline`?{kind:`empty`}:r===`hatch`?{kind:`hatch`}:{color:p(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(` / `)}))},[v,j]),ue=v.some(e=>e.engine!==void 0),Z=(0,b.useMemo)(()=>{let e=Math.max(2,Math.floor(G/90)),t=(S-y)/Math.max(1,e);return Array.from({length:e+1},(e,n)=>y+t*n)},[y,S,G]),Q=(0,b.useMemo)(()=>v.flatMap(e=>e.items.map(t=>({...t,lane:e.label,engine:e.engine}))),[v]);function de(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 fe=ae??`${e}: ${V} runs across ${v.length} lanes from ${M(y)} to ${M(S)}.`,pe=[{key:`lane`,label:`Lane`,render:e=>e.lane},...ue?[{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=>M(e.start)},{key:`dur`,label:`Duration`,numeric:!0,render:e=>e.end===null?`${k(B-e.start)}+`:k(e.end-e.start)},{key:`detail`,label:`Detail`,render:e=>e.detail??``}],$=I?v[I.lane]?.items[I.item]:void 0;function me(e,t){let n=t*24;return(0,_.jsxs)(`g`,{"data-lane":e.id,children:[t%2==1?(0,_.jsx)(`rect`,{className:x.band,x:0,y:n,width:P,height:24}):null,e.engine?(0,_.jsx)(d,{engine:e.engine,x:2,y:n+5,height:14}):null,(0,_.jsx)(`text`,{className:u.label,x:U-8,y:n+12,dy:`0.32em`,textAnchor:`end`,children:re(e.label,W)}),e.items.map((e,r)=>{let i=Math.max(y,e.start),a=Math.min(S,e.end??B);if(a<y||i>S)return null;let o=K(i),s=Math.max(E,K(Math.max(a,i))-o),c=j(e.status),l=C(e),d=!l&&c===`unknown`;return(0,_.jsx)(`rect`,{"data-item":e.id,"data-status":e.status,"data-open":e.end===null?`true`:void 0,"data-style":l?`outline`:d?`hatch`:`fill`,className:`${x.bar} ${e.stale?x.stale:``} ${e.end===null?x.open:``} ${l?x.outline:``} ${d?u.unknownMark:``}`,x:l?o+.5:o,y:l?n+5.5:n+5,width:l?Math.max(E,s-1):s,height:l?13:14,rx:3,fill:l?`none`:d?`url(#${z})`:p(c),stroke:l?h:void 0,onPointerEnter:()=>L({lane:t,item:r}),onPointerLeave:()=>L(e=>e&&e.lane===t&&e.item===r?null:e)},e.id)})]},e.id)}let he=(0,_.jsxs)(`svg`,{className:u.svg,width:P,height:T,viewBox:`0 0 ${P} ${T}`,"aria-hidden":`true`,children:[(0,_.jsx)(`line`,{className:u.axis,x1:U,x2:U+G,y1:21,y2:21}),Z.map((e,t)=>(0,_.jsx)(`text`,{className:u.tick,x:K(e),y:15,textAnchor:t===0?`start`:t===Z.length-1?`end`:`middle`,children:oe(e)},e))]});return(0,_.jsx)(l,{title:e,description:t,caveat:n,status:ce,table:(0,_.jsx)(a,{caption:e,columns:pe,rows:Q,rowKey:e=>e.id}),footer:(0,_.jsx)(f,{min:1,items:le}),children:(0,_.jsxs)(`div`,{ref:N,className:u.plotWrap,children:[he,(0,_.jsxs)(`div`,{className:q?x.scroller:void 0,style:q?{height:336}:void 0,onScroll:q?e=>se(e.currentTarget.scrollTop):void 0,"data-virtualized":q?`true`:void 0,children:[(0,_.jsxs)(`svg`,{className:u.svg,width:P,height:X,viewBox:`0 0 ${P} ${X}`,role:`img`,"aria-label":fe,children:[(0,_.jsx)(`defs`,{children:(0,_.jsx)(i,{id:z})}),Z.map(e=>(0,_.jsx)(`line`,{className:u.grid,x1:K(e),x2:K(e),y1:0,y2:X},e)),B>=y&&B<=S?(0,_.jsx)(`line`,{className:x.now,x1:K(B),x2:K(B),y1:0,y2:X}):null,v.slice(J,Y).map((e,t)=>me(e,J+t))]}),(0,_.jsx)(`ul`,{className:x.laneStops,style:{height:X},"aria-label":`${e} lanes`,"aria-describedby":R,children:v.slice(J,Y).map((e,t)=>(0,_.jsx)(`li`,{tabIndex:0,className:`${x.laneStop} ${u.focusable}`,style:{top:(J+t)*24,height:24},"aria-label":de(e),onFocus:()=>L(e.items.length?{lane:J+t,item:e.items.length-1}:null),onBlur:()=>L(null)},e.id))})]}),(0,_.jsx)(`span`,{id:R,className:u.srOnly,children:`Each lane lists its runs by status; open the Table view for every run.`}),I&&$?(0,_.jsx)(o,{left:r(K(Math.max(y,$.start)),P),top:T+I.lane*24-(q?F:0),title:v[I.lane].label,rows:[{key:`s`,label:`Status`,value:`${$.status}${$.stale?` (stale)`:``}`,...C($)||j($.status)===`unknown`?{}:{color:p(j($.status))}},{key:`t`,label:`Started`,value:M($.start)},{key:`d`,label:`Duration`,value:$.end===null?`${k(B-$.start)} so far`:k($.end-$.start)},...$.detail?[{key:`x`,label:`Detail`,value:$.detail}]:[]]}):null]})})}export{y as n,A as t};
2
- //# sourceMappingURL=Swimlane-BR40WVcj.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Swimlane-BR40WVcj.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/Sparkline.module.css","../../../../../../src/web-ui/components/charts/Sparkline.tsx","../../../../../../src/web-ui/components/charts/Swimlane.module.css","../../../../../../src/web-ui/components/charts/Swimlane.tsx"],"sourcesContent":[".sparkline {\n display: block;\n overflow: visible;\n}\n\n.line {\n fill: none;\n stroke: var(--text-tertiary);\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.dot {\n fill: var(--chart-sequential);\n}\n\n.area {\n fill: var(--chart-sequential);\n opacity: 0.1;\n stroke: none;\n}\n\n/* Fewer than two known points: a quiet dashed baseline, not an empty box. */\n.flat {\n stroke: var(--chart-grid);\n stroke-width: 1;\n stroke-dasharray: 2 2;\n}\n","/**\n * components/charts/Sparkline.tsx — the 12-ish-point inline trend for a\n * stat tile (marks-and-anatomy.md \"Figures\" stat-tile contract). No axes,\n * no legend, no tooltip — it is a glance, not a chart; the real numbers\n * live in the stat tile's value and in the full chart elsewhere on the\n * view. Gaps (`null`) break the line rather than reading as a dip to zero.\n *\n * V3.10: optional `area` wash, an optional `describe` formatter that appends a\n * spoken summary (first → latest, min–max) to the aria-label so the glance is\n * not image-only for a screen reader, and a designed flat/unknown state (a\n * dashed baseline) instead of an empty box when fewer than two points are known.\n */\nimport './chart-tokens.css';\nimport styles from './Sparkline.module.css';\n\nexport function sparklineSummary(points: (number | null)[], format: (v: number) => string): string {\n const known = points.filter((p): p is number => p !== null && Number.isFinite(p));\n if (known.length === 0) return 'no data';\n const first = known[0]!;\n const latest = known[known.length - 1]!;\n const gaps = points.length - known.length;\n return `from ${format(first)} to ${format(latest)}, range ${format(Math.min(...known))} to ${format(Math.max(...known))}` +\n (gaps > 0 ? `, ${gaps} point${gaps === 1 ? '' : 's'} without data` : '');\n}\n\nexport function Sparkline({\n points,\n width = 72,\n height = 24,\n ariaLabel,\n area = false,\n describe,\n}: {\n points: (number | null)[];\n width?: number;\n height?: number;\n ariaLabel: string;\n /** Soft 10% wash under the line. */\n area?: boolean;\n /** When given, a spoken summary is appended to `ariaLabel`. */\n describe?: (v: number) => string;\n}) {\n const label = describe ? `${ariaLabel}: ${sparklineSummary(points, describe)}` : ariaLabel;\n const known = points.filter((p): p is number => p !== null);\n if (known.length < 2) {\n return (\n <svg className={styles.sparkline} width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={label}>\n <line className={styles.flat} x1={1} x2={width - 1} y1={height - 1.5} y2={height - 1.5} />\n </svg>\n );\n }\n const min = Math.min(...known, 0);\n const max = Math.max(...known, 0);\n const range = max - min || 1;\n const stepX = width / Math.max(1, points.length - 1);\n const yOf = (v: number) => height - ((v - min) / range) * (height - 2) - 1;\n\n // Split into contiguous runs so a null renders as a real gap, not a dip.\n const runs: { x: number; y: number }[][] = [];\n let current: { x: number; y: number }[] = [];\n points.forEach((v, i) => {\n if (v === null) {\n if (current.length) runs.push(current);\n current = [];\n return;\n }\n current.push({ x: i * stepX, y: yOf(v) });\n });\n if (current.length) runs.push(current);\n\n const lastKnownIndex = points.map((v) => v !== null).lastIndexOf(true);\n const lastPoint =\n lastKnownIndex >= 0 ? { x: lastKnownIndex * stepX, y: yOf(points[lastKnownIndex] as number) } : null;\n const baseY = yOf(Math.max(min, 0));\n\n return (\n <svg className={styles.sparkline} width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={label}>\n {area\n ? runs.map((run, i) =>\n run.length > 1 ? (\n <path\n key={`a${i}`}\n className={styles.area}\n d={`${run.map((p, j) => `${j === 0 ? 'M' : 'L'}${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(' ')} L${run[run.length - 1]!.x.toFixed(1)},${baseY.toFixed(1)} L${run[0]!.x.toFixed(1)},${baseY.toFixed(1)} Z`}\n />\n ) : null,\n )\n : null}\n {runs.map((run, i) => (\n <path\n key={i}\n className={styles.line}\n d={run.map((p, j) => `${j === 0 ? 'M' : 'L'}${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(' ')}\n />\n ))}\n {lastPoint ? <circle className={styles.dot} cx={lastPoint.x} cy={lastPoint.y} r={2} /> : null}\n </svg>\n );\n}\n",".scroller {\n position: relative;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n\n.band {\n fill: var(--chart-grid);\n opacity: 0.35;\n}\n\n.bar {\n cursor: default;\n}\n\n/* Running on disk but silent for a long time: faded, and said in words in\n the tooltip and table — the fade is never the only signal. */\n.stale {\n opacity: 0.4;\n}\n\n.open {\n /* Square corners on open-ended work: a rounded end reads as \"finished\". */\n rx: 0;\n}\n\n.now {\n stroke: var(--text-tertiary);\n stroke-width: 1;\n stroke-dasharray: 2 3;\n}\n\n.laneStops {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n margin: 0;\n padding: 0;\n list-style: none;\n pointer-events: none;\n}\n\n.laneStop {\n position: absolute;\n left: 0;\n right: 0;\n}\n\n/* Queued / parked: a neutral outline, no fill — holding a place, not running. */\n.outline {\n stroke-width: 1.5;\n}\n","/**\n * components/charts/Swimlane.tsx — who ran what, when: one row (lane) per repo\n * or agent, one bar per run from its start to its end, coloured by STATUS\n * (the StatusBadge tones — state, not identity — always with a text legend).\n *\n * Open-ended work: a bar with `end: null` extends to `now` and gets an open\n * right edge; a `stale` one (running on disk, silent for a long time) is drawn\n * faded and says so in its tooltip and the table.\n *\n * V3.10: a lane may carry its ENGINE — drawn as the 2px identity tick and\n * the C/X/G/L monogram beside the label (never a vendor logo, and never the\n * bar fill: bars keep STATUS colour). Queued and parked work draws as a\n * neutral OUTLINE with no fill (\"not running yet\" must not look like a\n * status), and an unknown status draws as the 45° unknown hatch.\n *\n * Scale: past VIRTUALIZE_AFTER lanes the body becomes a fixed-height scroller\n * that renders only the rows in view (plus overscan), so a 500-lane history\n * costs the same DOM as a 20-lane one. Each lane is a keyboard stop with a\n * spoken summary; every run is in the Table view.\n */\nimport { useId, useMemo, useRef, useState, type UIEvent } from 'react';\nimport { CHART_QUEUED_OUTLINE, hatchPatternId, toneColor, type ChartEngine, type ChartTone } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend, ChartTooltip, EngineTick, HatchPattern, clampTooltipLeft, type ChartLegendItem } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { linearScale } from './chart-math.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport plot from './plot.module.css';\nimport styles from './Swimlane.module.css';\n\nexport interface SwimlaneItem {\n id: string;\n /** Epoch ms. */\n start: number;\n /** Epoch ms; null while still running. */\n end: number | null;\n /** Free-form status string (done / failed / aborted / running …). */\n status: string;\n /** Optional short text for tooltip and table (e.g. the engine). */\n detail?: string;\n stale?: boolean;\n /**\n * Draw as an outline with no fill — queued / parked work that holds a place\n * in line but is not running. Defaults to true for the statuses in\n * OUTLINE_STATUSES.\n */\n outline?: boolean;\n}\n\nexport interface SwimlaneLane {\n id: string;\n label: string;\n items: SwimlaneItem[];\n /** The lane's engine: a 2px identity tick + monogram beside the label. */\n engine?: ChartEngine;\n}\n\n/** Statuses that draw as an outline by default (they hold a place; nothing runs). */\nexport const OUTLINE_STATUSES: ReadonlySet<string> = new Set(['queued', 'parked', 'waiting']);\n\nfunction isOutline(item: SwimlaneItem): boolean {\n return item.outline ?? OUTLINE_STATUSES.has(item.status.toLowerCase());\n}\n\nexport interface SwimlaneProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n lanes: SwimlaneLane[];\n /** Visible time window, epoch ms. */\n from: number;\n to: number;\n /** \"Now\" for open-ended bars (defaults to `to`). */\n now?: number;\n width?: number;\n /** Map a status string to a tone. Defaults to the StatusBadge vocabulary subset below. */\n toneOf?: (status: string) => ChartTone;\n /** Full timestamp for tooltip and table. */\n formatTime?: (ms: number) => string;\n /** Axis tick label. Defaults to a span-aware short form (dates past 36 h, clock times below). */\n formatTick?: (ms: number) => string;\n ariaLabel?: string;\n}\n\nexport const ROW_H = 24;\nexport const VIRTUALIZE_AFTER = 50;\nconst VIEWPORT_ROWS = 14;\nconst OVERSCAN = 6;\nconst AXIS_H = 22;\nconst MIN_BAR_W = 3;\n\nconst DEFAULT_TONES: Record<string, ChartTone> = {\n done: 'success',\n success: 'success',\n merged: 'success',\n failed: 'danger',\n error: 'danger',\n aborted: 'neutral',\n cancelled: 'neutral',\n running: 'running',\n queued: 'neutral',\n parked: 'neutral',\n};\n\nfunction defaultToneOf(status: string): ChartTone {\n return DEFAULT_TONES[status.toLowerCase()] ?? 'unknown';\n}\n\nfunction defaultFormatTime(ms: number): string {\n const d = new Date(ms);\n return Number.isNaN(d.getTime())\n ? ''\n : d.toLocaleString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });\n}\n\n/** Short axis labels: long windows get dates, short ones get clock times — full timestamps collide. */\nexport function spanTickFormatter(from: number, to: number): (ms: number) => string {\n const long = to - from > 36 * 3_600_000;\n return (ms) => {\n const d = new Date(ms);\n if (Number.isNaN(d.getTime())) return '';\n return long\n ? d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })\n : d.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' });\n };\n}\n\nfunction truncateLabel(label: string, chars: number): string {\n return label.length > chars ? `${label.slice(0, Math.max(1, chars - 1))}…` : label;\n}\n\nfunction formatDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) return '—';\n const m = Math.round(ms / 60_000);\n if (m < 1) return '<1m';\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n return h < 48 ? `${h}h ${m % 60}m` : `${Math.round(h / 24)}d`;\n}\n\ninterface FlatItem extends SwimlaneItem {\n lane: string;\n engine: ChartEngine | undefined;\n}\n\nexport function Swimlane({\n title,\n description,\n caveat,\n status,\n lanes,\n from,\n to,\n now,\n width: fixedWidth,\n toneOf = defaultToneOf,\n formatTime = defaultFormatTime,\n formatTick,\n ariaLabel,\n}: SwimlaneProps) {\n const tickLabel = formatTick ?? spanTickFormatter(from, to);\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const [scrollTop, setScrollTop] = useState(0);\n const [hover, setHover] = useState<{ lane: number; item: number } | null>(null);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const nowMs = now ?? to;\n\n const itemCount = lanes.reduce((n, l) => n + l.items.length, 0);\n const resolvedStatus: ChartStatus = status ?? (itemCount === 0 ? { kind: 'empty', message: 'No runs in this window.' } : { kind: 'ready' });\n\n // Narrow screens give the labels less room, never less than a readable 72 px\n // (plus room for the engine tick and monogram when lanes carry one).\n const tickW = lanes.some((l) => l.engine !== undefined) ? 18 : 0;\n const labelW = Math.max(72, Math.min(160, Math.round(width * 0.24))) + tickW;\n const labelChars = Math.floor((labelW - tickW) / 7);\n const plotW = Math.max(40, width - labelW - 8);\n const xs = linearScale(from, Math.max(to, from + 1), labelW, labelW + plotW);\n const virtual = lanes.length > VIRTUALIZE_AFTER;\n const first = virtual ? Math.max(0, Math.floor(scrollTop / ROW_H) - OVERSCAN) : 0;\n const last = virtual ? Math.min(lanes.length, Math.ceil(scrollTop / ROW_H) + VIEWPORT_ROWS + OVERSCAN) : lanes.length;\n const bodyH = lanes.length * ROW_H;\n\n // Legend: one entry per drawn style — a status tone, the outline (queued /\n // parked) or the unknown hatch — each named by the statuses it stands for.\n const legendItems = useMemo((): ChartLegendItem[] => {\n const seen = new Map<string, { item: Omit<ChartLegendItem, 'label'>; names: Set<string> }>();\n for (const lane of lanes) for (const item of lane.items) {\n const tone = toneOf(item.status);\n const key = isOutline(item) ? 'outline' : tone === 'unknown' ? 'hatch' : tone;\n const style: Omit<ChartLegendItem, 'label'> = key === 'outline' ? { kind: 'empty' } : key === 'hatch' ? { kind: 'hatch' } : { color: toneColor(tone) };\n if (!seen.has(key)) seen.set(key, { item: style, names: new Set() });\n seen.get(key)!.names.add(item.status.toLowerCase());\n }\n return [...seen.values()].map(({ item, names }) => ({ ...item, label: [...names].sort().join(' / ') }));\n }, [lanes, toneOf]);\n const anyEngine = lanes.some((l) => l.engine !== undefined);\n\n const ticks = useMemo(() => {\n const count = Math.max(2, Math.floor(plotW / 90));\n const step = (to - from) / Math.max(1, count);\n return Array.from({ length: count + 1 }, (_, i) => from + step * i);\n }, [from, to, plotW]);\n\n const flat: FlatItem[] = useMemo(\n () => lanes.flatMap((lane) => lane.items.map((item) => ({ ...item, lane: lane.label, engine: lane.engine }))),\n [lanes],\n );\n\n function laneSummary(lane: SwimlaneLane): string {\n const counts = new Map<string, number>();\n for (const item of lane.items) counts.set(item.status, (counts.get(item.status) ?? 0) + 1);\n const parts = [...counts.entries()].sort((a, b) => b[1] - a[1]).map(([s, n]) => `${n} ${s}`);\n const engine = lane.engine ? ` (${lane.engine})` : '';\n return `${lane.label}${engine}: ${lane.items.length} run${lane.items.length === 1 ? '' : 's'}${parts.length ? ` (${parts.join(', ')})` : ''}`;\n }\n\n const summary = ariaLabel ?? `${title}: ${itemCount} runs across ${lanes.length} lanes from ${formatTime(from)} to ${formatTime(to)}.`;\n\n const columns: TableColumn<FlatItem>[] = [\n { key: 'lane', label: 'Lane', render: (r) => r.lane },\n ...(anyEngine ? [{ key: 'engine', label: 'Engine', render: (r: FlatItem) => r.engine ?? '—' }] : []),\n { key: 'status', label: 'Status', render: (r) => `${r.status}${r.stale ? ' (stale)' : ''}` },\n { key: 'start', label: 'Started', render: (r) => formatTime(r.start) },\n { key: 'dur', label: 'Duration', numeric: true, render: (r) => (r.end === null ? `${formatDuration(nowMs - r.start)}+` : formatDuration(r.end - r.start)) },\n { key: 'detail', label: 'Detail', render: (r) => r.detail ?? '' },\n ];\n\n const hovered = hover ? lanes[hover.lane]?.items[hover.item] : undefined;\n\n function renderLane(lane: SwimlaneLane, index: number) {\n const y = index * ROW_H;\n return (\n <g key={lane.id} data-lane={lane.id}>\n {index % 2 === 1 ? <rect className={styles.band} x={0} y={y} width={width} height={ROW_H} /> : null}\n {lane.engine ? <EngineTick engine={lane.engine} x={2} y={y + 5} height={ROW_H - 10} /> : null}\n <text className={plot.label} x={labelW - 8} y={y + ROW_H / 2} dy=\"0.32em\" textAnchor=\"end\">\n {truncateLabel(lane.label, labelChars)}\n </text>\n {lane.items.map((item, itemIndex) => {\n const start = Math.max(from, item.start);\n const endMs = Math.min(to, item.end ?? nowMs);\n if (endMs < from || start > to) return null;\n const x0 = xs(start);\n const w = Math.max(MIN_BAR_W, xs(Math.max(endMs, start)) - x0);\n const tone = toneOf(item.status);\n const outline = isOutline(item);\n const unknown = !outline && tone === 'unknown';\n return (\n <rect\n key={item.id}\n data-item={item.id}\n data-status={item.status}\n data-open={item.end === null ? 'true' : undefined}\n data-style={outline ? 'outline' : unknown ? 'hatch' : 'fill'}\n className={`${styles.bar} ${item.stale ? styles.stale : ''} ${item.end === null ? styles.open : ''} ${outline ? styles.outline : ''} ${unknown ? plot.unknownMark : ''}`}\n x={outline ? x0 + 0.5 : x0}\n y={outline ? y + 5.5 : y + 5}\n width={outline ? Math.max(MIN_BAR_W, w - 1) : w}\n height={outline ? ROW_H - 11 : ROW_H - 10}\n rx={3}\n fill={outline ? 'none' : unknown ? `url(#${hatchId})` : toneColor(tone)}\n stroke={outline ? CHART_QUEUED_OUTLINE : undefined}\n onPointerEnter={() => setHover({ lane: index, item: itemIndex })}\n onPointerLeave={() => setHover((h) => (h && h.lane === index && h.item === itemIndex ? null : h))}\n />\n );\n })}\n </g>\n );\n }\n\n const axis = (\n <svg className={plot.svg} width={width} height={AXIS_H} viewBox={`0 0 ${width} ${AXIS_H}`} aria-hidden=\"true\">\n <line className={plot.axis} x1={labelW} x2={labelW + plotW} y1={AXIS_H - 1} y2={AXIS_H - 1} />\n {ticks.map((t, i) => (\n <text\n key={t}\n className={plot.tick}\n x={xs(t)}\n y={AXIS_H - 7}\n textAnchor={i === 0 ? 'start' : i === ticks.length - 1 ? 'end' : 'middle'}\n >\n {tickLabel(t)}\n </text>\n ))}\n </svg>\n );\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n table={<TableView caption={title} columns={columns} rows={flat} rowKey={(r) => r.id} />}\n footer={<ChartLegend min={1} items={legendItems} />}\n >\n <div ref={wrapRef} className={plot.plotWrap}>\n {axis}\n <div\n className={virtual ? styles.scroller : undefined}\n style={virtual ? { height: VIEWPORT_ROWS * ROW_H } : undefined}\n onScroll={virtual ? (e: UIEvent<HTMLDivElement>) => setScrollTop(e.currentTarget.scrollTop) : undefined}\n data-virtualized={virtual ? 'true' : undefined}\n >\n <svg className={plot.svg} width={width} height={bodyH} viewBox={`0 0 ${width} ${bodyH}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {ticks.map((t) => (\n <line key={t} className={plot.grid} x1={xs(t)} x2={xs(t)} y1={0} y2={bodyH} />\n ))}\n {nowMs >= from && nowMs <= to ? (\n <line className={styles.now} x1={xs(nowMs)} x2={xs(nowMs)} y1={0} y2={bodyH} />\n ) : null}\n {lanes.slice(first, last).map((lane, i) => renderLane(lane, first + i))}\n </svg>\n {/* Keyboard + screen-reader lane list, overlaid on the rows it describes. */}\n <ul className={styles.laneStops} style={{ height: bodyH }} aria-label={`${title} lanes`} aria-describedby={liveId}>\n {lanes.slice(first, last).map((lane, i) => (\n <li\n key={lane.id}\n tabIndex={0}\n className={`${styles.laneStop} ${plot.focusable}`}\n style={{ top: (first + i) * ROW_H, height: ROW_H }}\n aria-label={laneSummary(lane)}\n onFocus={() => setHover(lane.items.length ? { lane: first + i, item: lane.items.length - 1 } : null)}\n onBlur={() => setHover(null)}\n />\n ))}\n </ul>\n </div>\n <span id={liveId} className={plot.srOnly}>Each lane lists its runs by status; open the Table view for every run.</span>\n {hover && hovered ? (\n <ChartTooltip\n left={clampTooltipLeft(xs(Math.max(from, hovered.start)), width)}\n top={AXIS_H + hover.lane * ROW_H - (virtual ? scrollTop : 0)}\n title={lanes[hover.lane]!.label}\n rows={[\n {\n key: 's',\n label: 'Status',\n value: `${hovered.status}${hovered.stale ? ' (stale)' : ''}`,\n ...(isOutline(hovered) || toneOf(hovered.status) === 'unknown' ? {} : { color: toneColor(toneOf(hovered.status)) }),\n },\n { key: 't', label: 'Started', value: formatTime(hovered.start) },\n {\n key: 'd',\n label: 'Duration',\n value: hovered.end === null ? `${formatDuration(nowMs - hovered.start)} so far` : formatDuration(hovered.end - hovered.start),\n },\n ...(hovered.detail ? [{ key: 'x', label: 'Detail', value: hovered.detail }] : []),\n ]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n"],"mappings":"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"}
@@ -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-afDA8cwW.js";import{D as i,O as a,P as o,a as s,j as c,l,s as u,u as d}from"./global-DVgMguLr.js";import{a as f,l as p,o as m}from"./command-catalog-s3W6Z96D.js";import{v as h}from"./workbench-types-DzN-5trg.js";import{n as g}from"./viewport-ZB86jdES.js";import{i as _,r as ee}from"./section-visibility-CSrsTcwK.js";import{T as te,l as ne,v as re,x as ie}from"./icons-DWb24OA6.js";import{n as ae,t as oe}from"./ActionMenu-DhbNne-M.js";import{n as v,t as y}from"./Button-0-nNbv1h.js";import{t as b}from"./EmptyState-DdJ4CxtO.js";import{f as se,r as ce,u as le}from"./terminal-icons-CxUYaWX9.js";var x=n(e(),1),S=class extends Error{constructor(){super(`Unlock actions with the mutation token to use the terminal.`),this.name=`TerminalLockedError`}};async function C(e,t){let n=i();if(!n)throw new S;let r=await d(e,t,n);return o(),r}function w(e,t){return`${h}/${encodeURIComponent(e)}/${t}`}var T={list:e=>l(h,e),create:async e=>(await C(h,e)).tab,input:(e,t)=>C(w(e,`input`),{dataBase64:t}),resize:(e,t,n)=>C(w(e,`resize`),{cols:t,rows:n}),kill:async e=>{await C(w(e,`kill`),{})},openExternal:async(e,t)=>{await C(`${h}/open-external`,t===void 0?{sessionId:e}:{sessionId:e,root:t})}};function E(e,t){let n=Number.isSafeInteger(t)&&t>0?`?after=${t}`:``;return`${w(e,`stream`)}${n}`}function ue(e){let t=``;for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));return btoa(t)}function de(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 fe(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 pe(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(ue(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 me(e){return Math.min(250*2**e,8e3)}function he(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 ge(e,t,n,r={}){let i=r.fetch??((e,t)=>fetch(e,t)),o=r.renew??c,s=r.proof??a,l=r.backoffMs??me,u=!1,d=null,f=null,p=0,m=!1,h=e=>{(!u||e===`closed`)&&n.onState?.(e)},g=()=>{u||(h(`reconnecting`),f=setTimeout(()=>{f=null,_()},l(p++)))};async function _(){if(u)return;d=new AbortController;let r;try{r=await i(E(e,t()),{method:`GET`,credentials:`same-origin`,headers:{"x-ashlr-read-client":s(),Accept:`text/event-stream`},signal:d.signal,cache:`no-store`})}catch{g();return}if(u)return;if(r.status===404){h(`gone`),u=!0;return}if(r.status===401){if(!m&&await o().catch(()=>!1)){m=!0,_();return}h(`expired`),u=!0;return}if(!r.ok||!r.body){g();return}m=!1,h(`open`);let a=r.body.getReader(),c=new TextDecoder,l=``;try{for(;;){let{value:e,done:t}=await a.read();if(t)break;p=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=he(e);t&&!u&&n.onFrame(t)}}}catch{}g()}return h(`connecting`),_(),{close(){u||(u=!0,f&&clearTimeout(f),d?.abort(),n.onState?.(`closed`))}}}var _e=5e3,D=null;function ve(){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 ve(),r=new t({fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:1.2,cursorBlink:!0,cursorStyle:`bar`,scrollback:_e,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()}}},ye={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 be(e){let t=document.createElement(`span`);t.style.display=`none`,e.appendChild(t);let n={};try{for(let[r,i]of Object.entries(ye)){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 xe(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 Se(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_uj2pz_15`,loading:`_loading_uj2pz_91`,strip:`_strip_uj2pz_100`,tabs:`_tabs_uj2pz_109`,tab:`_tab_uj2pz_109`,tabButton:`_tabButton_uj2pz_142`,tabClose:`_tabClose_uj2pz_159`,noticeClose:`_noticeClose_uj2pz_160`,tabTitle:`_tabTitle_uj2pz_165`,tabExited:`_tabExited_uj2pz_171`,unseen:`_unseen_uj2pz_180`,stripActions:`_stripActions_uj2pz_215`,header:`_header_uj2pz_225`,cwd:`_cwd_uj2pz_236`,headerStatus:`_headerStatus_uj2pz_248`,headerActions:`_headerActions_uj2pz_255`,notice:`_notice_uj2pz_160`,inlineNotice:`_inlineNotice_uj2pz_293`,body:`_body_uj2pz_301`,panel:`_panel_uj2pz_311`,viewport:`_viewport_uj2pz_320`,host:`_host_uj2pz_327`,viewLoading:`_viewLoading_uj2pz_344`,exitBar:`_exitBar_uj2pz_349`},M=t(),Ce={api:T,createView:O,openStream:ge,platform:f(),writeClipboard:async e=>{await navigator.clipboard.writeText(e)}},we=3e3,N=`ashlr.verse.terminal.screenReader`,P=0;function Te(){P=0}function Ee(){try{return localStorage.getItem(N)===`1`}catch{return!1}}function De(e){try{localStorage.setItem(N,e?`1`:`0`)}catch{}}function Oe(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 F(e,t){if(e instanceof S)return e.message;if(e instanceof u){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 ke(e){let t=e.replace(/\/+$/,``);return t.slice(t.lastIndexOf(`/`)+1)||t}function I({sessionId:e,roots:t,request:n,onSendToChat:r,visible:i,deps:a}){let o=(0,x.useMemo)(()=>({...Ce,...a}),[a]),c=_(),l=i&&c,d=g().compact,[f,p]=(0,x.useState)(null),[m,h]=(0,x.useState)(null),[S,C]=(0,x.useState)(null),[w,T]=(0,x.useState)(null),[E,ue]=(0,x.useState)(!1),[me,he]=(0,x.useState)(null),[ge,_e]=(0,x.useState)(!1),[D,ve]=(0,x.useState)(!1),[O,ye]=(0,x.useState)(Ee),[k,A]=(0,x.useState)(!1),[N,Te]=(0,x.useState)(()=>new Set),[I,Ae]=(0,x.useState)(null),[je,Me]=(0,x.useState)(()=>new Map),L=(0,x.useRef)(new Map),R=(0,x.useRef)(new Map),Ne=(0,x.useRef)(new Set),z=(0,x.useRef)(!1),B=(0,x.useRef)(null),Pe=(0,x.useRef)(null),Fe=(0,x.useRef)(new Map),V=(0,x.useRef)(null),H=(0,x.useRef)(null),U=(0,x.useRef)(null),W=(0,x.useRef)(!0),G=(0,x.useMemo)(()=>f?.tabs??[],[f]),Ie=(0,x.useRef)(new Set);Ie.current=new Set(G.filter(e=>e.exited).map(e=>e.id));let K=(0,x.useMemo)(()=>G.filter(t=>t.sessionId===e),[G,e]),q=K.find(e=>e.id===S)??null,Le=G.length-K.length,J=(0,x.useCallback)(async()=>{try{let e=await o.api.list();if(!W.current)return;p(e),h(null)}catch(e){if(!W.current)return;h(F(e,`The terminal list could not be loaded.`))}},[o.api]);(0,x.useEffect)(()=>(W.current=!0,J(),()=>{W.current=!1}),[J]),ee(()=>{J()},we,{enabled:i}),(0,x.useEffect)(()=>{f&&(S&&K.some(e=>e.id===S)||C(K.at(-1)?.id??null))},[f,K,S]),(0,x.useEffect)(()=>{if(!f)return;let e=new Set(f.tabs.map(e=>e.id));for(let[t,n]of L.current)e.has(t)||(Re(n),L.current.delete(t),Te(e=>{let n=new Set(e);return n.delete(t),n}))},[f]),(0,x.useEffect)(()=>{q&&l&&Me(e=>e.get(q.id)===q.lastActivityAt?e:new Map(e).set(q.id,q.lastActivityAt))},[q,l]),(0,x.useEffect)(()=>()=>{for(let e of L.current.values())Re(e);L.current.clear();for(let e of[V,H,U])e.current&&clearTimeout(e.current)},[]);function Re(e){e.queue.dispose();for(let t of e.disposers)try{t.dispose()}catch{}try{e.view.dispose()}catch{}}let ze=(0,x.useCallback)(()=>{for(let e of L.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}},[]),Y=(0,x.useCallback)(async(t={})=>{ue(!0),T(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}:{},...ze()});return W.current?(p(e=>e&&{...e,tabs:[...e.tabs.filter(e=>e.id!==n.id),n]}),C(n.id),n):n}catch(e){return W.current&&T({tone:`error`,text:F(e,`The terminal could not be opened.`)}),null}finally{W.current&&ue(!1)}},[o.api,e,ze]),X=(0,x.useCallback)(async e=>{try{await o.api.kill(e.id)}catch(e){if(!(e instanceof u&&e.status===404)){T({tone:`error`,text:F(e,`The terminal could not be closed.`)});return}}let t=L.current.get(e.id);if(t&&(Re(t),L.current.delete(e.id)),p(t=>t&&{...t,tabs:t.tabs.filter(t=>t.id!==e.id)}),S===e.id){let t=K.findIndex(t=>t.id===e.id),n=K[t+1]??K[t-1]??null;C(n?.id??null)}},[S,o.api,K]),Be=(0,x.useCallback)(async e=>{await Y({root:e.root})&&await X(e)},[X,Y]),Ve=(0,x.useRef)(e);Ve.current!==e&&(Ve.current=e,z.current=!1),(0,x.useEffect)(()=>{f&&f.available&&l&&!z.current&&!E&&(n&&n.nonce>P||(z.current=!0,K.length===0&&Y({})))},[f,l,K.length,E,Y,n]);let He=(0,x.useCallback)(async(e,t)=>{if(!(L.current.has(e)||Ne.current.has(e))){Ne.current.add(e);try{let n=await o.createView({...xe(t),theme:be(t),screenReaderMode:Ee()});if(!W.current||!R.current.has(e)){n.dispose();return}n.open(t);let r=pe(t=>o.api.input(e,t),{onError:e=>{W.current&&T({tone:`error`,text:F(e,`That input did not reach the shell.`)})}}),i={view:n,host:t,lastSeq:0,queue:r,disposers:[]};i.disposers.push(n.onData(t=>{Ie.current.has(e)||r.pushText(t)})),i.disposers.push(n.onBinary(t=>{Ie.current.has(e)||r.pushBinary(t)})),i.disposers.push(n.onSelectionChange(()=>{let e=n.hasSelection();_e(e),e&&(U.current&&clearTimeout(U.current),U.current=setTimeout(()=>{let e=n.getSelection();e&&o.writeClipboard(e).then(()=>{W.current&&(ve(!0),H.current&&clearTimeout(H.current),H.current=setTimeout(()=>ve(!1),1200))},()=>{})},150))})),n.setKeyFilter(e=>!Oe(e,o.platform)),L.current.set(e,i),A(!1),Te(t=>new Set(t).add(e))}catch(e){console.error(`[verse] terminal view failed to load`,e),W.current&&A(!0)}finally{Ne.current.delete(e)}}},[o]),Ue=(0,x.useRef)(He);Ue.current=He;let Z=(0,x.useRef)(new Map),We=e=>{let t=Z.current.get(e);return t||(t=t=>{t?(R.current.set(e,t),Ue.current(e,t)):(R.current.delete(e),Z.current.delete(e))},Z.current.set(e,t)),t},Q=(0,x.useCallback)(()=>{if(!S)return;let e=L.current.get(S);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&&q&&q.cols===n.cols&&q.rows===n.rows)return;V.current&&clearTimeout(V.current);let r=S;V.current=setTimeout(()=>{o.api.resize(r,n.cols,n.rows).catch(()=>{})},100)},[q,S,o.api]);(0,x.useEffect)(()=>{if(!l||!S||!N.has(S))return;Q();let e=Pe.current;if(!e||typeof ResizeObserver>`u`)return;let t=0,n=new ResizeObserver(()=>{cancelAnimationFrame(t),t=requestAnimationFrame(Q)});return n.observe(e),()=>{cancelAnimationFrame(t),n.disconnect()}},[l,S,N,Q]),(0,x.useEffect)(()=>Se(()=>{for(let e of L.current.values())e.view.setTheme(be(e.host))}),[]);let $=(0,x.useCallback)(e=>{let t=B.current;if(!t||t.tabId!==e)return;let n=L.current.get(e);if(!n)return;B.current=null;let r=t.text.replace(/[\r\n]+$/,``);r.includes(`
6
- `)&&!n.view.bracketedPaste()?o.writeClipboard(r).then(()=>T({tone:`info`,text:`That command has several lines, so it was copied instead: paste it with ⌘V.`}),()=>T({tone:`error`,text:`That command has several lines and could not be pasted safely.`})):n.view.paste(r),n.view.focus()},[o]);(0,x.useEffect)(()=>{if(!l||!S||!N.has(S)){he(null);return}let e=L.current.get(S);if(!e)return;let t=S,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(de(r.dataBase64)),e.lastSeq=r.seq,n&&(n=!1,B.current?.tabId===t&&setTimeout(()=>$(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=>{W.current&&(he(e),e===`gone`&&J())}});return B.current?.tabId===t&&e.lastSeq>0&&setTimeout(()=>$(t),0),()=>r.close()},[l,S,N,o,J,$]);let Ge=(0,x.useCallback)(async e=>{let n=e.root??q?.root??t[0],r=e.newTab===!0||!!e.appId||!!e.devServerId,i=null;if(r||(i=(q&&!q.exited&&(!e.root||q.root===e.root)?q:null)??K.find(t=>!t.exited&&(!e.root||t.root===e.root))??null),i?C(i.id):i=await Y({...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){B.current={tabId:i.id,text:e.paste};let t=L.current.get(i.id);t&&t.lastSeq>0&&$(i.id)}else L.current.get(i.id)?.view.focus()}},[q,$,Y,t,K]);(0,x.useEffect)(()=>{!n||!f||n.nonce<=P||(P=n.nonce,z.current=!0,f.available&&Ge(n))},[n,f,Ge]),(0,x.useEffect)(()=>{l&&S&&N.has(S)&&L.current.get(S)?.view.focus()},[l,S,N]);let Ke=()=>{if(!S)return;let e=L.current.get(S)?.view.getSelection()??``;e.trim()&&r(fe(e))},qe=()=>{let e=!O;ye(e),De(e);for(let t of L.current.values())t.view.setScreenReaderMode(e)},Je=async()=>{try{await o.api.openExternal(e,q?.root??t[0]),T({tone:`info`,text:`Opened in Terminal.`})}catch(e){T({tone:`error`,text:F(e,`Terminal could not be opened.`)})}},Ye=()=>{Y(q?.root?{root:q.root}:{})},Xe=(e,t)=>{let n=-1;if(e.key===`ArrowRight`?n=(t+1)%K.length:e.key===`ArrowLeft`?n=(t-1+K.length)%K.length:e.key===`Home`?n=0:e.key===`End`&&(n=K.length-1),n<0)return;e.preventDefault();let r=K[n];C(r.id),Fe.current.get(r.id)?.focus()};if(!f)return m?(0,M.jsx)(`div`,{className:j.pane,children:(0,M.jsx)(b,{compact:!0,tone:`error`,title:`Terminal is not reachable`,body:m,action:(0,M.jsx)(y,{size:`sm`,variant:`subtle`,onClick:()=>void J(),children:`Try again`})})}):(0,M.jsx)(`div`,{className:j.pane,"aria-busy":`true`,children:(0,M.jsxs)(`div`,{className:j.loading,children:[(0,M.jsx)(s,{width:`40%`}),(0,M.jsx)(s,{width:`70%`})]})});if(!f.available)return(0,M.jsxs)(`div`,{className:j.pane,children:[(0,M.jsx)(b,{compact:!0,icon:(0,M.jsx)(se,{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)(y,{size:`sm`,variant:`subtle`,icon:(0,M.jsx)(ne,{}),onClick:()=>void Je(),children:`Open in Terminal`}):void 0}),w?(0,M.jsx)(`p`,{className:j.inlineNotice,role:w.tone===`error`?`alert`:`status`,children:w.text}):null]});let Ze=t.length>1;return(0,M.jsxs)(`div`,{className:j.pane,"data-compact":d||void 0,children:[(0,M.jsxs)(`div`,{className:j.strip,children:[(0,M.jsx)(`div`,{className:j.tabs,role:`tablist`,"aria-label":`Terminals`,children:K.map((e,t)=>{let n=e.id===S,r=!n&&(je.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?Fe.current.set(e.id,t):Fe.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:()=>C(e.id),onKeyDown:e=>Xe(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 X(e),children:(0,M.jsx)(te,{size:12})})]},e.id)})}),(0,M.jsxs)(`div`,{className:j.stripActions,children:[(0,M.jsx)(v,{variant:`ghost`,size:`sm`,icon:(0,M.jsx)(re,{}),"aria-label":`New terminal tab`,title:"New terminal tab (⌃⇧`)",busy:E,onClick:Ye}),Ze?(0,M.jsx)(v,{variant:`ghost`,size:`sm`,icon:(0,M.jsx)(ce,{}),"aria-label":`New terminal in…`,"aria-haspopup":`menu`,"aria-expanded":I!==null,title:`Choose the folder`,onClick:e=>Ae({anchor:ae(e.currentTarget),from:e.currentTarget})}):null]})]}),q?(0,M.jsxs)(`div`,{className:j.header,children:[(0,M.jsx)(`span`,{className:j.cwd,title:q.root,children:q.root}),(0,M.jsx)(`span`,{className:j.headerStatus,role:`status`,"aria-live":`polite`,children:me===`reconnecting`?`Reconnecting…`:me===`expired`?`Session expired — reload to reconnect`:D?`Copied`:``}),(0,M.jsxs)(`div`,{className:j.headerActions,children:[(0,M.jsx)(y,{variant:`ghost`,size:`sm`,icon:(0,M.jsx)(ie,{}),disabled:!ge,"aria-label":`Send selection to chat`,title:ge?`Send the selected text to the chat as a code block`:`Select text in the terminal first`,onClick:Ke,children:d?null:`Send to chat`}),(0,M.jsx)(v,{variant:`ghost`,size:`sm`,icon:(0,M.jsx)(le,{}),"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)(v,{variant:`ghost`,size:`sm`,icon:(0,M.jsx)(ne,{}),"aria-label":`Open in Terminal.app`,title:`Open this folder in Terminal.app`,onClick:()=>void Je()}):null]})]}):null,w?(0,M.jsxs)(`div`,{className:j.notice,"data-tone":w.tone,role:w.tone===`error`?`alert`:`status`,children:[(0,M.jsx)(`span`,{children:w.text}),(0,M.jsx)(`button`,{type:`button`,className:j.noticeClose,"aria-label":`Dismiss`,onClick:()=>T(null),children:(0,M.jsx)(te,{size:12})})]}):null,(0,M.jsxs)(`div`,{className:j.body,ref:Pe,children:[k?(0,M.jsx)(b,{compact:!0,tone:`error`,title:`The terminal could not load`,body:`The rest of the chat still works.`,action:(0,M.jsx)(y,{size:`sm`,variant:`subtle`,onClick:()=>{A(!1);for(let[e,t]of R.current)He(e,t)},children:`Try again`})}):null,K.length===0&&!k?(0,M.jsx)(b,{compact:!0,icon:(0,M.jsx)(se,{size:20}),title:`No terminal open`,body:Le>0?`A login shell in this chat's folder. ${Le} ${Le===1?`terminal is`:`terminals are`} open in other chats.`:`A login shell in this chat's folder.`,action:(0,M.jsx)(y,{size:`sm`,variant:`subtle`,icon:(0,M.jsx)(re,{}),busy:E,onClick:Ye,children:`New terminal`})}):null,K.map(e=>{let t=e.id===S;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:We(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)(s,{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)(y,{size:`sm`,variant:`subtle`,onClick:()=>void Be(e),children:`Restart`}),(0,M.jsx)(y,{size:`sm`,variant:`ghost`,onClick:()=>void X(e),children:`Close`})]}):null]},e.id)})]}),I?(0,M.jsx)(oe,{label:`New terminal in`,anchor:I.anchor,returnFocus:I.from,onClose:()=>Ae(null),items:t.map(e=>({id:e,label:ke(e),description:e,onSelect:()=>{Y({root:e})}}))}):null]})}export{we as TERMINAL_LIST_POLL_MS,I as TerminalPane,Oe as keyPassesToPage,Te as resetTerminalPaneForTest};
7
- //# sourceMappingURL=TerminalPane-CPKUTD9K.js.map