@ashlr/hub 3.22.0 → 3.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (929) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +5 -5
  3. package/dist/authority-surface.json +16 -11
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/verify-safety-sources.d.ts +4 -0
  6. package/dist/cli/verify-safety-sources.js +41 -0
  7. package/dist/cli/verify-safety-sources.js.map +1 -0
  8. package/dist/cli/verify-safety.js +16 -1
  9. package/dist/cli/verify-safety.js.map +1 -1
  10. package/dist/core/decide/needs-you.d.ts +3 -1
  11. package/dist/core/decide/needs-you.js +52 -28
  12. package/dist/core/decide/needs-you.js.map +1 -1
  13. package/dist/core/fleet/fleet-control-model.d.ts +2 -1
  14. package/dist/core/fleet/fleet-control-model.js +5 -0
  15. package/dist/core/fleet/fleet-control-model.js.map +1 -1
  16. package/dist/core/fleet/fleet-control-types.d.ts +11 -1
  17. package/dist/core/fleet/fleet-control.d.ts +4 -0
  18. package/dist/core/fleet/fleet-control.js +23 -1
  19. package/dist/core/fleet/fleet-control.js.map +1 -1
  20. package/dist/core/fleet/quota.js +1 -1
  21. package/dist/core/fleet/quota.js.map +1 -1
  22. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  23. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +4 -2
  24. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +3 -1
  25. package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js +2 -0
  26. package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js.map +1 -0
  27. package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js +2 -0
  28. package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js.map +1 -0
  29. package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js +2 -0
  30. package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js.map +1 -0
  31. package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js +2 -0
  32. package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js.map +1 -0
  33. package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js +2 -0
  34. package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js.map +1 -0
  35. package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js +2 -0
  36. package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js.map +1 -0
  37. package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js +3 -0
  38. package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js.map +1 -0
  39. package/dist/core/web/public/next/assets/App-ttVrZYp5.js +8 -0
  40. package/dist/core/web/public/next/assets/App-ttVrZYp5.js.map +1 -0
  41. package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js +2 -0
  42. package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js.map +1 -0
  43. package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js +2 -0
  44. package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js.map +1 -0
  45. package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js +2 -0
  46. package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js.map +1 -0
  47. package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js +3 -0
  48. package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js.map +1 -0
  49. package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js +2 -0
  50. package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js.map +1 -0
  51. package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js +2 -0
  52. package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js.map +1 -0
  53. package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js +2 -0
  54. package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js.map +1 -0
  55. package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js +7 -0
  56. package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js.map +1 -0
  57. package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js +2 -0
  58. package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js.map +1 -0
  59. package/dist/core/web/public/next/assets/Button-CstSJwha.js +2 -0
  60. package/dist/core/web/public/next/assets/Button-CstSJwha.js.map +1 -0
  61. package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js +2 -0
  62. package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js.map +1 -0
  63. package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js +16 -0
  64. package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js.map +1 -0
  65. package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js +2 -0
  66. package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js.map +1 -0
  67. package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js +2 -0
  68. package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js.map +1 -0
  69. package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js +3 -0
  70. package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js.map +1 -0
  71. package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js +5 -0
  72. package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js.map +1 -0
  73. package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js +2 -0
  74. package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js.map +1 -0
  75. package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js +3 -0
  76. package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js.map +1 -0
  77. package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js +3 -0
  78. package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js.map +1 -0
  79. package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js +9 -0
  80. package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js.map +1 -0
  81. package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js +3 -0
  82. package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js.map +1 -0
  83. package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js +4 -0
  84. package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js.map +1 -0
  85. package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js +2 -0
  86. package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js.map +1 -0
  87. package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js +2 -0
  88. package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js.map +1 -0
  89. package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js +2 -0
  90. package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js.map +1 -0
  91. package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js +2 -0
  92. package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js.map +1 -0
  93. package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js +2 -0
  94. package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js.map +1 -0
  95. package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js +2 -0
  96. package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js.map +1 -0
  97. package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js +2 -0
  98. package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js.map +1 -0
  99. package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js +2 -0
  100. package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js.map +1 -0
  101. package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js +2 -0
  102. package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js.map +1 -0
  103. package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js +2 -0
  104. package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js.map +1 -0
  105. package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js +2 -0
  106. package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js.map +1 -0
  107. package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js +2 -0
  108. package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js.map +1 -0
  109. package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js +2 -0
  110. package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js.map +1 -0
  111. package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js +5 -0
  112. package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js.map +1 -0
  113. package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js +2 -0
  114. package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js.map +1 -0
  115. package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js +2 -0
  116. package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js.map +1 -0
  117. package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js +2 -0
  118. package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js.map +1 -0
  119. package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js +3 -0
  120. package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js.map +1 -0
  121. package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js +2 -0
  122. package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js.map +1 -0
  123. package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js +3 -0
  124. package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js.map +1 -0
  125. package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js +2 -0
  126. package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js.map +1 -0
  127. package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js +2 -0
  128. package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js.map +1 -0
  129. package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js +9 -0
  130. package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js.map +1 -0
  131. package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js +2 -0
  132. package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js.map +1 -0
  133. package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js +3 -0
  134. package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js.map +1 -0
  135. package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js +2 -0
  136. package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js.map +1 -0
  137. package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js +2 -0
  138. package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js.map +1 -0
  139. package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js +2 -0
  140. package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js.map +1 -0
  141. package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js +2 -0
  142. package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js.map +1 -0
  143. package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js +2 -0
  144. package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js.map +1 -0
  145. package/dist/core/web/public/next/assets/McpSection-snZNKexW.js +2 -0
  146. package/dist/core/web/public/next/assets/McpSection-snZNKexW.js.map +1 -0
  147. package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js +3 -0
  148. package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js.map +1 -0
  149. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js +72 -0
  150. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js.map +1 -0
  151. package/dist/core/web/public/next/assets/Meter-VXI75VNe.js +2 -0
  152. package/dist/core/web/public/next/assets/Meter-VXI75VNe.js.map +1 -0
  153. package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js +2 -0
  154. package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js.map +1 -0
  155. package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js +3 -0
  156. package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js.map +1 -0
  157. package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js +2 -0
  158. package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js.map +1 -0
  159. package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js +2 -0
  160. package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js.map +1 -0
  161. package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js +3 -0
  162. package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js.map +1 -0
  163. package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js +2 -0
  164. package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js.map +1 -0
  165. package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js +7 -0
  166. package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js.map +1 -0
  167. package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js +2 -0
  168. package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js.map +1 -0
  169. package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js +3 -0
  170. package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js.map +1 -0
  171. package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js +2 -0
  172. package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js.map +1 -0
  173. package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js +2 -0
  174. package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js.map +1 -0
  175. package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js +2 -0
  176. package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js.map +1 -0
  177. package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js +4 -0
  178. package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js.map +1 -0
  179. package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js +3 -0
  180. package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js.map +1 -0
  181. package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js +3 -0
  182. package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js.map +1 -0
  183. package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js +9 -0
  184. package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js.map +1 -0
  185. package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js +2 -0
  186. package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js.map +1 -0
  187. package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js +2 -0
  188. package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js.map +1 -0
  189. package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js +2 -0
  190. package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js.map +1 -0
  191. package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js +2 -0
  192. package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js.map +1 -0
  193. package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js +2 -0
  194. package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js.map +1 -0
  195. package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js +2 -0
  196. package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js.map +1 -0
  197. package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js +2 -0
  198. package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js.map +1 -0
  199. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js +7 -0
  200. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js.map +1 -0
  201. package/dist/core/web/public/next/assets/ResourcesChrome-DuEa7WOo.css +1 -0
  202. package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js +3 -0
  203. package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js.map +1 -0
  204. package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js +3 -0
  205. package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js.map +1 -0
  206. package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js +2 -0
  207. package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js.map +1 -0
  208. package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js +2 -0
  209. package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js.map +1 -0
  210. package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js +2 -0
  211. package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js.map +1 -0
  212. package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js +2 -0
  213. package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js.map +1 -0
  214. package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js +2 -0
  215. package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js.map +1 -0
  216. package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js +3 -0
  217. package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js.map +1 -0
  218. package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js +3 -0
  219. package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js.map +1 -0
  220. package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js +2 -0
  221. package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js.map +1 -0
  222. package/dist/core/web/public/next/assets/Select-B8GqZOX9.js +2 -0
  223. package/dist/core/web/public/next/assets/Select-B8GqZOX9.js.map +1 -0
  224. package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js +2 -0
  225. package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js.map +1 -0
  226. package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js +2 -0
  227. package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js.map +1 -0
  228. package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js +2 -0
  229. package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js.map +1 -0
  230. package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js +2 -0
  231. package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js.map +1 -0
  232. package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js +2 -0
  233. package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js.map +1 -0
  234. package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js +3 -0
  235. package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js.map +1 -0
  236. package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js +2 -0
  237. package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js.map +1 -0
  238. package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js +2 -0
  239. package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js.map +1 -0
  240. package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js +3 -0
  241. package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js.map +1 -0
  242. package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js +2 -0
  243. package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js.map +1 -0
  244. package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js +2 -0
  245. package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js.map +1 -0
  246. package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js +2 -0
  247. package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js.map +1 -0
  248. package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js +2 -0
  249. package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js.map +1 -0
  250. package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js +2 -0
  251. package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js.map +1 -0
  252. package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js +2 -0
  253. package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js.map +1 -0
  254. package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js +2 -0
  255. package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js.map +1 -0
  256. package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js +2 -0
  257. package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js.map +1 -0
  258. package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js +2 -0
  259. package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js.map +1 -0
  260. package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js +2 -0
  261. package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js.map +1 -0
  262. package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js +2 -0
  263. package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js.map +1 -0
  264. package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js +3 -0
  265. package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js.map +1 -0
  266. package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js +26 -0
  267. package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js.map +1 -0
  268. package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js +2 -0
  269. package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js.map +1 -0
  270. package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js +2 -0
  271. package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js.map +1 -0
  272. package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js +9 -0
  273. package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js.map +1 -0
  274. package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js +3 -0
  275. package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js.map +1 -0
  276. package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js +2 -0
  277. package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js.map +1 -0
  278. package/dist/core/web/public/next/assets/VerseConsoleApp-BmckthwC.css +1 -0
  279. package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js +3 -0
  280. package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js.map +1 -0
  281. package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js +3 -0
  282. package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js.map +1 -0
  283. package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js +2 -0
  284. package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js.map +1 -0
  285. package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js +2 -0
  286. package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js.map +1 -0
  287. package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js +2 -0
  288. package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js.map +1 -0
  289. package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js +2 -0
  290. package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js.map +1 -0
  291. package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js +6 -0
  292. package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js.map +1 -0
  293. package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js +2 -0
  294. package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js.map +1 -0
  295. package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js +2 -0
  296. package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js.map +1 -0
  297. package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js +2 -0
  298. package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js.map +1 -0
  299. package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js +2 -0
  300. package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js.map +1 -0
  301. package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js +2 -0
  302. package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js.map +1 -0
  303. package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js +2 -0
  304. package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js.map +1 -0
  305. package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js +2 -0
  306. package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js.map +1 -0
  307. package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js +2 -0
  308. package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js.map +1 -0
  309. package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js +2 -0
  310. package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js.map +1 -0
  311. package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js +2 -0
  312. package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js.map +1 -0
  313. package/dist/core/web/public/next/assets/charts-DT9PYS49.js +2 -0
  314. package/dist/core/web/public/next/assets/charts-DT9PYS49.js.map +1 -0
  315. package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js +2 -0
  316. package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js.map +1 -0
  317. package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js +2 -0
  318. package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js.map +1 -0
  319. package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js +2 -0
  320. package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js.map +1 -0
  321. package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js +2 -0
  322. package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js.map +1 -0
  323. package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js +2 -0
  324. package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js.map +1 -0
  325. package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js +2 -0
  326. package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js.map +1 -0
  327. package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js +2 -0
  328. package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js.map +1 -0
  329. package/dist/core/web/public/next/assets/control-queries-BG53otwz.js +2 -0
  330. package/dist/core/web/public/next/assets/control-queries-BG53otwz.js.map +1 -0
  331. package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js +2 -0
  332. package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js.map +1 -0
  333. package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js +2 -0
  334. package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js.map +1 -0
  335. package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js +2 -0
  336. package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js.map +1 -0
  337. package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js +2 -0
  338. package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js.map +1 -0
  339. package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js +2 -0
  340. package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js.map +1 -0
  341. package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js +2 -0
  342. package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js.map +1 -0
  343. package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js +2 -0
  344. package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js.map +1 -0
  345. package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js +2 -0
  346. package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js.map +1 -0
  347. package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js +3 -0
  348. package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js.map +1 -0
  349. package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js +2 -0
  350. package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js.map +1 -0
  351. package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js +5 -0
  352. package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js.map +1 -0
  353. package/dist/core/web/public/next/assets/global-w7KDTTi0.js +3 -0
  354. package/dist/core/web/public/next/assets/global-w7KDTTi0.js.map +1 -0
  355. package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js +3 -0
  356. package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js.map +1 -0
  357. package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js +2 -0
  358. package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js.map +1 -0
  359. package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js +2 -0
  360. package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js.map +1 -0
  361. package/dist/core/web/public/next/assets/icons-C3G-y5j2.js +2 -0
  362. package/dist/core/web/public/next/assets/icons-C3G-y5j2.js.map +1 -0
  363. package/dist/core/web/public/next/assets/index-BC5Uslm5.js +11 -0
  364. package/dist/core/web/public/next/assets/index-BC5Uslm5.js.map +1 -0
  365. package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js +2 -0
  366. package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js.map +1 -0
  367. package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js +2 -0
  368. package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js.map +1 -0
  369. package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js +2 -0
  370. package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js.map +1 -0
  371. package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js +2 -0
  372. package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js.map +1 -0
  373. package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js +2 -0
  374. package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js.map +1 -0
  375. package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js +2 -0
  376. package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js.map +1 -0
  377. package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js +7 -0
  378. package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js.map +1 -0
  379. package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js +2 -0
  380. package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js.map +1 -0
  381. package/dist/core/web/public/next/assets/mutations-CdLi0erM.js +2 -0
  382. package/dist/core/web/public/next/assets/mutations-CdLi0erM.js.map +1 -0
  383. package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js +2 -0
  384. package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js.map +1 -0
  385. package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js +2 -0
  386. package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js.map +1 -0
  387. package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js +2 -0
  388. package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js.map +1 -0
  389. package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js +2 -0
  390. package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js.map +1 -0
  391. package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js +2 -0
  392. package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js.map +1 -0
  393. package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js +2 -0
  394. package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js.map +1 -0
  395. package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js +2 -0
  396. package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js.map +1 -0
  397. package/dist/core/web/public/next/assets/panes-5GU8cuI9.js +3 -0
  398. package/dist/core/web/public/next/assets/panes-5GU8cuI9.js.map +1 -0
  399. package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js +2 -0
  400. package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js.map +1 -0
  401. package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js +2 -0
  402. package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js.map +1 -0
  403. package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js +2 -0
  404. package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js.map +1 -0
  405. package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js +2 -0
  406. package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js.map +1 -0
  407. package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js +2 -0
  408. package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js.map +1 -0
  409. package/dist/core/web/public/next/assets/primitives-6nAFZkcg.js +1 -0
  410. package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js +2 -0
  411. package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js.map +1 -0
  412. package/dist/core/web/public/next/assets/queries-PgZlvFqO.js +2 -0
  413. package/dist/core/web/public/next/assets/queries-PgZlvFqO.js.map +1 -0
  414. package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js +2 -0
  415. package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js.map +1 -0
  416. package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js +3 -0
  417. package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js.map +1 -0
  418. package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js +2 -0
  419. package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js.map +1 -0
  420. package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js +2 -0
  421. package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js.map +1 -0
  422. package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js +2 -0
  423. package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js.map +1 -0
  424. package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js +2 -0
  425. package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js.map +1 -0
  426. package/dist/core/web/public/next/assets/slots-DWlj_c7i.js +3 -0
  427. package/dist/core/web/public/next/assets/slots-DWlj_c7i.js.map +1 -0
  428. package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js +4 -0
  429. package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js.map +1 -0
  430. package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js +2 -0
  431. package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js.map +1 -0
  432. package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js +2 -0
  433. package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js.map +1 -0
  434. package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js +2 -0
  435. package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js.map +1 -0
  436. package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js +2 -0
  437. package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js.map +1 -0
  438. package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js +2 -0
  439. package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js.map +1 -0
  440. package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js +6 -0
  441. package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js.map +1 -0
  442. package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js +2 -0
  443. package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js.map +1 -0
  444. package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js +2 -0
  445. package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js.map +1 -0
  446. package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js +2 -0
  447. package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js.map +1 -0
  448. package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js +2 -0
  449. package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js.map +1 -0
  450. package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js +2 -0
  451. package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js.map +1 -0
  452. package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js +2 -0
  453. package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js.map +1 -0
  454. package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js +2 -0
  455. package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js.map +1 -0
  456. package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js +2 -0
  457. package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js.map +1 -0
  458. package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js +2 -0
  459. package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js.map +1 -0
  460. package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js +2 -0
  461. package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js.map +1 -0
  462. package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js +2 -0
  463. package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js.map +1 -0
  464. package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js +2 -0
  465. package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js.map +1 -0
  466. package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js +2 -0
  467. package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js.map +1 -0
  468. package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js +2 -0
  469. package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js.map +1 -0
  470. package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js +2 -0
  471. package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js.map +1 -0
  472. package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js +3 -0
  473. package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js.map +1 -0
  474. package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js +2 -0
  475. package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js.map +1 -0
  476. package/dist/core/web/public/next/index.html +1 -1
  477. package/dist/release-dependency-inventory.json +1 -1
  478. package/package.json +1 -1
  479. package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js +0 -2
  480. package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js.map +0 -1
  481. package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js +0 -2
  482. package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js.map +0 -1
  483. package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js +0 -2
  484. package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js.map +0 -1
  485. package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js +0 -2
  486. package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js.map +0 -1
  487. package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js +0 -2
  488. package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js.map +0 -1
  489. package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js +0 -2
  490. package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js.map +0 -1
  491. package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js +0 -3
  492. package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js.map +0 -1
  493. package/dist/core/web/public/next/assets/App-CPKNuUdC.js +0 -8
  494. package/dist/core/web/public/next/assets/App-CPKNuUdC.js.map +0 -1
  495. package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js +0 -2
  496. package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js.map +0 -1
  497. package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js +0 -2
  498. package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js.map +0 -1
  499. package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js +0 -2
  500. package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js.map +0 -1
  501. package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js +0 -3
  502. package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js.map +0 -1
  503. package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js +0 -2
  504. package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js.map +0 -1
  505. package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js +0 -2
  506. package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js.map +0 -1
  507. package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js +0 -2
  508. package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js.map +0 -1
  509. package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js +0 -7
  510. package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js.map +0 -1
  511. package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js +0 -2
  512. package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js.map +0 -1
  513. package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js +0 -2
  514. package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js.map +0 -1
  515. package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js +0 -2
  516. package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js.map +0 -1
  517. package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js +0 -16
  518. package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js.map +0 -1
  519. package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js +0 -2
  520. package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js.map +0 -1
  521. package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js +0 -2
  522. package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js.map +0 -1
  523. package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js +0 -3
  524. package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js.map +0 -1
  525. package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js +0 -5
  526. package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js.map +0 -1
  527. package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js +0 -2
  528. package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js.map +0 -1
  529. package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js +0 -3
  530. package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js.map +0 -1
  531. package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js +0 -3
  532. package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js.map +0 -1
  533. package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js +0 -9
  534. package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js.map +0 -1
  535. package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js +0 -3
  536. package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js.map +0 -1
  537. package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js +0 -4
  538. package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js.map +0 -1
  539. package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js +0 -2
  540. package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js.map +0 -1
  541. package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js +0 -2
  542. package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js.map +0 -1
  543. package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js +0 -2
  544. package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js.map +0 -1
  545. package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js +0 -2
  546. package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js.map +0 -1
  547. package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js +0 -2
  548. package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js.map +0 -1
  549. package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js +0 -2
  550. package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js.map +0 -1
  551. package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js +0 -2
  552. package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js.map +0 -1
  553. package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js +0 -2
  554. package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js.map +0 -1
  555. package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js +0 -2
  556. package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js.map +0 -1
  557. package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js +0 -2
  558. package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js.map +0 -1
  559. package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js +0 -2
  560. package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js.map +0 -1
  561. package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js +0 -2
  562. package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js.map +0 -1
  563. package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js +0 -2
  564. package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js.map +0 -1
  565. package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js +0 -5
  566. package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js.map +0 -1
  567. package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js +0 -2
  568. package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js.map +0 -1
  569. package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js +0 -2
  570. package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js.map +0 -1
  571. package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js +0 -2
  572. package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js.map +0 -1
  573. package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js +0 -3
  574. package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js.map +0 -1
  575. package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js +0 -2
  576. package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js.map +0 -1
  577. package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js +0 -3
  578. package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js.map +0 -1
  579. package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js +0 -2
  580. package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js.map +0 -1
  581. package/dist/core/web/public/next/assets/Input-Bt6fp051.js +0 -2
  582. package/dist/core/web/public/next/assets/Input-Bt6fp051.js.map +0 -1
  583. package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js +0 -9
  584. package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js.map +0 -1
  585. package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js +0 -2
  586. package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js.map +0 -1
  587. package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js +0 -3
  588. package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js.map +0 -1
  589. package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js +0 -2
  590. package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js.map +0 -1
  591. package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js +0 -2
  592. package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js.map +0 -1
  593. package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js +0 -2
  594. package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js.map +0 -1
  595. package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js +0 -2
  596. package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js.map +0 -1
  597. package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js +0 -2
  598. package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js.map +0 -1
  599. package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js +0 -2
  600. package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js.map +0 -1
  601. package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js +0 -3
  602. package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js.map +0 -1
  603. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js +0 -72
  604. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js.map +0 -1
  605. package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js +0 -2
  606. package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js.map +0 -1
  607. package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js +0 -2
  608. package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js.map +0 -1
  609. package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js +0 -3
  610. package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js.map +0 -1
  611. package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js +0 -2
  612. package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js.map +0 -1
  613. package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js +0 -2
  614. package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js.map +0 -1
  615. package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js +0 -3
  616. package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js.map +0 -1
  617. package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js +0 -2
  618. package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js.map +0 -1
  619. package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js +0 -7
  620. package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js.map +0 -1
  621. package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js +0 -2
  622. package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js.map +0 -1
  623. package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js +0 -3
  624. package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js.map +0 -1
  625. package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js +0 -2
  626. package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js.map +0 -1
  627. package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js +0 -2
  628. package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js.map +0 -1
  629. package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js +0 -2
  630. package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js.map +0 -1
  631. package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js +0 -4
  632. package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js.map +0 -1
  633. package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js +0 -3
  634. package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js.map +0 -1
  635. package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js +0 -3
  636. package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js.map +0 -1
  637. package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js +0 -9
  638. package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js.map +0 -1
  639. package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js +0 -2
  640. package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js.map +0 -1
  641. package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js +0 -2
  642. package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js.map +0 -1
  643. package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js +0 -2
  644. package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js.map +0 -1
  645. package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js +0 -2
  646. package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js.map +0 -1
  647. package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js +0 -2
  648. package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js.map +0 -1
  649. package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js +0 -2
  650. package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js.map +0 -1
  651. package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js +0 -2
  652. package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js.map +0 -1
  653. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js +0 -7
  654. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js.map +0 -1
  655. package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js +0 -3
  656. package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js.map +0 -1
  657. package/dist/core/web/public/next/assets/ResourcesChrome-p_VCkMZH.css +0 -1
  658. package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js +0 -3
  659. package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js.map +0 -1
  660. package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js +0 -2
  661. package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js.map +0 -1
  662. package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js +0 -2
  663. package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js.map +0 -1
  664. package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js +0 -2
  665. package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js.map +0 -1
  666. package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js +0 -2
  667. package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js.map +0 -1
  668. package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js +0 -2
  669. package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js.map +0 -1
  670. package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js +0 -3
  671. package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js.map +0 -1
  672. package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js +0 -3
  673. package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js.map +0 -1
  674. package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js +0 -2
  675. package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js.map +0 -1
  676. package/dist/core/web/public/next/assets/Select-tf4lNvWD.js +0 -2
  677. package/dist/core/web/public/next/assets/Select-tf4lNvWD.js.map +0 -1
  678. package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js +0 -2
  679. package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js.map +0 -1
  680. package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js +0 -2
  681. package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js.map +0 -1
  682. package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js +0 -2
  683. package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js.map +0 -1
  684. package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js +0 -2
  685. package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js.map +0 -1
  686. package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js +0 -2
  687. package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js.map +0 -1
  688. package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js +0 -3
  689. package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js.map +0 -1
  690. package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js +0 -2
  691. package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js.map +0 -1
  692. package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js +0 -2
  693. package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js.map +0 -1
  694. package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js +0 -3
  695. package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js.map +0 -1
  696. package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js +0 -2
  697. package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js.map +0 -1
  698. package/dist/core/web/public/next/assets/Slider-C68TumXj.js +0 -2
  699. package/dist/core/web/public/next/assets/Slider-C68TumXj.js.map +0 -1
  700. package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js +0 -2
  701. package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js.map +0 -1
  702. package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js +0 -2
  703. package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js.map +0 -1
  704. package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js +0 -2
  705. package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js.map +0 -1
  706. package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js +0 -2
  707. package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js.map +0 -1
  708. package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js +0 -2
  709. package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js.map +0 -1
  710. package/dist/core/web/public/next/assets/Surface-DCL7uORg.js +0 -2
  711. package/dist/core/web/public/next/assets/Surface-DCL7uORg.js.map +0 -1
  712. package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js +0 -2
  713. package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js.map +0 -1
  714. package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js +0 -2
  715. package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js.map +0 -1
  716. package/dist/core/web/public/next/assets/Tag-Ciht3C94.js +0 -2
  717. package/dist/core/web/public/next/assets/Tag-Ciht3C94.js.map +0 -1
  718. package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js +0 -26
  719. package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js.map +0 -1
  720. package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js +0 -3
  721. package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js.map +0 -1
  722. package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js +0 -2
  723. package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js.map +0 -1
  724. package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js +0 -2
  725. package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js.map +0 -1
  726. package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js +0 -9
  727. package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js.map +0 -1
  728. package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js +0 -3
  729. package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js.map +0 -1
  730. package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js +0 -2
  731. package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js.map +0 -1
  732. package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js +0 -3
  733. package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js.map +0 -1
  734. package/dist/core/web/public/next/assets/VerseConsoleApp-n6qr3lCF.css +0 -1
  735. package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js +0 -3
  736. package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js.map +0 -1
  737. package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js +0 -2
  738. package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js.map +0 -1
  739. package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js +0 -2
  740. package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js.map +0 -1
  741. package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js +0 -2
  742. package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js.map +0 -1
  743. package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js +0 -2
  744. package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js.map +0 -1
  745. package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js +0 -6
  746. package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js.map +0 -1
  747. package/dist/core/web/public/next/assets/actions-gBplqbpY.js +0 -2
  748. package/dist/core/web/public/next/assets/actions-gBplqbpY.js.map +0 -1
  749. package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js +0 -2
  750. package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js.map +0 -1
  751. package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js +0 -2
  752. package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js.map +0 -1
  753. package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js +0 -2
  754. package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js.map +0 -1
  755. package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js +0 -2
  756. package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js.map +0 -1
  757. package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js +0 -2
  758. package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js.map +0 -1
  759. package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js +0 -2
  760. package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js.map +0 -1
  761. package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js +0 -2
  762. package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js.map +0 -1
  763. package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js +0 -2
  764. package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js.map +0 -1
  765. package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js +0 -2
  766. package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js.map +0 -1
  767. package/dist/core/web/public/next/assets/charts-CzqC55eL.js +0 -2
  768. package/dist/core/web/public/next/assets/charts-CzqC55eL.js.map +0 -1
  769. package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js +0 -2
  770. package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js.map +0 -1
  771. package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js +0 -2
  772. package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js.map +0 -1
  773. package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js +0 -2
  774. package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js.map +0 -1
  775. package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js +0 -2
  776. package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js.map +0 -1
  777. package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js +0 -2
  778. package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js.map +0 -1
  779. package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js +0 -2
  780. package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js.map +0 -1
  781. package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js +0 -2
  782. package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js.map +0 -1
  783. package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js +0 -2
  784. package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js.map +0 -1
  785. package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js +0 -2
  786. package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js.map +0 -1
  787. package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js +0 -2
  788. package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js.map +0 -1
  789. package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js +0 -2
  790. package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js.map +0 -1
  791. package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js +0 -2
  792. package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js.map +0 -1
  793. package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js +0 -2
  794. package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js.map +0 -1
  795. package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js +0 -2
  796. package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js.map +0 -1
  797. package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js +0 -2
  798. package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js.map +0 -1
  799. package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js +0 -2
  800. package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js.map +0 -1
  801. package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js +0 -3
  802. package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js.map +0 -1
  803. package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js +0 -2
  804. package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js.map +0 -1
  805. package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js +0 -5
  806. package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js.map +0 -1
  807. package/dist/core/web/public/next/assets/global-BJ_kVFpD.js +0 -3
  808. package/dist/core/web/public/next/assets/global-BJ_kVFpD.js.map +0 -1
  809. package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js +0 -3
  810. package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js.map +0 -1
  811. package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js +0 -2
  812. package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js.map +0 -1
  813. package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js +0 -2
  814. package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js.map +0 -1
  815. package/dist/core/web/public/next/assets/icons-MYfI6vZr.js +0 -2
  816. package/dist/core/web/public/next/assets/icons-MYfI6vZr.js.map +0 -1
  817. package/dist/core/web/public/next/assets/index-DOAOxiKl.js +0 -11
  818. package/dist/core/web/public/next/assets/index-DOAOxiKl.js.map +0 -1
  819. package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js +0 -2
  820. package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js.map +0 -1
  821. package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js +0 -2
  822. package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js.map +0 -1
  823. package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js +0 -2
  824. package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js.map +0 -1
  825. package/dist/core/web/public/next/assets/live-model-CCjYFk48.js +0 -2
  826. package/dist/core/web/public/next/assets/live-model-CCjYFk48.js.map +0 -1
  827. package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js +0 -2
  828. package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js.map +0 -1
  829. package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js +0 -2
  830. package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js.map +0 -1
  831. package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js +0 -7
  832. package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js.map +0 -1
  833. package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js +0 -2
  834. package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js.map +0 -1
  835. package/dist/core/web/public/next/assets/mutations-BlGALvmG.js +0 -2
  836. package/dist/core/web/public/next/assets/mutations-BlGALvmG.js.map +0 -1
  837. package/dist/core/web/public/next/assets/nav-ByibvQW1.js +0 -2
  838. package/dist/core/web/public/next/assets/nav-ByibvQW1.js.map +0 -1
  839. package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js +0 -2
  840. package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js.map +0 -1
  841. package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js +0 -2
  842. package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js.map +0 -1
  843. package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js +0 -2
  844. package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js.map +0 -1
  845. package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js +0 -2
  846. package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js.map +0 -1
  847. package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js +0 -2
  848. package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js.map +0 -1
  849. package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js +0 -2
  850. package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js.map +0 -1
  851. package/dist/core/web/public/next/assets/panes-CHt3427X.js +0 -3
  852. package/dist/core/web/public/next/assets/panes-CHt3427X.js.map +0 -1
  853. package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js +0 -2
  854. package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js.map +0 -1
  855. package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js +0 -2
  856. package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js.map +0 -1
  857. package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js +0 -2
  858. package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js.map +0 -1
  859. package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js +0 -2
  860. package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js.map +0 -1
  861. package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js +0 -2
  862. package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js.map +0 -1
  863. package/dist/core/web/public/next/assets/primitives-CDKCUR2v.js +0 -1
  864. package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js +0 -2
  865. package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js.map +0 -1
  866. package/dist/core/web/public/next/assets/queries--mGK10fL.js +0 -2
  867. package/dist/core/web/public/next/assets/queries--mGK10fL.js.map +0 -1
  868. package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js +0 -2
  869. package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js.map +0 -1
  870. package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js +0 -3
  871. package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js.map +0 -1
  872. package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js +0 -2
  873. package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js.map +0 -1
  874. package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js +0 -2
  875. package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js.map +0 -1
  876. package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js +0 -2
  877. package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js.map +0 -1
  878. package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js +0 -2
  879. package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js.map +0 -1
  880. package/dist/core/web/public/next/assets/slots-40edgV7X.js +0 -3
  881. package/dist/core/web/public/next/assets/slots-40edgV7X.js.map +0 -1
  882. package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js +0 -4
  883. package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js.map +0 -1
  884. package/dist/core/web/public/next/assets/sse-CAFwslNC.js +0 -2
  885. package/dist/core/web/public/next/assets/sse-CAFwslNC.js.map +0 -1
  886. package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js +0 -2
  887. package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js.map +0 -1
  888. package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js +0 -2
  889. package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js.map +0 -1
  890. package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js +0 -2
  891. package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js.map +0 -1
  892. package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js +0 -2
  893. package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js.map +0 -1
  894. package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js +0 -6
  895. package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js.map +0 -1
  896. package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js +0 -2
  897. package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js.map +0 -1
  898. package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js +0 -2
  899. package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js.map +0 -1
  900. package/dist/core/web/public/next/assets/usage-queries-BONqdout.js +0 -2
  901. package/dist/core/web/public/next/assets/usage-queries-BONqdout.js.map +0 -1
  902. package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js +0 -2
  903. package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js.map +0 -1
  904. package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js +0 -2
  905. package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js.map +0 -1
  906. package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js +0 -2
  907. package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js.map +0 -1
  908. package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js +0 -2
  909. package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js.map +0 -1
  910. package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js +0 -2
  911. package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js.map +0 -1
  912. package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js +0 -2
  913. package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js.map +0 -1
  914. package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js +0 -2
  915. package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js.map +0 -1
  916. package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js +0 -2
  917. package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js.map +0 -1
  918. package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js +0 -2
  919. package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js.map +0 -1
  920. package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js +0 -2
  921. package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js.map +0 -1
  922. package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js +0 -2
  923. package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js.map +0 -1
  924. package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js +0 -2
  925. package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js.map +0 -1
  926. package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js +0 -3
  927. package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js.map +0 -1
  928. package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js +0 -2
  929. package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatTile-mYm1GPj7.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/StatTile.module.css","../../../../../../src/web-ui/components/charts/StatTile.tsx"],"sourcesContent":[".tile {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n padding: var(--card-pad, var(--space-4));\n border-radius: var(--radius-lg);\n border: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n /* Dark: a 4% white top hairline lifts the KPI row off the canvas; light:\n the token is transparent and this draws nothing. */\n box-shadow: inset 0 1px 0 var(--hairline-lift, transparent);\n}\n\n.label {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n text-transform: uppercase;\n letter-spacing: var(--tracking-label);\n}\n\n/* KPI number: Plex 600, 24/32, tabular numerals (SPEC-310C §6). */\n.value {\n font-family: var(--font-ui);\n font-size: var(--text-2xl-size);\n line-height: var(--text-2xl-line);\n font-weight: var(--font-weight-semibold);\n font-variant-numeric: tabular-nums;\n color: var(--text-primary);\n overflow-wrap: anywhere;\n}\n\n/* The sparkline sits directly under the number it explains. */\n.trend {\n display: block;\n line-height: 0;\n margin: var(--space-1) 0 2px;\n}\n\n.meta {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: var(--space-1) var(--space-2);\n}\n\n.delta {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-variant-numeric: tabular-nums;\n}\n\n.arrow {\n font-weight: var(--font-weight-semibold);\n}\n\n/* A judged delta sits on its status tint, so good / bad reads at a glance;\n the words carry it too (never colour alone). */\n.deltaGood {\n padding: 0 var(--space-1);\n border-radius: var(--radius-sm);\n background: var(--status-success-bg);\n color: var(--status-success-fg);\n}\n\n.deltaBad {\n padding: 0 var(--space-1);\n border-radius: var(--radius-sm);\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n\n.deltaNeutral {\n color: var(--text-tertiary);\n}\n\n.caption {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n/* StatTileSkeleton — bars at the size of what they stand in for. */\n.skLabel {\n display: block;\n width: 40%;\n height: var(--text-2xs-line);\n}\n\n.skValue {\n display: block;\n width: 55%;\n height: var(--text-2xl-line);\n}\n\n.skTrend {\n display: block;\n width: 100%;\n height: 28px;\n margin: var(--space-1) 0 2px;\n}\n\n.skMeta {\n display: block;\n width: 70%;\n height: var(--text-xs-line);\n}\n","/**\n * components/charts/StatTile.tsx — value + delta + optional sparkline, the\n * figure contract from marks-and-anatomy.md. Use for a single current value\n * (a one-bar bar chart is never the answer — this is). `value` takes a\n * ReactNode (not just a string) so callers can wrap a sourceQuality-bearing\n * field in <Epistemic/> and pass that straight through.\n *\n * V3.10 (SPEC-310C §6 \"StatTile: sparkline goes under the number; deltas show\n * units\"): the 72×24 sparkline used to float top-right, disconnected from the\n * number it explains; it now sits directly under it. A delta reads as a\n * sentence fragment with its unit and its comparison — \"+5 merges vs prior\n * 7d\", never a bare \"-1\". In dark the tile gets the 4% top hairline\n * (`--hairline-lift`, transparent in light) so a KPI row lifts off the canvas.\n *\n * Polish (verse-visual-quality): the sparkline spans the tile (`fill`), in\n * the quantity ink with a gradient wash; a judged delta sits on a tinted pill\n * with a direction arrow (the arrow is decoration — the signed number and\n * its words still say which way it went).\n */\nimport type { ReactNode } from 'react';\nimport { formatSignedCompact } from './format.js';\nimport { Sparkline } from './Sparkline.js';\nimport styles from './StatTile.module.css';\n\nexport interface StatTileDelta {\n /** Signed raw value, e.g. +12 or -3. */\n value: number;\n /** Whether a positive delta reads as good (green) or bad (red). Omit for\n * a neutral, non-judgmental delta (e.g. \"goals in flight\" — more isn't\n * inherently good or bad). */\n goodWhenPositive?: boolean;\n /** vs which period, e.g. \"vs prior 7d\". */\n versus?: string;\n /** Unit after the number: \"merges\", \"pts\", \"min\". Plural is the caller's call. */\n unit?: string;\n /** Formats the SIGNED value (default: \"+12\" / \"-3\"). Use for percent points, durations, dollars. */\n format?: (signed: number) => string;\n}\n\n/** \"+5 merges vs prior 7d\" — the whole delta as one readable phrase. */\nexport function deltaText(delta: StatTileDelta): string {\n const n = delta.format ? delta.format(delta.value) : formatSignedCompact(delta.value);\n return [n, delta.unit, delta.versus].filter((part) => part !== undefined && part !== '').join(' ');\n}\n\nexport function StatTile({\n label,\n value,\n caption,\n delta,\n trend,\n trendLabel,\n describeTrend,\n}: {\n label: string;\n value: ReactNode;\n caption?: ReactNode;\n delta?: StatTileDelta | null;\n trend?: (number | null)[];\n trendLabel?: string;\n /** Spoken summary formatter for the sparkline (first → latest, range). */\n describeTrend?: (v: number) => string;\n}) {\n const deltaTone =\n delta == null || delta.goodWhenPositive === undefined\n ? styles.deltaNeutral\n : delta.value === 0\n ? styles.deltaNeutral\n : (delta.value > 0) === delta.goodWhenPositive\n ? styles.deltaGood\n : styles.deltaBad;\n\n const arrow = delta == null || delta.value === 0 || !Number.isFinite(delta.value) ? null : delta.value > 0 ? '↑' : '↓';\n\n return (\n <div className={styles.tile} data-stat-tile=\"\">\n <span className={styles.label}>{label}</span>\n <span className={styles.value}>{value}</span>\n {trend ? (\n <span className={styles.trend}>\n <Sparkline points={trend} width=\"fill\" height={28} area ariaLabel={trendLabel ?? `${label} trend`} describe={describeTrend} />\n </span>\n ) : null}\n {delta || caption ? (\n <div className={styles.meta}>\n {delta ? (\n <span className={`${styles.delta} ${deltaTone}`} data-delta-tone={deltaTone === styles.deltaGood ? 'good' : deltaTone === styles.deltaBad ? 'bad' : 'neutral'}>\n {arrow ? <span className={styles.arrow} aria-hidden=\"true\">{arrow}</span> : null}\n <span>{deltaText(delta)}</span>\n </span>\n ) : null}\n {caption ? <span className={styles.caption}>{caption}</span> : null}\n </div>\n ) : null}\n </div>\n );\n}\n\n/**\n * A stat tile's loading placeholder in the tile's own shape — label, number\n * and sparkline bars on the same box — so a KPI row does not jump when its\n * figures land. Uses the app's shared `.skeleton` shimmer (design/global.css),\n * which already stops under reduced motion. Presentation only: the caller\n * announces the loading state once for the whole row.\n */\nexport function StatTileSkeleton({ trend = true }: { trend?: boolean }) {\n return (\n <div className={styles.tile} data-stat-tile-skeleton=\"\" aria-hidden=\"true\">\n <span className={`skeleton ${styles.skLabel}`} />\n <span className={`skeleton ${styles.skValue}`} />\n {trend ? <span className={`skeleton ${styles.skTrend}`} /> : null}\n <span className={`skeleton ${styles.skMeta}`} />\n </div>\n );\n}\n"],"mappings":"whBCwCA,SAAgB,EAAU,EAA8B,CAEtD,MAAO,CADG,EAAM,OAAS,EAAM,OAAO,EAAM,KAAK,EAAI,EAAoB,EAAM,KAAK,EACzE,EAAM,KAAM,EAAM,MAAM,CAAC,CAAC,OAAQ,GAAS,IAAS,IAAA,IAAa,IAAS,EAAE,CAAC,CAAC,KAAK,GAAG,CACnG,CAEA,SAAgB,EAAS,CACvB,QACA,QACA,UACA,QACA,QACA,aACA,iBAUC,CACD,IAAM,EACJ,GAAS,MAAQ,EAAM,mBAAqB,IAAA,IAExC,EAAM,QAAU,EADhB,EAAO,aAGJ,EAAM,MAAQ,IAAO,EAAM,iBAC1B,EAAO,UACP,EAAO,SAEX,EAAQ,GAAS,MAAQ,EAAM,QAAU,GAAK,CAAC,OAAO,SAAS,EAAM,KAAK,EAAI,KAAO,EAAM,MAAQ,EAAI,IAAM,IAEnH,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,iBAAe,GAA5C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,CAAY,CAAA,GAC5C,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,CAAY,CAAA,EAC3C,GACC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MACtB,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,OAAQ,EAAO,MAAM,OAAO,OAAQ,GAAI,KAAA,GAAK,UAAW,GAAc,GAAG,EAAM,QAAS,SAAU,CAAgB,CAAA,CACzH,CAAA,EACJ,KACH,GAAS,GACR,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAvB,SAAA,CACG,GACC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,GAAG,EAAO,MAAM,GAAG,IAAa,kBAAiB,IAAc,EAAO,UAAY,OAAS,IAAc,EAAO,SAAW,MAAQ,UAApJ,SAAA,CACG,GAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAO,cAAY,OAAQ,SAAA,CAAY,CAAA,EAAI,MAC5E,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAU,CAAK,CAAQ,CAAA,CAC1B,CACJ,CAAA,EAAA,KACH,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAU,SAAA,CAAc,CAAA,EAAI,IAC5D,CACH,CAAA,EAAA,IACD,GAET,CASA,SAAgB,EAAiB,CAAE,QAAQ,IAA6B,CACtE,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,0BAAwB,GAAG,cAAY,OAApE,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,YAAY,EAAO,SAAY,CAAA,GAChD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,YAAY,EAAO,SAAY,CAAA,EAC/C,GAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,YAAY,EAAO,SAAY,CAAA,EAAI,MAC7D,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,YAAY,EAAO,QAAW,CAAA,CAC5C,GAET"}
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./index-BC5Uslm5.js";var t={badge:`_badge_ytqgz_4`,dot:`_dot_ytqgz_17`,neutral:`_neutral_ytqgz_24`,info:`_info_ytqgz_32`,running:`_running_ytqgz_40`,pulse:`_pulse_ytqgz_1`,success:`_success_ytqgz_49`,warning:`_warning_ytqgz_57`,danger:`_danger_ytqgz_65`,unknown:`_unknown_ytqgz_73`,phaseDot:`_phaseDot_ytqgz_82`},n=e(),r={pending:`neutral`,queued:`neutral`,waiting:`neutral`,running:`running`,active:`running`,in_progress:`running`,building:`running`,applying:`running`,done:`success`,success:`success`,succeeded:`success`,applied:`success`,merged:`success`,ready:`success`,approved:`success`,ship:`success`,review:`warning`,degraded:`warning`,paused:`warning`,noise:`neutral`,failed:`danger`,error:`danger`,errored:`danger`,rejected:`danger`,harmful:`danger`,cancelled:`neutral`,canceled:`neutral`,unknown:`unknown`};function i(e){return e?r[e.toLowerCase()]??`neutral`:`unknown`}function a({status:e,tone:r,children:a}){let o=r??i(e);return(0,n.jsxs)(`span`,{className:`${t.badge} ${t[o]}`,children:[(0,n.jsx)(`span`,{className:t.dot,"aria-hidden":`true`}),a??e]})}function o({index:e}){let r=(e%6+6)%6;return(0,n.jsx)(`span`,{className:t.phaseDot,style:{background:`var(--phase-${r+1})`},"aria-hidden":`true`})}export{a as n,i as r,o as t};
2
+ //# sourceMappingURL=StatusBadge-Yz7S3kZ2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBadge-Yz7S3kZ2.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/StatusBadge.module.css","../../../../../../src/web-ui/components/primitives/StatusBadge.tsx"],"sourcesContent":["/* V2: a tag, not a pill — the design language reserves fully-round shapes\n for dots and avatars. Height derives from the density tokens so a badge in\n a table row lines up with the controls next to it. */\n.badge {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n height: var(--density-row-sm);\n padding: 0 var(--space-2);\n border-radius: var(--radius-xs);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-medium);\n line-height: 1;\n white-space: nowrap;\n}\n\n.dot {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n flex-shrink: 0;\n}\n\n.neutral {\n background: var(--status-neutral-bg);\n color: var(--status-neutral-fg);\n}\n.neutral .dot {\n background: var(--status-neutral-solid);\n}\n\n.info {\n background: var(--status-info-bg);\n color: var(--status-info-fg);\n}\n.info .dot {\n background: var(--status-info-solid);\n}\n\n.running {\n background: var(--status-running-bg);\n color: var(--status-running-fg);\n}\n.running .dot {\n background: var(--status-running-solid);\n animation: pulse 1.6s ease-in-out infinite;\n}\n\n.success {\n background: var(--status-success-bg);\n color: var(--status-success-fg);\n}\n.success .dot {\n background: var(--status-success-solid);\n}\n\n.warning {\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n}\n.warning .dot {\n background: var(--status-warning-solid);\n}\n\n.danger {\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n.danger .dot {\n background: var(--status-danger-solid);\n}\n\n.unknown {\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n font-style: italic;\n}\n.unknown .dot {\n background: var(--status-unknown-solid);\n}\n\n.phaseDot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n}\n\n@keyframes pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.4;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .running .dot {\n animation: none;\n }\n}\n\n:root[data-motion=\"reduce\"] .running .dot {\n animation: none;\n}\n","/**\n * components/primitives/StatusBadge.tsx — the ONE status-color mapping for\n * the whole app. See DESIGN.md \"Status-color semantics\" for the reasoning;\n * the short version: `running` is amber (motion, unresolved — matches\n * Vercel/GitHub Actions \"in progress\"), `done` is green (resolved,\n * successful). Neither reuses the accent color, so \"this is clickable\"\n * (accent) never visually collides with \"this succeeded\" (green).\n *\n * Every view should route run/swarm/proposal/daemon status strings through\n * `statusToTone()` rather than switching on raw strings itself, so adding a\n * new backend status value only ever needs one edit, here.\n */\nimport type { ReactNode } from 'react';\nimport styles from './StatusBadge.module.css';\n\nexport type Tone = 'neutral' | 'info' | 'running' | 'success' | 'warning' | 'danger' | 'unknown';\n\nconst STATUS_TONE: Record<string, Tone> = {\n // Run / swarm / proposal lifecycle.\n pending: 'neutral',\n queued: 'neutral',\n waiting: 'neutral',\n running: 'running',\n active: 'running',\n in_progress: 'running',\n building: 'running',\n applying: 'running',\n done: 'success',\n success: 'success',\n succeeded: 'success',\n applied: 'success',\n merged: 'success',\n ready: 'success',\n approved: 'success',\n ship: 'success',\n review: 'warning',\n degraded: 'warning',\n paused: 'warning',\n noise: 'neutral',\n failed: 'danger',\n error: 'danger',\n errored: 'danger',\n rejected: 'danger',\n harmful: 'danger',\n cancelled: 'neutral',\n canceled: 'neutral',\n unknown: 'unknown',\n};\n\nexport function statusToTone(status: string | undefined | null): Tone {\n if (!status) return 'unknown';\n return STATUS_TONE[status.toLowerCase()] ?? 'neutral';\n}\n\nexport interface StatusBadgeProps {\n status: string;\n /** Override the derived tone (rare — prefer letting statusToTone decide). */\n tone?: Tone;\n children?: ReactNode;\n}\n\nexport function StatusBadge({ status, tone, children }: StatusBadgeProps): ReactNode {\n const resolved = tone ?? statusToTone(status);\n return (\n <span className={`${styles.badge} ${styles[resolved]}`}>\n <span className={styles.dot} aria-hidden=\"true\" />\n {children ?? status}\n </span>\n );\n}\n\n/** A named DAG/milestone phase — categorical color, unrelated to health. */\nexport function PhaseDot({ index }: { index: number }): ReactNode {\n const n = ((index % 6) + 6) % 6; // wrap safely for any index, including negatives\n return <span className={styles.phaseDot} style={{ background: `var(--phase-${n + 1})` }} aria-hidden=\"true\" />;\n}\n"],"mappings":"kVCiBM,EAAoC,CAExC,QAAS,UACT,OAAQ,UACR,QAAS,UACT,QAAS,UACT,OAAQ,UACR,YAAa,UACb,SAAU,UACV,SAAU,UACV,KAAM,UACN,QAAS,UACT,UAAW,UACX,QAAS,UACT,OAAQ,UACR,MAAO,UACP,SAAU,UACV,KAAM,UACN,OAAQ,UACR,SAAU,UACV,OAAQ,UACR,MAAO,UACP,OAAQ,SACR,MAAO,SACP,QAAS,SACT,SAAU,SACV,QAAS,SACT,UAAW,UACX,SAAU,UACV,QAAS,SACX,EAEA,SAAgB,EAAa,EAAyC,CAEpE,OADK,EACE,EAAY,EAAO,YAAY,IAAM,UADxB,SAEtB,CASA,SAAgB,EAAY,CAAE,SAAQ,OAAM,YAAyC,CACnF,IAAM,EAAW,GAAQ,EAAa,CAAM,EAC5C,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,KAA3C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAK,cAAY,MAAQ,CAAA,EAChD,GAAY,CACT,GAEV,CAGA,SAAgB,EAAS,CAAE,SAAuC,CAChE,IAAM,GAAM,EAAQ,EAAK,GAAK,EAC9B,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,MAAO,CAAE,WAAY,eAAe,EAAI,EAAE,EAAG,EAAG,cAAY,MAAQ,CAAA,CAC/G"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{H as r,L as i,P as a,S as o,V as ee,W as s,_ as c,b as l,c as u,f as d,g as f,i as te,l as ne,n as re,o as ie,r as p,s as ae,t as oe,y as se,z as m}from"./ChartFrame-Dljee9y6.js";import{c as h,h as g,i as _,l as v,m as ce,n as le,r as ue}from"./colors-DvK0wMHH.js";import{d as de,n as y,s as fe,t as pe}from"./format-D7nBg2bn.js";var b=e(n(),1),x=t(),S=8,C=16,w=2,T=28,E=16,D=4,O=[`Mon`,``,`Wed`,``,`Fri`,``,``],me=[``,`Mon`,``,`Wed`,``,`Fri`,``];function k({title:e,description:t,caveat:n,status:i,days:a,weekStart:o=1,width:c,formatValue:l=pe,unit:u=``,ariaLabel:d}){let ie=(0,b.useRef)(null),p=te(ie,c),ae=(0,b.useId)(),se=ce((0,b.useId)()),h=(0,b.useMemo)(()=>ne(a,o),[a,o]),[_,v]=(0,b.useState)(null),le=Math.max(0,...a.map(e=>e.value??0)),ue=a.some(e=>e.value!==null),de=i??(a.length===0?{kind:`empty`}:ue?{kind:`ready`}:{kind:`unknown`}),fe=p-T,k=Math.max(1,Math.floor((fe+w)/10)),A=Math.min(h.weeks,k),j=h.weeks-A,M=Math.max(S,Math.min(C,Math.floor((fe+w)/Math.max(1,A))-w)),N=j,P=h.cells.filter(e=>e.week>=N),F=T+A*(M+w),I=E+7*(M+w),L=e=>T+(e.week-N)*(M+w),R=e=>E+e.weekday*(M+w),z=u?` ${u}`:``,B=e=>`${y(e.day)}: ${e.value===null?`no data`:`${l(e.value)}${z}`}`,V=[];for(let e of h.months){if(e.week<N)continue;let t=V[V.length-1];t&&e.week-t.week<3||V.push(e)}let H=P.filter(e=>!e.outside),U=_===null?void 0:H[_];function he(e){if(H.length===0)return;let t=_??H.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=H.length-1):r=t+n,r!==null&&(e.preventDefault(),v(Math.max(0,Math.min(H.length-1,r))))}let W=a.filter(e=>e.value!==null),ge=W.reduce((e,t)=>e+(t.value??0),0),G=W.reduce((e,t)=>!e||(t.value??0)>(e.value??0)?t:e,null),K=d??`${e}: ${a.length} days, ${l(ge)}${z} in total`+(G&&(G.value??0)>0?`, busiest ${y(G.day)} with ${l(G.value)}`:``)+(a.length-W.length>0?`, ${a.length-W.length} days without data`:``)+`.`,_e=[{key:`day`,label:`Day`,render:e=>y(e.day)},{key:`value`,label:u?u[0].toUpperCase()+u.slice(1):`Value`,numeric:!0,render:e=>e.value===null?`—`:l(e.value)}],ve=(0,x.jsxs)(`div`,{className:s.legend,"aria-hidden":`true`,children:[(0,x.jsx)(`span`,{className:s.legendItem,children:`Less`}),Array.from({length:5},(e,t)=>(0,x.jsx)(`span`,{className:s.swatch,style:{background:g(t)}},t)),(0,x.jsx)(`span`,{className:s.legendItem,children:`More`}),(0,x.jsxs)(`span`,{className:s.legendItem,children:[(0,x.jsx)(`span`,{className:s.swatchHatch}),`no data`]})]});return(0,x.jsx)(oe,{title:e,description:t,caveat:n,status:de,skeleton:`heat`,table:(0,x.jsx)(re,{caption:e,columns:_e,rows:[...a].sort((e,t)=>e.day.localeCompare(t.day)),rowKey:e=>e.day}),footer:(0,x.jsxs)(x.Fragment,{children:[ve,j>0?(0,x.jsxs)(`p`,{className:s.note,children:[`Showing the latest `,A,` weeks; `,j,` earlier weeks are in the table.`]}):null]}),children:(0,x.jsxs)(`div`,{ref:ie,className:`${s.plotWrap} ${s.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the arrow keys to move between days.`,"aria-describedby":ae,onFocus:()=>v(e=>e??(H.length?H.length-1:null)),onBlur:()=>v(null),onKeyDown:he,children:[(0,x.jsxs)(`svg`,{className:s.svg,width:F,height:I,viewBox:`0 0 ${F} ${I}`,role:`img`,"aria-label":K,children:[(0,x.jsx)(`defs`,{children:(0,x.jsx)(ee,{id:se})}),V.map(e=>(0,x.jsx)(`text`,{className:s.tick,x:T+(e.week-N)*(M+w),y:11,children:e.label},`${e.week}${e.label}`)),(o===1?O:me).map((e,t)=>e&&M>=10?(0,x.jsx)(`text`,{className:s.tick,x:0,y:E+t*(M+w)+M/2,dy:`0.32em`,children:e},t):null),P.map(e=>{if(e.outside)return null;let t=f(e.value,le,D),n=U?.day===e.day;return(0,x.jsx)(`rect`,{"data-day":e.day,"data-bucket":t===null?`unknown`:t,x:L(e),y:R(e),width:M,height:M,rx:2,className:t===null?s.unknownMark:void 0,fill:t===null?`url(#${se})`:g(t),style:n?{stroke:`var(--border-focus)`,strokeWidth:2,strokeDasharray:`none`}:void 0,onPointerEnter:()=>v(H.indexOf(e)),onPointerLeave:()=>v(null)},e.day)})]}),(0,x.jsx)(`span`,{id:ae,className:s.srOnly,"aria-live":`polite`,children:U?B(U):``}),U?(0,x.jsx)(m,{left:r(L(U)+M/2,F,60),top:R(U),title:y(U.day),rows:[{key:`v`,label:u||`Value`,value:U.value===null?null:l(U.value)}]}):null]})})}var A={band:`_band_1rlew_3`,focusRing:`_focusRing_1rlew_8`};function j(e){return e.estimate===null||e.low===null||e.high===null?`unknown`:e.low>0?`positive`:e.high<0?`negative`:`none`}var M={positive:`helped (interval above zero)`,negative:`hurt (interval below zero)`,none:`no clear effect (interval crosses zero)`,unknown:`unknown`};function N(e){return e===`positive`?_:e===`negative`?ue:`var(--text-secondary)`}function P(e,t){return e>0?`+${t(e)}`:t(e)}var F=e=>Math.abs(e)>=10?e.toFixed(0):e.toFixed(1),I=28,L=22,R=12,z=480;function B({title:e,description:t,caveat:n,status:r,rows:a,unit:c=``,gate:l,formatValue:d,unknownText:f=`not enough pairs yet`,width:ne,ariaLabel:ie}){let p=d??F,se=(0,b.useRef)(null),m=te(se,ne),[h,g]=(0,b.useState)(null),v=(0,b.useId)(),de=ce((0,b.useId)()),y=c?` ${c}`:``,fe=a.filter(e=>j(e)!==`unknown`),pe=r??(a.length===0?{kind:`empty`,message:`No experiments have run yet.`}:{kind:`ready`}),S=m<z,C=Math.max(84,Math.min(180,Math.round(m*(S?.3:.26)))),w=S?0:118,T=C+8,E=Math.max(T+40,m-w-R),D=fe.flatMap(e=>[e.low,e.high]),O=Math.min(0,l?.value??0,...D),me=Math.max(0,l?.value??0,...D),k=u(O,me===O?O+1:me,{count:S?3:5,integer:ae([...D,l?.value??0]),format:d?e=>e===0?`0`:P(e,d):void 0}),B=k.ticks,V=d?k.labels:k.labels.map((e,t)=>B[t]>0?`+${e}`:e),H=o(B[0],B[B.length-1],T,E),U=a.length*I,he=U+L,W=e=>{let t=j(e);return t===`unknown`?`${e.label}: ${f}`:`${e.label}: ${P(e.estimate,p)}${y}, 95% interval ${P(e.low,p)} to ${P(e.high,p)}; ${M[t]}`},ge=fe.filter(e=>j(e)===`positive`).length,G=ie??`${e}: ${a.length} experiment${a.length===1?``:`s`}, ${ge} with an interval above zero.`;function K(e){if(a.length===0)return;let t=h??0,n=e.key===`ArrowDown`?t+1:e.key===`ArrowUp`?t-1:e.key===`Home`?0:e.key===`End`?a.length-1:null;n!==null&&(e.preventDefault(),g(Math.max(0,Math.min(a.length-1,n))))}let _e=[{key:`label`,label:`Experiment`,render:e=>e.label},{key:`est`,label:`Estimate${y}`,numeric:!0,render:e=>e.estimate===null?`—`:P(e.estimate,p)},{key:`ci`,label:`95% interval`,numeric:!0,render:e=>e.low===null||e.high===null?`—`:`${P(e.low,p)} to ${P(e.high,p)}`},{key:`n`,label:`Pairs`,numeric:!0,render:e=>e.n===null||e.n===void 0?`—`:String(e.n)},{key:`verdict`,label:`Reading`,render:e=>j(e)===`unknown`?f:M[j(e)]},...a.some(e=>e.detail)?[{key:`detail`,label:`Status`,render:e=>e.detail??``}]:[]],ve=h===null?void 0:a[h],q=Math.floor(C/7);return(0,x.jsx)(oe,{title:e,description:t,caveat:n,status:pe,skeleton:`lanes`,table:(0,x.jsx)(re,{caption:e,columns:_e,rows:a,rowKey:e=>e.id}),footer:(0,x.jsx)(i,{min:1,items:[{label:`Helped`,color:_},{label:`Hurt`,color:ue},{label:`No clear effect`,color:`var(--text-secondary)`},...a.length>fe.length?[{label:f,kind:`hatch`}]:[]]}),children:(0,x.jsxs)(`div`,{ref:se,className:`${s.plotWrap} ${s.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the up and down arrow keys to read each experiment.`,"aria-describedby":v,onFocus:()=>g(e=>e??(a.length?0:null)),onBlur:()=>g(null),onKeyDown:K,children:[(0,x.jsxs)(`svg`,{className:s.svg,width:m,height:he,viewBox:`0 0 ${m} ${he}`,role:`img`,"aria-label":G,children:[(0,x.jsx)(`defs`,{children:(0,x.jsx)(ee,{id:de})}),B.map((e,t)=>(0,x.jsxs)(`g`,{children:[(0,x.jsx)(`line`,{className:s.grid,x1:H(e),x2:H(e),y1:0,y2:U}),(0,x.jsx)(`text`,{className:s.tick,x:H(e),y:he-6,textAnchor:`middle`,children:V[t]})]},e)),(0,x.jsx)(`line`,{"data-role":`zero`,x1:H(0),x2:H(0),y1:0,y2:U,stroke:le,strokeWidth:1.5}),l&&l.value!==0?(0,x.jsx)(`g`,{"data-role":`gate`,children:(0,x.jsx)(`line`,{className:s.reference,x1:H(l.value),x2:H(l.value),y1:0,y2:U})}):null,a.map((e,t)=>{let n=t*I+I/2,r=j(e),i=N(r),a=h===t;return(0,x.jsxs)(`g`,{"data-row":e.id,"data-verdict":r,opacity:h!==null&&!a?.55:1,children:[t%2==1?(0,x.jsx)(`rect`,{className:A.band,x:0,y:t*I,width:m,height:I}):null,(0,x.jsx)(`text`,{className:s.label,x:C,y:n,dy:`0.32em`,textAnchor:`end`,children:e.label.length>q?`${e.label.slice(0,q-1)}…`:e.label}),r===`unknown`?(0,x.jsxs)(`g`,{"data-role":`unknown`,children:[(0,x.jsx)(`rect`,{className:s.unknownMark,fill:`url(#${de})`,x:T+.5,y:n-5,width:Math.max(1,E-T-1),height:10,rx:2}),S?null:(0,x.jsx)(`text`,{className:s.tick,x:m-R,y:n,dy:`0.32em`,textAnchor:`end`,children:f})]}):(0,x.jsxs)(`g`,{children:[(0,x.jsx)(`line`,{"data-role":`ci`,x1:H(e.low),x2:H(e.high),y1:n,y2:n,stroke:i,strokeWidth:2,strokeLinecap:`round`}),(0,x.jsx)(`line`,{x1:H(e.low),x2:H(e.low),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,x.jsx)(`line`,{x1:H(e.high),x2:H(e.high),y1:n-5,y2:n+5,stroke:i,strokeWidth:1.5}),(0,x.jsx)(`rect`,{"data-role":`estimate`,className:s.marker,x:H(e.estimate)-5,y:n-5,width:10,height:10,rx:2,fill:i}),S?null:(0,x.jsxs)(`text`,{className:s.tick,x:m-R,y:n,dy:`0.32em`,textAnchor:`end`,children:[P(e.estimate,p),` [`,P(e.low,p),`, `,P(e.high,p),`]`]})]}),a?(0,x.jsx)(`rect`,{className:A.focusRing,x:1,y:t*I+1,width:m-2,height:26,rx:3}):null]},e.id)})]}),(0,x.jsx)(`span`,{id:v,className:s.srOnly,"aria-live":`polite`,children:ve?W(ve):``})]})})}function V(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 H=18,U=26,he=14,W=864e5,ge=e=>Math.abs(e)>=10?e.toFixed(0):e.toFixed(1);function G(e,t){return e>0?`+${t(e)}`:t(e)}function K({title:e,description:t,caveat:n,status:f,steps:ne,markers:g=[],now:_,from:le,baseline:y,unit:pe=``,formatValue:S,formatTime:C,height:w=200,width:T,ariaLabel:E}){let D=S??ge,O=e=>c(e)?(C??fe)(e):`—`,me=(0,b.useRef)(null),k=te(me,T),A=p(),[j,M]=(0,b.useState)(null),N=(0,b.useId)(),P=ce((0,b.useId)()),F=pe?` ${pe}`:``,I=_??Date.now(),L=V(ne,I),R=g.filter(e=>c(e.at)),z=L.filter(e=>e.value!==null),B=f??(L.length===0?{kind:`empty`,message:`No versions yet — the compiled defaults are in force.`}:z.length===0?{kind:`unknown`,reason:`no version has a measured value yet.`}:{kind:`ready`}),K=[...L.map(e=>e.at),...R.map(e=>e.at)].filter(c),_e=Math.max(c(I)?I:0,...K,...L.map(e=>e.until).filter(c)),ve=le!==void 0&&c(le)?le:K.length?Math.min(...K):_e-W,[q,ye]=d(ve,_e,ie,`end`),be=z.flatMap(e=>[e.value,e.low??e.value,e.high??e.value]),xe=Math.min(y?.value??0,...be),Se=Math.max(y?.value??0,...be),Ce=u(xe,Se===xe?xe+1:Se,{count:4,integer:ae([...be,y?.value??0]),format:S?e=>e===0?`0`:G(e,S):void 0}),we=Ce.ticks,Te=S?Ce.labels:Ce.labels.map((e,t)=>we[t]>0?`+${e}`:e),J=a(Te,30,56,A),Y=Math.max(40,k-J-he),Ee=w-H-U,De=o(q,ye,J,J+Y),X=o(we[0],we[we.length-1],H+Ee,H),Z=e=>Math.min(J+Y,Math.max(J,De(e))),Oe=de(q,ye,C,[q,ye]),ke=l([{key:`start`,x:J,anchor:`start`,priority:2,variants:Oe.map(e=>e(q))},{key:`end`,x:J+Y,anchor:`end`,priority:3,variants:Oe.map(e=>e(ye))}],{min:J,max:J+Y,charPx:se(A)}),Ae=[],Q=[],je=null;for(let e of L){if(e.value===null){Q.length&&Ae.push(Q.join(` `)),Q=[],je=null;continue}let t=X(e.value),n=Z(e.at),r=Z(e.until);Q.push(je===null?`M${n.toFixed(1)},${t.toFixed(1)}`:`L${n.toFixed(1)},${t.toFixed(1)}`),Q.push(`L${r.toFixed(1)},${t.toFixed(1)}`),je=t}Q.length&&Ae.push(Q.join(` `));let Me=e=>`${e.label}${e.detail?` (${e.detail})`:``}, ${O(e.at)} to ${O(e.until)}: `+(e.value===null?`not measured`:`${G(e.value,D)}${F}`+(e.low!==null&&e.low!==void 0&&e.high!==null&&e.high!==void 0?`, 95% interval ${G(e.low,D)} to ${G(e.high,D)}`:``)),Ne=z[z.length-1],Pe=R.filter(e=>e.kind===`rollback`).length,Fe=E??`${e}: ${L.length} step${L.length===1?``:`s`}`+(Ne?`, now ${G(Ne.value,D)}${F}`:``)+(Pe?`, ${Pe} rollback${Pe===1?``:`s`}`:``)+`.`;function Ie(e){if(L.length===0)return;let t=j??L.length-1,n=e.key===`ArrowLeft`?t-1:e.key===`ArrowRight`?t+1:e.key===`Home`?0:e.key===`End`?L.length-1:null;n!==null&&(e.preventDefault(),M(Math.max(0,Math.min(L.length-1,n))))}let Le=[...L.map(e=>({id:`s:${e.id}`,when:e.at,what:`${e.label}${e.detail?` · ${e.detail}`:``}`,value:e.value===null?`—`:G(e.value,D),interval:e.low===null||e.low===void 0||e.high===null||e.high===void 0?`—`:`${G(e.low,D)} to ${G(e.high,D)}`})),...R.map(e=>({id:`m:${e.id}`,when:e.at,what:`${e.kind===`rollback`?`▼ Rolled back`:`▲ Adopted`}: ${e.label}`,value:``,interval:``}))].sort((e,t)=>e.when-t.when),Re=[{key:`when`,label:`When`,render:e=>O(e.when)},{key:`what`,label:`Step`,render:e=>e.what},{key:`value`,label:`Level${F}`,numeric:!0,render:e=>e.value},{key:`ci`,label:`95% interval`,numeric:!0,render:e=>e.interval}],$=j===null?void 0:L[j];return(0,x.jsx)(oe,{title:e,description:t,caveat:n,status:B,skeleton:`line`,table:(0,x.jsx)(re,{caption:e,columns:Re,rows:Le,rowKey:e=>e.id}),footer:(0,x.jsx)(i,{items:[{label:`Level`,color:h,kind:`line`},{label:`95% interval`,color:v},...Pe?[{label:`▼ rollback`,color:ue}]:[],...L.some(e=>e.value===null)?[{label:`not measured`,kind:`hatch`}]:[]]}),children:(0,x.jsxs)(`div`,{ref:me,className:`${s.plotWrap} ${s.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the left and right arrow keys to read each step.`,"aria-describedby":N,onFocus:()=>M(e=>e??(L.length?L.length-1:null)),onBlur:()=>M(null),onKeyDown:Ie,children:[(0,x.jsxs)(`svg`,{className:s.svg,width:k,height:w,viewBox:`0 0 ${k} ${w}`,role:`img`,"aria-label":Fe,children:[(0,x.jsx)(`defs`,{children:(0,x.jsx)(ee,{id:P})}),we.map((e,t)=>(0,x.jsxs)(`g`,{children:[(0,x.jsx)(`line`,{className:s.grid,x1:J,x2:J+Y,y1:X(e),y2:X(e)}),(0,x.jsx)(`text`,{className:s.tick,x:J-6,y:X(e),dy:`0.32em`,textAnchor:`end`,children:Te[t]})]},e)),ke.map(e=>(0,x.jsx)(`text`,{"data-axis-label":e.key,className:s.tick,x:e.x,y:w-8,textAnchor:e.anchor,children:e.text},e.key)),y?(0,x.jsxs)(`g`,{"data-role":`baseline`,children:[(0,x.jsx)(`line`,{className:s.reference,x1:J,x2:J+Y,y1:X(y.value),y2:X(y.value)}),(0,x.jsx)(`text`,{className:`${s.tick} ${s.halo}`,x:J+4,y:X(y.value)-5,children:y.label})]}):null,L.map((e,t)=>{let n=Z(e.at),r=Math.max(n+1,Z(e.until));if(e.value===null)return(0,x.jsx)(`rect`,{"data-step":e.id,"data-unknown":`true`,className:s.unknownMark,fill:`url(#${P})`,x:n,y:H,width:r-n,height:Ee,opacity:.6},e.id);let i=e.low!==null&&e.low!==void 0&&e.high!==null&&e.high!==void 0;return(0,x.jsx)(`g`,{"data-step":e.id,opacity:j!==null&&j!==t?.6:1,children:i?(0,x.jsx)(`rect`,{"data-role":`band`,x:n,y:X(e.high),width:r-n,height:Math.max(1,X(e.low)-X(e.high)),fill:v,opacity:.35}):null},e.id)}),Ae.map((e,t)=>(0,x.jsx)(`path`,{"data-role":`level`,className:s.line,stroke:h,d:e},t)),L.map(e=>e.value===null?null:(0,x.jsx)(`circle`,{className:s.marker,cx:Z(e.at),cy:X(e.value),r:3.5,fill:h},`p${e.id}`)),R.map(e=>{let t=Z(e.at),n=e.kind===`rollback`?`M${t-5},8 L${t+5},8 L${t},16 Z`:`M${t-5},16 L${t+5},16 L${t},8 Z`;return(0,x.jsx)(`path`,{"data-marker":e.kind,d:n,fill:e.kind===`rollback`?ue:h,children:(0,x.jsx)(`title`,{children:`${e.kind===`rollback`?`Rolled back`:`Adopted`}: ${e.label} · ${O(e.at)}`})},e.id)})]}),(0,x.jsx)(`span`,{id:N,className:s.srOnly,"aria-live":`polite`,children:$?Me($):``}),$?(0,x.jsx)(m,{left:r((Z($.at)+Z($.until))/2,k),top:$.value===null?H+Ee/2:X($.high??$.value),title:`${$.label}${$.detail?` · ${$.detail}`:``}`,rows:[{key:`v`,label:`Level`,value:$.value===null?null:`${G($.value,D)}${F}`},{key:`ci`,label:`95% interval`,value:$.low===null||$.low===void 0||$.high===null||$.high===void 0?null:`${G($.low,D)} to ${G($.high,D)}`},{key:`t`,label:`From`,value:O($.at)}]}):null]})})}export{B as n,k as r,K as t};
2
+ //# sourceMappingURL=StepBand-Bdkv7iGd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepBand-Bdkv7iGd.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 skeleton=\"heat\"\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 { allIntegers, axisTicks, linearScale } 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 defaultFormatValue = (v: number): string => (Math.abs(v) >= 10 ? v.toFixed(0) : v.toFixed(1));\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: formatValueProp,\n unknownText = 'not enough pairs yet',\n width: fixedWidth,\n ariaLabel,\n}: ForestPlotProps) {\n const formatValue = formatValueProp ?? defaultFormatValue;\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 // Tick labels at the step's own precision (a lift axis of 0.25 steps\n // printed at one decimal read \"+0.3 / +0.8\"); a caller's formatter is\n // held to printing every tick faithfully.\n const xAxis = axisTicks(lo, hi === lo ? lo + 1 : hi, {\n count: narrow ? 3 : 5,\n integer: allIntegers([...bounds, gate?.value ?? 0]),\n format: formatValueProp ? (t) => (t === 0 ? '0' : signed(t, formatValueProp)) : undefined,\n });\n const ticks = xAxis.ticks;\n const tickLabels = formatValueProp ? xAxis.labels : xAxis.labels.map((l, i) => (ticks[i]! > 0 ? `+${l}` : l));\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 skeleton=\"lanes\"\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, i) => (\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 {tickLabels[i]}\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 { MIN_TIME_SPAN_MS, allIntegers, axisTicks, ensureSpan, isPlausibleTime, labelCharPx, layoutAxisLabels, linearScale, tickGutter } from './chart-math.js';\nimport { formatTimeLabel, timeLabelLadder } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport { useTextScale } from './useTextScale.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/** With no plausible time at all, the window shown ends now and spans a day. */\nconst FALLBACK_SPAN_MS = 86_400_000;\nconst defaultFormatValue = (v: number): string => (Math.abs(v) >= 10 ? v.toFixed(0) : v.toFixed(1));\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: markersProp = [],\n now: nowProp,\n from: fromProp,\n baseline,\n unit = '',\n formatValue: formatValueProp,\n formatTime: formatTimeProp,\n height = 200,\n width: fixedWidth,\n ariaLabel,\n}: StepBandProps) {\n const formatValue = formatValueProp ?? defaultFormatValue;\n // A 0 / pre-2000 time is a null timestamp that leaked through (a baseline\n // \"created\" at epoch 0): it is spoken and tabled as \"—\", never \"Dec 31\".\n const formatTime = (ms: number): string => (isPlausibleTime(ms) ? (formatTimeProp ?? formatTimeLabel)(ms) : '—');\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const textScale = useTextScale();\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 // A marker at an implausible time has nowhere honest to sit on the axis.\n const markers = markersProp.filter((m) => isPlausibleTime(m.at));\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 // The domain comes from plausible times only; a step stamped at epoch 0\n // still draws — held from the left edge — but no longer drags the axis to\n // 1970. A degenerate span widens to MIN_TIME_SPAN_MS, ending at `now`.\n const starts = [...spans.map((s) => s.at), ...markers.map((m) => m.at)].filter(isPlausibleTime);\n const right = Math.max(isPlausibleTime(now) ? now : 0, ...starts, ...spans.map((s) => s.until).filter(isPlausibleTime));\n const left = fromProp !== undefined && isPlausibleTime(fromProp) ? fromProp : starts.length ? Math.min(...starts) : right - FALLBACK_SPAN_MS;\n const [x0, x1] = ensureSpan(left, right, MIN_TIME_SPAN_MS, 'end');\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 yAxis = axisTicks(lo, hi === lo ? lo + 1 : hi, {\n count: 4,\n integer: allIntegers([...ys0, baseline?.value ?? 0]),\n format: formatValueProp ? (t) => (t === 0 ? '0' : signed(t, formatValueProp)) : undefined,\n });\n const ticks = yAxis.ticks;\n // Kit labels take their precision from the step; a lift above zero wears \"+\".\n const tickLabels = formatValueProp ? yAxis.labels : yAxis.labels.map((l, i) => (ticks[i]! > 0 ? `+${l}` : l));\n const padL = tickGutter(tickLabels, 30, 56, textScale);\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 // Start / end labels, collision-free at the operator's Display size: the\n // end (now) outranks the start.\n const ladder = timeLabelLadder(x0, x1, formatTimeProp, [x0, x1]);\n const xLabels = layoutAxisLabels(\n [\n { key: 'start', x: padL, anchor: 'start', priority: 2, variants: ladder.map((f) => f(x0)) },\n { key: 'end', x: padL + plotW, anchor: 'end', priority: 3, variants: ladder.map((f) => f(x1)) },\n ],\n { min: padL, max: padL + plotW, charPx: labelCharPx(textScale) },\n );\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 skeleton=\"line\"\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, i) => (\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\">{tickLabels[i]}</text>\n </g>\n ))}\n {xLabels.map((l) => (\n <text key={l.key} data-axis-label={l.key} className={plot.tick} x={l.x} y={height - 8} textAnchor={l.anchor}>{l.text}</text>\n ))}\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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"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{gt as r}from"./VerseConsoleApp-DjPpZLo1.js";var i=e(n(),1),a={surface:`_surface_1ck24_6`,strip:`_strip_1ck24_14`,title:`_title_1ck24_29`,stripActions:`_stripActions_1ck24_39`,scroll:`_scroll_1ck24_45`,body:`_body_1ck24_53`,grid:`_grid_1ck24_62`,cell:`_cell_1ck24_70`,card:`_card_1ck24_79`,cardHead:`_cardHead_1ck24_114`,cardHeading:`_cardHeading_1ck24_121`,cardTitle:`_cardTitle_1ck24_130`,cardCaption:`_cardCaption_1ck24_138`,cardActions:`_cardActions_1ck24_144`,note:`_note_1ck24_151`,micro:`_micro_1ck24_172`},o=t(),s=e=>Math.max(1,Math.min(12,Math.round(Number.isFinite(e)?e:12)));function c(e,t){let n=s(t);return e===`compact`?12:e===`medium`?n<=6?6:12:n}function l(e,t){let n=t.map(s),r=n.map(t=>c(e,t));if(e!==`medium`)return r;let i=0,a=0;for(let e=0;e<n.length;e+=1)if(a+n[e]>12&&(i=e,a=0),a+=n[e],a===12){let t=e-i+1;if(t>=2){for(let t=i;t<=e;t+=1)r[t]=6;t%2==1&&(r[e]=12)}i=e+1,a=0}return r}function u(e){return(0,i.isValidElement)(e)&&e.type===p}function d(e,t){let n=i.Children.toArray(e),r=l(t,n.filter(u).map(e=>e.props.span)),a=0;return n.map(e=>u(e)?(0,i.cloneElement)(e,{layoutSpan:r[a++]}):e)}function f({title:e,actions:t,lead:n,children:s}){let c=(0,i.useId)(),{viewport:l}=r();return(0,o.jsxs)(`section`,{className:a.surface,"aria-labelledby":c,"data-viewport":l,children:[(0,o.jsxs)(`header`,{className:a.strip,"data-app-region":`drag`,children:[(0,o.jsx)(`h2`,{id:c,className:a.title,children:e}),t?(0,o.jsx)(`div`,{className:a.stripActions,children:t}):null]}),(0,o.jsx)(`div`,{className:a.scroll,children:(0,o.jsxs)(`div`,{className:a.body,children:[n,(0,o.jsx)(`div`,{className:a.grid,children:d(s,l)})]})})]})}function p({span:e,children:t,className:n,id:i,layoutSpan:s}){let{viewport:l}=r(),u={gridColumn:`span ${s??c(l,e)}`};return(0,o.jsx)(`div`,{id:i,className:`${a.cell} ${n??``}`,style:u,"data-span":e,children:t})}function m({title:e,caption:t,actions:n,children:r,tone:s,labelledBy:c}){let l=(0,i.useId)(),u=c??l;return(0,o.jsxs)(`section`,{className:a.card,"aria-labelledby":u,"data-tone":s,children:[(0,o.jsxs)(`header`,{className:a.cardHead,children:[(0,o.jsxs)(`span`,{className:a.cardHeading,children:[(0,o.jsx)(`h3`,{id:u,className:a.cardTitle,children:e}),t?(0,o.jsx)(`span`,{className:a.cardCaption,children:t}):null]}),n?(0,o.jsx)(`span`,{className:a.cardActions,children:n}):null]}),r]})}function h({children:e,tone:t=`muted`}){return(0,o.jsx)(`p`,{className:a.note,"data-tone":t,role:t===`danger`?`alert`:`note`,children:e})}function g({children:e}){return(0,o.jsx)(`span`,{className:a.micro,children:e})}export{f as a,g as i,h as n,p as r,m as t};
2
+ //# sourceMappingURL=Surface-DVOAKl2g.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Surface-DVOAKl2g.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/surface.module.css","../../../../../../src/web-ui/routes/verse/command/Surface.tsx"],"sourcesContent":["/*\n * routes/verse/command/surface.module.css — the shared chrome of the four\n * 3.10 surfaces: strip, scroll region, 12-column grid, card frame. Tokens\n * only (style-scan-310: no raw hex, no px font sizes).\n */\n.surface {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--bg-canvas);\n}\n\n.strip {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n height: var(--strip-height);\n padding: 0 var(--space-5);\n /* Desktop shell: only the traffic-light overlap past the rail is owed. */\n padding-left: max(var(--space-5), calc(var(--app-traffic-light-inset, 0px) - var(--rail-width, 56px)));\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n/* Surface title: Grotesk 20/28, −0.02em (SPEC-310C §6). */\n.title {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-xl-size);\n line-height: var(--text-xl-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display);\n color: var(--text-primary);\n}\n\n.stripActions {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n}\n\n.scroll {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-gutter: stable;\n}\n\n.body {\n display: flex;\n flex-direction: column;\n gap: var(--surface-gap);\n max-width: 1440px;\n margin: 0 auto;\n padding: var(--space-5) var(--space-5) var(--space-16);\n}\n\n.grid {\n display: grid;\n grid-template-columns: repeat(var(--surface-columns), minmax(0, 1fr));\n gap: var(--surface-gap);\n /* Cells share their row's height (audit 16)… */\n align-items: stretch;\n}\n\n.cell {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n/* …and a plain Card fills it, so a pair (Needs you | Leader) is one height.\n A chart frame keeps its natural height: stretching a chart to a taller\n neighbour draws a half-empty card (the 3.9 harness finding). */\n.cell > .card {\n flex: 1 1 auto;\n}\n\n/* A card that renders nothing (e.g. Cloud on a server without the lane)\n leaves no empty row and no extra grid gap. */\n.cell:empty {\n display: none;\n}\n\n.surface[data-viewport='compact'] .body {\n padding: var(--space-4) var(--space-4) var(--space-12);\n}\n\n.surface[data-viewport='compact'] .strip {\n padding: 0 var(--space-4);\n}\n\n/* Card frame — identical to ChartFrame so chart and non-chart cards read as one set. */\n.card {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n min-width: 0;\n padding: var(--card-pad);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n}\n\n.card[data-tone='attention'] {\n border-color: var(--border-default);\n box-shadow: inset 0 1px 0 var(--hairline-lift, transparent);\n}\n\n.cardHead {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--space-3);\n}\n\n.cardHeading {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n gap: 2px;\n min-width: 0;\n}\n\n/* Card title 13/18, 600. */\n.cardTitle {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.cardCaption {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.cardActions {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n flex: none;\n}\n\n.note {\n margin: 0;\n padding: var(--space-3);\n border-radius: var(--radius-md);\n background: var(--bg-hover);\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line-relaxed);\n}\n\n.note[data-tone='unknown'] {\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n}\n\n.note[data-tone='danger'] {\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n}\n\n/* Micro-label 11/14 uppercase (SPEC-310C §6). */\n.micro {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n","/**\n * routes/verse/command/Surface.tsx — the layout every 3.10 surface shares\n * (Command, Fleet, Growth, Mind; SPEC-310C §5 + DESIGN.md §13.4).\n *\n * - a 48px strip with the surface title (Grotesk 20/28) and its actions;\n * - one scroll region;\n * - a 12-column grid (`--surface-columns`) with 16px gaps. Cards that\n * share a row are one height (a plain Card fills its cell); a chart frame\n * keeps its natural height, never stretched to a taller neighbour (the\n * 3.9 harness showed half-empty chart cards);\n * - spans come from the viewport class, never a hard-coded breakpoint:\n * wide uses the span as written; medium keeps each wide ROW whole —\n * a pair that fills 12 columns (5 | 7, 8 | 4) becomes 6 | 6 instead of\n * half + full with a blank half-row between (audit 15), and any other\n * cell folds ≤ 6 to half width and wider to full; compact (375) is one\n * column in DOM order — which is why every surface writes its cards in\n * the order the phone should show them.\n */\nimport { Children, cloneElement, isValidElement, useId, type CSSProperties, type ReactElement, type ReactNode } from 'react';\nimport { useViewport, type ViewportClass } from '../shell/viewport.js';\nimport styles from './surface.module.css';\n\nconst clampSpan = (span: number): number => Math.max(1, Math.min(12, Math.round(Number.isFinite(span) ? span : 12)));\n\n/** The grid span ONE card gets at a viewport class, on its own (no row context). Pure (tested). */\nexport function spanFor(viewport: ViewportClass, span: number): number {\n const s = clampSpan(span);\n if (viewport === 'compact') return 12;\n if (viewport === 'medium') return s <= 6 ? 6 : 12;\n return s;\n}\n\n/**\n * The spans a run of cells gets at a viewport class, in DOM order. Pure (tested).\n *\n * At medium the cells are grouped into the rows the wide grid would draw\n * (auto-placement: a cell that does not fit starts the next row). A row that\n * exactly fills 12 columns with two or more cells is treated as a unit: every\n * cell goes to half width, and an odd one out (a 4 | 4 | 4 trio's third)\n * takes the full row — so no row is left with a blank half. A row that does\n * not fill 12 (the surface's own layout left room) folds cell by cell.\n */\nexport function layoutSpans(viewport: ViewportClass, spans: readonly number[]): number[] {\n const wide = spans.map(clampSpan);\n const out = wide.map((s) => spanFor(viewport, s));\n if (viewport !== 'medium') return out;\n let start = 0;\n let sum = 0;\n for (let i = 0; i < wide.length; i += 1) {\n if (sum + wide[i]! > 12) {\n start = i;\n sum = 0;\n }\n sum += wide[i]!;\n if (sum === 12) {\n const count = i - start + 1;\n if (count >= 2) {\n for (let j = start; j <= i; j += 1) out[j] = 6;\n if (count % 2 === 1) out[i] = 12;\n }\n start = i + 1;\n sum = 0;\n }\n }\n return out;\n}\n\ninterface CellProps {\n span: number;\n children: ReactNode;\n className?: string;\n id?: string;\n /** Set by Surface from the whole grid's rows (layoutSpans); a Cell outside a Surface falls back to spanFor. */\n layoutSpan?: number;\n}\n\nfunction isCell(node: ReactNode): node is ReactElement<CellProps> {\n return isValidElement(node) && node.type === Cell;\n}\n\n/**\n * Hands each direct Cell child its span for this viewport, computed across the\n * whole run so rows stay whole. Only direct children (and arrays) are seen —\n * a Cell nested in a fragment keeps its own `spanFor` fallback.\n */\nfunction laidOut(children: ReactNode, viewport: ViewportClass): ReactNode[] {\n const items = Children.toArray(children);\n const spans = layoutSpans(viewport, items.filter(isCell).map((c) => c.props.span));\n let k = 0;\n return items.map((child) => (isCell(child) ? cloneElement(child, { layoutSpan: spans[k++] }) : child));\n}\n\nexport interface SurfaceProps {\n /** Accessible name and visible title (\"Command\"). */\n title: string;\n /** Right side of the strip (refresh indicator, etc.). */\n actions?: ReactNode;\n /** Rendered above the grid, full width (the Command top bar, the verdict). */\n lead?: ReactNode;\n children: ReactNode;\n}\n\nexport function Surface({ title, actions, lead, children }: SurfaceProps) {\n const titleId = useId();\n const { viewport } = useViewport();\n return (\n <section className={styles.surface} aria-labelledby={titleId} data-viewport={viewport}>\n <header className={styles.strip} data-app-region=\"drag\">\n <h2 id={titleId} className={styles.title}>{title}</h2>\n {actions ? <div className={styles.stripActions}>{actions}</div> : null}\n </header>\n <div className={styles.scroll}>\n <div className={styles.body}>\n {lead}\n <div className={styles.grid}>{laidOut(children, viewport)}</div>\n </div>\n </div>\n </section>\n );\n}\n\n/** One grid cell. `span` is the 1440 layout's column count (SPEC-310C §5 table). */\nexport function Cell({ span, children, className, id, layoutSpan }: CellProps) {\n const { viewport } = useViewport();\n const style: CSSProperties = { gridColumn: `span ${layoutSpan ?? spanFor(viewport, span)}` };\n return (\n <div id={id} className={`${styles.cell} ${className ?? ''}`} style={style} data-span={span}>\n {children}\n </div>\n );\n}\n\n/**\n * A non-chart card with the same frame as ChartFrame: title (13/18 600),\n * one caption line, then the body. Charts bring their own frame.\n */\nexport function Card({\n title,\n caption,\n actions,\n children,\n tone,\n labelledBy,\n}: {\n title: ReactNode;\n caption?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n /** A quiet emphasis for the one card that needs the operator (Needs you). */\n tone?: 'attention';\n labelledBy?: string;\n}) {\n const ownId = useId();\n const titleId = labelledBy ?? ownId;\n return (\n <section className={styles.card} aria-labelledby={titleId} data-tone={tone}>\n <header className={styles.cardHead}>\n <span className={styles.cardHeading}>\n <h3 id={titleId} className={styles.cardTitle}>{title}</h3>\n {caption ? <span className={styles.cardCaption}>{caption}</span> : null}\n </span>\n {actions ? <span className={styles.cardActions}>{actions}</span> : null}\n </header>\n {children}\n </section>\n );\n}\n\n/** A designed not-available / unknown line inside a card. */\nexport function CardNote({ children, tone = 'muted' }: { children: ReactNode; tone?: 'muted' | 'unknown' | 'danger' }) {\n return (\n <p className={styles.note} data-tone={tone} role={tone === 'danger' ? 'alert' : 'note'}>\n {children}\n </p>\n );\n}\n\n/** The micro-label (11/14 uppercase) used for group headings inside cards. */\nexport function MicroLabel({ children }: { children: ReactNode }) {\n return <span className={styles.micro}>{children}</span>;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{A as r,B as i,H as a,I as o,L as s,S as c,V as l,W as u,_ as d,a as f,b as p,f as m,i as h,k as g,n as ee,o as _,r as v,t as y,u as b,y as x,z as te}from"./ChartFrame-Dljee9y6.js";import{c as S,m as ne,p as C,s as re,y as w}from"./colors-DvK0wMHH.js";var T=e(n(),1),E={box:`_box_i6k7k_1`,fillBox:`_fillBox_i6k7k_8`,sparkline:`_sparkline_i6k7k_15`,line:`_line_i6k7k_20`,dot:`_dot_i6k7k_28`,area:`_area_i6k7k_34`,flat:`_flat_i6k7k_39`},D=t();function O(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`:``)}var k=112;function ie(e){let t=(0,T.useRef)(null),[n,r]=(0,T.useState)(k);return(0,T.useLayoutEffect)(()=>{if(!e)return;let n=t.current;if(!n)return;let i=()=>{let e=Math.floor(n.getBoundingClientRect().width);e>0&&r(t=>t===e?t:e)};if(i(),typeof ResizeObserver>`u`)return;let a=0,o=new ResizeObserver(()=>{cancelAnimationFrame(a),a=requestAnimationFrame(i)});return o.observe(n),()=>{cancelAnimationFrame(a),o.disconnect()}},[e]),[t,n]}function A({points:e,width:t=72,height:n=24,ariaLabel:i,area:a=!1,describe:s,color:c=S}){let l=t===`fill`,[d,p]=ie(l),m=l?p:t,h=f(),ee=(0,T.useId)(),_=s?`${i}: ${O(e,s)}`:i,v=e.filter(e=>e!==null),y=3.5,b;if(v.length<2)b=(0,D.jsx)(`line`,{className:E.flat,x1:1,x2:m-1,y1:n-1.5,y2:n-1.5});else{let t=Math.min(...v,0),i=Math.max(...v,0)-t||1,s=(m-y*2)/Math.max(1,e.length-1),l=e=>y+(1-(e-t)/i)*(n-y*2),d=[],f=[];e.forEach((e,t)=>{if(e===null){f.length&&d.push(f),f=[];return}f.push({x:y+t*s,y:l(e)})}),f.length&&d.push(f);let p=e.map(e=>e!==null).lastIndexOf(!0),h=p>=0?{x:y+p*s,y:l(e[p])}:null,_=l(Math.max(t,0)),x=C(ee,`spark`);b=(0,D.jsxs)(D.Fragment,{children:[a?(0,D.jsx)(`defs`,{children:(0,D.jsx)(o,{id:x,color:c,top:y,bottom:_,from:.28})}):null,a?d.map((e,t)=>e.length>1?(0,D.jsx)(`path`,{className:`${E.area} ${u.fadeIn}`,fill:`url(#${x})`,d:g(e,e.map(e=>({x:e.x,y:_})))},`a${t}`):null):null,d.map((e,t)=>(0,D.jsx)(`path`,{className:`${E.line} ${u.draw}`,pathLength:1,stroke:c,d:r(e)},t)),h?(0,D.jsx)(`circle`,{className:`${E.dot} ${u.fadeIn}`,cx:h.x,cy:h.y,r:2.5,fill:c}):null]})}let x=(0,D.jsx)(`svg`,{className:E.sparkline,width:m,height:n,viewBox:`0 0 ${m} ${n}`,role:`img`,"aria-label":_,children:b});return(0,D.jsx)(`span`,{ref:d,className:l?E.fillBox:E.box,"data-motion":h,children:x})}var j={scroller:`_scroller_13ks6_1`,band:`_band_13ks6_7`,bar:`_bar_13ks6_12`,dimmed:`_dimmed_13ks6_18`,stale:`_stale_13ks6_24`,open:`_open_13ks6_28`,now:`_now_13ks6_33`,laneStops:`_laneStops_13ks6_40`,laneStop:`_laneStop_13ks6_40`,outline:`_outline_13ks6_58`},M=new Set([`queued`,`parked`,`waiting`]);function N(e){return e.outline??M.has(e.status.toLowerCase())}var ae=14,oe=6,P=22,se=3,F={done:`success`,success:`success`,merged:`success`,failed:`danger`,error:`danger`,aborted:`neutral`,cancelled:`neutral`,running:`running`,queued:`neutral`,parked:`neutral`};function ce(e){return F[e.toLowerCase()]??`unknown`}function le(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 ue(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 de(e,t){return e.length>t?`${e.slice(0,Math.max(1,t-1))}…`:e}function I(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 fe({title:e,description:t,caveat:n,status:r,lanes:o,from:g,to:S,now:C,width:E,toneOf:O=ce,formatTime:k=le,formatTick:ie,ariaLabel:A}){let M=o.flatMap(e=>e.items.flatMap(e=>[e.start,e.end??NaN])).filter(d),F=d(S)?S:C!==void 0&&d(C)?C:M.length?Math.max(...M):Date.now(),fe=d(g)?g:M.length?Math.min(...M):F-864e5,[L,R]=m(fe,F,_,`end`),pe=ie??ue(L,R),z=(0,T.useRef)(null),B=h(z,E),me=v(),[V,he]=(0,T.useState)(0),[H,U]=(0,T.useState)(null),ge=f(),_e=(0,T.useId)(),W=ne((0,T.useId)()),G=C??R,ve=o.reduce((e,t)=>e+t.items.length,0),ye=r??(ve===0?{kind:`empty`,message:`No runs in this window.`}:{kind:`ready`}),be=o.some(e=>e.engine!==void 0)?18:0,K=Math.max(72,Math.min(160,Math.round(B*.24)))+be,xe=Math.floor((K-be)/(7*me)),q=Math.max(40,B-K-8),J=c(L,Math.max(R,L+1),K,K+q),Y=o.length>50,X=Y?Math.max(0,Math.floor(V/24)-oe):0,Se=Y?Math.min(o.length,Math.ceil(V/24)+ae+oe):o.length,Z=o.length*24,Ce=(0,T.useMemo)(()=>{let e=new Map;for(let t of o)for(let n of t.items){let t=O(n.status),r=N(n)?`outline`:t===`unknown`?`hatch`:t,i=r===`outline`?{kind:`empty`}:r===`hatch`?{kind:`hatch`}:{color:w(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(` / `)}))},[o,O]),we=o.some(e=>e.engine!==void 0),Q=(0,T.useMemo)(()=>{let e=Math.max(2,Math.floor(q/90)),t=(R-L)/Math.max(1,e);return Array.from({length:e+1},(e,n)=>L+t*n)},[L,R,q]),Te=(0,T.useMemo)(()=>o.flatMap(e=>e.items.map(t=>({...t,lane:e.label,engine:e.engine}))),[o]);function Ee(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 De=A??`${e}: ${ve} runs across ${o.length} lanes from ${k(L)} to ${k(R)}.`,Oe=[{key:`lane`,label:`Lane`,render:e=>e.lane},...we?[{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=>k(e.start)},{key:`dur`,label:`Duration`,numeric:!0,render:e=>e.end===null?`${I(G-e.start)}+`:I(e.end-e.start)},{key:`detail`,label:`Detail`,render:e=>e.detail??``}],$=H?o[H.lane]?.items[H.item]:void 0;function ke(e,t){let n=t*24;return(0,D.jsxs)(`g`,{"data-lane":e.id,children:[t%2==1?(0,D.jsx)(`rect`,{className:j.band,x:0,y:n,width:B,height:24}):null,e.engine?(0,D.jsx)(i,{engine:e.engine,x:2,y:n+5,height:14}):null,(0,D.jsx)(`text`,{className:u.label,x:K-8,y:n+12,dy:`0.32em`,textAnchor:`end`,children:de(e.label,xe)}),e.items.map((e,r)=>{let i=Math.max(L,e.start),a=Math.min(R,e.end??G);if(a<L||i>R)return null;let o=J(i),s=Math.max(se,J(Math.max(a,i))-o),c=O(e.status),l=N(e),d=!l&&c===`unknown`,f=H!==null&&(H.lane!==t||H.item!==r);return(0,D.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:`${j.bar} ${u.grow} ${f?j.dimmed:``} ${e.stale?j.stale:``} ${e.end===null?j.open:``} ${l?j.outline:``} ${d?u.unknownMark:``}`,style:{"--chart-i":Math.min(t,10)},x:l?o+.5:o,y:l?n+5.5:n+5,width:l?Math.max(se,s-1):s,height:l?13:14,rx:3,fill:l?`none`:d?`url(#${W})`:w(c),stroke:l?re:void 0,onPointerEnter:()=>U({lane:t,item:r}),onPointerLeave:()=>U(e=>e&&e.lane===t&&e.item===r?null:e)},e.id)})]},e.id)}let Ae=p(Q.map((e,t)=>({key:String(t),x:J(e),anchor:t===0?`start`:t===Q.length-1?`end`:`middle`,priority:t===Q.length-1?3:t===0?2:1,required:t===0||t===Q.length-1,variants:[pe(e)]})),{min:K,max:K+q,charPx:x(me)}),je=(0,D.jsxs)(`svg`,{className:u.svg,width:B,height:P,viewBox:`0 0 ${B} ${P}`,"aria-hidden":`true`,children:[(0,D.jsx)(`line`,{className:u.axis,x1:K,x2:K+q,y1:21,y2:21}),Ae.map(e=>(0,D.jsx)(`text`,{"data-axis-label":e.key,className:u.tick,x:e.x,y:15,textAnchor:e.anchor,children:e.text},e.key))]});return(0,D.jsx)(y,{title:e,description:t,caveat:n,status:ye,skeleton:`lanes`,table:(0,D.jsx)(ee,{caption:e,columns:Oe,rows:Te,rowKey:e=>e.id}),footer:(0,D.jsx)(s,{min:1,items:Ce}),children:(0,D.jsxs)(`div`,{ref:z,className:u.plotWrap,"data-motion":Y?`static`:ge,children:[je,(0,D.jsxs)(`div`,{className:Y?j.scroller:void 0,style:Y?{height:336}:void 0,onScroll:Y?e=>he(e.currentTarget.scrollTop):void 0,"data-virtualized":Y?`true`:void 0,children:[(0,D.jsxs)(`svg`,{className:u.svg,width:B,height:Z,viewBox:`0 0 ${B} ${Z}`,role:`img`,"aria-label":De,children:[(0,D.jsx)(`defs`,{children:(0,D.jsx)(l,{id:W})}),Q.map(e=>(0,D.jsx)(`line`,{className:u.grid,x1:b(J(e)),x2:b(J(e)),y1:0,y2:Z},e)),G>=L&&G<=R?(0,D.jsx)(`line`,{className:j.now,x1:b(J(G)),x2:b(J(G)),y1:0,y2:Z}):null,o.slice(X,Se).map((e,t)=>ke(e,X+t))]}),(0,D.jsx)(`ul`,{className:j.laneStops,style:{height:Z},"aria-label":`${e} lanes`,"aria-describedby":_e,children:o.slice(X,Se).map((e,t)=>(0,D.jsx)(`li`,{tabIndex:0,className:`${j.laneStop} ${u.focusable}`,style:{top:(X+t)*24,height:24},"aria-label":Ee(e),onFocus:()=>U(e.items.length?{lane:X+t,item:e.items.length-1}:null),onBlur:()=>U(null)},e.id))})]}),(0,D.jsx)(`span`,{id:_e,className:u.srOnly,children:`Each lane lists its runs by status; open the Table view for every run.`}),H&&$?(0,D.jsx)(te,{left:a(J(Math.max(L,$.start)),B),top:P+H.lane*24-(Y?V:0),title:o[H.lane].label,rows:[{key:`s`,label:`Status`,value:`${$.status}${$.stale?` (stale)`:``}`,...N($)||O($.status)===`unknown`?{}:{color:w(O($.status))}},{key:`t`,label:`Started`,value:k($.start)},{key:`d`,label:`Duration`,value:$.end===null?`${I(G-$.start)} so far`:I($.end-$.start)},...$.detail?[{key:`x`,label:`Detail`,value:$.detail}]:[]]}):null]})})}export{A as n,fe as t};
2
+ //# sourceMappingURL=Swimlane-CeMBD_FC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Swimlane-CeMBD_FC.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":[".box {\n display: inline-block;\n line-height: 0;\n vertical-align: middle;\n}\n\n/* `width=\"fill\"`: the sparkline spans its box (a stat tile's full width). */\n.fillBox {\n display: block;\n width: 100%;\n min-width: 0;\n line-height: 0;\n}\n\n.sparkline {\n display: block;\n overflow: visible;\n}\n\n.line {\n fill: none;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n/* The latest point: the line's ink, ringed with the surface. */\n.dot {\n stroke: var(--chart-surface);\n stroke-width: 1.5;\n}\n\n/* The wash is a gradient (ChartParts AreaGradient); opacity lives in its stops. */\n.area {\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 *\n * Polish (verse-visual-quality): the line is the quantity ink (azure, not a\n * gray that read as \"disabled\"), drawn as a monotone curve through every\n * point (chart-math — it never overshoots, so no invented peak), the wash is\n * a gradient of that ink, the latest point is a ringed dot, `width=\"fill\"`\n * spans the tile instead of a fixed 112 px stub, and the line draws itself in\n * once on mount unless reduced motion is asked for (motion.ts).\n */\nimport { useId, useLayoutEffect, useRef, useState, type ReactNode, type RefObject } from 'react';\nimport { AreaGradient } from './ChartParts.js';\nimport { CHART_SEQUENTIAL, gradientId } from './colors.js';\nimport { smoothAreaPath, smoothPath, type XY } from './chart-math.js';\nimport { useChartMotion } from './motion.js';\nimport './chart-tokens.css';\nimport plot from './plot.module.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\n/** Width a `fill` sparkline draws at before its box is measured (jsdom, first paint). */\nconst FILL_FALLBACK_W = 112;\n\n/** The measured width of a `fill` sparkline's box (no chart minimum: a tile can be narrow). */\nfunction useFillWidth(enabled: boolean): [RefObject<HTMLSpanElement | null>, number] {\n const ref = useRef<HTMLSpanElement>(null);\n const [w, setW] = useState<number>(FILL_FALLBACK_W);\n useLayoutEffect(() => {\n if (!enabled) return undefined;\n const el = ref.current;\n if (!el) return undefined;\n const read = (): void => {\n const next = Math.floor(el.getBoundingClientRect().width);\n if (next > 0) setW((prev) => (prev === next ? prev : next));\n };\n read();\n if (typeof ResizeObserver === 'undefined') return undefined;\n let frame = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(read);\n });\n observer.observe(el);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [enabled]);\n return [ref, w];\n}\n\nexport function Sparkline({\n points,\n width = 72,\n height = 24,\n ariaLabel,\n area = false,\n describe,\n color = CHART_SEQUENTIAL,\n}: {\n points: (number | null)[];\n /** Pixels, or `fill` to span the containing box (StatTile). */\n width?: number | 'fill';\n height?: number;\n ariaLabel: string;\n /** Soft gradient wash under the line. */\n area?: boolean;\n /** When given, a spoken summary is appended to `ariaLabel`. */\n describe?: (v: number) => string;\n /** The line's ink (default: the quantity azure). */\n color?: string;\n}) {\n const fill = width === 'fill';\n const [boxRef, measured] = useFillWidth(fill);\n const w = fill ? measured : width;\n const motion = useChartMotion();\n const gradKey = useId();\n const label = describe ? `${ariaLabel}: ${sparklineSummary(points, describe)}` : ariaLabel;\n const known = points.filter((p): p is number => p !== null);\n\n // Pad by the end dot's radius + ring so it is never cropped at the edge.\n const PAD = 3.5;\n let body: ReactNode;\n if (known.length < 2) {\n body = <line className={styles.flat} x1={1} x2={w - 1} y1={height - 1.5} y2={height - 1.5} />;\n } else {\n const min = Math.min(...known, 0);\n const max = Math.max(...known, 0);\n const range = max - min || 1;\n const stepX = (w - PAD * 2) / Math.max(1, points.length - 1);\n const yOf = (v: number) => PAD + (1 - (v - min) / range) * (height - PAD * 2);\n\n // Split into contiguous runs so a null renders as a real gap, not a dip.\n const runs: XY[][] = [];\n let current: XY[] = [];\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: PAD + 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 = lastKnownIndex >= 0 ? { x: PAD + lastKnownIndex * stepX, y: yOf(points[lastKnownIndex] as number) } : null;\n const baseY = yOf(Math.max(min, 0));\n const gid = gradientId(gradKey, 'spark');\n\n body = (\n <>\n {area ? (\n <defs>\n <AreaGradient id={gid} color={color} top={PAD} bottom={baseY} from={0.28} />\n </defs>\n ) : null}\n {area\n ? runs.map((run, i) =>\n run.length > 1 ? (\n <path\n key={`a${i}`}\n className={`${styles.area} ${plot.fadeIn}`}\n fill={`url(#${gid})`}\n d={smoothAreaPath(run, run.map((p) => ({ x: p.x, y: baseY })))}\n />\n ) : null,\n )\n : null}\n {runs.map((run, i) => (\n <path key={i} className={`${styles.line} ${plot.draw}`} pathLength={1} stroke={color} d={smoothPath(run)} />\n ))}\n {lastPoint ? <circle className={`${styles.dot} ${plot.fadeIn}`} cx={lastPoint.x} cy={lastPoint.y} r={2.5} fill={color} /> : null}\n </>\n );\n }\n\n const svg = (\n <svg className={styles.sparkline} width={w} height={height} viewBox={`0 0 ${w} ${height}`} role=\"img\" aria-label={label}>\n {body}\n </svg>\n );\n return (\n <span ref={boxRef} className={fill ? styles.fillBox : styles.box} data-motion={motion}>\n {svg}\n </span>\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 transition: opacity var(--duration-fast) var(--ease-standard);\n}\n\n/* Another run is hovered: step back so the one being read stands out. */\n.dimmed {\n opacity: 0.45;\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 shape-rendering: crispEdges;\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 *\n * Polish (verse-visual-quality): runs grow from their start once on mount,\n * lane by lane (not when virtualized — rows mounting on scroll must not\n * replay it; static under reduced motion), hovering a run dims the others\n * so the one being read stands out, and gridlines snap to the pixel grid.\n */\nimport { useId, useMemo, useRef, useState, type CSSProperties, 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 { MIN_TIME_SPAN_MS, crisp, ensureSpan, isPlausibleTime, labelCharPx, layoutAxisLabels, linearScale } from './chart-math.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport { useChartMotion } from './motion.js';\nimport { useTextScale } from './useTextScale.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: fromProp,\n to: toProp,\n now,\n width: fixedWidth,\n toneOf = defaultToneOf,\n formatTime = defaultFormatTime,\n formatTick,\n ariaLabel,\n}: SwimlaneProps) {\n // A window bound of 0 / NaN / pre-2000 is a null timestamp that leaked\n // through; fall back to the runs themselves (then to a day ending now), and\n // widen a degenerate window so its ticks are distinct times.\n const itemTimes = lanes.flatMap((l) => l.items.flatMap((i) => [i.start, i.end ?? Number.NaN])).filter(isPlausibleTime);\n const toBound = isPlausibleTime(toProp)\n ? toProp\n : now !== undefined && isPlausibleTime(now) ? now : itemTimes.length ? Math.max(...itemTimes) : Date.now();\n const fromBound = isPlausibleTime(fromProp) ? fromProp : itemTimes.length ? Math.min(...itemTimes) : toBound - 86_400_000;\n const [from, to] = ensureSpan(fromBound, toBound, MIN_TIME_SPAN_MS, 'end');\n const tickLabel = formatTick ?? spanTickFormatter(from, to);\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const textScale = useTextScale();\n const [scrollTop, setScrollTop] = useState(0);\n const [hover, setHover] = useState<{ lane: number; item: number } | null>(null);\n const motion = useChartMotion();\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 // 7 px a character at 12 px text, scaled to the Display size.\n const labelChars = Math.floor((labelW - tickW) / (7 * textScale));\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 const dimmed = hover !== null && !(hover.lane === index && hover.item === itemIndex);\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} ${plot.grow} ${dimmed ? styles.dimmed : ''} ${item.stale ? styles.stale : ''} ${item.end === null ? styles.open : ''} ${outline ? styles.outline : ''} ${unknown ? plot.unknownMark : ''}`}\n style={{ '--chart-i': Math.min(index, 10) } as CSSProperties}\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 // Tick labels never overprint: the window's end outranks its start, and an\n // interior tick whose label would touch a neighbour is dropped (its\n // gridline stays).\n const tickLabels = layoutAxisLabels(\n ticks.map((t, i) => ({\n key: String(i),\n x: xs(t),\n anchor: i === 0 ? 'start' as const : i === ticks.length - 1 ? 'end' as const : 'middle' as const,\n priority: i === ticks.length - 1 ? 3 : i === 0 ? 2 : 1,\n required: i === 0 || i === ticks.length - 1,\n variants: [tickLabel(t)],\n })),\n { min: labelW, max: labelW + plotW, charPx: labelCharPx(textScale) },\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 {tickLabels.map((l) => (\n <text key={l.key} data-axis-label={l.key} className={plot.tick} x={l.x} y={AXIS_H - 7} textAnchor={l.anchor}>\n {l.text}\n </text>\n ))}\n </svg>\n );\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n skeleton=\"lanes\"\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} data-motion={virtual ? 'static' : motion}>\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={crisp(xs(t))} x2={crisp(xs(t))} y1={0} y2={bodyH} />\n ))}\n {nowMs >= from && nowMs <= to ? (\n <line className={styles.now} x1={crisp(xs(nowMs))} x2={crisp(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":"iiBC4BA,SAAgB,EAAiB,EAA2B,EAAuC,CACjG,IAAM,EAAQ,EAAO,OAAQ,GAAmB,IAAM,MAAQ,OAAO,SAAS,CAAC,CAAC,EAChF,GAAI,EAAM,SAAW,EAAG,MAAO,UAC/B,IAAM,EAAQ,EAAM,GACd,EAAS,EAAM,EAAM,OAAS,GAC9B,EAAO,EAAO,OAAS,EAAM,OACnC,MAAO,QAAQ,EAAO,CAAK,EAAE,MAAM,EAAO,CAAM,EAAE,UAAU,EAAO,KAAK,IAAI,GAAG,CAAK,CAAC,EAAE,MAAM,EAAO,KAAK,IAAI,GAAG,CAAK,CAAC,KACnH,EAAO,EAAI,KAAK,EAAK,QAAQ,IAAS,EAAI,GAAK,IAAI,eAAiB,GACzE,CAGA,IAAM,EAAkB,IAGxB,SAAS,GAAa,EAA+D,CACnF,IAAM,GAAA,EAAM,EAAA,OAAA,CAAwB,IAAI,EAClC,CAAC,EAAG,IAAA,EAAQ,EAAA,SAAA,CAAiB,CAAe,EAsBlD,OArBA,EAAA,EAAA,gBAAA,KAAsB,CACpB,GAAI,CAAC,EAAS,OACd,IAAM,EAAK,EAAI,QACf,GAAI,CAAC,EAAI,OACT,IAAM,MAAmB,CACvB,IAAM,EAAO,KAAK,MAAM,EAAG,sBAAsB,CAAC,CAAC,KAAK,EACpD,EAAO,GAAG,EAAM,GAAU,IAAS,EAAO,EAAO,CAAK,CAC5D,EAEA,GADA,EAAK,EACD,OAAO,eAAmB,IAAa,OAC3C,IAAI,EAAQ,EACN,EAAW,IAAI,mBAAqB,CACxC,qBAAqB,CAAK,EAC1B,EAAQ,sBAAsB,CAAI,CACpC,CAAC,EAED,OADA,EAAS,QAAQ,CAAE,MACN,CACX,qBAAqB,CAAK,EAC1B,EAAS,WAAW,CACtB,CACF,EAAG,CAAC,CAAO,CAAC,EACL,CAAC,EAAK,CAAC,CAChB,CAEA,SAAgB,EAAU,CACxB,SACA,QAAQ,GACR,SAAS,GACT,YACA,OAAO,GACP,WACA,QAAQ,GAaP,CACD,IAAM,EAAO,IAAU,OACjB,CAAC,EAAQ,GAAY,GAAa,CAAI,EACtC,EAAI,EAAO,EAAW,EACtB,EAAS,EAAe,EACxB,IAAA,EAAU,EAAA,MAAA,CAAM,EAChB,EAAQ,EAAW,GAAG,EAAU,IAAI,EAAiB,EAAQ,CAAQ,IAAM,EAC3E,EAAQ,EAAO,OAAQ,GAAmB,IAAM,IAAI,EAGpD,EAAM,IACR,EACJ,GAAI,EAAM,OAAS,EACjB,GAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,GAAI,EAAG,GAAI,EAAI,EAAG,GAAI,EAAS,IAAK,GAAI,EAAS,GAAM,CAAA,MACvF,CACL,IAAM,EAAM,KAAK,IAAI,GAAG,EAAO,CAAC,EAE1B,EADM,KAAK,IAAI,GAAG,EAAO,CACjB,EAAM,GAAO,EACrB,GAAS,EAAI,EAAM,GAAK,KAAK,IAAI,EAAG,EAAO,OAAS,CAAC,EACrD,EAAO,GAAc,GAAO,GAAK,EAAI,GAAO,IAAU,EAAS,EAAM,GAGrE,EAAe,CAAC,EAClB,EAAgB,CAAC,EACrB,EAAO,SAAS,EAAG,IAAM,CACvB,GAAI,IAAM,KAAM,CACV,EAAQ,QAAQ,EAAK,KAAK,CAAO,EACrC,EAAU,CAAC,EACX,MACF,CACA,EAAQ,KAAK,CAAE,EAAG,EAAM,EAAI,EAAO,EAAG,EAAI,CAAC,CAAE,CAAC,CAChD,CAAC,EACG,EAAQ,QAAQ,EAAK,KAAK,CAAO,EAErC,IAAM,EAAiB,EAAO,IAAK,GAAM,IAAM,IAAI,CAAC,CAAC,YAAY,EAAI,EAC/D,EAAY,GAAkB,EAAI,CAAE,EAAG,EAAM,EAAiB,EAAO,EAAG,EAAI,EAAO,EAAyB,CAAE,EAAI,KAClH,EAAQ,EAAI,KAAK,IAAI,EAAK,CAAC,CAAC,EAC5B,EAAM,EAAW,GAAS,OAAO,EAEvC,GACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,GACC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,GAAI,EAAY,QAAO,IAAK,EAAK,OAAQ,EAAO,KAAM,GAAO,CAAA,CACvE,CAAA,EACJ,KACH,EACG,EAAK,KAAK,EAAK,IACb,EAAI,OAAS,GACX,EAAA,EAAA,IAAA,CAAC,OAAD,CAEE,UAAW,GAAG,EAAO,KAAK,GAAG,EAAK,SAClC,KAAM,QAAQ,EAAI,GAClB,EAAG,EAAe,EAAK,EAAI,IAAK,IAAO,CAAE,EAAG,EAAE,EAAG,EAAG,CAAM,EAAE,CAAC,CAC9D,EAJM,IAAI,GAIV,EACC,IACN,EACA,KACH,EAAK,KAAK,EAAK,KACd,EAAA,EAAA,IAAA,CAAC,OAAD,CAAc,UAAW,GAAG,EAAO,KAAK,GAAG,EAAK,OAAQ,WAAY,EAAG,OAAQ,EAAO,EAAG,EAAW,CAAG,CAAI,EAAhG,CAAgG,CAC5G,EACA,GAAY,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAW,GAAG,EAAO,IAAI,GAAG,EAAK,SAAU,GAAI,EAAU,EAAG,GAAI,EAAU,EAAG,EAAG,IAAK,KAAM,CAAQ,CAAA,EAAI,IAC5H,CAAA,CAAA,CAEN,CAEA,IAAM,GACJ,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,UAAW,MAAO,EAAW,SAAQ,QAAS,OAAO,EAAE,GAAG,IAAU,KAAK,MAAM,aAAY,EAC/G,SAAA,CACE,CAAA,EAEP,OACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,IAAK,EAAQ,UAAW,EAAO,EAAO,QAAU,EAAO,IAAK,cAAa,EAC5E,SAAA,CACG,CAAA,CAEV,qQEpGa,EAAwC,IAAI,IAAI,CAAC,SAAU,SAAU,SAAS,CAAC,EAE5F,SAAS,EAAU,EAA6B,CAC9C,OAAO,EAAK,SAAW,EAAiB,IAAI,EAAK,OAAO,YAAY,CAAC,CACvE,CAyBA,IAAM,GAAgB,GAChB,GAAW,EACX,EAAS,GACT,GAAY,EAEZ,EAA2C,CAC/C,KAAM,UACN,QAAS,UACT,OAAQ,UACR,OAAQ,SACR,MAAO,SACP,QAAS,UACT,UAAW,UACX,QAAS,UACT,OAAQ,UACR,OAAQ,SACV,EAEA,SAAS,GAAc,EAA2B,CAChD,OAAO,EAAc,EAAO,YAAY,IAAM,SAChD,CAEA,SAAS,GAAkB,EAAoB,CAC7C,IAAM,EAAI,IAAI,KAAK,CAAE,EACrB,OAAO,OAAO,MAAM,EAAE,QAAQ,CAAC,EAC3B,GACA,EAAE,eAAe,QAAS,CAAE,MAAO,QAAS,IAAK,UAAW,KAAM,UAAW,OAAQ,SAAU,CAAC,CACtG,CAGA,SAAgB,GAAkB,EAAc,EAAoC,CAClF,IAAM,EAAO,EAAK,EAAO,OACzB,MAAQ,IAAO,CACb,IAAM,EAAI,IAAI,KAAK,CAAE,EAErB,OADI,OAAO,MAAM,EAAE,QAAQ,CAAC,EAAU,GAC/B,EACH,EAAE,mBAAmB,QAAS,CAAE,MAAO,QAAS,IAAK,SAAU,CAAC,EAChE,EAAE,mBAAmB,QAAS,CAAE,KAAM,UAAW,OAAQ,SAAU,CAAC,CAC1E,CACF,CAEA,SAAS,GAAc,EAAe,EAAuB,CAC3D,OAAO,EAAM,OAAS,EAAQ,GAAG,EAAM,MAAM,EAAG,KAAK,IAAI,EAAG,EAAQ,CAAC,CAAC,EAAE,GAAK,CAC/E,CAEA,SAAS,EAAe,EAAoB,CAC1C,GAAI,CAAC,OAAO,SAAS,CAAE,GAAK,EAAK,EAAG,MAAO,IAC3C,IAAM,EAAI,KAAK,MAAM,EAAK,GAAM,EAChC,GAAI,EAAI,EAAG,MAAO,MAClB,GAAI,EAAI,GAAI,MAAO,GAAG,EAAE,GACxB,IAAM,EAAI,KAAK,MAAM,EAAI,EAAE,EAC3B,OAAO,EAAI,GAAK,GAAG,EAAE,IAAI,EAAI,GAAG,GAAK,GAAG,KAAK,MAAM,EAAI,EAAE,EAAE,EAC7D,CAOA,SAAgB,GAAS,CACvB,QACA,cACA,SACA,SACA,QACA,KAAM,EACN,GAAI,EACJ,MACA,MAAO,EACP,SAAS,GACT,aAAa,GACb,cACA,aACgB,CAIhB,IAAM,EAAY,EAAM,QAAS,GAAM,EAAE,MAAM,QAAS,GAAM,CAAC,EAAE,MAAO,EAAE,KAAO,GAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAe,EAC/G,EAAU,EAAgB,CAAM,EAClC,EACA,IAAQ,IAAA,IAAa,EAAgB,CAAG,EAAI,EAAM,EAAU,OAAS,KAAK,IAAI,GAAG,CAAS,EAAI,KAAK,IAAI,EACrG,GAAY,EAAgB,CAAQ,EAAI,EAAW,EAAU,OAAS,KAAK,IAAI,GAAG,CAAS,EAAI,EAAU,MACzG,CAAC,EAAM,GAAM,EAAW,GAAW,EAAS,EAAkB,KAAK,EACnE,GAAY,IAAc,GAAkB,EAAM,CAAE,EACpD,GAAA,EAAU,EAAA,OAAA,CAAuB,IAAI,EACrC,EAAQ,EAAc,EAAS,CAAU,EACzC,GAAY,EAAa,EACzB,CAAC,EAAW,KAAA,EAAgB,EAAA,SAAA,CAAS,CAAC,EACtC,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAgD,IAAI,EACxE,GAAS,EAAe,EACxB,IAAA,EAAS,EAAA,MAAA,CAAM,EACf,EAAU,IAAA,EAAe,EAAA,MAAA,CAAM,CAAC,EAChC,EAAQ,GAAO,EAEf,GAAY,EAAM,QAAQ,EAAG,IAAM,EAAI,EAAE,MAAM,OAAQ,CAAC,EACxD,GAA8B,IAAW,KAAc,EAAI,CAAE,KAAM,QAAS,QAAS,yBAA0B,EAAI,CAAE,KAAM,OAAQ,GAInI,GAAQ,EAAM,KAAM,GAAM,EAAE,SAAW,IAAA,EAAS,EAAI,GAAK,EACzD,EAAS,KAAK,IAAI,GAAI,KAAK,IAAI,IAAK,KAAK,MAAM,EAAQ,GAAI,CAAC,CAAC,EAAI,GAEjE,GAAa,KAAK,OAAO,EAAS,KAAU,EAAI,GAAU,EAC1D,EAAQ,KAAK,IAAI,GAAI,EAAQ,EAAS,CAAC,EACvC,EAAK,EAAY,EAAM,KAAK,IAAI,EAAI,EAAO,CAAC,EAAG,EAAQ,EAAS,CAAK,EACrE,EAAU,EAAM,OAAA,GAChB,EAAQ,EAAU,KAAK,IAAI,EAAG,KAAK,MAAM,EAAA,EAAiB,EAAI,EAAQ,EAAI,EAC1E,GAAO,EAAU,KAAK,IAAI,EAAM,OAAQ,KAAK,KAAK,EAAA,EAAiB,EAAI,GAAgB,EAAQ,EAAI,EAAM,OACzG,EAAQ,EAAM,OAAA,GAId,IAAA,EAAc,EAAA,QAAA,KAAiC,CACnD,IAAM,EAAO,IAAI,IACjB,IAAK,IAAM,KAAQ,EAAO,IAAK,IAAM,KAAQ,EAAK,MAAO,CACvD,IAAM,EAAO,EAAO,EAAK,MAAM,EACzB,EAAM,EAAU,CAAI,EAAI,UAAY,IAAS,UAAY,QAAU,EACnE,EAAwC,IAAQ,UAAY,CAAE,KAAM,OAAQ,EAAI,IAAQ,QAAU,CAAE,KAAM,OAAQ,EAAI,CAAE,MAAO,EAAU,CAAI,CAAE,EAChJ,EAAK,IAAI,CAAG,GAAG,EAAK,IAAI,EAAK,CAAE,KAAM,EAAO,MAAO,IAAI,GAAM,CAAC,EACnE,EAAK,IAAI,CAAG,CAAC,CAAE,MAAM,IAAI,EAAK,OAAO,YAAY,CAAC,CACpD,CACA,MAAO,CAAC,GAAG,EAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAE,OAAM,YAAa,CAAE,GAAG,EAAM,MAAO,CAAC,GAAG,CAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAE,EAAE,CACxG,EAAG,CAAC,EAAO,CAAM,CAAC,EACZ,GAAY,EAAM,KAAM,GAAM,EAAE,SAAW,IAAA,EAAS,EAEpD,GAAA,EAAQ,EAAA,QAAA,KAAc,CAC1B,IAAM,EAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,EAAE,CAAC,EAC1C,GAAQ,EAAK,GAAQ,KAAK,IAAI,EAAG,CAAK,EAC5C,OAAO,MAAM,KAAK,CAAE,OAAQ,EAAQ,CAAE,GAAI,EAAG,IAAM,EAAO,EAAO,CAAC,CACpE,EAAG,CAAC,EAAM,EAAI,CAAK,CAAC,EAEd,IAAA,EAAmB,EAAA,QAAA,KACjB,EAAM,QAAS,GAAS,EAAK,MAAM,IAAK,IAAU,CAAE,GAAG,EAAM,KAAM,EAAK,MAAO,OAAQ,EAAK,MAAO,EAAE,CAAC,EAC5G,CAAC,CAAK,CACR,EAEA,SAAS,GAAY,EAA4B,CAC/C,IAAM,EAAS,IAAI,IACnB,IAAK,IAAM,KAAQ,EAAK,MAAO,EAAO,IAAI,EAAK,QAAS,EAAO,IAAI,EAAK,MAAM,GAAK,GAAK,CAAC,EACzF,IAAM,EAAQ,CAAC,GAAG,EAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAG,IAAM,EAAE,GAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAG,KAAO,GAAG,EAAE,GAAG,GAAG,EACrF,EAAS,EAAK,OAAS,KAAK,EAAK,OAAO,GAAK,GACnD,MAAO,GAAG,EAAK,QAAQ,EAAO,IAAI,EAAK,MAAM,OAAO,MAAM,EAAK,MAAM,SAAW,EAAI,GAAK,MAAM,EAAM,OAAS,KAAK,EAAM,KAAK,IAAI,EAAE,GAAK,IAC3I,CAEA,IAAM,GAAU,GAAa,GAAG,EAAM,IAAI,GAAU,eAAe,EAAM,OAAO,cAAc,EAAW,CAAI,EAAE,MAAM,EAAW,CAAE,EAAE,GAE9H,GAAmC,CACvC,CAAE,IAAK,OAAQ,MAAO,OAAQ,OAAS,GAAM,EAAE,IAAK,EACpD,GAAI,GAAY,CAAC,CAAE,IAAK,SAAU,MAAO,SAAU,OAAS,GAAgB,EAAE,QAAU,GAAI,CAAC,EAAI,CAAC,EAClG,CAAE,IAAK,SAAU,MAAO,SAAU,OAAS,GAAM,GAAG,EAAE,SAAS,EAAE,MAAQ,WAAa,IAAK,EAC3F,CAAE,IAAK,QAAS,MAAO,UAAW,OAAS,GAAM,EAAW,EAAE,KAAK,CAAE,EACrE,CAAE,IAAK,MAAO,MAAO,WAAY,QAAS,GAAM,OAAS,GAAO,EAAE,MAAQ,KAAO,GAAG,EAAe,EAAQ,EAAE,KAAK,EAAE,GAAK,EAAe,EAAE,IAAM,EAAE,KAAK,CAAG,EAC1J,CAAE,IAAK,SAAU,MAAO,SAAU,OAAS,GAAM,EAAE,QAAU,EAAG,CAClE,EAEM,EAAU,EAAQ,EAAM,EAAM,KAAK,EAAE,MAAM,EAAM,MAAQ,IAAA,GAE/D,SAAS,GAAW,EAAoB,EAAe,CACrD,IAAM,EAAI,EAAA,GACV,OACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAiB,YAAW,EAAK,GAAjC,SAAA,CACG,EAAQ,GAAM,GAAI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,EAAG,EAAM,IAAU,QAAO,OAAA,EAAgB,CAAA,EAAI,KAC9F,EAAK,QAAS,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,OAAQ,EAAK,OAAQ,EAAG,EAAG,EAAG,EAAI,EAAG,OAAQ,EAAa,CAAA,EAAI,MACzF,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,MAAO,EAAG,EAAS,EAAG,EAAG,EAAA,GAAe,GAAG,SAAS,WAAW,MAClF,SAAA,GAAc,EAAK,MAAO,EAAU,CACjC,CAAA,EACL,EAAK,MAAM,KAAK,EAAM,IAAc,CACnC,IAAM,EAAQ,KAAK,IAAI,EAAM,EAAK,KAAK,EACjC,EAAQ,KAAK,IAAI,EAAI,EAAK,KAAO,CAAK,EAC5C,GAAI,EAAQ,GAAQ,EAAQ,EAAI,OAAO,KACvC,IAAM,EAAK,EAAG,CAAK,EACb,EAAI,KAAK,IAAI,GAAW,EAAG,KAAK,IAAI,EAAO,CAAK,CAAC,EAAI,CAAE,EACvD,EAAO,EAAO,EAAK,MAAM,EACzB,EAAU,EAAU,CAAI,EACxB,EAAU,CAAC,GAAW,IAAS,UAC/B,EAAS,IAAU,OAAU,EAAM,OAAS,GAAS,EAAM,OAAS,GAC1E,OACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAEE,YAAW,EAAK,GAChB,cAAa,EAAK,OAClB,YAAW,EAAK,MAAQ,KAAO,OAAS,IAAA,GACxC,aAAY,EAAU,UAAY,EAAU,QAAU,OACtD,UAAW,GAAG,EAAO,IAAI,GAAG,EAAK,KAAK,GAAG,EAAS,EAAO,OAAS,GAAG,GAAG,EAAK,MAAQ,EAAO,MAAQ,GAAG,GAAG,EAAK,MAAQ,KAAO,EAAO,KAAO,GAAG,GAAG,EAAU,EAAO,QAAU,GAAG,GAAG,EAAU,EAAK,YAAc,KAChN,MAAO,CAAE,YAAa,KAAK,IAAI,EAAO,EAAE,CAAE,EAC1C,EAAG,EAAU,EAAK,GAAM,EACxB,EAAG,EAAU,EAAI,IAAM,EAAI,EAC3B,MAAO,EAAU,KAAK,IAAI,GAAW,EAAI,CAAC,EAAI,EAC9C,OAAQ,EAAU,GAAa,GAC/B,GAAI,EACJ,KAAM,EAAU,OAAS,EAAU,QAAQ,EAAQ,GAAK,EAAU,CAAI,EACtE,OAAQ,EAAU,GAAuB,IAAA,GACzC,mBAAsB,EAAS,CAAE,KAAM,EAAO,KAAM,CAAU,CAAC,EAC/D,mBAAsB,EAAU,GAAO,GAAK,EAAE,OAAS,GAAS,EAAE,OAAS,EAAY,KAAO,CAAE,CACjG,EAhBM,EAAK,EAgBX,CAEL,CAAC,CACA,CArCK,EAAA,EAAK,EAqCV,CAEP,CAKA,IAAM,GAAa,EACjB,EAAM,KAAK,EAAG,KAAO,CACnB,IAAK,OAAO,CAAC,EACb,EAAG,EAAG,CAAC,EACP,OAAQ,IAAM,EAAI,QAAmB,IAAM,EAAM,OAAS,EAAI,MAAiB,SAC/E,SAAU,IAAM,EAAM,OAAS,EAAI,EAAI,IAAM,EAAI,EAAI,EACrD,SAAU,IAAM,GAAK,IAAM,EAAM,OAAS,EAC1C,SAAU,CAAC,GAAU,CAAC,CAAC,CACzB,EAAE,EACF,CAAE,IAAK,EAAQ,IAAK,EAAS,EAAO,OAAQ,EAAY,EAAS,CAAE,CACrE,EAEM,IACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAK,IAAY,QAAO,OAAQ,EAAQ,QAAS,OAAO,EAAM,GAAG,IAAU,cAAY,OAAvG,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,KAAM,GAAI,EAAQ,GAAI,EAAS,EAAO,GAAI,GAAY,GAAI,EAAa,CAAA,EAC5F,GAAW,IAAK,IACf,EAAA,EAAA,IAAA,CAAC,OAAD,CAAkB,kBAAiB,EAAE,IAAK,UAAW,EAAK,KAAM,EAAG,EAAE,EAAG,EAAG,GAAY,WAAY,EAAE,OAClG,SAAA,EAAE,IACC,EAFK,EAAE,GAEP,CACP,CACE,IAGP,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACS,QACM,cACL,SACR,OAAQ,GACR,SAAS,QACT,OAAO,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,QAAS,EAAgB,WAAS,KAAM,GAAM,OAAS,GAAM,EAAE,EAAK,CAAA,EACtF,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,IAAK,EAAG,MAAO,EAAc,CAAA,EAElD,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,IAAK,EAAS,UAAW,EAAK,SAAU,cAAa,EAAU,SAAW,GAA/E,SAAA,CACG,IACD,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,UAAW,EAAU,EAAO,SAAW,IAAA,GACvC,MAAO,EAAU,CAAE,OAAQ,GAAsB,EAAI,IAAA,GACrD,SAAU,EAAW,GAA+B,GAAa,EAAE,cAAc,SAAS,EAAI,IAAA,GAC9F,mBAAkB,EAAU,OAAS,IAAA,GAJvC,SAAA,EAME,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAK,IAAY,QAAO,OAAQ,EAAO,QAAS,OAAO,EAAM,GAAG,IAAS,KAAK,MAAM,aAAY,GAAhH,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,GAAI,CAAU,CAAA,CACxB,CAAA,EACL,EAAM,IAAK,IACV,EAAA,EAAA,IAAA,CAAC,OAAD,CAAc,UAAW,EAAK,KAAM,GAAI,EAAM,EAAG,CAAC,CAAC,EAAG,GAAI,EAAM,EAAG,CAAC,CAAC,EAAG,GAAI,EAAG,GAAI,CAAQ,EAAhF,CAAgF,CAC5F,EACA,GAAS,GAAQ,GAAS,GACzB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAK,GAAI,EAAM,EAAG,CAAK,CAAC,EAAG,GAAI,EAAM,EAAG,CAAK,CAAC,EAAG,GAAI,EAAG,GAAI,CAAQ,CAAA,EAC1F,KACH,EAAM,MAAM,EAAO,EAAI,CAAC,CAAC,KAAK,EAAM,IAAM,GAAW,EAAM,EAAQ,CAAC,CAAC,CACnE,CAEL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,UAAW,MAAO,CAAE,OAAQ,CAAM,EAAG,aAAY,GAAG,EAAM,QAAS,mBAAkB,GACxG,SAAA,EAAM,MAAM,EAAO,EAAI,CAAC,CAAC,KAAK,EAAM,KACnC,EAAA,EAAA,IAAA,CAAC,KAAD,CAEE,SAAU,EACV,UAAW,GAAG,EAAO,SAAS,GAAG,EAAK,YACtC,MAAO,CAAE,KAAM,EAAQ,GAAA,GAAY,OAAA,EAAc,EACjD,aAAY,GAAY,CAAI,EAC5B,YAAe,EAAS,EAAK,MAAM,OAAS,CAAE,KAAM,EAAQ,EAAG,KAAM,EAAK,MAAM,OAAS,CAAE,EAAI,IAAI,EACnG,WAAc,EAAS,IAAI,CAC5B,EAPM,EAAK,EAOX,CACF,CACC,CAAA,CACD,KACL,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,GAAQ,UAAW,EAAK,OAAQ,SAAA,wEAA4E,CAAA,EACrH,GAAS,GACR,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,KAAM,EAAiB,EAAG,KAAK,IAAI,EAAM,EAAQ,KAAK,CAAC,EAAG,CAAK,EAC/D,IAAK,EAAS,EAAM,KAAA,IAAgB,EAAU,EAAY,GAC1D,MAAO,EAAM,EAAM,KAAK,CAAE,MAC1B,KAAM,CACJ,CACE,IAAK,IACL,MAAO,SACP,MAAO,GAAG,EAAQ,SAAS,EAAQ,MAAQ,WAAa,KACxD,GAAI,EAAU,CAAO,GAAK,EAAO,EAAQ,MAAM,IAAM,UAAY,CAAC,EAAI,CAAE,MAAO,EAAU,EAAO,EAAQ,MAAM,CAAC,CAAE,CACnH,EACA,CAAE,IAAK,IAAK,MAAO,UAAW,MAAO,EAAW,EAAQ,KAAK,CAAE,EAC/D,CACE,IAAK,IACL,MAAO,WACP,MAAO,EAAQ,MAAQ,KAAO,GAAG,EAAe,EAAQ,EAAQ,KAAK,EAAE,SAAW,EAAe,EAAQ,IAAM,EAAQ,KAAK,CAC9H,EACA,GAAI,EAAQ,OAAS,CAAC,CAAE,IAAK,IAAK,MAAO,SAAU,MAAO,EAAQ,MAAO,CAAC,EAAI,CAAC,CACjF,CACD,CAAA,EACC,IACD,GACK,CAAA,CAEhB"}
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./index-BC5Uslm5.js";var t={wrapper:`_wrapper_1xq82_1`,label:`_label_1xq82_8`,track:`_track_1xq82_13`,knob:`_knob_1xq82_44`},n=e();function r({checked:e,onChange:r,label:i,disabled:a=!1,id:o,className:s,...c}){let l=(0,n.jsx)(`button`,{type:`button`,id:o,role:`switch`,"aria-checked":e,disabled:a,className:t.track,onClick:()=>r(!e),...c,children:(0,n.jsx)(`span`,{className:t.knob,"aria-hidden":`true`})});return i?(0,n.jsxs)(`label`,{className:`${t.wrapper} ${s??``}`,children:[l,(0,n.jsx)(`span`,{className:t.label,children:i})]}):(0,n.jsx)(`span`,{className:s,children:l})}export{r as t};
2
+ //# sourceMappingURL=Switch-Cqc_bSoh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Switch-Cqc_bSoh.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Switch.module.css","../../../../../../src/web-ui/components/primitives/Switch.tsx"],"sourcesContent":[".wrapper {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n cursor: pointer;\n}\n\n.label {\n font-size: var(--text-sm-size);\n color: var(--text-primary);\n}\n\n.track {\n position: relative;\n flex: none;\n width: 34px;\n height: 18px;\n padding: 0;\n border: 1px solid var(--border-strong);\n border-radius: var(--radius-full);\n background: var(--bg-active);\n cursor: pointer;\n transition:\n background-color var(--duration-fast) var(--ease-standard),\n border-color var(--duration-fast) var(--ease-standard);\n}\n\n.track:hover:not(:disabled) {\n border-color: var(--text-tertiary);\n}\n\n.track[aria-checked='true'] {\n background: var(--accent-600);\n border-color: var(--accent-600);\n}\n\n.track[aria-checked='true']:hover:not(:disabled) {\n background: var(--accent-700);\n border-color: var(--accent-700);\n}\n\n/* Press: the knob narrows slightly toward the direction of travel. No bounce,\n no translate on the track itself. */\n.track:active:not(:disabled) .knob {\n width: 14px;\n}\n\n.track[aria-checked='true']:active:not(:disabled) .knob {\n transform: translateX(14px);\n}\n\n.track:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.knob {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 12px;\n height: 12px;\n border-radius: var(--radius-full);\n background: var(--bg-surface);\n transition:\n transform var(--duration-fast) var(--ease-standard),\n width var(--duration-fast) var(--ease-standard);\n}\n\n.track[aria-checked='true'] .knob {\n transform: translateX(16px);\n background: var(--accent-contrast);\n}\n","/**\n * components/primitives/Switch.tsx — a binary setting that takes effect\n * immediately (no form submit). role=\"switch\" + aria-checked, so a screen\n * reader announces \"on\"/\"off\" rather than \"checkbox, checked\".\n *\n * State is never carried by color alone: the knob's POSITION is the primary\n * signal (design doc §6), the accent fill is reinforcement.\n */\nimport type { ReactNode } from 'react';\nimport styles from './Switch.module.css';\n\nexport interface SwitchProps {\n checked: boolean;\n onChange: (next: boolean) => void;\n /** Visible label; when omitted, pass `aria-label`. */\n label?: ReactNode;\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n disabled?: boolean;\n id?: string;\n className?: string;\n}\n\nexport function Switch({\n checked,\n onChange,\n label,\n disabled = false,\n id,\n className,\n ...aria\n}: SwitchProps) {\n const control = (\n <button\n type=\"button\"\n id={id}\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled}\n className={styles.track}\n onClick={() => onChange(!checked)}\n {...aria}\n >\n <span className={styles.knob} aria-hidden=\"true\" />\n </button>\n );\n\n if (!label) return <span className={className}>{control}</span>;\n\n return (\n <label className={`${styles.wrapper} ${className ?? ''}`}>\n {control}\n <span className={styles.label}>{label}</span>\n </label>\n );\n}\n"],"mappings":"sJCuBA,SAAgB,EAAO,CACrB,UACA,WACA,QACA,WAAW,GACX,KACA,YACA,GAAG,GACW,CACd,IAAM,GACJ,EAAA,EAAA,IAAA,CAAC,SAAD,CACE,KAAK,SACD,KACJ,KAAK,SACL,eAAc,EACJ,WACV,UAAW,EAAO,MAClB,YAAe,EAAS,CAAC,CAAO,EAChC,GAAI,EAEJ,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,cAAY,MAAQ,CAAA,CAC5C,CAAA,EAKV,OAFK,GAGH,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,GAAG,EAAO,QAAQ,GAAG,GAAa,KAApD,SAAA,CACG,GACD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,CAAY,CAAA,CACvC,KANU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAiB,YAAY,SAAA,CAAc,CAAA,CAQhE"}
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./index-BC5Uslm5.js";var t={tag:`_tag_2eqdv_1`,sm:`_sm_2eqdv_19`,mono:`_mono_2eqdv_25`,dot:`_dot_2eqdv_30`,marker:`_marker_2eqdv_38`},n=e(),r={claude:`var(--engine-claude)`,codex:`var(--engine-codex)`,grok:`var(--engine-grok)`,local:`var(--engine-local)`,devin:`var(--engine-devin)`};function i({children:e,engine:i,mono:a=!1,size:o=`md`,dot:s=!1,title:c,className:l}){let u=s||i!==void 0;return(0,n.jsxs)(`span`,{className:`${t.tag} ${t[o]} ${a?t.mono:``} ${l??``}`,title:c,"data-engine":i,children:[u?(0,n.jsx)(`span`,{className:t.dot,style:i?{background:r[i]}:void 0,"aria-hidden":`true`}):null,e]})}function a({engine:e,className:i}){return(0,n.jsx)(`span`,{className:`${t.marker} ${i??``}`,style:{background:r[e]},"aria-hidden":`true`})}function o(e){return r[e]}export{i as n,o as r,a as t};
2
+ //# sourceMappingURL=Tag-BvOxSxYi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tag-BvOxSxYi.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Tag.module.css","../../../../../../src/web-ui/components/primitives/Tag.tsx"],"sourcesContent":[".tag {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n max-width: 100%;\n height: var(--density-row-sm);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs);\n background: var(--bg-hover);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.sm {\n height: calc(var(--density-row-sm) - var(--space-2));\n padding: 0 var(--space-1);\n font-size: var(--text-2xs-size);\n}\n\n.mono {\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n}\n\n.dot {\n flex: none;\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--status-neutral-solid);\n}\n\n.marker {\n display: inline-block;\n flex: none;\n width: 2px;\n height: 100%;\n min-height: var(--engine-marker-h);\n border-radius: var(--radius-full);\n}\n","/**\n * components/primitives/Tag.tsx — a small, quiet label: a seat pill, a model\n * name, a repo, a risk class. NOT a status badge (that is StatusBadge, which\n * owns the status-color mapping) and not a button.\n *\n * `engine` tints the leading dot with that provider's identity hue. Identity\n * hues are never used for the text itself (design doc §2) — the tag's label\n * stays in the normal text color so it keeps its contrast in both themes.\n */\nimport type { ReactNode } from 'react';\nimport type { VerseEngine } from '../../data/api-types.js';\nimport styles from './Tag.module.css';\n\nconst ENGINE_COLOR: Record<VerseEngine, string> = {\n claude: 'var(--engine-claude)',\n codex: 'var(--engine-codex)',\n grok: 'var(--engine-grok)',\n local: 'var(--engine-local)',\n devin: 'var(--engine-devin)',\n};\n\nexport interface TagProps {\n children: ReactNode;\n /** Provider identity: tints the leading dot and the pill's edge. */\n engine?: VerseEngine;\n /** Monospace for ids, paths and model names. */\n mono?: boolean;\n size?: 'sm' | 'md';\n /** Show a leading dot even without an engine. */\n dot?: boolean;\n title?: string;\n className?: string;\n}\n\nexport function Tag({ children, engine, mono = false, size = 'md', dot = false, title, className }: TagProps) {\n const showDot = dot || engine !== undefined;\n return (\n <span\n className={`${styles.tag} ${styles[size]} ${mono ? styles.mono : ''} ${className ?? ''}`}\n title={title}\n data-engine={engine}\n >\n {showDot ? (\n <span\n className={styles.dot}\n style={engine ? { background: ENGINE_COLOR[engine] } : undefined}\n aria-hidden=\"true\"\n />\n ) : null}\n {children}\n </span>\n );\n}\n\n/** The 2px identity marker used on session rows and seat pills. */\nexport function EngineMarker({ engine, className }: { engine: VerseEngine; className?: string }) {\n return <span className={`${styles.marker} ${className ?? ''}`} style={{ background: ENGINE_COLOR[engine] }} aria-hidden=\"true\" />;\n}\n\nexport function engineColor(engine: VerseEngine): string {\n return ENGINE_COLOR[engine];\n}\n"],"mappings":"+JCaM,EAA4C,CAChD,OAAQ,uBACR,MAAO,sBACP,KAAM,qBACN,MAAO,sBACP,MAAO,qBACT,EAeA,SAAgB,EAAI,CAAE,WAAU,SAAQ,OAAO,GAAO,OAAO,KAAM,MAAM,GAAO,QAAO,aAAuB,CAC5G,IAAM,EAAU,GAAO,IAAW,IAAA,GAClC,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CACE,UAAW,GAAG,EAAO,IAAI,GAAG,EAAO,GAAM,GAAG,EAAO,EAAO,KAAO,GAAG,GAAG,GAAa,KAC7E,QACP,cAAa,EAHf,SAAA,CAKG,GACC,EAAA,EAAA,IAAA,CAAC,OAAD,CACE,UAAW,EAAO,IAClB,MAAO,EAAS,CAAE,WAAY,EAAa,EAAQ,EAAI,IAAA,GACvD,cAAY,MACb,CAAA,EACC,KACH,CACG,GAEV,CAGA,SAAgB,EAAa,CAAE,SAAQ,aAA0D,CAC/F,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,GAAG,EAAO,OAAO,GAAG,GAAa,KAAM,MAAO,CAAE,WAAY,EAAa,EAAQ,EAAG,cAAY,MAAQ,CAAA,CAClI,CAEA,SAAgB,EAAY,EAA6B,CACvD,OAAO,EAAa,EACtB"}
@@ -0,0 +1,3 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{t as r}from"./global-w7KDTTi0.js";import{i}from"./SkipToContent-BynsXs9i.js";import{Bt as ee,Ht as te,Vt as a,gt as ne}from"./VerseConsoleApp-DjPpZLo1.js";import{M as re,j as ie}from"./VerseShared-Bf-XTHCh.js";import{b as ae}from"./verse-model-DAOz9LrY.js";import{n as o}from"./format-V6IiIMAL.js";import{n as s,t as c}from"./Button-CstSJwha.js";import{n as oe,t as se}from"./ActionMenu-Z14OhnFI.js";import{T as ce,l as le,v as ue,x as de}from"./icons-C3G-y5j2.js";import{a as fe,o as l}from"./command-catalog-B0ApAGD0.js";import{t as u}from"./EmptyState-CGVr0VO2.js";import{t as d}from"./pane-chrome.module-D7o-fVd0.js";import{f as pe,r as me,u as he}from"./terminal-icons-Dx6neM-J.js";import{a as ge,i as _e,n as ve,t as f}from"./terminal-client-CCSvMeEv.js";import{a as p,i as ye,n as be,r as xe,s as Se,t as m}from"./terminal-view-BSieiQvi.js";var h=e(n(),1),g={pane:`_pane_7fww7_15`,loading:`_loading_7fww7_91`,strip:`_strip_7fww7_100`,tabs:`_tabs_7fww7_109`,tab:`_tab_7fww7_109`,tabButton:`_tabButton_7fww7_142`,tabClose:`_tabClose_7fww7_159`,noticeClose:`_noticeClose_7fww7_160`,tabTitle:`_tabTitle_7fww7_165`,tabExited:`_tabExited_7fww7_171`,unseen:`_unseen_7fww7_180`,stripActions:`_stripActions_7fww7_215`,cwd:`_cwd_7fww7_227`,headerStatus:`_headerStatus_7fww7_229`,notice:`_notice_7fww7_160`,inlineNotice:`_inlineNotice_7fww7_267`,body:`_body_7fww7_275`,panel:`_panel_7fww7_285`,viewport:`_viewport_7fww7_294`,host:`_host_7fww7_301`,viewLoading:`_viewLoading_7fww7_318`,exitBar:`_exitBar_7fww7_323`,header:`_header_7fww7_229`},_=t(),Ce={api:ge,createView:m,openStream:p,platform:ee(),writeClipboard:async e=>{await navigator.clipboard.writeText(e)}},we=3e3,v=`ashlr.verse.terminal.screenReader`,y=0;function b(){y=0}function Te(){try{return localStorage.getItem(v)===`1`}catch{return!1}}function Ee(e){try{localStorage.setItem(v,e?`1`:`0`)}catch{}}function De(e,t){if(e.type!==`keydown`||!l(e,[`chat`,`global`],t))return!1;let n=a(e),r=e.ctrlKey&&(n==="`"||n===`tab`);return t===`mac`?e.metaKey||r:r||e.ctrlKey&&e.shiftKey}function x(e,t){if(e instanceof f)return e.message;if(e instanceof r){if(e.status===401)return`Unlock actions with the mutation token to use the terminal.`;if(e.detail)return o(e.detail)}return t}function S({sessionId:e,roots:t,request:n,onSendToChat:ee,visible:a,deps:o}){let l=(0,h.useMemo)(()=>({...Ce,...o}),[o]),ge=re(),f=a&&ge,p=ne().compact,[m,v]=(0,h.useState)(null),[b,S]=(0,h.useState)(null),[C,w]=(0,h.useState)(null),[T,E]=(0,h.useState)(null),[D,Oe]=(0,h.useState)(!1),[ke,Ae]=(0,h.useState)(null),[je,Me]=(0,h.useState)(!1),[Ne,Pe]=(0,h.useState)(!1),[O,Fe]=(0,h.useState)(Te),[k,Ie]=(0,h.useState)(!1),[A,Le]=(0,h.useState)(()=>new Set),[j,Re]=(0,h.useState)(null),[ze,Be]=(0,h.useState)(()=>new Map),M=(0,h.useRef)(new Map),N=(0,h.useRef)(new Map),P=(0,h.useRef)(new Set),F=(0,h.useRef)(!1),I=(0,h.useRef)(null),Ve=(0,h.useRef)(null),L=(0,h.useRef)(new Map),R=(0,h.useRef)(null),z=(0,h.useRef)(null),B=(0,h.useRef)(null),V=(0,h.useRef)(!0),H=(0,h.useRef)(!1),U=(0,h.useMemo)(()=>m?.tabs??[],[m]),W=(0,h.useRef)(new Set);W.current=new Set(U.filter(e=>e.exited).map(e=>e.id));let G=(0,h.useMemo)(()=>U.filter(t=>t.sessionId===e),[U,e]),K=G.find(e=>e.id===C)??null,q=U.length-G.length,J=(0,h.useCallback)(async()=>{try{let e=await l.api.list();if(!V.current)return;v(e),S(null)}catch(e){if(!V.current)return;S(x(e,`The terminal list could not be loaded.`))}},[l.api]);(0,h.useEffect)(()=>(V.current=!0,J(),()=>{V.current=!1}),[J]),ie(()=>{J()},we,{enabled:a}),(0,h.useEffect)(()=>{m&&(C&&G.some(e=>e.id===C)||w(G.at(-1)?.id??null))},[m,G,C]),(0,h.useEffect)(()=>{if(!m)return;let e=new Set(m.tabs.map(e=>e.id));for(let[t,n]of M.current)e.has(t)||(Y(n),M.current.delete(t),Le(e=>{let n=new Set(e);return n.delete(t),n}))},[m]),(0,h.useEffect)(()=>{K&&f&&Be(e=>e.get(K.id)===K.lastActivityAt?e:new Map(e).set(K.id,K.lastActivityAt))},[K,f]),(0,h.useEffect)(()=>()=>{for(let e of M.current.values())Y(e);M.current.clear();for(let e of[R,z,B])e.current&&clearTimeout(e.current)},[]);function Y(e){e.queue.dispose();for(let t of e.disposers)try{t.dispose()}catch{}try{e.view.dispose()}catch{}}let He=(0,h.useCallback)(()=>{for(let e of M.current.values())if(e.view.cols>1&&e.view.rows>1)return{cols:e.view.cols,rows:e.view.rows};return{cols:80,rows:24}},[]),X=(0,h.useCallback)(async(t={})=>{Oe(!0),E(null);try{let n=await l.api.create({sessionId:e,...t.root?{root:t.root}:{},...t.appId?{appId:t.appId}:{},...t.appId&&t.via?{via:t.via}:{},...t.appId&&t.model?{model:t.model}:{},...t.devServerId?{devServerId:t.devServerId}:{},...He()});return V.current?(v(e=>e&&{...e,tabs:[...e.tabs.filter(e=>e.id!==n.id),n]}),w(n.id),n):n}catch(e){return V.current&&E({tone:`error`,text:x(e,`The terminal could not be opened.`)}),null}finally{V.current&&Oe(!1)}},[l.api,e,He]),Z=(0,h.useCallback)(async e=>{try{await l.api.kill(e.id)}catch(e){if(!(e instanceof r&&e.status===404)){E({tone:`error`,text:x(e,`The terminal could not be closed.`)});return}}let t=M.current.get(e.id);if(t&&(Y(t),M.current.delete(e.id)),v(t=>t&&{...t,tabs:t.tabs.filter(t=>t.id!==e.id)}),C===e.id){let t=G.findIndex(t=>t.id===e.id),n=G[t+1]??G[t-1]??null;w(n?.id??null)}},[C,l.api,G]),Ue=(0,h.useCallback)(async e=>{await X({root:e.root})&&await Z(e)},[Z,X]),We=(0,h.useRef)(e);We.current!==e&&(We.current=e,F.current=!1),(0,h.useEffect)(()=>{m&&m.available&&f&&!F.current&&!D&&(n&&n.nonce>y||(F.current=!0,G.length===0&&X({})))},[m,f,G.length,D,X,n]);let Ge=(0,h.useCallback)(async(e,t)=>{if(!(M.current.has(e)||P.current.has(e))){P.current.add(e);try{let n=await l.createView({...be(t),theme:xe(t),screenReaderMode:Te()});if(!V.current||!N.current.has(e)){n.dispose();return}n.open(t);let r=Se(t=>l.api.input(e,t),{onError:e=>{V.current&&E({tone:`error`,text:x(e,`That input did not reach the shell.`)})}}),i={view:n,host:t,lastSeq:0,queue:r,disposers:[]};i.disposers.push(n.onData(t=>{W.current.has(e)||r.pushText(t)})),i.disposers.push(n.onBinary(t=>{W.current.has(e)||r.pushBinary(t)})),i.disposers.push(n.onSelectionChange(()=>{let e=n.hasSelection();Me(e),e&&(B.current&&clearTimeout(B.current),B.current=setTimeout(()=>{let e=n.getSelection();e&&l.writeClipboard(e).then(()=>{V.current&&(Pe(!0),z.current&&clearTimeout(z.current),z.current=setTimeout(()=>Pe(!1),1200))},()=>{})},150))})),n.setKeyFilter(e=>!De(e,l.platform)),M.current.set(e,i),Ie(!1),Le(t=>new Set(t).add(e))}catch(e){console.error(`[verse] terminal view failed to load`,e),V.current&&Ie(!0)}finally{P.current.delete(e)}}},[l]),Ke=(0,h.useRef)(Ge);Ke.current=Ge;let qe=(0,h.useRef)(new Map),Je=e=>{let t=qe.current.get(e);return t||(t=t=>{t?(N.current.set(e,t),Ke.current(e,t)):(N.current.delete(e),qe.current.delete(e))},qe.current.set(e,t)),t},Ye=(0,h.useCallback)(()=>{if(!C)return;let e=M.current.get(C);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&&K&&K.cols===n.cols&&K.rows===n.rows)return;R.current&&clearTimeout(R.current);let r=C;R.current=setTimeout(()=>{l.api.resize(r,n.cols,n.rows).catch(()=>{})},100)},[K,C,l.api]);(0,h.useEffect)(()=>{if(!f||!C||!A.has(C))return;Ye();let e=Ve.current;if(!e||typeof ResizeObserver>`u`)return;let t=0,n=new ResizeObserver(()=>{cancelAnimationFrame(t),t=requestAnimationFrame(Ye)});return n.observe(e),()=>{cancelAnimationFrame(t),n.disconnect()}},[f,C,A,Ye]),(0,h.useEffect)(()=>ye(()=>{for(let e of M.current.values())e.view.setTheme(xe(e.host))}),[]);let Q=(0,h.useCallback)(e=>{let t=I.current;if(!t||t.tabId!==e)return;let n=M.current.get(e);if(!n)return;I.current=null;let r=t.text.replace(/[\r\n]+$/,``);r.includes(`
2
+ `)&&!n.view.bracketedPaste()?l.writeClipboard(r).then(()=>E({tone:`info`,text:`That command has several lines, so it was copied instead: paste it with ⌘V.`}),()=>E({tone:`error`,text:`That command has several lines and could not be pasted safely.`})):n.view.paste(r),n.view.focus()},[l]);(0,h.useEffect)(()=>{if(!f||!C||!A.has(C)){Ae(null);return}let e=M.current.get(C);if(!e)return;let t=C,n=!0,r=l.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(ve(r.dataBase64)),e.lastSeq=r.seq,n&&(n=!1,I.current?.tabId===t&&setTimeout(()=>Q(t),120));return}v(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=>{V.current&&(Ae(e),e===`gone`&&J())}});return I.current?.tabId===t&&e.lastSeq>0&&setTimeout(()=>Q(t),0),()=>r.close()},[f,C,A,l,J,Q]);let Xe=(0,h.useCallback)(async e=>{let n=e.root??K?.root??t[0],r=e.newTab===!0||!!e.appId||!!e.devServerId,i=null;if(r||(i=(K&&!K.exited&&(!e.root||K.root===e.root)?K:null)??G.find(t=>!t.exited&&(!e.root||t.root===e.root))??null),i?w(i.id):i=await X({...n?{root:n}:{},...e.appId?{appId:e.appId}:{},...e.via?{via:e.via}:{},...e.model?{model:e.model}:{},...e.devServerId?{devServerId:e.devServerId}:{}}),i){if(e.paste){I.current={tabId:i.id,text:e.paste};let t=M.current.get(i.id);t&&t.lastSeq>0&&Q(i.id)}else M.current.get(i.id)?.view.focus()}},[K,Q,X,t,G]);(0,h.useEffect)(()=>{!n||!m||n.nonce<=y||(y=n.nonce,F.current=!0,m.available&&Xe(n))},[n,m,Xe]),(0,h.useEffect)(()=>{f&&C&&A.has(C)&&M.current.get(C)?.view.focus()},[f,C,A]);let Ze=()=>{if(!C)return;let e=M.current.get(C)?.view.getSelection()??``;e.trim()&&ee(_e(e))},Qe=()=>{let e=!O;Fe(e),Ee(e);for(let t of M.current.values())t.view.setScreenReaderMode(e)},$e=async()=>{try{await l.api.openExternal(e,K?.root??t[0]),E({tone:`info`,text:`Opened in Terminal.`})}catch(e){E({tone:`error`,text:x(e,`Terminal could not be opened.`)})}},et=e=>{H.current=!0,X(e).finally(()=>{H.current=!1})},tt=()=>{et(K?.root?{root:K.root}:{})},nt=(e,t)=>{let n=-1;if(e.key===`ArrowRight`?n=(t+1)%G.length:e.key===`ArrowLeft`?n=(t-1+G.length)%G.length:e.key===`Home`?n=0:e.key===`End`&&(n=G.length-1),n<0)return;e.preventDefault();let r=G[n];w(r.id),L.current.get(r.id)?.focus()};if(!m)return b?(0,_.jsx)(`div`,{className:g.pane,children:(0,_.jsx)(u,{compact:!0,tone:`error`,title:`Terminal is not reachable`,body:b,action:(0,_.jsx)(c,{size:`sm`,variant:`subtle`,onClick:()=>void J(),children:`Try again`})})}):(0,_.jsxs)(`div`,{className:g.pane,"aria-busy":`true`,children:[(0,_.jsx)(`div`,{className:g.strip,"aria-hidden":`true`}),(0,_.jsxs)(`div`,{className:g.loading,children:[(0,_.jsx)(i,{width:`40%`}),(0,_.jsx)(i,{width:`70%`})]})]});if(!m.available)return(0,_.jsxs)(`div`,{className:g.pane,children:[(0,_.jsx)(u,{compact:!0,icon:(0,_.jsx)(pe,{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:l.platform===`mac`?(0,_.jsx)(c,{size:`sm`,variant:`subtle`,icon:(0,_.jsx)(le,{}),onClick:()=>void $e(),children:`Open in Terminal`}):void 0}),T?(0,_.jsx)(`p`,{className:g.inlineNotice,role:T.tone===`error`?`alert`:`status`,children:T.text}):null]});let rt=t.length>1,it=fe(`dock.terminal-new`)?.keys[0],$=it?te(it,l.platform):null,at=G.length===0&&!k&&(!F.current||D&&!H.current),ot=K?.root??G.at(-1)?.root??(at?t[0]??null:null);return(0,_.jsxs)(`div`,{className:g.pane,"data-compact":p||void 0,children:[(0,_.jsxs)(`div`,{className:g.strip,children:[(0,_.jsx)(`div`,{className:g.tabs,role:`tablist`,"aria-label":`Terminals`,children:G.map((e,t)=>{let n=e.id===C,r=!n&&(ze.get(e.id)??e.createdAt)<e.lastActivityAt;return(0,_.jsxs)(`div`,{className:g.tab,"data-selected":n||void 0,role:`presentation`,children:[(0,_.jsxs)(`button`,{ref:t=>{t?L.current.set(e.id,t):L.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:g.tabButton,title:`${e.title} — ${e.root}`,onClick:()=>w(e.id),onKeyDown:e=>nt(e,t),children:[(0,_.jsx)(`span`,{className:g.tabTitle,children:e.title}),e.exited?(0,_.jsx)(`span`,{className:g.tabExited,children:`exited`}):null,r&&!e.exited?(0,_.jsx)(`span`,{className:g.unseen,"aria-label":`new output`,role:`img`}):null]}),(0,_.jsx)(`button`,{type:`button`,className:g.tabClose,"aria-label":`Close terminal ${e.title}`,title:`Close terminal`,onClick:()=>void Z(e),children:(0,_.jsx)(ce,{size:12})})]},e.id)})}),(0,_.jsxs)(`div`,{className:g.stripActions,children:[(0,_.jsx)(s,{variant:`ghost`,size:`sm`,icon:(0,_.jsx)(ue,{}),"aria-label":`New terminal tab`,title:$?`New terminal tab (${$})`:`New terminal tab`,busy:D,onClick:tt}),rt?(0,_.jsx)(s,{variant:`ghost`,size:`sm`,icon:(0,_.jsx)(me,{}),"aria-label":`New terminal in…`,"aria-haspopup":`menu`,"aria-expanded":j!==null,title:`Choose the folder`,onClick:e=>Re({anchor:oe(e.currentTarget),from:e.currentTarget})}):null]})]}),ot===null?null:(0,_.jsxs)(`div`,{className:`${d.header} ${g.header}`,children:[(0,_.jsx)(`span`,{className:`${d.title} ${g.cwd}`,title:ot,children:ae(ot)}),(0,_.jsx)(`span`,{className:g.headerStatus,role:`status`,"aria-live":`polite`,children:ke===`reconnecting`?`Reconnecting…`:ke===`expired`?`Session expired — reload to reconnect`:Ne?`Copied`:``}),(0,_.jsxs)(`div`,{className:d.actions,children:[(0,_.jsx)(c,{variant:`ghost`,size:`sm`,icon:(0,_.jsx)(de,{}),disabled:!je,"aria-label":`Send selection to chat`,title:je?`Send the selected text to the chat as a code block`:`Select text in the terminal first`,onClick:Ze,children:p?null:`Send to chat`}),(0,_.jsx)(s,{variant:`ghost`,size:`sm`,icon:(0,_.jsx)(he,{}),"aria-label":`Screen reader mode`,"aria-pressed":O,title:O?`Screen reader mode is on`:`Screen reader mode`,onClick:Qe}),l.platform===`mac`?(0,_.jsx)(s,{variant:`ghost`,size:`sm`,icon:(0,_.jsx)(le,{}),"aria-label":`Open in Terminal.app`,title:`Open this folder in Terminal.app`,onClick:()=>void $e()}):null]})]}),T?(0,_.jsxs)(`div`,{className:g.notice,"data-tone":T.tone,role:T.tone===`error`?`alert`:`status`,children:[(0,_.jsx)(`span`,{children:T.text}),(0,_.jsx)(`button`,{type:`button`,className:g.noticeClose,"aria-label":`Dismiss`,title:`Dismiss`,onClick:()=>E(null),children:(0,_.jsx)(ce,{size:12})})]}):null,(0,_.jsxs)(`div`,{className:g.body,ref:Ve,children:[k?(0,_.jsx)(u,{compact:!0,tone:`error`,title:`The terminal could not load`,body:`The rest of the chat still works.`,action:(0,_.jsx)(c,{size:`sm`,variant:`subtle`,onClick:()=>{Ie(!1);for(let[e,t]of N.current)Ge(e,t)},children:`Try again`})}):null,at?(0,_.jsx)(`div`,{className:g.loading,role:`status`,"aria-label":`Opening a shell`,children:(0,_.jsx)(i,{width:`30%`})}):null,G.length===0&&!k&&!at?(0,_.jsx)(u,{compact:!0,icon:(0,_.jsx)(pe,{size:20}),title:`No terminal open`,body:`Click New terminal${$?` or press ${$}`:``} to open a login shell in this chat's folder.${q>0?` ${q} ${q===1?`terminal is`:`terminals are`} open in other chats.`:``}`,action:(0,_.jsx)(c,{size:`sm`,variant:`subtle`,icon:(0,_.jsx)(ue,{}),busy:D,onClick:tt,children:`New terminal`})}):null,G.map(e=>{let t=e.id===C;return(0,_.jsxs)(`div`,{id:`terminal-panel-${e.id}`,role:`tabpanel`,"aria-labelledby":`terminal-tab-${e.id}`,className:g.panel,hidden:!t,children:[(0,_.jsxs)(`div`,{className:g.viewport,children:[(0,_.jsx)(`div`,{className:g.host,ref:Je(e.id),"data-testid":`terminal-host-${e.id}`}),!A.has(e.id)&&!k?(0,_.jsx)(`div`,{className:g.viewLoading,"aria-hidden":`true`,children:(0,_.jsx)(i,{width:`30%`})}):null]}),e.exited?(0,_.jsxs)(`div`,{className:g.exitBar,role:`status`,children:[(0,_.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,_.jsx)(c,{size:`sm`,variant:`subtle`,onClick:()=>void Ue(e),children:`Restart`}),(0,_.jsx)(c,{size:`sm`,variant:`ghost`,onClick:()=>void Z(e),children:`Close`})]}):null]},e.id)})]}),j?(0,_.jsx)(se,{label:`New terminal in`,anchor:j.anchor,returnFocus:j.from,onClose:()=>Re(null),items:t.map(e=>({id:e,label:ae(e),description:e,onSelect:()=>{et({root:e})}}))}):null]})}export{we as TERMINAL_LIST_POLL_MS,S as TerminalPane,De as keyPassesToPage,b as resetTerminalPaneForTest};
3
+ //# sourceMappingURL=TerminalPane-D3f02aI4.js.map