@ashlr/hub 3.10.0 → 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (534) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/README.md +343 -82
  3. package/dist/authority-surface.json +109 -29
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/cloud.d.ts +39 -0
  6. package/dist/cli/cloud.js +448 -0
  7. package/dist/cli/cloud.js.map +1 -0
  8. package/dist/cli/completions.js +4 -0
  9. package/dist/cli/completions.js.map +1 -1
  10. package/dist/cli/help.js +2 -0
  11. package/dist/cli/help.js.map +1 -1
  12. package/dist/cli/index.d.ts +1 -0
  13. package/dist/cli/index.js +10 -0
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/core/cloud/backlog.d.ts +17 -0
  16. package/dist/core/cloud/backlog.js +177 -0
  17. package/dist/core/cloud/backlog.js.map +1 -0
  18. package/dist/core/cloud/budget.d.ts +19 -0
  19. package/dist/core/cloud/budget.js +99 -0
  20. package/dist/core/cloud/budget.js.map +1 -0
  21. package/dist/core/cloud/checkout.d.ts +41 -0
  22. package/dist/core/cloud/checkout.js +168 -0
  23. package/dist/core/cloud/checkout.js.map +1 -0
  24. package/dist/core/cloud/cloud-api.d.ts +86 -0
  25. package/dist/core/cloud/cloud-api.js +599 -0
  26. package/dist/core/cloud/cloud-api.js.map +1 -0
  27. package/dist/core/cloud/delivery-contract.d.ts +25 -0
  28. package/dist/core/cloud/delivery-contract.js +138 -0
  29. package/dist/core/cloud/delivery-contract.js.map +1 -0
  30. package/dist/core/cloud/improvement-backlog.d.ts +11 -0
  31. package/dist/core/cloud/improvement-backlog.js +26 -0
  32. package/dist/core/cloud/improvement-backlog.js.map +1 -0
  33. package/dist/core/cloud/launcher.d.ts +68 -0
  34. package/dist/core/cloud/launcher.js +312 -0
  35. package/dist/core/cloud/launcher.js.map +1 -0
  36. package/dist/core/cloud/service.d.ts +51 -0
  37. package/dist/core/cloud/service.js +215 -0
  38. package/dist/core/cloud/service.js.map +1 -0
  39. package/dist/core/cloud/store.d.ts +41 -0
  40. package/dist/core/cloud/store.js +278 -0
  41. package/dist/core/cloud/store.js.map +1 -0
  42. package/dist/core/cloud/tracker.d.ts +30 -0
  43. package/dist/core/cloud/tracker.js +152 -0
  44. package/dist/core/cloud/tracker.js.map +1 -0
  45. package/dist/core/cloud/types.d.ts +233 -0
  46. package/dist/core/cloud/types.js +73 -0
  47. package/dist/core/cloud/types.js.map +1 -0
  48. package/dist/core/daemon/capacity-publisher.d.ts +19 -0
  49. package/dist/core/daemon/capacity-publisher.js +49 -2
  50. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  51. package/dist/core/daemon/overnight-status.d.ts +13 -0
  52. package/dist/core/daemon/overnight-status.js +93 -8
  53. package/dist/core/daemon/overnight-status.js.map +1 -1
  54. package/dist/core/fleet/dispatch-router.js +26 -9
  55. package/dist/core/fleet/dispatch-router.js.map +1 -1
  56. package/dist/core/fleet/fleet-runtime-journal.js +12 -5
  57. package/dist/core/fleet/fleet-runtime-journal.js.map +1 -1
  58. package/dist/core/fleet/fleet-types.d.ts +13 -0
  59. package/dist/core/routing/budget-store.js +11 -5
  60. package/dist/core/routing/budget-store.js.map +1 -1
  61. package/dist/core/routing/capacity-history-api.d.ts +30 -0
  62. package/dist/core/routing/capacity-history-api.js +147 -0
  63. package/dist/core/routing/capacity-history-api.js.map +1 -0
  64. package/dist/core/routing/capacity-history-types.d.ts +63 -0
  65. package/dist/core/routing/capacity-history-types.js +18 -0
  66. package/dist/core/routing/capacity-history-types.js.map +1 -0
  67. package/dist/core/routing/capacity-history.d.ts +130 -0
  68. package/dist/core/routing/capacity-history.js +654 -0
  69. package/dist/core/routing/capacity-history.js.map +1 -0
  70. package/dist/core/routing/headroom.d.ts +5 -1
  71. package/dist/core/routing/headroom.js +82 -41
  72. package/dist/core/routing/headroom.js.map +1 -1
  73. package/dist/core/routing/router.d.ts +8 -1
  74. package/dist/core/routing/router.js +49 -16
  75. package/dist/core/routing/router.js.map +1 -1
  76. package/dist/core/routing/seat-reasons.d.ts +35 -0
  77. package/dist/core/routing/seat-reasons.js +48 -0
  78. package/dist/core/routing/seat-reasons.js.map +1 -0
  79. package/dist/core/routing/types.d.ts +37 -0
  80. package/dist/core/routing/types.js.map +1 -1
  81. package/dist/core/verse/activity-api.d.ts +3 -1
  82. package/dist/core/verse/activity-api.js +16 -1
  83. package/dist/core/verse/activity-api.js.map +1 -1
  84. package/dist/core/verse/activity.d.ts +7 -0
  85. package/dist/core/verse/activity.js +23 -0
  86. package/dist/core/verse/activity.js.map +1 -1
  87. package/dist/core/verse/fleet-history-types.d.ts +12 -4
  88. package/dist/core/verse/fleet-history-types.js +4 -2
  89. package/dist/core/verse/fleet-history-types.js.map +1 -1
  90. package/dist/core/verse/fleet-live-api.d.ts +14 -1
  91. package/dist/core/verse/fleet-live-api.js +31 -11
  92. package/dist/core/verse/fleet-live-api.js.map +1 -1
  93. package/dist/core/verse/preferences.d.ts +3 -1
  94. package/dist/core/verse/preferences.js +5 -2
  95. package/dist/core/verse/preferences.js.map +1 -1
  96. package/dist/core/verse/types.d.ts +5 -1
  97. package/dist/core/verse/types.js.map +1 -1
  98. package/dist/core/verse/verse-api.d.ts +1 -1
  99. package/dist/core/verse/verse-api.js +4 -1
  100. package/dist/core/verse/verse-api.js.map +1 -1
  101. package/dist/core/vision/leader-cloud.d.ts +63 -0
  102. package/dist/core/vision/leader-cloud.js +134 -0
  103. package/dist/core/vision/leader-cloud.js.map +1 -0
  104. package/dist/core/vision/leader.d.ts +6 -0
  105. package/dist/core/vision/leader.js +12 -1
  106. package/dist/core/vision/leader.js.map +1 -1
  107. package/dist/core/web/public/next/assets/{ActionMenu-DhbNne-M.js → ActionMenu-CQvNJvHY.js} +2 -2
  108. package/dist/core/web/public/next/assets/{ActionMenu-DhbNne-M.js.map → ActionMenu-CQvNJvHY.js.map} +1 -1
  109. package/dist/core/web/public/next/assets/Advanced-Bywv_iYR.css +1 -0
  110. package/dist/core/web/public/next/assets/Advanced-DEM93sKI.js +2 -0
  111. package/dist/core/web/public/next/assets/Advanced-DEM93sKI.js.map +1 -0
  112. package/dist/core/web/public/next/assets/{App-DyBg1v_q.js → App-CimXmK0L.js} +5 -5
  113. package/dist/core/web/public/next/assets/{App-DyBg1v_q.js.map → App-CimXmK0L.js.map} +1 -1
  114. package/dist/core/web/public/next/assets/AppsSection-D6U-dSj6.js +2 -0
  115. package/dist/core/web/public/next/assets/AppsSection-D6U-dSj6.js.map +1 -0
  116. package/dist/core/web/public/next/assets/AreaTrend-LD9lCPkT.js +2 -0
  117. package/dist/core/web/public/next/assets/AreaTrend-LD9lCPkT.js.map +1 -0
  118. package/dist/core/web/public/next/assets/AutonomySection-3V9pUyxm.js +2 -0
  119. package/dist/core/web/public/next/assets/{AutonomySection-CoMngwNB.js.map → AutonomySection-3V9pUyxm.js.map} +1 -1
  120. package/dist/core/web/public/next/assets/BranchBar-BZNQ50YE.css +1 -0
  121. package/dist/core/web/public/next/assets/BranchBar-U8UdpfEB.js +2 -0
  122. package/dist/core/web/public/next/assets/BranchBar-U8UdpfEB.js.map +1 -0
  123. package/dist/core/web/public/next/assets/BudgetControl-DOTlMSmW.js +2 -0
  124. package/dist/core/web/public/next/assets/BudgetControl-DOTlMSmW.js.map +1 -0
  125. package/dist/core/web/public/next/assets/BurnDown-x4PWH9JF.js +2 -0
  126. package/dist/core/web/public/next/assets/BurnDown-x4PWH9JF.js.map +1 -0
  127. package/dist/core/web/public/next/assets/{Button-0-nNbv1h.js → Button-DYv_KKxr.js} +2 -2
  128. package/dist/core/web/public/next/assets/{Button-0-nNbv1h.js.map → Button-DYv_KKxr.js.map} +1 -1
  129. package/dist/core/web/public/next/assets/CapacityStrip-C667yQe8.js +2 -0
  130. package/dist/core/web/public/next/assets/CapacityStrip-C667yQe8.js.map +1 -0
  131. package/dist/core/web/public/next/assets/CapacityStrip-Cc28CyWk.css +1 -0
  132. package/dist/core/web/public/next/assets/ChatSection-CCcIPpOq.js +3 -0
  133. package/dist/core/web/public/next/assets/{ChatSection-B9cdRKUh.js.map → ChatSection-CCcIPpOq.js.map} +1 -1
  134. package/dist/core/web/public/next/assets/CloudBudgetForm-DJeJvBEu.js +2 -0
  135. package/dist/core/web/public/next/assets/CloudBudgetForm-DJeJvBEu.js.map +1 -0
  136. package/dist/core/web/public/next/assets/{CommandPalette-GpeCSrPy.js → CommandPalette-FiD4N8XD.js} +2 -2
  137. package/dist/core/web/public/next/assets/{CommandPalette-GpeCSrPy.js.map → CommandPalette-FiD4N8XD.js.map} +1 -1
  138. package/dist/core/web/public/next/assets/CommandSection-DN8KwH-X.js +2 -0
  139. package/dist/core/web/public/next/assets/CommandSection-DN8KwH-X.js.map +1 -0
  140. package/dist/core/web/public/next/assets/Composer-ByzxOJK6.css +1 -0
  141. package/dist/core/web/public/next/assets/Composer.module-C8U73KdQ.js +2 -0
  142. package/dist/core/web/public/next/assets/{Composer.module-DJMdrqNt.js.map → Composer.module-C8U73KdQ.js.map} +1 -1
  143. package/dist/core/web/public/next/assets/DiffPane-BAvvbBsf.css +1 -0
  144. package/dist/core/web/public/next/assets/DiffPane-DLJ3gGGK.js +2 -0
  145. package/dist/core/web/public/next/assets/DiffPane-DLJ3gGGK.js.map +1 -0
  146. package/dist/core/web/public/next/assets/{DiffViewer-tOGWk0CA.js → DiffViewer-B7NWPjIO.js} +2 -2
  147. package/dist/core/web/public/next/assets/{DiffViewer-tOGWk0CA.js.map → DiffViewer-B7NWPjIO.js.map} +1 -1
  148. package/dist/core/web/public/next/assets/DockHost-B4RaYOET.css +1 -0
  149. package/dist/core/web/public/next/assets/DockHost-DvR-hPhZ.js +2 -0
  150. package/dist/core/web/public/next/assets/DockHost-DvR-hPhZ.js.map +1 -0
  151. package/dist/core/web/public/next/assets/{EmptyState-DdJ4CxtO.js → EmptyState-DhNgDDrF.js} +2 -2
  152. package/dist/core/web/public/next/assets/{EmptyState-DdJ4CxtO.js.map → EmptyState-DhNgDDrF.js.map} +1 -1
  153. package/dist/core/web/public/next/assets/{Epistemic-BLjM5y_y.js → Epistemic-uARPnx9x.js} +2 -2
  154. package/dist/core/web/public/next/assets/{Epistemic-BLjM5y_y.js.map → Epistemic-uARPnx9x.js.map} +1 -1
  155. package/dist/core/web/public/next/assets/FleetSection-CFiWeOEs.css +1 -0
  156. package/dist/core/web/public/next/assets/FleetSection-D_zRBCub.js +3 -0
  157. package/dist/core/web/public/next/assets/FleetSection-D_zRBCub.js.map +1 -0
  158. package/dist/core/web/public/next/assets/Funnel-CL8uHONq.js +2 -0
  159. package/dist/core/web/public/next/assets/Funnel-CL8uHONq.js.map +1 -0
  160. package/dist/core/web/public/next/assets/GearTray-C7k4l_BW.js +2 -0
  161. package/dist/core/web/public/next/assets/GearTray-C7k4l_BW.js.map +1 -0
  162. package/dist/core/web/public/next/assets/GrowthSection-DwdNSGj8.js +2 -0
  163. package/dist/core/web/public/next/assets/GrowthSection-DwdNSGj8.js.map +1 -0
  164. package/dist/core/web/public/next/assets/HandoffDialog-FPVOqOMN.js +2 -0
  165. package/dist/core/web/public/next/assets/HandoffDialog-FPVOqOMN.js.map +1 -0
  166. package/dist/core/web/public/next/assets/{Input-CTu0CycC.js → Input-B9-VLcHS.js} +2 -2
  167. package/dist/core/web/public/next/assets/{Input-CTu0CycC.js.map → Input-B9-VLcHS.js.map} +1 -1
  168. package/dist/core/web/public/next/assets/{LeaderCard-BuSDeATv.js → LeaderCard-4R0BhDzT.js} +2 -2
  169. package/dist/core/web/public/next/assets/{LeaderCard-BuSDeATv.js.map → LeaderCard-4R0BhDzT.js.map} +1 -1
  170. package/dist/core/web/public/next/assets/{MatrixHeatmap-9dKgJ_pT.css → MatrixHeatmap-Bmnvo1l1.css} +1 -1
  171. package/dist/core/web/public/next/assets/MatrixHeatmap-DiuushcS.js +2 -0
  172. package/dist/core/web/public/next/assets/MatrixHeatmap-DiuushcS.js.map +1 -0
  173. package/dist/core/web/public/next/assets/McpSection-CJ__OJKl.js +2 -0
  174. package/dist/core/web/public/next/assets/{McpSection-1UncWBpW.js.map → McpSection-CJ__OJKl.js.map} +1 -1
  175. package/dist/core/web/public/next/assets/MessageMarkdown-Cgh5f1-Q.css +1 -0
  176. package/dist/core/web/public/next/assets/MessageMarkdown-qWKyJvAQ.js +3 -0
  177. package/dist/core/web/public/next/assets/{MessageMarkdown-C4pl9LI5.js.map → MessageMarkdown-qWKyJvAQ.js.map} +1 -1
  178. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CZsF77ZM.js → MessageMarkdownRenderer-x05TrsrW.js} +2 -2
  179. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-CZsF77ZM.js.map → MessageMarkdownRenderer-x05TrsrW.js.map} +1 -1
  180. package/dist/core/web/public/next/assets/{Meter-C18ciKz4.js → Meter-D-hncpkO.js} +2 -2
  181. package/dist/core/web/public/next/assets/{Meter-C18ciKz4.js.map → Meter-D-hncpkO.js.map} +1 -1
  182. package/dist/core/web/public/next/assets/MindSection-BjXHkQPS.js +2 -0
  183. package/dist/core/web/public/next/assets/MindSection-BjXHkQPS.js.map +1 -0
  184. package/dist/core/web/public/next/assets/MutationTokenDialog-SkRxqV_I.js +2 -0
  185. package/dist/core/web/public/next/assets/MutationTokenDialog-SkRxqV_I.js.map +1 -0
  186. package/dist/core/web/public/next/assets/NeedsYouDrawer-BpvidnM2.css +1 -0
  187. package/dist/core/web/public/next/assets/NeedsYouDrawer-rSd1ZHAR.js +2 -0
  188. package/dist/core/web/public/next/assets/NeedsYouDrawer-rSd1ZHAR.js.map +1 -0
  189. package/dist/core/web/public/next/assets/NeedsYouList-CG-nB1tr.js +2 -0
  190. package/dist/core/web/public/next/assets/NeedsYouList-CG-nB1tr.js.map +1 -0
  191. package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +1 -0
  192. package/dist/core/web/public/next/assets/NewChatDialog-BeDQ1eW3.js +3 -0
  193. package/dist/core/web/public/next/assets/{NewChatDialog-B_BsS9pr.js.map → NewChatDialog-BeDQ1eW3.js.map} +1 -1
  194. package/dist/core/web/public/next/assets/OnboardingFlow-CkTZtt-m.js +2 -0
  195. package/dist/core/web/public/next/assets/{OnboardingFlow-CtCPpgoX.js.map → OnboardingFlow-CkTZtt-m.js.map} +1 -1
  196. package/dist/core/web/public/next/assets/PreviewPane-DoMsJSG3.css +1 -0
  197. package/dist/core/web/public/next/assets/PreviewPane-kzbbSK4u.js +2 -0
  198. package/dist/core/web/public/next/assets/PreviewPane-kzbbSK4u.js.map +1 -0
  199. package/dist/core/web/public/next/assets/RailStatus-D-t2gPae.js +2 -0
  200. package/dist/core/web/public/next/assets/RailStatus-D-t2gPae.js.map +1 -0
  201. package/dist/core/web/public/next/assets/{RefreshIndicator-CnhEovMZ.js → RefreshIndicator-BLnr9IOM.js} +2 -2
  202. package/dist/core/web/public/next/assets/{RefreshIndicator-CnhEovMZ.js.map → RefreshIndicator-BLnr9IOM.js.map} +1 -1
  203. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-28gLwmwV.js → ResourcePoolConsoleApp-BeG0gBif.js} +4 -4
  204. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-28gLwmwV.js.map → ResourcePoolConsoleApp-BeG0gBif.js.map} +1 -1
  205. package/dist/core/web/public/next/assets/ResourcesChrome-B3Z3O98t.css +1 -0
  206. package/dist/core/web/public/next/assets/ResourcesChrome-BzV6bkIa.js +3 -0
  207. package/dist/core/web/public/next/assets/ResourcesChrome-BzV6bkIa.js.map +1 -0
  208. package/dist/core/web/public/next/assets/ResourcesDrawer-CSKIO_wZ.css +1 -0
  209. package/dist/core/web/public/next/assets/ResourcesDrawer-o4ILHdep.js +2 -0
  210. package/dist/core/web/public/next/assets/ResourcesDrawer-o4ILHdep.js.map +1 -0
  211. package/dist/core/web/public/next/assets/{RouteErrorBoundary-AyUPCIb3.js → RouteErrorBoundary-C5SxA2Dg.js} +2 -2
  212. package/dist/core/web/public/next/assets/{RouteErrorBoundary-AyUPCIb3.js.map → RouteErrorBoundary-C5SxA2Dg.js.map} +1 -1
  213. package/dist/core/web/public/next/assets/RunInCloudAction-C3LBp7C4.js +2 -0
  214. package/dist/core/web/public/next/assets/RunInCloudAction-C3LBp7C4.js.map +1 -0
  215. package/dist/core/web/public/next/assets/SeatSelector-DpvvbjNm.js +3 -0
  216. package/dist/core/web/public/next/assets/{SeatSelector-DaUO-zoK.js.map → SeatSelector-DpvvbjNm.js.map} +1 -1
  217. package/dist/core/web/public/next/assets/{Segmented-B_8c_83S.js → Segmented-BL40udoO.js} +2 -2
  218. package/dist/core/web/public/next/assets/{Segmented-B_8c_83S.js.map → Segmented-BL40udoO.js.map} +1 -1
  219. package/dist/core/web/public/next/assets/{Select-Bl5g5Dt_.js → Select-FWLnAw_j.js} +2 -2
  220. package/dist/core/web/public/next/assets/{Select-Bl5g5Dt_.js.map → Select-FWLnAw_j.js.map} +1 -1
  221. package/dist/core/web/public/next/assets/{SessionInsightChip-w0I21q0c.js → SessionInsightChip-CWye87Ju.js} +2 -2
  222. package/dist/core/web/public/next/assets/{SessionInsightChip-w0I21q0c.js.map → SessionInsightChip-CWye87Ju.js.map} +1 -1
  223. package/dist/core/web/public/next/assets/SessionSearch-YvCHFUuN.js +2 -0
  224. package/dist/core/web/public/next/assets/{SessionSearch-B5aQ0BCM.js.map → SessionSearch-YvCHFUuN.js.map} +1 -1
  225. package/dist/core/web/public/next/assets/SettingsSection-Dr18upeE.js +2 -0
  226. package/dist/core/web/public/next/assets/SettingsSection-Dr18upeE.js.map +1 -0
  227. package/dist/core/web/public/next/assets/{Sheet-CVjk-cLI.js → Sheet-DZKcQXQg.js} +2 -2
  228. package/dist/core/web/public/next/assets/{Sheet-CVjk-cLI.js.map → Sheet-DZKcQXQg.js.map} +1 -1
  229. package/dist/core/web/public/next/assets/{ShortcutsOverlay-BiBjnBcc.js → ShortcutsOverlay-BpDimdPq.js} +2 -2
  230. package/dist/core/web/public/next/assets/{ShortcutsOverlay-BiBjnBcc.js.map → ShortcutsOverlay-BpDimdPq.js.map} +1 -1
  231. package/dist/core/web/public/next/assets/Sidebar-BRc1vGDF.css +1 -0
  232. package/dist/core/web/public/next/assets/Sidebar-BoBzBEFX.js +3 -0
  233. package/dist/core/web/public/next/assets/Sidebar-BoBzBEFX.js.map +1 -0
  234. package/dist/core/web/public/next/assets/{Slider-BS9MU5ZV.js → Slider-DUMo9HDD.js} +2 -2
  235. package/dist/core/web/public/next/assets/{Slider-BS9MU5ZV.js.map → Slider-DUMo9HDD.js.map} +1 -1
  236. package/dist/core/web/public/next/assets/{StatusBadge-DAf-ArKE.js → StatusBadge-BwnBNFQr.js} +2 -2
  237. package/dist/core/web/public/next/assets/{StatusBadge-DAf-ArKE.js.map → StatusBadge-BwnBNFQr.js.map} +1 -1
  238. package/dist/core/web/public/next/assets/StepBand-PDXMIlRk.js +2 -0
  239. package/dist/core/web/public/next/assets/StepBand-PDXMIlRk.js.map +1 -0
  240. package/dist/core/web/public/next/assets/{Surface-CiYOdNKQ.js → Surface-B3TZVoER.js} +2 -2
  241. package/dist/core/web/public/next/assets/{Surface-CiYOdNKQ.js.map → Surface-B3TZVoER.js.map} +1 -1
  242. package/dist/core/web/public/next/assets/Swimlane-DR4OgON_.js +2 -0
  243. package/dist/core/web/public/next/assets/Swimlane-DR4OgON_.js.map +1 -0
  244. package/dist/core/web/public/next/assets/{Switch-BzRXtNPt.js → Switch-CcR5Llk5.js} +2 -2
  245. package/dist/core/web/public/next/assets/{Switch-BzRXtNPt.js.map → Switch-CcR5Llk5.js.map} +1 -1
  246. package/dist/core/web/public/next/assets/{Tag-DEEbDz7T.js → Tag-_-K1h7Hk.js} +2 -2
  247. package/dist/core/web/public/next/assets/{Tag-DEEbDz7T.js.map → Tag-_-K1h7Hk.js.map} +1 -1
  248. package/dist/core/web/public/next/assets/TerminalPane-BwfMbnJz.css +1 -0
  249. package/dist/core/web/public/next/assets/TerminalPane-_1aH4ndN.js +7 -0
  250. package/dist/core/web/public/next/assets/TerminalPane-_1aH4ndN.js.map +1 -0
  251. package/dist/core/web/public/next/assets/UniverseConsoleApp-BUsq-inZ.js +2 -0
  252. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DKqAf-eD.js.map → UniverseConsoleApp-BUsq-inZ.js.map} +1 -1
  253. package/dist/core/web/public/next/assets/{UniverseView-D6081LQL.js → UniverseView-Dogy_dsB.js} +2 -2
  254. package/dist/core/web/public/next/assets/{UniverseView-D6081LQL.js.map → UniverseView-Dogy_dsB.js.map} +1 -1
  255. package/dist/core/web/public/next/assets/UsageSection-DiX_dTyo.js +2 -0
  256. package/dist/core/web/public/next/assets/UsageSection-DiX_dTyo.js.map +1 -0
  257. package/dist/core/web/public/next/assets/UsageSection-DsB-Jqyl.css +1 -0
  258. package/dist/core/web/public/next/assets/VerseConsoleApp-Cxqr-3qc.css +1 -0
  259. package/dist/core/web/public/next/assets/VerseConsoleApp-WVeyJnW7.js +3 -0
  260. package/dist/core/web/public/next/assets/VerseConsoleApp-WVeyJnW7.js.map +1 -0
  261. package/dist/core/web/public/next/assets/Workspace-BYW9dm90.css +1 -0
  262. package/dist/core/web/public/next/assets/Workspace-BbxZHwQd.js +10 -0
  263. package/dist/core/web/public/next/assets/Workspace-BbxZHwQd.js.map +1 -0
  264. package/dist/core/web/public/next/assets/actions-Ddfg2iLl.css +1 -0
  265. package/dist/core/web/public/next/assets/actions-s2lfm_5k.js +2 -0
  266. package/dist/core/web/public/next/assets/actions-s2lfm_5k.js.map +1 -0
  267. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js +2 -0
  268. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js.map +1 -0
  269. package/dist/core/web/public/next/assets/{budget-queries-Dacv1VYP.js → budget-queries-wUshcovN.js} +2 -2
  270. package/dist/core/web/public/next/assets/{budget-queries-Dacv1VYP.js.map → budget-queries-wUshcovN.js.map} +1 -1
  271. package/dist/core/web/public/next/assets/calendar-day-BxBYHfX1.js +2 -0
  272. package/dist/core/web/public/next/assets/calendar-day-BxBYHfX1.js.map +1 -0
  273. package/dist/core/web/public/next/assets/capacity-strip-model-Bj_9ztzs.js +2 -0
  274. package/dist/core/web/public/next/assets/capacity-strip-model-Bj_9ztzs.js.map +1 -0
  275. package/dist/core/web/public/next/assets/charts-CMSgAUKn.js +2 -0
  276. package/dist/core/web/public/next/assets/charts-CMSgAUKn.js.map +1 -0
  277. package/dist/core/web/public/next/assets/cloud-C1KPNRHC.css +1 -0
  278. package/dist/core/web/public/next/assets/cloud-queries-CnV1yaNG.js +2 -0
  279. package/dist/core/web/public/next/assets/cloud-queries-CnV1yaNG.js.map +1 -0
  280. package/dist/core/web/public/next/assets/cloud.module-CiwatLj3.js +2 -0
  281. package/dist/core/web/public/next/assets/cloud.module-CiwatLj3.js.map +1 -0
  282. package/dist/core/web/public/next/assets/colors-BZ3a9wFf.js +2 -0
  283. package/dist/core/web/public/next/assets/colors-BZ3a9wFf.js.map +1 -0
  284. package/dist/core/web/public/next/assets/{command-bus-CpYuam1F.js → command-bus-DqimKCUY.js} +2 -2
  285. package/dist/core/web/public/next/assets/{command-bus-CpYuam1F.js.map → command-bus-DqimKCUY.js.map} +1 -1
  286. package/dist/core/web/public/next/assets/command-catalog-BdtDH93o.js +2 -0
  287. package/dist/core/web/public/next/assets/command-catalog-BdtDH93o.js.map +1 -0
  288. package/dist/core/web/public/next/assets/{composer-keys-CYz4U4Bg.js → composer-keys-DBRymxQn.js} +2 -2
  289. package/dist/core/web/public/next/assets/{composer-keys-CYz4U4Bg.js.map → composer-keys-DBRymxQn.js.map} +1 -1
  290. package/dist/core/web/public/next/assets/context-model-Dwd49-dp.js +2 -0
  291. package/dist/core/web/public/next/assets/context-model-Dwd49-dp.js.map +1 -0
  292. package/dist/core/web/public/next/assets/context-model-MT17V86_.js +2 -0
  293. package/dist/core/web/public/next/assets/context-model-MT17V86_.js.map +1 -0
  294. package/dist/core/web/public/next/assets/context-queries-xVKIeynP.js +2 -0
  295. package/dist/core/web/public/next/assets/context-queries-xVKIeynP.js.map +1 -0
  296. package/dist/core/web/public/next/assets/context.module-BijAfoJw.js +2 -0
  297. package/dist/core/web/public/next/assets/context.module-BijAfoJw.js.map +1 -0
  298. package/dist/core/web/public/next/assets/{control-queries-BGjarMm9.js → control-queries-DOZR-D8G.js} +2 -2
  299. package/dist/core/web/public/next/assets/{control-queries-BGjarMm9.js.map → control-queries-DOZR-D8G.js.map} +1 -1
  300. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js +2 -0
  301. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js.map +1 -0
  302. package/dist/core/web/public/next/assets/dock-icons-8EtARwUm.js +2 -0
  303. package/dist/core/web/public/next/assets/dock-icons-8EtARwUm.js.map +1 -0
  304. package/dist/core/web/public/next/assets/dock-panes-UKS-mXhr.js +2 -0
  305. package/dist/core/web/public/next/assets/{dock-panes-BNTLvX7G.js.map → dock-panes-UKS-mXhr.js.map} +1 -1
  306. package/dist/core/web/public/next/assets/{dock-store-_E5h6TEq.js → dock-store-BA1cHOYA.js} +2 -2
  307. package/dist/core/web/public/next/assets/{dock-store-_E5h6TEq.js.map → dock-store-BA1cHOYA.js.map} +1 -1
  308. package/dist/core/web/public/next/assets/fleet-model-CNe8Wh-s.js +2 -0
  309. package/dist/core/web/public/next/assets/fleet-model-CNe8Wh-s.js.map +1 -0
  310. package/dist/core/web/public/next/assets/fleet-queries-BSdRlUwJ.js +2 -0
  311. package/dist/core/web/public/next/assets/fleet-queries-BSdRlUwJ.js.map +1 -0
  312. package/dist/core/web/public/next/assets/format-B8DAVcn2.js +2 -0
  313. package/dist/core/web/public/next/assets/format-B8DAVcn2.js.map +1 -0
  314. package/dist/core/web/public/next/assets/format-DKrNjdwD.js +2 -0
  315. package/dist/core/web/public/next/assets/format-DKrNjdwD.js.map +1 -0
  316. package/dist/core/web/public/next/assets/{git-model-5v5xGobf.js → git-model-CivuBY_D.js} +2 -2
  317. package/dist/core/web/public/next/assets/{git-model-5v5xGobf.js.map → git-model-CivuBY_D.js.map} +1 -1
  318. package/dist/core/web/public/next/assets/global-Di2PUgj4.js +2 -0
  319. package/dist/core/web/public/next/assets/global-Di2PUgj4.js.map +1 -0
  320. package/dist/core/web/public/next/assets/{guarded-action-vOPc8v75.js → guarded-action-CvOHcqyH.js} +2 -2
  321. package/dist/core/web/public/next/assets/{guarded-action-vOPc8v75.js.map → guarded-action-CvOHcqyH.js.map} +1 -1
  322. package/dist/core/web/public/next/assets/{icons-DWb24OA6.js → icons-B_yuAgdN.js} +2 -2
  323. package/dist/core/web/public/next/assets/{icons-DWb24OA6.js.map → icons-B_yuAgdN.js.map} +1 -1
  324. package/dist/core/web/public/next/assets/{index-afDA8cwW.js → index-oAAq8XJa.js} +3 -3
  325. package/dist/core/web/public/next/assets/{index-afDA8cwW.js.map → index-oAAq8XJa.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/live-model-DCw_IFRI.js +2 -0
  327. package/dist/core/web/public/next/assets/live-model-DCw_IFRI.js.map +1 -0
  328. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js +2 -0
  329. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js.map +1 -0
  330. package/dist/core/web/public/next/assets/mind-B9PzLcl0.css +1 -0
  331. package/dist/core/web/public/next/assets/mind.module-vnuJcwvD.js +2 -0
  332. package/dist/core/web/public/next/assets/mind.module-vnuJcwvD.js.map +1 -0
  333. package/dist/core/web/public/next/assets/mutations-Dpsql5t7.js +2 -0
  334. package/dist/core/web/public/next/assets/{mutations-C6E10SPX.js.map → mutations-Dpsql5t7.js.map} +1 -1
  335. package/dist/core/web/public/next/assets/{overnight-queries-CCGfiS-g.js → overnight-queries-X-44Gsw5.js} +2 -2
  336. package/dist/core/web/public/next/assets/{overnight-queries-CCGfiS-g.js.map → overnight-queries-X-44Gsw5.js.map} +1 -1
  337. package/dist/core/web/public/next/assets/pane-chrome-8JmEhHVD.css +1 -0
  338. package/dist/core/web/public/next/assets/pane-chrome.module-D7o-fVd0.js +2 -0
  339. package/dist/core/web/public/next/assets/pane-chrome.module-D7o-fVd0.js.map +1 -0
  340. package/dist/core/web/public/next/assets/primitives-BDIcUvob.js +1 -0
  341. package/dist/core/web/public/next/assets/{queries-BuYIEHst.js → queries-BA4rNGD-.js} +2 -2
  342. package/dist/core/web/public/next/assets/{queries-BuYIEHst.js.map → queries-BA4rNGD-.js.map} +1 -1
  343. package/dist/core/web/public/next/assets/{reasoning-pref-BVzGczV7.js → reasoning-pref-B9-DJUXP.js} +2 -2
  344. package/dist/core/web/public/next/assets/{reasoning-pref-BVzGczV7.js.map → reasoning-pref-B9-DJUXP.js.map} +1 -1
  345. package/dist/core/web/public/next/assets/seat-subscription-CH6fW4fJ.js +2 -0
  346. package/dist/core/web/public/next/assets/seat-subscription-CH6fW4fJ.js.map +1 -0
  347. package/dist/core/web/public/next/assets/{section-visibility-CSrsTcwK.js → section-visibility-qFqc_d4Z.js} +2 -2
  348. package/dist/core/web/public/next/assets/{section-visibility-CSrsTcwK.js.map → section-visibility-qFqc_d4Z.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/{sidebar-model-C8fyqSQY.js → sidebar-model-M1GaQU5l.js} +2 -2
  350. package/dist/core/web/public/next/assets/{sidebar-model-C8fyqSQY.js.map → sidebar-model-M1GaQU5l.js.map} +1 -1
  351. package/dist/core/web/public/next/assets/slots-Ds9ZIqUL.js +3 -0
  352. package/dist/core/web/public/next/assets/{slots-W8gkmdfE.js.map → slots-Ds9ZIqUL.js.map} +1 -1
  353. package/dist/core/web/public/next/assets/surface-data-J52iIGMD.js +2 -0
  354. package/dist/core/web/public/next/assets/surface-data-J52iIGMD.js.map +1 -0
  355. package/dist/core/web/public/next/assets/surface-prefetch-CgZ-LEJK.js +2 -0
  356. package/dist/core/web/public/next/assets/surface-prefetch-CgZ-LEJK.js.map +1 -0
  357. package/dist/core/web/public/next/assets/tasks-model-ent8f0jZ.js +2 -0
  358. package/dist/core/web/public/next/assets/{tasks-model-CnYQzgxk.js.map → tasks-model-ent8f0jZ.js.map} +1 -1
  359. package/dist/core/web/public/next/assets/{terminal-icons-CxUYaWX9.js → terminal-icons-DJTK7QpR.js} +2 -2
  360. package/dist/core/web/public/next/assets/{terminal-icons-CxUYaWX9.js.map → terminal-icons-DJTK7QpR.js.map} +1 -1
  361. package/dist/core/web/public/next/assets/{tool-semantics-CTRuLF5j.js → tool-semantics-GX8ScuSH.js} +2 -2
  362. package/dist/core/web/public/next/assets/{tool-semantics-CTRuLF5j.js.map → tool-semantics-GX8ScuSH.js.map} +1 -1
  363. package/dist/core/web/public/next/assets/{turn-files-BvB5LLNw.js → turn-files-BPHQzYuH.js} +2 -2
  364. package/dist/core/web/public/next/assets/{turn-files-BvB5LLNw.js.map → turn-files-BPHQzYuH.js.map} +1 -1
  365. package/dist/core/web/public/next/assets/types-D5XOdyw8.js +2 -0
  366. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +1 -0
  367. package/dist/core/web/public/next/assets/{usage-queries-CQOpeE1H.js → usage-queries-Bn8ccqyN.js} +2 -2
  368. package/dist/core/web/public/next/assets/{usage-queries-CQOpeE1H.js.map → usage-queries-Bn8ccqyN.js.map} +1 -1
  369. package/dist/core/web/public/next/assets/use-guarded-action-C2HlSzkz.js +2 -0
  370. package/dist/core/web/public/next/assets/use-guarded-action-C2HlSzkz.js.map +1 -0
  371. package/dist/core/web/public/next/assets/{use-ticker-hryPXnyp.js → use-ticker-BNc1H4ZC.js} +2 -2
  372. package/dist/core/web/public/next/assets/{use-ticker-hryPXnyp.js.map → use-ticker-BNc1H4ZC.js.map} +1 -1
  373. package/dist/core/web/public/next/assets/use-token-gate-B3IJL6bf.js +2 -0
  374. package/dist/core/web/public/next/assets/use-token-gate-B3IJL6bf.js.map +1 -0
  375. package/dist/core/web/public/next/assets/{useActivity-Cg_9-7nt.js → useActivity-Bk3XgXjL.js} +2 -2
  376. package/dist/core/web/public/next/assets/{useActivity-Cg_9-7nt.js.map → useActivity-Bk3XgXjL.js.map} +1 -1
  377. package/dist/core/web/public/next/assets/useChartWidth-BAtVgn2n.css +1 -0
  378. package/dist/core/web/public/next/assets/useChartWidth-lZ9PrQn0.js +2 -0
  379. package/dist/core/web/public/next/assets/useChartWidth-lZ9PrQn0.js.map +1 -0
  380. package/dist/core/web/public/next/assets/{useSeatsRefresh-4Ov9eT1F.js → useSeatsRefresh-CG4jczeL.js} +2 -2
  381. package/dist/core/web/public/next/assets/{useSeatsRefresh-4Ov9eT1F.js.map → useSeatsRefresh-CG4jczeL.js.map} +1 -1
  382. package/dist/core/web/public/next/assets/verse-model-D7NZQFAR.js +2 -0
  383. package/dist/core/web/public/next/assets/verse-model-D7NZQFAR.js.map +1 -0
  384. package/dist/core/web/public/next/assets/{verse-queries-BjQoOTwv.js → verse-queries-DvIJcn6Z.js} +2 -2
  385. package/dist/core/web/public/next/assets/{verse-queries-BjQoOTwv.js.map → verse-queries-DvIJcn6Z.js.map} +1 -1
  386. package/dist/core/web/public/next/assets/verse-store-DjBWj04q.js +3 -0
  387. package/dist/core/web/public/next/assets/verse-store-DjBWj04q.js.map +1 -0
  388. package/dist/core/web/public/next/assets/verse-ui-store-zafyzXKD.js +3 -0
  389. package/dist/core/web/public/next/assets/{verse-ui-store-KTTKfv-T.js.map → verse-ui-store-zafyzXKD.js.map} +1 -1
  390. package/dist/core/web/public/next/assets/{viewport-ZB86jdES.js → viewport-BEqGUoTA.js} +2 -2
  391. package/dist/core/web/public/next/assets/{viewport-ZB86jdES.js.map → viewport-BEqGUoTA.js.map} +1 -1
  392. package/dist/core/web/public/next/assets/warmup-BR6pxAKs.js +3 -0
  393. package/dist/core/web/public/next/assets/warmup-BR6pxAKs.js.map +1 -0
  394. package/dist/core/web/public/next/assets/{workspace-model-4hq_Mv3N.js → workspace-model-D_tWD5Wt.js} +2 -2
  395. package/dist/core/web/public/next/assets/{workspace-model-4hq_Mv3N.js.map → workspace-model-D_tWD5Wt.js.map} +1 -1
  396. package/dist/core/web/public/next/index.html +1 -1
  397. package/dist/release-dependency-inventory.json +1 -1
  398. package/package.json +1 -1
  399. package/dist/core/web/public/next/assets/Advanced-CHjxJt2z.css +0 -1
  400. package/dist/core/web/public/next/assets/Advanced-DM0DYibH.js +0 -2
  401. package/dist/core/web/public/next/assets/Advanced-DM0DYibH.js.map +0 -1
  402. package/dist/core/web/public/next/assets/AppsSection-CXxbfPJQ.js +0 -2
  403. package/dist/core/web/public/next/assets/AppsSection-CXxbfPJQ.js.map +0 -1
  404. package/dist/core/web/public/next/assets/AreaTrend-gUVXkfhf.js +0 -2
  405. package/dist/core/web/public/next/assets/AreaTrend-gUVXkfhf.js.map +0 -1
  406. package/dist/core/web/public/next/assets/AutonomySection-CoMngwNB.js +0 -2
  407. package/dist/core/web/public/next/assets/BranchBar-C-NovaXr.js +0 -2
  408. package/dist/core/web/public/next/assets/BranchBar-C-NovaXr.js.map +0 -1
  409. package/dist/core/web/public/next/assets/BranchBar-C9BpPVLr.css +0 -1
  410. package/dist/core/web/public/next/assets/BudgetControl-P5lMxHvQ.js +0 -2
  411. package/dist/core/web/public/next/assets/BudgetControl-P5lMxHvQ.js.map +0 -1
  412. package/dist/core/web/public/next/assets/BurnDown-4P1LDoCL.js +0 -2
  413. package/dist/core/web/public/next/assets/BurnDown-4P1LDoCL.js.map +0 -1
  414. package/dist/core/web/public/next/assets/CapacityStrip-D6Yyg4a1.js +0 -2
  415. package/dist/core/web/public/next/assets/CapacityStrip-D6Yyg4a1.js.map +0 -1
  416. package/dist/core/web/public/next/assets/CapacityStrip-wgFP9MUA.css +0 -1
  417. package/dist/core/web/public/next/assets/ChatSection-B9cdRKUh.js +0 -3
  418. package/dist/core/web/public/next/assets/CommandSection-BC0uXim_.js +0 -2
  419. package/dist/core/web/public/next/assets/CommandSection-BC0uXim_.js.map +0 -1
  420. package/dist/core/web/public/next/assets/Composer-CkcwbQhG.css +0 -1
  421. package/dist/core/web/public/next/assets/Composer.module-DJMdrqNt.js +0 -2
  422. package/dist/core/web/public/next/assets/DiffPane-5uLKa0au.js +0 -2
  423. package/dist/core/web/public/next/assets/DiffPane-5uLKa0au.js.map +0 -1
  424. package/dist/core/web/public/next/assets/DiffPane-Csboxnn0.css +0 -1
  425. package/dist/core/web/public/next/assets/DockHost-BGnTgdIb.css +0 -1
  426. package/dist/core/web/public/next/assets/DockHost-CBV_6Ehi.js +0 -2
  427. package/dist/core/web/public/next/assets/DockHost-CBV_6Ehi.js.map +0 -1
  428. package/dist/core/web/public/next/assets/FleetSection-DuJcQCGg.js +0 -3
  429. package/dist/core/web/public/next/assets/FleetSection-DuJcQCGg.js.map +0 -1
  430. package/dist/core/web/public/next/assets/FleetSection-w9AjqfTR.css +0 -1
  431. package/dist/core/web/public/next/assets/Funnel-qX3Hlbce.js +0 -2
  432. package/dist/core/web/public/next/assets/Funnel-qX3Hlbce.js.map +0 -1
  433. package/dist/core/web/public/next/assets/GearTray-kVGP1coG.js +0 -2
  434. package/dist/core/web/public/next/assets/GearTray-kVGP1coG.js.map +0 -1
  435. package/dist/core/web/public/next/assets/GrowthSection-CYxJ9MH5.js +0 -2
  436. package/dist/core/web/public/next/assets/GrowthSection-CYxJ9MH5.js.map +0 -1
  437. package/dist/core/web/public/next/assets/HandoffDialog-DHZo3Ev0.js +0 -2
  438. package/dist/core/web/public/next/assets/HandoffDialog-DHZo3Ev0.js.map +0 -1
  439. package/dist/core/web/public/next/assets/MatrixHeatmap-B_JWCjZx.js +0 -2
  440. package/dist/core/web/public/next/assets/MatrixHeatmap-B_JWCjZx.js.map +0 -1
  441. package/dist/core/web/public/next/assets/McpSection-1UncWBpW.js +0 -2
  442. package/dist/core/web/public/next/assets/MessageMarkdown-C4pl9LI5.js +0 -3
  443. package/dist/core/web/public/next/assets/MessageMarkdown-Czcl3L_Q.css +0 -1
  444. package/dist/core/web/public/next/assets/MindSection-C3fCw_fD.js +0 -2
  445. package/dist/core/web/public/next/assets/MindSection-C3fCw_fD.js.map +0 -1
  446. package/dist/core/web/public/next/assets/MutationTokenDialog-Dn0tzCrh.js +0 -2
  447. package/dist/core/web/public/next/assets/MutationTokenDialog-Dn0tzCrh.js.map +0 -1
  448. package/dist/core/web/public/next/assets/NeedsYouDrawer-CuNYJCJ0.js +0 -2
  449. package/dist/core/web/public/next/assets/NeedsYouDrawer-CuNYJCJ0.js.map +0 -1
  450. package/dist/core/web/public/next/assets/NeedsYouDrawer-SkhvvdLb.css +0 -1
  451. package/dist/core/web/public/next/assets/NewChatDialog-B_BsS9pr.js +0 -3
  452. package/dist/core/web/public/next/assets/OnboardingFlow-CtCPpgoX.js +0 -2
  453. package/dist/core/web/public/next/assets/PreviewPane-Cx6RRwzM.js +0 -2
  454. package/dist/core/web/public/next/assets/PreviewPane-Cx6RRwzM.js.map +0 -1
  455. package/dist/core/web/public/next/assets/PreviewPane-WQJFjSXe.css +0 -1
  456. package/dist/core/web/public/next/assets/RailStatus-BWs6xevj.js +0 -2
  457. package/dist/core/web/public/next/assets/RailStatus-BWs6xevj.js.map +0 -1
  458. package/dist/core/web/public/next/assets/SeatSelector-DaUO-zoK.js +0 -3
  459. package/dist/core/web/public/next/assets/SessionSearch-B5aQ0BCM.js +0 -2
  460. package/dist/core/web/public/next/assets/SettingsSection-CuESA30a.js +0 -2
  461. package/dist/core/web/public/next/assets/SettingsSection-CuESA30a.js.map +0 -1
  462. package/dist/core/web/public/next/assets/Sidebar-DfD8MNZt.css +0 -1
  463. package/dist/core/web/public/next/assets/Sidebar-q11dtYZf.js +0 -3
  464. package/dist/core/web/public/next/assets/Sidebar-q11dtYZf.js.map +0 -1
  465. package/dist/core/web/public/next/assets/StepBand-B1W7rU70.js +0 -2
  466. package/dist/core/web/public/next/assets/StepBand-B1W7rU70.js.map +0 -1
  467. package/dist/core/web/public/next/assets/Swimlane-BR40WVcj.js +0 -2
  468. package/dist/core/web/public/next/assets/Swimlane-BR40WVcj.js.map +0 -1
  469. package/dist/core/web/public/next/assets/TerminalPane-CPKUTD9K.js +0 -7
  470. package/dist/core/web/public/next/assets/TerminalPane-CPKUTD9K.js.map +0 -1
  471. package/dist/core/web/public/next/assets/TerminalPane-CmE2QL-Q.css +0 -1
  472. package/dist/core/web/public/next/assets/UniverseConsoleApp-DKqAf-eD.js +0 -2
  473. package/dist/core/web/public/next/assets/UsageSection-B6fR3cru.js +0 -2
  474. package/dist/core/web/public/next/assets/UsageSection-B6fR3cru.js.map +0 -1
  475. package/dist/core/web/public/next/assets/UsageSection-DwgNOYvi.css +0 -1
  476. package/dist/core/web/public/next/assets/VerseConsoleApp-C0V221WL.css +0 -1
  477. package/dist/core/web/public/next/assets/VerseConsoleApp-bjARLPwN.js +0 -3
  478. package/dist/core/web/public/next/assets/VerseConsoleApp-bjARLPwN.js.map +0 -1
  479. package/dist/core/web/public/next/assets/Workspace-DQXMVDf7.css +0 -1
  480. package/dist/core/web/public/next/assets/Workspace-DtJb5tiM.js +0 -10
  481. package/dist/core/web/public/next/assets/Workspace-DtJb5tiM.js.map +0 -1
  482. package/dist/core/web/public/next/assets/actions-Bszsdpms.js +0 -2
  483. package/dist/core/web/public/next/assets/actions-Bszsdpms.js.map +0 -1
  484. package/dist/core/web/public/next/assets/actions-Dug8YIf0.css +0 -1
  485. package/dist/core/web/public/next/assets/capacity-strip-model-BR539Ci8.js +0 -2
  486. package/dist/core/web/public/next/assets/capacity-strip-model-BR539Ci8.js.map +0 -1
  487. package/dist/core/web/public/next/assets/charts-D4NaLaXA.js +0 -2
  488. package/dist/core/web/public/next/assets/charts-D4NaLaXA.js.map +0 -1
  489. package/dist/core/web/public/next/assets/colors-B-vHsX1S.js +0 -2
  490. package/dist/core/web/public/next/assets/colors-B-vHsX1S.js.map +0 -1
  491. package/dist/core/web/public/next/assets/command-catalog-s3W6Z96D.js +0 -2
  492. package/dist/core/web/public/next/assets/command-catalog-s3W6Z96D.js.map +0 -1
  493. package/dist/core/web/public/next/assets/context-model-Bto3LZn2.js +0 -2
  494. package/dist/core/web/public/next/assets/context-model-Bto3LZn2.js.map +0 -1
  495. package/dist/core/web/public/next/assets/context-queries-DVdSLrYy.js +0 -2
  496. package/dist/core/web/public/next/assets/context-queries-DVdSLrYy.js.map +0 -1
  497. package/dist/core/web/public/next/assets/context.module-B_k02HNU.js +0 -2
  498. package/dist/core/web/public/next/assets/context.module-B_k02HNU.js.map +0 -1
  499. package/dist/core/web/public/next/assets/dock-icons-oG8d7mNZ.js +0 -2
  500. package/dist/core/web/public/next/assets/dock-icons-oG8d7mNZ.js.map +0 -1
  501. package/dist/core/web/public/next/assets/dock-panes-BNTLvX7G.js +0 -2
  502. package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js +0 -2
  503. package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js.map +0 -1
  504. package/dist/core/web/public/next/assets/format-BNYWGJat.js +0 -2
  505. package/dist/core/web/public/next/assets/format-BNYWGJat.js.map +0 -1
  506. package/dist/core/web/public/next/assets/global-DVgMguLr.js +0 -2
  507. package/dist/core/web/public/next/assets/global-DVgMguLr.js.map +0 -1
  508. package/dist/core/web/public/next/assets/live-model-Dm6ITHvX.js +0 -2
  509. package/dist/core/web/public/next/assets/live-model-Dm6ITHvX.js.map +0 -1
  510. package/dist/core/web/public/next/assets/mind-B-lYfSUJ.css +0 -1
  511. package/dist/core/web/public/next/assets/mind.module-BzhAlg3e.js +0 -2
  512. package/dist/core/web/public/next/assets/mind.module-BzhAlg3e.js.map +0 -1
  513. package/dist/core/web/public/next/assets/mutations-C6E10SPX.js +0 -2
  514. package/dist/core/web/public/next/assets/primitives-DQvYikjm.js +0 -1
  515. package/dist/core/web/public/next/assets/seat-subscription-CrWOV4Qc.js +0 -2
  516. package/dist/core/web/public/next/assets/seat-subscription-CrWOV4Qc.js.map +0 -1
  517. package/dist/core/web/public/next/assets/slots-W8gkmdfE.js +0 -3
  518. package/dist/core/web/public/next/assets/surface-data-ZtCegYMQ.js +0 -2
  519. package/dist/core/web/public/next/assets/surface-data-ZtCegYMQ.js.map +0 -1
  520. package/dist/core/web/public/next/assets/tasks-model-CnYQzgxk.js +0 -2
  521. package/dist/core/web/public/next/assets/types-Dypu22dp.js +0 -3
  522. package/dist/core/web/public/next/assets/types-Dypu22dp.js.map +0 -1
  523. package/dist/core/web/public/next/assets/use-guarded-action-CO_aAsed.js +0 -2
  524. package/dist/core/web/public/next/assets/use-guarded-action-CO_aAsed.js.map +0 -1
  525. package/dist/core/web/public/next/assets/use-token-gate-DYA2-ALC.js +0 -2
  526. package/dist/core/web/public/next/assets/use-token-gate-DYA2-ALC.js.map +0 -1
  527. package/dist/core/web/public/next/assets/useChartWidth-B8E5mJgM.css +0 -1
  528. package/dist/core/web/public/next/assets/useChartWidth-MEXvDxDL.js +0 -2
  529. package/dist/core/web/public/next/assets/useChartWidth-MEXvDxDL.js.map +0 -1
  530. package/dist/core/web/public/next/assets/verse-model-E98kXngO.js +0 -2
  531. package/dist/core/web/public/next/assets/verse-model-E98kXngO.js.map +0 -1
  532. package/dist/core/web/public/next/assets/verse-store-BgKx_YGs.js +0 -2
  533. package/dist/core/web/public/next/assets/verse-store-BgKx_YGs.js.map +0 -1
  534. package/dist/core/web/public/next/assets/verse-ui-store-KTTKfv-T.js +0 -3
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,s as n}from"./index-afDA8cwW.js";import{h as r,m as i}from"./global-DVgMguLr.js";import{p as a}from"./queries-BuYIEHst.js";import{t as o}from"./RefreshIndicator-CnhEovMZ.js";import{D as s,j as c}from"./useChartWidth-MEXvDxDL.js";import{_ as l,c as u}from"./colors-B-vHsX1S.js";import{t as d}from"./AreaTrend-gUVXkfhf.js";import{n as f,t as p}from"./Funnel-qX3Hlbce.js";import{n as m,r as h,t as g}from"./StepBand-B1W7rU70.js";import{r as _}from"./section-visibility-CSrsTcwK.js";import{t as v}from"./use-ticker-hryPXnyp.js";import{o as y,r as b}from"./surface-data-ZtCegYMQ.js";import{a as x,r as S}from"./Surface-CiYOdNKQ.js";var C=n(e(),1),w={"oversized-file":`some records are over the size bound`,"invalid-file":`some records are malformed`,"unsafe-file":`some records were refused (symlink, shared or foreign-owned)`,"unsafe-directory":`the store directory is not private`,"io-error":`some records could not be read`,"file-limit":`the store has more records than one read covers`,"invalid-row":`some ledger rows are malformed`,"oversized-row":`some ledger rows are over the size bound`,"duplicate-canonical-realized-merge-identity":`two proposals claim the same merge, so merges are unknown`,"claim-integrity-verdicts-not-persisted":`claim-check verdicts are not recorded per proposal yet`,"scorecard-trend-pending":`the scorecard trend is still being collected`,"scorecard-worker-unavailable":`the scorecard trend could not be read this time`};function T(e){return w[e]??e.replace(/-/g,` `)}function E(e,t){if(t.complete||t.state===`not-recorded`||t.reasons.length===0)return;let n=t.recordsSkipped>0?` (${t.recordsSkipped} skipped)`:``;return`${e} are lower bounds: ${t.reasons.map(T).join(`; `)}${n}.`}function D(e,t){return t.state===`not-recorded`?{kind:`unknown`,reason:`${T(t.reasons[0]??`not recorded`)}.`}:t.state===`degraded`&&t.recordsRead===0?{kind:`unknown`,reason:`${T(t.reasons[0]??`io-error`)}.`}:e.darkSince?{kind:`dark`,since:e.darkSince}:{kind:`ready`}}function O(e){let t=e.funnel,n=E(`Pipeline counts`,e.sources.proposals)??E(`Pipeline counts`,e.sources.decisions);return{stages:[{id:`filed`,label:`Filed`,value:t.filed},{id:`verified`,label:`Verified`,value:t.verified},{id:`passed`,label:`Verification passed`,value:t.verificationPassed},{id:`ship`,label:`Judged ship`,value:t.judgedShip},{id:`merged`,label:`Merged`,value:t.merged}],status:D(e,e.sources.proposals),...n?{caveat:n}:{}}}function k(e,t){return e.days.map(e=>({day:e.day,value:t(e)}))}var A=Object.freeze({minPairs:8,ciLevel:.95,minLiftCiLow:0,maxCostIncreasePct:20,canaryHours:48,rollbackStandardErrors:1,minHeldOutTasks:12});function j(e){let t=[];for(let n=e.length;n-7>=0;n-=7){let r=e.slice(n-7,n),i=e=>{let t=0;for(let n of r){let r=e(n);if(r===null||!Number.isFinite(r))return null;t+=r}return t},a=r[r.length-1].day;t.unshift({end:Date.parse(`${a}T00:00:00Z`),endDay:a,merges:i(e=>e.merges.realized),costUsd:i(e=>e.estCostUsd)})}return t}function M(e){return e.merges===null||e.costUsd===null||e.merges===0?null:e.costUsd/e.merges}var N=[{id:`merged`,label:`Merged`,color:l(`success`)},{id:`ship`,label:`Judged ship, not merged`,color:l(`info`)},{id:`rejected`,label:`Judged not worth shipping`,color:l(`warning`)},{id:`unjudged`,label:`Not judged`,color:l(`neutral`)}];function P(e){let t=e.model.includes(`/`)?e.model.split(`/`).pop():e.model;return t.length>18?`${t.slice(0,17)}…`:t}function F(e,t=6){let n=[...e].filter(e=>e.dispatches>0).sort((e,t)=>t.dispatches-e.dispatches).slice(0,t);return{categories:n.map(P),values:n.map(e=>{let t=Math.max(0,e.merged);return[t,Math.max(0,e.shipVerdicts-t),Math.max(0,e.judged-e.shipVerdicts),Math.max(0,e.dispatches-e.judged)]}),costPerMerged:n.map(e=>e.costPerMergedUsd),models:n}}function I(e){if(!e||e.versions.length===0)return{steps:[],markers:[]};let t=new Map(e.versions.map(e=>[e.id,e])),n=new Map(e.experiments.map(e=>[e.id,e])),r=new Map,i=[],a=[...e.versions].sort((e,t)=>e.seq-t.seq)[0];r.set(a.id,0);let o=Date.parse(a.createdAt);Number.isFinite(o)&&i.push({at:o,step:{id:`${a.id}@base`,at:o,value:0,low:0,high:0,label:a.status===`baseline`?`Compiled defaults`:a.id,detail:`baseline`}});let s=e.versions.filter(e=>e.adoptedAt&&e.id!==a.id).sort((e,t)=>Date.parse(e.adoptedAt)-Date.parse(t.adoptedAt));for(let e of s){let o=e.experimentId?n.get(e.experimentId):void 0,s=o?.baseVersionId??e.parentId??a.id,c=r.get(s)??(t.has(s)?null:0),l=o?.lift??null,u=l&&c!=null?c+l.mean:null;r.set(e.id,u);let d=Date.parse(e.adoptedAt);if(!Number.isFinite(d))continue;let f=e.status===`canary`?`canary`:e.status===`rolled-back`?`adopted, later rolled back`:`adopted`;if(i.push({at:d,step:{id:`${e.id}@adopt`,at:d,value:u,low:u!==null&&l?c+l.ciLow:null,high:u!==null&&l?c+l.ciHigh:null,label:e.id,detail:f}}),e.rolledBackAt){let n=Date.parse(e.rolledBackAt);if(Number.isFinite(n)){let a=r.get(s)??null,o=t.get(s);i.push({at:n,marker:{id:`${e.id}@rb`,at:n,kind:`rollback`,label:`${e.id}: ${e.rollbackReason??`rolled back`}`}}),i.push({at:n+1,step:{id:`${e.id}@rb-step`,at:n+1,value:a,low:null,high:null,label:o?.id??s,detail:`restored after ${e.id} rolled back`}})}}}return i.sort((e,t)=>e.at-t.at),{steps:i.flatMap(e=>e.step?[e.step]:[]),markers:i.flatMap(e=>e.marker?[e.marker]:[])}}var L={adopt:`passed the gate`,reject:`rejected`,inconclusive:`inconclusive`};function R(e){return e?e.experiments.map(e=>({id:e.id,label:`${e.candidateVersionId} vs ${e.baseVersionId}`,estimate:e.lift?.mean??null,low:e.lift?.ciLow??null,high:e.lift?.ciHigh??null,n:e.pairs,detail:e.status===`running`||e.status===`queued`?`${e.status} · ${e.pairs}/${A.minPairs} pairs`:e.verdict?L[e.verdict]??e.verdict:e.status})):[]}var z=t(),B=3e5,V=a(`30d`);function H(e,t){return{kind:`unknown`,reason:e??t}}function U(){let e=i(b,{freshMs:6e4}),t=i(y,{freshMs:6e4}),n=i(V,{freshMs:6e4}),a=r(b),l=r(y),w=r(V);_(()=>{a(),l(),w()},B);let T=v(6e4),P=e.data?.value??null,L=t.data?.value??null,U=(0,C.useMemo)(()=>P?j(P.days):[],[P]),W=e.data?P?D(P,P.sources.runs):H(e.data.reason,`fleet history did not answer.`):{kind:`loading`},G=W.kind===`ready`?U.length===0?{kind:`empty`,message:`Not a full week of history yet.`}:{kind:`ready`}:W,K=P?E(`Merge counts`,P.sources.decisions):void 0,q=P?O(P):null,J=(0,C.useMemo)(()=>F(n.data?.models??[]),[n.data]),Y=n.status===`loading`?{kind:`loading`}:n.status===`error`||!n.data?{kind:`unknown`,reason:`per-model economics could not be read.`}:J.categories.length===0?{kind:`empty`,message:`No model dispatched fleet work in the last 30 days.`}:{kind:`ready`},X=(0,C.useMemo)(()=>I(L),[L]),Z=(0,C.useMemo)(()=>R(L),[L]),Q=(e,n)=>t.data?L?n?{kind:`ready`}:{kind:`empty`,message:e}:H(t.data.reason,`self-improvement did not answer.`):{kind:`loading`},$=e=>`wk to ${s(new Date(e).toISOString().slice(0,10))}`;return(0,z.jsxs)(x,{title:`Growth`,actions:[e,t].some(e=>e.status===`refreshing`)?(0,z.jsx)(o,{}):null,children:[(0,z.jsx)(S,{span:8,children:(0,z.jsx)(d,{title:`Merges per week`,description:`Rolling 7-day windows ending today`,caveat:K,status:G,series:[{id:`merges`,label:`Merges`,color:u,points:U.map(e=>({x:e.end,y:e.merges}))}],formatX:$})}),(0,z.jsx)(S,{span:4,children:(0,z.jsx)(d,{title:`Cost per merge`,description:`Estimated run spend ÷ merges, per week`,status:G,series:[{id:`cpm`,label:`Cost per merge`,color:u,points:U.map(e=>({x:e.end,y:M(e)}))}],formatX:$,formatY:c,height:200})}),(0,z.jsx)(S,{span:4,children:(0,z.jsx)(p,{title:`Pipeline · 90d`,description:`Filed → verified → passed → judged ship → merged`,caveat:q?.caveat,status:q?q.status:W,stages:q?.stages??[]})}),(0,z.jsx)(S,{span:4,children:(0,z.jsx)(f,{title:`Model outcomes · 30d`,description:`What each model's dispatches became`,status:Y,categories:J.categories,segments:N,values:J.values,height:200})}),(0,z.jsx)(S,{span:4,children:(0,z.jsx)(h,{title:`Merges by day`,description:`Last 90 days`,status:W,days:P?k(P,e=>e.merges.realized):[],unit:`merges`})}),(0,z.jsx)(S,{span:8,children:(0,z.jsx)(g,{title:`Harness level`,description:`Pass-rate lift over the compiled defaults · band = each step's own 95% interval · canary ${A.canaryHours} h`,status:Q(`No harness adopted yet — the compiled defaults are in force.`,X.steps.length>0),steps:X.steps,markers:X.markers,now:T,baseline:{value:0,label:`Compiled defaults`},unit:`pts`})}),(0,z.jsx)(S,{span:4,children:(0,z.jsx)(m,{title:`Experiments`,description:`Paired lift, 95% interval · adopt needs CI low > ${A.minLiftCiLow} and ≥ ${A.minPairs} pairs`,status:Q(`No experiments have run yet.`,Z.length>0),rows:Z,unit:`pts`,unknownText:`under ${A.minPairs} pairs`})})]})}export{B as GROWTH_POLL_MS,U as GrowthSection};
2
- //# sourceMappingURL=GrowthSection-CYxJ9MH5.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GrowthSection-CYxJ9MH5.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/fleet-history-view.ts","../../../../../../src/core/learn/harness-types.ts","../../../../../../src/web-ui/routes/verse/growth/growth-model.ts","../../../../../../src/web-ui/routes/verse/sections/GrowthSection.tsx"],"sourcesContent":["/**\n * components/charts/fleet-history-view.ts — maps the `GET /api/verse/fleet/history`\n * payload (core/verse/fleet-history-types.ts) onto the chart kit's props, so\n * every surface that charts fleet history (Command, Fleet, Growth) makes the\n * same honesty decisions:\n *\n * - the fleet is DARK → every chart shows \"Fleet dark since <date>\", not\n * empty axes;\n * - a source could not be read at all → \"unknown\", not zeros;\n * - a source was only partly read → a caveat naming why (lower bounds);\n * - claim-check → always the not-recorded state, never a fabricated series.\n *\n * Pure functions over the wire type; no fetching here.\n */\nimport type {\n FleetHistoryDay,\n FleetHistoryResponse,\n FleetHistorySource,\n} from '../../../core/verse/fleet-history-types.js';\nimport type { ChartStatus } from './ChartFrame.js';\nimport type { BarStackProps } from './BarStack.js';\nimport type { FunnelStage } from './Funnel.js';\nimport type { SwimlaneLane } from './Swimlane.js';\nimport type { CalendarDatum } from './CalendarHeatmap.js';\nimport type { AreaTrendSeries } from './AreaTrend.js';\nimport { toneColor } from './colors.js';\nimport { formatDayLabel } from './format.js';\n\nconst REASON_TEXT: Record<string, string> = {\n 'oversized-file': 'some records are over the size bound',\n 'invalid-file': 'some records are malformed',\n 'unsafe-file': 'some records were refused (symlink, shared or foreign-owned)',\n 'unsafe-directory': 'the store directory is not private',\n 'io-error': 'some records could not be read',\n 'file-limit': 'the store has more records than one read covers',\n 'invalid-row': 'some ledger rows are malformed',\n 'oversized-row': 'some ledger rows are over the size bound',\n 'duplicate-canonical-realized-merge-identity': 'two proposals claim the same merge, so merges are unknown',\n 'claim-integrity-verdicts-not-persisted': 'claim-check verdicts are not recorded per proposal yet',\n 'scorecard-trend-pending': 'the scorecard trend is still being collected',\n 'scorecard-worker-unavailable': 'the scorecard trend could not be read this time',\n};\n\nfunction reasonText(reason: string): string {\n return REASON_TEXT[reason] ?? reason.replace(/-/g, ' ');\n}\n\n/** A caveat sentence for a partly-read source, or undefined when it is complete. */\nexport function sourceCaveat(label: string, source: FleetHistorySource): string | undefined {\n if (source.complete || source.state === 'not-recorded') return undefined;\n if (source.reasons.length === 0) return undefined;\n const skipped = source.recordsSkipped > 0 ? ` (${source.recordsSkipped} skipped)` : '';\n return `${label} are lower bounds: ${source.reasons.map(reasonText).join('; ')}${skipped}.`;\n}\n\n/**\n * The shared status for a chart over one source. Order matters: unreadable\n * beats dark (we cannot claim darkness from a store we cannot read), and dark\n * beats an all-zero window (the designed \"since\" message is more useful).\n */\nexport function historyStatus(history: FleetHistoryResponse, source: FleetHistorySource): ChartStatus {\n if (source.state === 'not-recorded') return { kind: 'unknown', reason: `${reasonText(source.reasons[0] ?? 'not recorded')}.` };\n if (source.state === 'degraded' && source.recordsRead === 0) {\n return { kind: 'unknown', reason: `${reasonText(source.reasons[0] ?? 'io-error')}.` };\n }\n if (history.darkSince) return { kind: 'dark', since: history.darkSince };\n return { kind: 'ready' };\n}\n\n/** \"Sep 3\" for a day row (the wire's days are already in the caller's zone). */\nexport function dayLabel(day: FleetHistoryDay): string {\n return formatDayLabel(day.day);\n}\n\n/** Runs per day as done / failed / aborted / unfinished — status tones, legend-labelled. */\nexport function runsByDay(history: FleetHistoryResponse): Pick<BarStackProps, 'categories' | 'segments' | 'values' | 'status' | 'caveat'> {\n return {\n categories: history.days.map(dayLabel),\n segments: [\n { id: 'done', label: 'Done', color: toneColor('success') },\n { id: 'failed', label: 'Failed', color: toneColor('danger') },\n { id: 'aborted', label: 'Aborted', color: toneColor('neutral') },\n { id: 'unfinished', label: 'Unfinished', color: toneColor('running') },\n ],\n values: history.days.map((d) => [d.runs.done, d.runs.failed, d.runs.aborted, d.runs.unfinished]),\n status: historyStatus(history, history.sources.runs),\n caveat: sourceCaveat('Run counts', history.sources.runs),\n };\n}\n\n/** Judge verdicts per day (the considered ones, plus failed judge calls). */\nexport function verdictsByDay(history: FleetHistoryResponse): Pick<BarStackProps, 'categories' | 'segments' | 'values' | 'status' | 'caveat'> {\n return {\n categories: history.days.map(dayLabel),\n segments: [\n { id: 'ship', label: 'Ship', color: toneColor('success') },\n { id: 'review', label: 'Review', color: toneColor('warning') },\n { id: 'noise', label: 'Noise', color: toneColor('neutral') },\n { id: 'harmful', label: 'Harmful', color: toneColor('danger') },\n { id: 'failed', label: 'Judge failed', color: toneColor('unknown') },\n ],\n values: history.days.map((d) => [d.judged.ship, d.judged.review, d.judged.noise, d.judged.harmful, d.judged.failed]),\n status: historyStatus(history, history.sources.decisions),\n caveat: sourceCaveat('Verdict counts', history.sources.decisions),\n };\n}\n\n/** Proposal pipeline for the window (cumulative stages — see FleetHistoryFunnel). */\nexport function pipelineFunnel(history: FleetHistoryResponse): { stages: FunnelStage[]; status: ChartStatus; caveat?: string } {\n const f = history.funnel;\n const caveat = sourceCaveat('Pipeline counts', history.sources.proposals) ?? sourceCaveat('Pipeline counts', history.sources.decisions);\n return {\n stages: [\n { id: 'filed', label: 'Filed', value: f.filed },\n { id: 'verified', label: 'Verified', value: f.verified },\n { id: 'passed', label: 'Verification passed', value: f.verificationPassed },\n { id: 'ship', label: 'Judged ship', value: f.judgedShip },\n { id: 'merged', label: 'Merged', value: f.merged },\n ],\n status: historyStatus(history, history.sources.proposals),\n ...(caveat ? { caveat } : {}),\n };\n}\n\n/** Swimlane lanes straight from the projection (runs → bars, engine as detail). */\nexport function runLanes(history: FleetHistoryResponse): { lanes: SwimlaneLane[]; from: number; to: number; status: ChartStatus; caveat?: string } {\n const truncated = history.swimlanesTruncated ? 'Showing the newest runs only; the full list is longer.' : undefined;\n const caveat = [sourceCaveat('Runs', history.sources.runs), truncated].filter(Boolean).join(' ') || undefined;\n return {\n lanes: history.swimlanes.map((lane) => ({\n id: lane.id,\n label: lane.label,\n items: lane.items.map((item) => ({\n id: item.id,\n start: item.startMs,\n end: item.endMs,\n status: item.status,\n detail: item.engine,\n stale: item.stale,\n })),\n })),\n from: Date.parse(history.window.from),\n to: Date.parse(history.window.to),\n status: historyStatus(history, history.sources.runs),\n ...(caveat ? { caveat } : {}),\n };\n}\n\n/** One number per day for the calendar heatmap. */\nexport function dailyValues(history: FleetHistoryResponse, pick: (day: FleetHistoryDay) => number | null): CalendarDatum[] {\n return history.days.map((d) => ({ day: d.day, value: pick(d) }));\n}\n\n/** Scorecard trend (daily snapshots of the trailing window) as AreaTrend series. */\nexport function scorecardSeries(history: FleetHistoryResponse, window: '7d' | '30d' = '7d'): { series: AreaTrendSeries[]; status: ChartStatus; caveat?: string } {\n const points = window === '7d' ? history.scorecard.trend7d : history.scorecard.trend30d;\n const source = history.scorecard.source;\n const status: ChartStatus = points.length === 0\n ? source.state === 'degraded'\n ? { kind: 'unknown', reason: `${reasonText(source.reasons[0] ?? 'io-error')}.` }\n : { kind: 'empty', message: 'No scorecard snapshots yet — the first is taken today, then one a day.' }\n : { kind: 'ready' };\n const caveat = points.length > 0 ? sourceCaveat('Scorecard points', source) : undefined;\n return {\n series: [\n { id: 'merges', label: 'Merges', points: points.map((p) => ({ x: Date.parse(p.ts), y: p.merges.realized })) },\n { id: 'filed', label: 'Proposals filed', points: points.map((p) => ({ x: Date.parse(p.ts), y: p.proposalsFiled })) },\n ],\n status,\n ...(caveat ? { caveat } : {}),\n };\n}\n","/**\n * Harness registry + experiments — V3.10 Track B contract (unit B-U1, frozen day 0).\n *\n * A HARNESS is the config-only envelope around the fleet's models: prompt\n * overlays, effort, sampling, routing weights and enabled skills. The\n * self-improvement loop (unit U9) versions harnesses, A/B-tests a candidate\n * against the active version on free local slots (paired runs, 95% CI,\n * ≥ 8 pairs, held-out tasks), and adopts a winner only through the Leader's\n * class-B action, behind a 48 h canary with automatic rollback.\n *\n * WHY config-only: a harness can never carry code, so adopting one can never\n * change authority (SPEC-310B I2). Code self-improvement arrives as ordinary\n * fleet PRs that pass every merge gate and only run after Mason deploys them.\n *\n * Honesty rule: `null` = unknown / not measured, never zero.\n *\n * BROWSER-SAFE: the Growth surface imports this — type-only imports, plain consts.\n */\nimport type { RoutingDifficulty } from '../routing/types.js';\nimport type { FleetEngine } from '../fleet/fleet-types.js';\n\nexport const VERSE_LEARNING_PATH = '/api/verse/learning';\n\n// ---------------------------------------------------------------------------\n// Harness config (what a version pins)\n// ---------------------------------------------------------------------------\n\nexport type HarnessEffort = 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n\n/** Roles a prompt overlay can target. */\nexport type HarnessRole = 'producer' | 'judge' | 'leader' | 'planner';\n\nexport interface HarnessSampling {\n /** null = the engine's own default. */\n temperature: number | null;\n topP: number | null;\n maxOutputTokens: number | null;\n}\n\n/**\n * The dispatch router's tunables. Precedence at dispatch (U5): a Leader\n * `router.tune` override (LeaderDirectivesV1) › the active harness › the\n * router's compiled defaults. All λ are ≥ 0.\n */\nexport interface HarnessRoutingWeights {\n lambdaCost: number;\n lambdaPressure: number;\n lambdaLatency: number;\n /** Best-of-N runs at and above this difficulty. */\n bonThreshold: RoutingDifficulty;\n}\n\nexport interface HarnessConfigV1 {\n v: 1;\n /** Text appended to a role's system prompt; absent role = no overlay. Scrubbed, ≤ 4 KB each. */\n prompts: Partial<Record<HarnessRole, string>>;\n /** Effort per fleet engine; absent = engine default. */\n effort: Partial<Record<FleetEngine, HarnessEffort>>;\n /** Sampling per fleet engine; absent = engine default. */\n sampling: Partial<Record<FleetEngine, HarnessSampling>>;\n routing: HarnessRoutingWeights;\n /** Enabled skill ids, sorted. */\n skills: string[];\n}\n\n/** A config change. Top-level fields present here REPLACE the base's field wholesale (no deep merge). */\nexport type HarnessConfigPatch = Partial<Omit<HarnessConfigV1, 'v'>>;\n\n// ---------------------------------------------------------------------------\n// Versions\n// ---------------------------------------------------------------------------\n\n/**\n * - `baseline` — version 0: the compiled defaults.\n * - `candidate` — under experiment.\n * - `canary` — adopted, inside its 48 h canary.\n * - `adopted` — canary passed; the active version.\n * - `rolled-back` — canary fell below baseline − 1 SE (or vetoed).\n * - `rejected` — failed the adoption gate.\n */\nexport type HarnessVersionStatus = 'baseline' | 'candidate' | 'canary' | 'adopted' | 'rolled-back' | 'rejected';\n\nexport interface HarnessVersion {\n v: 1;\n /** Stable id, e.g. `h-0007`. */\n id: string;\n /** Monotonic; baseline = 0. */\n seq: number;\n parentId: string | null;\n createdAt: string;\n status: HarnessVersionStatus;\n config: HarnessConfigV1;\n /** sha256 hex of the canonical config — what experiments and ledger rows bind to. */\n configDigest: string;\n source: { kind: 'baseline' | 'hypothesis' | 'manual'; hypothesisId: string | null };\n /** The experiment whose verdict justified adoption; null for baseline / manual. */\n experimentId: string | null;\n adoptedAt: string | null;\n /** End of the 48 h canary; null when not in canary. */\n canaryUntil: string | null;\n rolledBackAt: string | null;\n rollbackReason: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Hypotheses and experiments\n// ---------------------------------------------------------------------------\n\nexport type HarnessTarget = 'prompt' | 'effort' | 'sampling' | 'routing' | 'skill';\n\n/** A typed, testable claim about a config change (the Leader emits ≤ 3 per memo; A7 insights may too). */\nexport interface HarnessHypothesis {\n v: 1;\n id: string;\n source: { kind: 'leader' | 'insight' | 'manual'; ref: string | null };\n target: HarnessTarget;\n /** Config only — never code. */\n patch: HarnessConfigPatch;\n /** The claim in one sentence. Untrusted model text: scrubbed, rendered as text. */\n statement: string;\n /** Metric it should move, e.g. `local-eval.pass-rate`. */\n metric: string;\n /** Predicted change, in the metric's units. */\n predictedDelta: number;\n createdAt: string;\n}\n\nexport type ExperimentVerdict = 'adopt' | 'reject' | 'inconclusive';\n\nexport type ExperimentStatus = 'queued' | 'running' | 'done' | 'cancelled' | 'failed';\n\nexport interface ExperimentLift {\n /** Paired pass-rate lift of candidate over base, in percentage points. */\n mean: number;\n ciLow: number;\n ciHigh: number;\n level: 0.95;\n}\n\nexport interface ExperimentResultV1 {\n v: 1;\n id: string;\n hypothesisId: string | null;\n baseVersionId: string;\n candidateVersionId: string;\n /** The held-out task set the pairs were drawn from. */\n taskSet: { id: string; digest: string };\n status: ExperimentStatus;\n /** Complete pairs so far. */\n pairs: number;\n wins: number;\n losses: number;\n ties: number;\n /** null until pairs ≥ HARNESS_ADOPTION_GATE.minPairs. */\n lift: ExperimentLift | null;\n /** Any `refuse`-class task regressed (blocks adoption). null = not measured yet. */\n refuseRegression: boolean | null;\n /** candidate − base count of `claimed-change-none-made` failures; must be ≤ 0 to adopt. */\n claimedChangeNoneMadeDelta: number | null;\n /** Wall-time / cost change in percent; must be ≤ +20 to adopt. */\n costDeltaPct: number | null;\n /** null while running. */\n verdict: ExperimentVerdict | null;\n /** Specific sentences behind the verdict. */\n reasons: string[];\n startedAt: string | null;\n finishedAt: string | null;\n}\n\n/**\n * The adoption gate (SPEC-310B §5) — frozen numbers. Adoption is a Leader\n * class-B action and requires ALL of: pairs ≥ minPairs, lift.ciLow >\n * minLiftCiLow, no refuse regression, claimedChangeNoneMadeDelta ≤ 0, and\n * costDeltaPct ≤ maxCostIncreasePct.\n */\nexport const HARNESS_ADOPTION_GATE = Object.freeze({\n minPairs: 8,\n ciLevel: 0.95,\n minLiftCiLow: 0,\n maxCostIncreasePct: 20,\n canaryHours: 48,\n /** Roll back when the canary pass rate falls below baseline − this many standard errors. */\n rollbackStandardErrors: 1,\n /** local-eval/tasks-heldout.ts must hold at least this many tasks (20 of 22 current tasks are saturated). */\n minHeldOutTasks: 12,\n} as const);\n\n/** Ledger payload for harness:adopted / harness:rolled-back / harness:rejected. */\nexport interface HarnessTransition {\n versionId: string;\n /** The version active before; null when none. */\n fromVersionId: string | null;\n configDigest: string;\n experimentId: string | null;\n reason: string;\n}\n\n// ---------------------------------------------------------------------------\n// Cross-unit request / result shapes (learn/{experiments,harness-registry}.ts)\n// ---------------------------------------------------------------------------\n\nexport type HarnessActor = 'mason' | 'leader' | 'daemon';\n\nexport interface StartExperimentRequest {\n hypothesis: HarnessHypothesis;\n requestedBy: HarnessActor;\n}\n\nexport type StartExperimentResult = { ok: true; experimentId: string } | { ok: false; reason: string };\n\nexport interface CancelExperimentRequest {\n experimentId: string;\n reason: string;\n actor: HarnessActor;\n}\n\n/** A finished experiment cannot be cancelled (ok: false). */\nexport type CancelExperimentResult = { ok: true } | { ok: false; reason: string };\n\nexport interface AdoptHarnessRequest {\n versionId: string;\n /** The experiment whose verdict passed the gate. */\n experimentId: string;\n actor: HarnessActor;\n}\n\nexport interface RollbackHarnessRequest {\n /** The version to make active again; null = back to the baseline defaults. */\n toVersionId: string | null;\n reason: string;\n actor: HarnessActor;\n}\n\n/** `before` is the version active before the call, so a veto can restore it exactly. */\nexport type HarnessChangeResult =\n | { ok: true; before: HarnessVersion | null; after: HarnessVersion | null }\n | { ok: false; reason: string };\n\n// ---------------------------------------------------------------------------\n// Learning API (U9) — GET /api/verse/learning\n// ---------------------------------------------------------------------------\n\nexport interface HarnessCanaryState {\n versionId: string;\n startedAt: string;\n until: string;\n baselinePassRate: number | null;\n baselineStandardError: number | null;\n currentPassRate: number | null;\n runs: number;\n}\n\nexport interface LearningStateV1 {\n v: 1;\n generatedAt: string;\n /** null = nothing adopted; the baseline defaults are in force. */\n active: HarnessVersion | null;\n canary: HarnessCanaryState | null;\n /** Oldest → newest (Growth step chart with CI band and rollback markers). */\n versions: HarnessVersion[];\n /** Newest first (ForestPlot). */\n experiments: ExperimentResultV1[];\n /** Open hypotheses not yet tested. */\n hypotheses: HarnessHypothesis[];\n}\n","/**\n * routes/verse/growth/growth-model.ts — \"is the output compounding?\" as pure\n * data (unit C7; SPEC-310B §6 Growth, SPEC-310C §5).\n *\n * weeklyBins rolling 7-day windows ENDING TODAY, so every point is a\n * complete week (a calendar week-to-date would dip every\n * Monday and read as a regression);\n * costPerMerge spend ÷ merges per window — undefined (null) for a week\n * with no merges, never $0 or ∞;\n * modelOutcomes what each model's dispatches became (ROI composition);\n * harnessSteps the active harness's level over time: each adoption\n * steps up by its experiment's lift, a rollback steps back\n * down with a ▼ marker;\n * forestRows one row per experiment, newest first.\n *\n * Framework-free; tested directly.\n */\nimport type { FleetHistoryDay } from '../../../../core/verse/fleet-history-types.js';\nimport type { ExperimentResultV1, LearningStateV1 } from '../../../../core/learn/harness-types.js';\nimport { HARNESS_ADOPTION_GATE } from '../../../../core/learn/harness-types.js';\nimport type { ModelStats } from '../../../data/api-types.js';\nimport type { BarStackSegment } from '../../../components/charts/BarStack.js';\nimport { toneColor } from '../../../components/charts/colors.js';\nimport type { ForestRow } from '../../../components/charts/ForestPlot.js';\nimport type { StepMarker, StepPoint } from '../../../components/charts/StepBand.js';\n\nexport interface WeekBin {\n /** Epoch ms of the window's last day (UTC midnight). */\n end: number;\n /** YYYY-MM-DD of the last day. */\n endDay: string;\n merges: number | null;\n costUsd: number | null;\n}\n\n/** Complete 7-day windows ending on the last day of `days`, oldest first. */\nexport function weeklyBins(days: readonly FleetHistoryDay[]): WeekBin[] {\n const bins: WeekBin[] = [];\n for (let end = days.length; end - 7 >= 0; end -= 7) {\n const week = days.slice(end - 7, end);\n const sum = (pick: (d: FleetHistoryDay) => number | null): number | null => {\n let total = 0;\n for (const d of week) {\n const v = pick(d);\n if (v === null || !Number.isFinite(v)) return null;\n total += v;\n }\n return total;\n };\n const lastDay = week[week.length - 1]!.day;\n bins.unshift({ end: Date.parse(`${lastDay}T00:00:00Z`), endDay: lastDay, merges: sum((d) => d.merges.realized), costUsd: sum((d) => d.estCostUsd) });\n }\n return bins;\n}\n\n/** Dollars per merge; null when either side is unknown or nothing merged. */\nexport function costPerMerge(bin: WeekBin): number | null {\n if (bin.merges === null || bin.costUsd === null || bin.merges === 0) return null;\n return bin.costUsd / bin.merges;\n}\n\n// ---------------------------------------------------------------------------\n// Model outcomes (ROI)\n// ---------------------------------------------------------------------------\n\nexport const OUTCOME_SEGMENTS: BarStackSegment[] = [\n { id: 'merged', label: 'Merged', color: toneColor('success') },\n { id: 'ship', label: 'Judged ship, not merged', color: toneColor('info') },\n { id: 'rejected', label: 'Judged not worth shipping', color: toneColor('warning') },\n { id: 'unjudged', label: 'Not judged', color: toneColor('neutral') },\n];\n\nexport interface ModelOutcomes {\n categories: string[];\n values: (number | null)[][];\n /** Per category, for the caption / table: dollars per merge. */\n costPerMerged: (number | null)[];\n models: ModelStats[];\n}\n\n/** A short, readable model label (\"qwen3.8:27b\", \"grok-4.7\"). */\nexport function modelLabel(m: Pick<ModelStats, 'engine' | 'model'>): string {\n const model = m.model.includes('/') ? m.model.split('/').pop()! : m.model;\n return model.length > 18 ? `${model.slice(0, 17)}…` : model;\n}\n\n/** Top `limit` models by dispatches, each split into what its dispatches became. */\nexport function modelOutcomes(models: readonly ModelStats[], limit = 6): ModelOutcomes {\n const top = [...models].filter((m) => m.dispatches > 0).sort((a, b) => b.dispatches - a.dispatches).slice(0, limit);\n return {\n categories: top.map(modelLabel),\n values: top.map((m) => {\n const merged = Math.max(0, m.merged);\n const ship = Math.max(0, m.shipVerdicts - merged);\n const rejected = Math.max(0, m.judged - m.shipVerdicts);\n const unjudged = Math.max(0, m.dispatches - m.judged);\n return [merged, ship, rejected, unjudged];\n }),\n costPerMerged: top.map((m) => m.costPerMergedUsd),\n models: top,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Harness steps + experiments\n// ---------------------------------------------------------------------------\n\nexport interface HarnessSeries {\n steps: StepPoint[];\n markers: StepMarker[];\n}\n\n/**\n * The level of the ACTIVE harness over time, in points of paired pass-rate\n * lift over the compiled defaults. Each adoption adds its own experiment's\n * lift to the level of the version it was measured against; its band is that\n * experiment's 95% interval (the step's own uncertainty, not a compounded\n * one — the caption says so). A rollback returns to the parent's level.\n */\nexport function harnessSteps(learning: LearningStateV1 | null): HarnessSeries {\n if (!learning || learning.versions.length === 0) return { steps: [], markers: [] };\n const byId = new Map(learning.versions.map((v) => [v.id, v]));\n const exps = new Map(learning.experiments.map((e) => [e.id, e]));\n const level = new Map<string, number | null>();\n const events: { at: number; step?: StepPoint; marker?: StepMarker }[] = [];\n\n const baseline = [...learning.versions].sort((a, b) => a.seq - b.seq)[0]!;\n level.set(baseline.id, 0);\n const t0 = Date.parse(baseline.createdAt);\n if (Number.isFinite(t0)) events.push({ at: t0, step: { id: `${baseline.id}@base`, at: t0, value: 0, low: 0, high: 0, label: baseline.status === 'baseline' ? 'Compiled defaults' : baseline.id, detail: 'baseline' } });\n\n const adopted = learning.versions\n .filter((v) => v.adoptedAt && v.id !== baseline.id)\n .sort((a, b) => Date.parse(a.adoptedAt!) - Date.parse(b.adoptedAt!));\n for (const v of adopted) {\n const exp: ExperimentResultV1 | undefined = v.experimentId ? exps.get(v.experimentId) : undefined;\n const baseId = exp?.baseVersionId ?? v.parentId ?? baseline.id;\n const baseLevel = level.get(baseId) ?? (byId.has(baseId) ? null : 0);\n const lift = exp?.lift ?? null;\n const value = lift && baseLevel !== null && baseLevel !== undefined ? baseLevel + lift.mean : null;\n level.set(v.id, value);\n const at = Date.parse(v.adoptedAt!);\n if (!Number.isFinite(at)) continue;\n const detail = v.status === 'canary' ? 'canary' : v.status === 'rolled-back' ? 'adopted, later rolled back' : 'adopted';\n events.push({\n at,\n step: {\n id: `${v.id}@adopt`,\n at,\n value,\n low: value !== null && lift ? baseLevel! + lift.ciLow : null,\n high: value !== null && lift ? baseLevel! + lift.ciHigh : null,\n label: v.id,\n detail,\n },\n });\n if (v.rolledBackAt) {\n const back = Date.parse(v.rolledBackAt);\n if (Number.isFinite(back)) {\n const parentLevel = level.get(baseId) ?? null;\n const parent = byId.get(baseId);\n events.push({ at: back, marker: { id: `${v.id}@rb`, at: back, kind: 'rollback', label: `${v.id}: ${v.rollbackReason ?? 'rolled back'}` } });\n events.push({ at: back + 1, step: { id: `${v.id}@rb-step`, at: back + 1, value: parentLevel, low: null, high: null, label: parent?.id ?? baseId, detail: `restored after ${v.id} rolled back` } });\n }\n }\n }\n events.sort((a, b) => a.at - b.at);\n return {\n steps: events.flatMap((e) => (e.step ? [e.step] : [])),\n markers: events.flatMap((e) => (e.marker ? [e.marker] : [])),\n };\n}\n\nconst VERDICT_WORD: Record<string, string> = { adopt: 'passed the gate', reject: 'rejected', inconclusive: 'inconclusive' };\n\nexport function forestRows(learning: LearningStateV1 | null): ForestRow[] {\n if (!learning) return [];\n return learning.experiments.map((e) => ({\n id: e.id,\n label: `${e.candidateVersionId} vs ${e.baseVersionId}`,\n estimate: e.lift?.mean ?? null,\n low: e.lift?.ciLow ?? null,\n high: e.lift?.ciHigh ?? null,\n n: e.pairs,\n detail:\n e.status === 'running' || e.status === 'queued'\n ? `${e.status} · ${e.pairs}/${HARNESS_ADOPTION_GATE.minPairs} pairs`\n : e.verdict\n ? VERDICT_WORD[e.verdict] ?? e.verdict\n : e.status,\n }));\n}\n","/**\n * routes/verse/sections/GrowthSection.tsx — ⌘3 Growth: is the output\n * compounding? (SPEC-310B §6, SPEC-310C §5; unit C7)\n *\n * Merges / week (8) | Cost per merge (4)\n * Pipeline funnel (4) | Model outcomes (4) | Merges by day (4)\n * Harness level with 95% band + ▼ rollbacks (8) | Experiments forest plot (4)\n *\n * Sources: fleet history (A8), per-model economics (/api/models), learning\n * (B-U9). Each can be missing on its own; its cards say so. History and\n * learning change daily, so the surface refreshes every 5 minutes while\n * visible — never faster.\n */\nimport { useMemo } from 'react';\nimport { AreaTrend } from '../../../components/charts/AreaTrend.js';\nimport { BarStack } from '../../../components/charts/BarStack.js';\nimport { CalendarHeatmap } from '../../../components/charts/CalendarHeatmap.js';\nimport type { ChartStatus } from '../../../components/charts/ChartFrame.js';\nimport { CHART_SEQUENTIAL } from '../../../components/charts/colors.js';\nimport { ForestPlot } from '../../../components/charts/ForestPlot.js';\nimport { Funnel } from '../../../components/charts/Funnel.js';\nimport { StepBand } from '../../../components/charts/StepBand.js';\nimport { dailyValues, historyStatus, pipelineFunnel, sourceCaveat } from '../../../components/charts/fleet-history-view.js';\nimport { formatDayLabel, formatUsd } from '../../../components/charts/format.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { modelsQuery } from '../../../data/queries.js';\nimport { useNow } from '../autonomy/use-ticker.js';\nimport { Cell, Surface } from '../command/Surface.js';\nimport { fleetHistoryQuery, learningQuery } from '../command/surface-data.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { OUTCOME_SEGMENTS, costPerMerge, forestRows, harnessSteps, modelOutcomes, weeklyBins } from '../growth/growth-model.js';\nimport { HARNESS_ADOPTION_GATE } from '../../../../core/learn/harness-types.js';\n\nexport const GROWTH_POLL_MS = 300_000;\n\nconst models30 = modelsQuery('30d');\n\nfunction unknownFrom(reason: string | null | undefined, fallback: string): ChartStatus {\n return { kind: 'unknown', reason: reason ?? fallback };\n}\n\nexport function GrowthSection() {\n const history = useQuery(fleetHistoryQuery, { freshMs: 60_000 });\n const learning = useQuery(learningQuery, { freshMs: 60_000 });\n const models = useQuery(models30, { freshMs: 60_000 });\n const refetchHistory = useRefetch(fleetHistoryQuery);\n const refetchLearning = useRefetch(learningQuery);\n const refetchModels = useRefetch(models30);\n usePollWhileVisible(() => {\n refetchHistory();\n refetchLearning();\n refetchModels();\n }, GROWTH_POLL_MS);\n const now = useNow(60_000);\n\n const hist = history.data?.value ?? null;\n const learn = learning.data?.value ?? null;\n\n const bins = useMemo(() => (hist ? weeklyBins(hist.days) : []), [hist]);\n const histStatus: ChartStatus = !history.data ? { kind: 'loading' } : !hist ? unknownFrom(history.data.reason, 'fleet history did not answer.') : historyStatus(hist, hist.sources.runs);\n const weeklyStatus: ChartStatus = histStatus.kind !== 'ready' ? histStatus : bins.length === 0 ? { kind: 'empty', message: 'Not a full week of history yet.' } : { kind: 'ready' };\n const mergesCaveat = hist ? sourceCaveat('Merge counts', hist.sources.decisions) : undefined;\n const funnel = hist ? pipelineFunnel(hist) : null;\n\n const outcomes = useMemo(() => modelOutcomes(models.data?.models ?? []), [models.data]);\n const modelStatus: ChartStatus = models.status === 'loading'\n ? { kind: 'loading' }\n : models.status === 'error' || !models.data\n ? { kind: 'unknown', reason: 'per-model economics could not be read.' }\n : outcomes.categories.length === 0\n ? { kind: 'empty', message: 'No model dispatched fleet work in the last 30 days.' }\n : { kind: 'ready' };\n\n const harness = useMemo(() => harnessSteps(learn), [learn]);\n const forest = useMemo(() => forestRows(learn), [learn]);\n const learnStatus = (emptyMessage: string, hasData: boolean): ChartStatus =>\n !learning.data ? { kind: 'loading' } : !learn ? unknownFrom(learning.data.reason, 'self-improvement did not answer.') : hasData ? { kind: 'ready' } : { kind: 'empty', message: emptyMessage };\n\n const weekLabel = (ms: number) => `wk to ${formatDayLabel(new Date(ms).toISOString().slice(0, 10))}`;\n\n return (\n <Surface title=\"Growth\" actions={[history, learning].some((q) => q.status === 'refreshing') ? <RefreshIndicator /> : null}>\n <Cell span={8}>\n <AreaTrend\n title=\"Merges per week\"\n description=\"Rolling 7-day windows ending today\"\n caveat={mergesCaveat}\n status={weeklyStatus}\n series={[{ id: 'merges', label: 'Merges', color: CHART_SEQUENTIAL, points: bins.map((b) => ({ x: b.end, y: b.merges })) }]}\n formatX={weekLabel}\n />\n </Cell>\n <Cell span={4}>\n <AreaTrend\n title=\"Cost per merge\"\n description=\"Estimated run spend ÷ merges, per week\"\n status={weeklyStatus}\n series={[{ id: 'cpm', label: 'Cost per merge', color: CHART_SEQUENTIAL, points: bins.map((b) => ({ x: b.end, y: costPerMerge(b) })) }]}\n formatX={weekLabel}\n formatY={formatUsd}\n height={200}\n />\n </Cell>\n <Cell span={4}>\n <Funnel\n title=\"Pipeline · 90d\"\n description=\"Filed → verified → passed → judged ship → merged\"\n caveat={funnel?.caveat}\n status={!funnel ? histStatus : funnel.status}\n stages={funnel?.stages ?? []}\n />\n </Cell>\n <Cell span={4}>\n <BarStack\n title=\"Model outcomes · 30d\"\n description=\"What each model's dispatches became\"\n status={modelStatus}\n categories={outcomes.categories}\n segments={OUTCOME_SEGMENTS}\n values={outcomes.values}\n height={200}\n />\n </Cell>\n <Cell span={4}>\n <CalendarHeatmap\n title=\"Merges by day\"\n description=\"Last 90 days\"\n status={histStatus}\n days={hist ? dailyValues(hist, (d) => d.merges.realized) : []}\n unit=\"merges\"\n />\n </Cell>\n <Cell span={8}>\n <StepBand\n title=\"Harness level\"\n description={`Pass-rate lift over the compiled defaults · band = each step's own 95% interval · canary ${HARNESS_ADOPTION_GATE.canaryHours} h`}\n status={learnStatus('No harness adopted yet — the compiled defaults are in force.', harness.steps.length > 0)}\n steps={harness.steps}\n markers={harness.markers}\n now={now}\n baseline={{ value: 0, label: 'Compiled defaults' }}\n unit=\"pts\"\n />\n </Cell>\n <Cell span={4}>\n <ForestPlot\n title=\"Experiments\"\n description={`Paired lift, 95% interval · adopt needs CI low > ${HARNESS_ADOPTION_GATE.minLiftCiLow} and ≥ ${HARNESS_ADOPTION_GATE.minPairs} pairs`}\n status={learnStatus('No experiments have run yet.', forest.length > 0)}\n rows={forest}\n unit=\"pts\"\n unknownText={`under ${HARNESS_ADOPTION_GATE.minPairs} pairs`}\n />\n </Cell>\n </Surface>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,s as n}from"./index-afDA8cwW.js";import{k as r,m as i}from"./global-DVgMguLr.js";import{n as a,t as ee}from"./MutationTokenDialog-Dn0tzCrh.js";import{v as te}from"./verse-ui-store-KTTKfv-T.js";import{i as ne,l as re,m as ie}from"./verse-queries-BjQoOTwv.js";import{t as ae}from"./Segmented-B_8c_83S.js";import{n as o,r as oe}from"./types-Dypu22dp.js";import{f as s,g as se,o as c,p as l,u as ce}from"./verse-store-BgKx_YGs.js";import{l as le,r as ue,t as de}from"./context-queries-DVdSLrYy.js";import{h as fe,n as pe}from"./verse-model-E98kXngO.js";import{o as me,s as he}from"./context-model-Bto3LZn2.js";import{t as ge}from"./SeatSelector-DaUO-zoK.js";import{o as _e}from"./workspace-model-4hq_Mv3N.js";import{n as ve,t as u}from"./use-token-gate-DYA2-ALC.js";import{C as ye,T as be,_ as xe,b as Se,c as Ce,f as we,g as Te,h as Ee,l as d,p as De,s as f,t as p,w as Oe}from"./context.module-B_k02HNU.js";var m=n(e(),1),h=t();function g(e,t,n){if(!n)return d(e,t);if(e.length===0)return null;let r=e.find(e=>e.id===n.seatId);if(!r)return d(e,t);let i=Te(r,n.model);if(i)return{seatId:r.id,model:i.id};let a=r.models.find(e=>!e.unavailableReason);return{seatId:r.id,model:a?a.id:n.model}}var ke=4e3,Ae="Building the handoff reads this chat’s log and runs `git diff --stat` on its folders. It spends nothing.",je=`Asking for a summary sends one turn to this chat’s seat.`,Me=`Stopping the summary turn.`,Ne=`Creating the chat records a new session on this machine. Nothing is sent to a model until you press Send in it.`;function Pe(e,t){let n=null,r=!1;for(let i of e)if(`turnId`in i&&i.turnId===t){if(i.type===`error`)n=i.message;else if(i.type===`assistant-message`||i.type===`text-delta`&&i.text.trim().length>0)r=!0;else if(i.type===`cancelled`)return{kind:`cancelled`};else if(i.type===`turn-done`)return i.ok?r?{kind:`ok`}:{kind:`empty`}:{kind:`failed`,message:n}}return null}function _(e){return e.open?(0,h.jsx)(v,{...e}):null}function v({session:e,seats:t,onClose:n,onCreated:d,initialTarget:_}){let v=(0,m.useId)(),y=(0,m.useId)(),b=(0,m.useId)(),x=(0,m.useId)(),Fe=(0,m.useId)(),S=(0,m.useId)(),C=(0,m.useId)(),w=(0,m.useRef)(null),T=ve(),Ie=i(le),[E,Le]=(0,m.useState)(null),[D,O]=(0,m.useState)(`idle`),[k,A]=(0,m.useState)(null),[j,Re]=(0,m.useState)(``),[M,ze]=(0,m.useState)(``),[Be,Ve]=(0,m.useState)(!1),N=(0,m.useRef)(0),P=(0,m.useRef)(!0);(0,m.useEffect)(()=>(P.current=!0,()=>{P.current=!1}),[]);let He=(0,m.useRef)(null);He.current=E;let Ue=T.run,F=(0,m.useCallback)(async t=>{let n=N.current+=1;O(`loading`),A(null);try{let r=await Ue(Ae,()=>ue(e.id,t));if(!P.current||n!==N.current)return;if(r===null){O(He.current?`ready`:`locked`);return}Le(r),Re(r.text),O(`ready`)}catch(e){if(!P.current||n!==N.current)return;A(u(e)),O(`error`)}},[Ue,e.id]);(0,m.useEffect)(()=>{r()?F({includeLastAssistant:!1,focus:``}):O(`locked`)},[]);let I=E!==null&&j!==E.text,We=(0,m.useMemo)(()=>be(j)>65536||Ee({text:j})>65536,[j]),Ge=j.length>o,[L,Ke]=(0,m.useState)(()=>g(t,e,_));(0,m.useEffect)(()=>{L===null&&t.length>0&&Ke(g(t,e,_))},[L,t,e,_]);let R=L?fe(t,L.seatId)??null:null,z=L?Te(R,L.model):null,[B,qe]=(0,m.useState)(null),Je=Ce({option:z,target:L,source:e,preferences:Ie.data}),V=B!==null&&Se(z,B)!==void 0?B:Je,Ye=xe(z),H=ye(R,z),U=we(j.length,z,V,R?.engine??null),Xe=[he(z),me(R?.engine)].filter(Boolean).join(` `),Ze=1+(e.extraRoots?.filter(t=>t&&t!==e.projectPath).length??0),Qe=_e(R?.engine??null,Ze);function $e(e){Ke({seatId:e.seatId,model:e.model}),qe(null)}let[W,et]=(0,m.useState)(()=>De(e.title)),[G,K]=(0,m.useState)({phase:`idle`}),q=fe(t,e.seatId)?.label??pe[e.engine],J=G.phase===`sending`||G.phase===`waiting`||G.phase===`cancelling`,Y=e.status===`running`?`A turn is running in this chat. Wait for it to finish first.`:e.turnCount===0?`This chat has no turns yet, so there is nothing to summarize.`:null;async function tt(){K({phase:`sending`});try{let t=await T.run(je,async()=>{l(e.id,`running`);try{let t=await ie(e.id,oe);return s(e.id,t.session,t.turnId),t.turnId}catch(t){throw l(e.id,`idle`),t}});if(!P.current)return;K(t===null?{phase:`idle`}:{phase:`waiting`,turnId:t})}catch(e){P.current&&K({phase:`failed`,message:u(e)})}}async function nt(){if(G.phase!==`waiting`)return;let t=G.turnId;K({phase:`cancelling`,turnId:t});try{await T.run(Me,()=>ne(e.id))===null&&P.current&&K({phase:`waiting`,turnId:t})}catch(e){P.current&&K({phase:`failed`,message:u(e)})}}let rt=(0,m.useRef)(M);rt.current=M,(0,m.useEffect)(()=>{if(G.phase!==`waiting`&&G.phase!==`cancelling`)return;let t=G.turnId,n=!1,r=()=>{if(n)return;let r=Pe(c(e.id).events,t);if(r!==null)switch(n=!0,r.kind){case`ok`:K({phase:`done`}),Ve(!0),F({includeLastAssistant:!0,focus:rt.current});break;case`cancelled`:K({phase:`failed`,message:`Summary stopped. The automatic preview is unchanged.`});break;case`empty`:K({phase:`failed`,message:`${q} finished without writing a summary. The automatic preview is unchanged.`});break;default:K({phase:`failed`,message:`The summary turn failed${r.message?`: ${r.message}`:``}. The automatic preview is unchanged.`})}};r();let i=se(r),a=setInterval(()=>{let t=c(e.id).stream;t!==`open`&&t!==`connecting`&&t!==`reconnecting`&&re(e.id).then(t=>ce(e.id,t.session,t.events)).catch(()=>{})},ke);return()=>{n=!0,i(),clearInterval(a)}},[G,e.id]);let[X,it]=(0,m.useState)(!1),[at,Z]=(0,m.useState)(null),ot=j.trim().length>0,Q=H??(E?null:`Build the handoff first.`)??(ot?null:`The handoff is empty — rebuild it or write one.`)??(We?`The handoff is over the 64 KB limit for one message. Trim it first.`:null)??(J?`Wait for the summary to finish, or stop it.`:null);async function st(){if(!L||Q!==null||X)return;it(!0),Z(null);let t=j;try{let r=await T.run(Ne,()=>de({source:e,seatId:L.seatId,model:L.model,contextMode:Se(z,V),title:W.trim()||void 0}));if(r===null)return;s(r.id,r),te(r.projectPath,{seatId:r.seatId,model:r.model}),d(r,t),n()}catch(e){P.current&&Z(u(e))}finally{P.current&&it(!1)}}let ct=()=>{T.dialog.open||n()},lt=Math.ceil(j.length/4),$=()=>void F({includeLastAssistant:Be,focus:M});return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(a,{open:!0,onClose:ct,titleId:v,title:`Continue in a fresh chat`,initialFocusRef:w,widthClassName:p.dialogWidth,description:(0,h.jsxs)(h.Fragment,{children:[`Start a new chat from a written handoff of “`,e.title||`Untitled chat`,`” instead of its full history.`]}),children:(0,h.jsxs)(`form`,{className:p.form,noValidate:!0,onSubmit:e=>{e.preventDefault(),st()},children:[(0,h.jsxs)(`div`,{className:p.field,children:[(0,h.jsxs)(`label`,{className:p.label,htmlFor:y,children:[`Focus for the next chat `,(0,h.jsx)(`span`,{className:p.optional,children:`optional`})]}),(0,h.jsxs)(`div`,{className:p.row,children:[(0,h.jsx)(`input`,{id:y,ref:w,className:p.input,value:M,maxLength:500,placeholder:`e.g. finish the migration, then run the full test suite`,autoComplete:`off`,onChange:e=>ze(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),D!==`loading`&&$())}}),(0,h.jsx)(`button`,{type:`button`,className:p.secondary,onClick:$,disabled:D===`loading`||J,children:I?`Rebuild (replaces your edits)`:`Rebuild`})]})]}),(0,h.jsxs)(`div`,{className:p.field,children:[(0,h.jsx)(`label`,{className:p.label,htmlFor:b,children:`Handoff — becomes the new chat’s first message`}),D===`locked`&&!E?(0,h.jsxs)(`div`,{className:p.locked,role:`status`,children:[(0,h.jsxs)(`p`,{children:[`Building the handoff needs the mutation token: it reads this chat’s log and runs `,(0,h.jsx)(`code`,{children:`git diff --stat`}),`. It spends nothing.`]}),(0,h.jsx)(`button`,{type:`button`,className:p.secondary,onClick:$,children:`Unlock and build the handoff`})]}):(0,h.jsx)(`textarea`,{id:b,className:p.textarea,value:j,rows:12,spellCheck:!1,"aria-describedby":x,"aria-busy":D===`loading`||void 0,disabled:!E,placeholder:D===`loading`?`Building the handoff from this chat’s log…`:``,onChange:e=>Re(e.target.value)}),(0,h.jsx)(`p`,{id:x,className:p.hint,"aria-live":`polite`,children:D===`loading`?E?`Rebuilding…`:`Reading this chat’s log…`:E?(0,h.jsxs)(h.Fragment,{children:[j.length.toLocaleString(),` chars · ~`,lt.toLocaleString(),` tokens`,` · `,E.stats.turnsCovered,` `,E.stats.turnsCovered===1?`turn`:`turns`,` · `,E.stats.filesTouched,` `,E.stats.filesTouched===1?`file`:`files`,` touched`,I?` · edited`:``,Be?` · includes ${q}’s own summary`:``]}):null}),E&&E.stats.truncated.length>0?(0,h.jsxs)(`p`,{className:p.hint,children:[`To stay under `,o.toLocaleString(),` characters these sections were left out: `,E.stats.truncated.join(`, `),`.`]}):null,We?(0,h.jsx)(`p`,{className:p.error,role:`alert`,children:`Over the 64 KB limit for one message (counted as it is sent, line breaks and quotes encoded) — the new chat could not send it. Trim it first.`}):Ge?(0,h.jsxs)(`p`,{className:p.warn,children:[`Longer than the `,o.toLocaleString(),`-character handoff budget. It can still be sent; the new chat just starts bigger.`]}):null,D===`error`&&k?(0,h.jsxs)(`p`,{className:p.error,role:`alert`,children:[`Could not build the handoff: `,k,` `,(0,h.jsx)(`button`,{type:`button`,className:p.link,onClick:$,children:`Try again`})]}):null]}),(0,h.jsxs)(`section`,{className:p.aside,"aria-labelledby":`${v}-summary`,children:[(0,h.jsxs)(`h3`,{id:`${v}-summary`,className:p.label,children:[`Better summary `,(0,h.jsx)(`span`,{className:p.optional,children:`optional, spends`})]}),(0,h.jsxs)(`p`,{className:p.hint,children:[`The handoff above is assembled from this chat’s log. For one in the agent’s own words, ask `,q,` to write it first — its reply is added to the handoff. `,Oe(e.engine,q)]}),G.phase===`waiting`||G.phase===`cancelling`?(0,h.jsxs)(`div`,{className:p.row,role:`status`,children:[(0,h.jsx)(`span`,{className:p.pending,"aria-hidden":`true`}),(0,h.jsx)(`span`,{className:p.hint,children:G.phase===`cancelling`?`Stopping the summary…`:`Waiting for ${q} to finish its summary…`}),(0,h.jsx)(`button`,{type:`button`,className:p.secondary,onClick:()=>void nt(),disabled:G.phase===`cancelling`,children:`Stop the summary`})]}):(0,h.jsxs)(`div`,{className:p.row,children:[(0,h.jsx)(`button`,{type:`button`,className:p.secondary,onClick:()=>void tt(),disabled:Y!==null||G.phase===`sending`,children:G.phase===`sending`?`Sending…`:G.phase===`done`?`Ask ${q} again`:`Ask ${q} to summarize first`}),G.phase===`done`?(0,h.jsx)(`span`,{className:p.hint,role:`status`,children:`Summary added.`}):null]}),Y!==null&&!J?(0,h.jsx)(`p`,{className:p.hint,children:Y}):null,Y===null&&G.phase===`idle`&&I?(0,h.jsx)(`p`,{className:p.hint,children:`The handoff is rebuilt with the summary, which replaces your edits above.`}):null,G.phase===`failed`?(0,h.jsx)(`p`,{className:p.error,role:`alert`,children:G.message}):null]}),(0,h.jsxs)(`div`,{className:p.field,children:[(0,h.jsx)(ge,{id:Fe,seats:t,value:L,onChange:$e,label:`Continue on`,modeFor:(e,t)=>L&&e.id===L.seatId&&t.id===L.model?V:`standard`}),H?(0,h.jsx)(`p`,{className:p.error,role:`alert`,children:H}):null,Qe?(0,h.jsx)(`p`,{className:p.hint,children:Qe}):null]}),z&&!H?(0,h.jsxs)(`div`,{className:p.field,children:[Ye?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`span`,{id:C,className:p.label,children:`Context mode`}),(0,h.jsx)(ae,{"aria-labelledby":C,size:`sm`,value:V,onChange:e=>qe(e),options:[{value:`standard`,label:`Standard`},{value:`expansive`,label:`Expansive`}]}),(0,h.jsxs)(`p`,{className:p.hint,children:[f(z,V),`.`,` `,V===`expansive`?`Expansive keeps far more of the conversation before compacting, but every turn re-sends all of it — each turn costs more usage.${Xe?` ${Xe}`:``}`:`Standard compacts sooner and keeps each turn cheaper. Expansive is one click away if the work needs it.`]})]}):f(z,`standard`)?(0,h.jsxs)(`p`,{className:p.hint,children:[f(z,`standard`),`.`]}):null,(0,h.jsx)(`p`,{className:`${p.fit} ${p[`fit-${U.tone}`]??``}`,"data-verdict":U.verdict??`unknown`,children:U.text})]}):null,(0,h.jsxs)(`div`,{className:p.field,children:[(0,h.jsx)(`label`,{className:p.label,htmlFor:S,children:`Title`}),(0,h.jsx)(`input`,{id:S,className:p.input,value:W,maxLength:120,autoComplete:`off`,onChange:e=>et(e.target.value)})]}),at?(0,h.jsx)(`p`,{className:p.error,role:`alert`,children:at}):null,(0,h.jsx)(`p`,{className:p.cost,children:`Creating the chat is free — nothing is sent to a model. The handoff goes into the new chat’s composer; read it, then press Send. That first turn is the first thing spent.`}),(0,h.jsxs)(`div`,{className:p.actions,children:[Q&&E?(0,h.jsx)(`span`,{className:p.blocked,children:Q}):null,(0,h.jsx)(`button`,{type:`button`,className:p.cancel,onClick:n,children:`Cancel`}),(0,h.jsx)(`button`,{type:`submit`,className:p.primary,disabled:Q!==null||X,children:X?`Creating…`:`Create chat`})]})]})}),(0,h.jsx)(ee,{open:T.dialog.open,reason:T.dialog.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:T.dialog.onClose,onUnlocked:T.dialog.onUnlocked})]})}export{_ as HandoffDialog};
2
- //# sourceMappingURL=HandoffDialog-DHZo3Ev0.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HandoffDialog-DHZo3Ev0.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/context/HandoffDialog.tsx"],"sourcesContent":["/**\n * routes/verse/context/HandoffDialog.tsx — \"Continue in a fresh chat\".\n *\n * A long session gets expensive (every turn re-sends the whole prefix) and\n * forgetful (after a couple of compactions its early turns survive only as\n * summaries). The fix is a NEW session that starts from a written note\n * instead of the full history. This dialog builds that note, lets the\n * operator read and edit it, picks where it continues, and creates the\n * session — and then STOPS. The note is handed back through `onCreated` so\n * the caller can drop it into the new chat's composer; the operator presses\n * Send. That keeps the spending rule simple enough to say in one sentence:\n *\n * Building the preview and creating the chat spend nothing. The first\n * thing spent is the turn the operator sends, having read it.\n *\n * The one optional spend is \"Ask this seat to summarize first\": an ordinary\n * turn on the CURRENT session (through `sendVerseTurn`, so it passes the\n * engine's spend chokepoint and the local-only policy like any other turn),\n * after which the preview is rebuilt with `includeLastAssistant` so the\n * seat's own summary is carried over verbatim. It is a button, never a\n * default, and its cost is stated beside it in the seat's own name.\n *\n * Mounted only while open (the exported wrapper returns null otherwise), so\n * every open starts from a clean state and nothing is fetched for a dialog\n * nobody opened.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { VerseEvent, VerseSeat, VerseSession } from '../../../data/api-types.js';\nimport {\n VERSE_HANDOFF_MAX_CHARS,\n VERSE_HANDOFF_SUMMARY_REQUEST,\n VERSE_MAX_TURN_TEXT_BYTES,\n type VerseContextMode,\n type VerseHandoffPreview,\n} from '../../../../core/verse/types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { Segmented } from '../../../components/primitives/Segmented.js';\nimport { hasMutationHold } from '../../../data/auth-store.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { SeatSelector, type SeatChoice } from '../SeatSelector.js';\nimport { ENGINE_LABEL, seatById } from '../verse-model.js';\nimport { cancelVerseTurn, fetchVerseSessionDetail, sendVerseTurn } from '../verse-queries.js';\nimport {\n getVerseSessionState,\n seedVerseSession,\n setVerseSession,\n setVerseSessionStatus,\n subscribeVerseStore,\n} from '../verse-store.js';\nimport { expansiveMeteringNote, expansiveRatioSentence } from '../usage/context-model.js';\nimport { rememberVerseSeat } from '../verse-ui-store.js';\nimport { extraRootsCaveat } from '../workspace-model.js';\nimport {\n budgetLine,\n defaultHandoffMode,\n defaultHandoffTarget,\n handoffFit,\n handoffTitle,\n modelOption,\n offersExpansive,\n requestMode,\n targetUnavailableReason,\n TITLE_MAX_CHARS,\n turnCostSentence,\n utf8Bytes,\n API_BODY_MAX_BYTES,\n jsonBodyBytes,\n type HandoffTarget,\n} from './context-model.js';\nimport {\n createHandoffSession,\n fetchHandoffPreview,\n HANDOFF_FOCUS_MAX_CHARS,\n versePreferencesQuery,\n} from './context-queries.js';\nimport { describeContextError, useTokenGate } from './use-token-gate.js';\nimport styles from './context.module.css';\n\nexport interface HandoffDialogProps {\n /** The session being handed off (the live record — its status gates \"summarize\"). */\n session: VerseSession;\n seats: readonly VerseSeat[];\n open: boolean;\n onClose: () => void;\n /**\n * The new session exists. `text` is the handoff exactly as the operator left\n * it in the editor — pre-fill it into the new chat's composer; do NOT send it.\n */\n onCreated: (session: VerseSession, text: string) => void;\n /**\n * The seat + model to open on, when the operator already named one — the\n * composer's \"Continue on ‹seat›\" (Workspace). Absent = the usual default\n * (same seat and model, \"same agent, fresh context\"). See\n * `initialHandoffTarget` for how a stale choice is resolved.\n */\n initialTarget?: SeatChoice;\n}\n\n/**\n * Where the dialog opens. An explicit `initial` choice wins over the default\n * because the operator just picked it; the dialog must not silently swap it\n * for \"same seat\" and make them pick again.\n *\n * - The seat is in the roster → that seat, on the named model (matched\n * exactly, then by canonical id). If the model is gone, the seat's first\n * runnable model: the seat was the choice; the model id may be an alias the\n * roster has since renamed. If nothing on it runs, the named model stays\n * selected so `targetUnavailableReason` says WHY, rather than a different\n * seat appearing unasked.\n * - The roster is still empty (cold bootstrap) → null; the fill-once effect\n * retries with the same choice when seats arrive.\n * - The seat is not in a loaded roster (removed since) → the ordinary default.\n */\nexport function initialHandoffTarget(\n seats: readonly VerseSeat[],\n source: Pick<VerseSession, 'seatId' | 'model'>,\n initial: SeatChoice | undefined,\n): HandoffTarget | null {\n if (!initial) return defaultHandoffTarget(seats, source);\n if (seats.length === 0) return null;\n const seat = seats.find((s) => s.id === initial.seatId);\n if (!seat) return defaultHandoffTarget(seats, source);\n const named = modelOption(seat, initial.model);\n if (named) return { seatId: seat.id, model: named.id };\n const runnable = seat.models.find((m) => !m.unavailableReason);\n return { seatId: seat.id, model: runnable ? runnable.id : initial.model };\n}\n\n/** How often to re-read a session's log while waiting on a summary, when no live stream feeds the store. */\nexport const SUMMARY_POLL_MS = 4_000;\n\nconst PREVIEW_REASON = 'Building the handoff reads this chat’s log and runs `git diff --stat` on its folders. It spends nothing.';\nconst SUMMARY_REASON = 'Asking for a summary sends one turn to this chat’s seat.';\nconst CANCEL_REASON = 'Stopping the summary turn.';\nconst CREATE_REASON = 'Creating the chat records a new session on this machine. Nothing is sent to a model until you press Send in it.';\n\ntype PreviewStatus = 'idle' | 'locked' | 'loading' | 'ready' | 'error';\n\ntype SummaryState =\n | { phase: 'idle' }\n | { phase: 'sending' }\n | { phase: 'waiting'; turnId: string }\n | { phase: 'cancelling'; turnId: string }\n | { phase: 'done' }\n | { phase: 'failed'; message: string };\n\ntype TurnOutcome = { kind: 'ok' } | { kind: 'cancelled' } | { kind: 'failed'; message: string | null } | { kind: 'empty' };\n\n/**\n * How a turn ended, read from the session's event log; null while it runs.\n * Every terminal path in the engine emits `turn-done` (a stopped turn emits\n * `cancelled` first), so waiting for one of those two is sufficient.\n */\nexport function turnOutcome(events: readonly VerseEvent[], turnId: string): TurnOutcome | null {\n let lastError: string | null = null;\n let wroteReply = false;\n for (const e of events) {\n if (!('turnId' in e) || e.turnId !== turnId) continue;\n if (e.type === 'error') lastError = e.message;\n else if (e.type === 'assistant-message' || (e.type === 'text-delta' && e.text.trim().length > 0)) wroteReply = true;\n else if (e.type === 'cancelled') return { kind: 'cancelled' };\n else if (e.type === 'turn-done') {\n if (!e.ok) return { kind: 'failed', message: lastError };\n return wroteReply ? { kind: 'ok' } : { kind: 'empty' };\n }\n }\n return null;\n}\n\nexport function HandoffDialog(props: HandoffDialogProps) {\n if (!props.open) return null;\n return <HandoffDialogBody {...props} />;\n}\n\nfunction HandoffDialogBody({ session, seats, onClose, onCreated, initialTarget }: HandoffDialogProps) {\n const titleId = useId();\n const focusId = useId();\n const textId = useId();\n const statsId = useId();\n const seatId = useId();\n const nameId = useId();\n const modeLabelId = useId();\n const focusRef = useRef<HTMLInputElement>(null);\n const gate = useTokenGate();\n const prefs = useQuery(versePreferencesQuery);\n\n // ---- preview -----------------------------------------------------------\n const [preview, setPreview] = useState<VerseHandoffPreview | null>(null);\n const [previewStatus, setPreviewStatus] = useState<PreviewStatus>('idle');\n const [previewError, setPreviewError] = useState<string | null>(null);\n const [text, setText] = useState('');\n const [focus, setFocus] = useState('');\n const [includeLastAssistant, setIncludeLastAssistant] = useState(false);\n /** Only the newest preview request may land (a rebuild can race the first read). */\n const requestSeq = useRef(0);\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => { mounted.current = false; };\n }, []);\n\n // Read through a ref by the async paths below, which outlive the render\n // that started them (a summary turn can take minutes).\n const previewRef = useRef<VerseHandoffPreview | null>(null);\n previewRef.current = preview;\n const runGated = gate.run;\n\n const requestPreview = useCallback(async (opts: { includeLastAssistant: boolean; focus: string }) => {\n const seq = (requestSeq.current += 1);\n setPreviewStatus('loading');\n setPreviewError(null);\n try {\n const result = await runGated(PREVIEW_REASON, () => fetchHandoffPreview(session.id, opts));\n if (!mounted.current || seq !== requestSeq.current) return;\n if (result === null) {\n // Token prompt dismissed: keep whatever preview is already on screen.\n setPreviewStatus(previewRef.current ? 'ready' : 'locked');\n return;\n }\n setPreview(result);\n setText(result.text);\n setPreviewStatus('ready');\n } catch (err) {\n if (!mounted.current || seq !== requestSeq.current) return;\n setPreviewError(describeContextError(err));\n setPreviewStatus('error');\n }\n }, [runGated, session.id]);\n\n // First build on open. With no token held it waits for an explicit unlock\n // rather than stacking a second dialog on top of this one uninvited.\n useEffect(() => {\n if (hasMutationHold()) void requestPreview({ includeLastAssistant: false, focus: '' });\n else setPreviewStatus('locked');\n // eslint-disable-next-line react-hooks/exhaustive-deps -- once per open; the body is mounted per open.\n }, []);\n\n const edited = preview !== null && text !== preview.text;\n // The new chat sends this as its first turn: it must fit the turn cap AND\n // the API's request-body cap once JSON-escaped, or the Send would be refused.\n const overTurnLimit = useMemo(\n () => utf8Bytes(text) > VERSE_MAX_TURN_TEXT_BYTES || jsonBodyBytes({ text }) > API_BODY_MAX_BYTES,\n [text],\n );\n const overBudget = text.length > VERSE_HANDOFF_MAX_CHARS;\n\n // ---- target ------------------------------------------------------------\n // The body mounts per open, so `initialTarget` is read once per open: a\n // later pick inside the dialog is never overwritten by the prop.\n const [target, setTarget] = useState<HandoffTarget | null>(() => initialHandoffTarget(seats, session, initialTarget));\n // Seats that arrive after the dialog opened (cold bootstrap) fill an empty target once.\n useEffect(() => {\n if (target === null && seats.length > 0) setTarget(initialHandoffTarget(seats, session, initialTarget));\n }, [target, seats, session, initialTarget]);\n const targetSeat = target ? seatById(seats, target.seatId) ?? null : null;\n const option = target ? modelOption(targetSeat, target.model) : null;\n const [modeChoice, setModeChoice] = useState<VerseContextMode | null>(null);\n const defaultMode = defaultHandoffMode({ option, target, source: session, preferences: prefs.data });\n const mode: VerseContextMode = modeChoice !== null && requestMode(option, modeChoice) !== undefined ? modeChoice : defaultMode;\n const expansiveOffered = offersExpansive(option);\n const unavailable = targetUnavailableReason(targetSeat, option);\n // The TARGET seat's engine: the new chat carries that CLI's fixed prompt, not the source's.\n const fit = handoffFit(text.length, option, mode, targetSeat?.engine ?? null);\n // Expansive's cost in the shared wording: the re-send ratio, then (codex\n // only) the reported >272k metering that multiplies it.\n const expansiveCost = [expansiveRatioSentence(option), expansiveMeteringNote(targetSeat?.engine)].filter(Boolean).join(' ');\n const rootCount = 1 + (session.extraRoots?.filter((r) => r && r !== session.projectPath).length ?? 0);\n const reachCaveat = extraRootsCaveat(targetSeat?.engine ?? null, rootCount);\n\n function chooseTarget(choice: SeatChoice) {\n setTarget({ seatId: choice.seatId, model: choice.model });\n // A new model re-derives its own default mode; a choice made for the old\n // model may not even exist on the new one.\n setModeChoice(null);\n }\n\n const [title, setTitle] = useState(() => handoffTitle(session.title));\n\n // ---- summarize first ---------------------------------------------------\n const [summary, setSummary] = useState<SummaryState>({ phase: 'idle' });\n const sourceSeat = seatById(seats, session.seatId);\n const sourceSeatLabel = sourceSeat?.label ?? ENGINE_LABEL[session.engine];\n const summarizing = summary.phase === 'sending' || summary.phase === 'waiting' || summary.phase === 'cancelling';\n const summarizeBlocked = session.status === 'running'\n ? 'A turn is running in this chat. Wait for it to finish first.'\n : session.turnCount === 0\n ? 'This chat has no turns yet, so there is nothing to summarize.'\n : null;\n\n async function summarize() {\n setSummary({ phase: 'sending' });\n try {\n const turnId = await gate.run(SUMMARY_REASON, async () => {\n setVerseSessionStatus(session.id, 'running');\n try {\n // The SHARED constant, verbatim: the handoff builder recognises this\n // exact text and keeps it out of the new chat's \"latest requests\".\n const response = await sendVerseTurn(session.id, VERSE_HANDOFF_SUMMARY_REQUEST);\n // Same reconciliation ChatSection's send uses: the turn may already\n // have settled by the time the 202 is applied.\n setVerseSession(session.id, response.session, response.turnId);\n return response.turnId;\n } catch (err) {\n setVerseSessionStatus(session.id, 'idle');\n throw err;\n }\n });\n if (!mounted.current) return;\n setSummary(turnId === null ? { phase: 'idle' } : { phase: 'waiting', turnId });\n } catch (err) {\n if (mounted.current) setSummary({ phase: 'failed', message: describeContextError(err) });\n }\n }\n\n async function stopSummary() {\n if (summary.phase !== 'waiting') return;\n const turnId = summary.turnId;\n setSummary({ phase: 'cancelling', turnId });\n try {\n const done = await gate.run(CANCEL_REASON, () => cancelVerseTurn(session.id));\n if (done === null && mounted.current) setSummary({ phase: 'waiting', turnId });\n // Otherwise the `cancelled` event settles it through the store watcher.\n } catch (err) {\n if (mounted.current) setSummary({ phase: 'failed', message: describeContextError(err) });\n }\n }\n\n // Watch the session's event log for the summary turn to finish. The open\n // chat's SSE stream feeds verse-store already; when nothing is streaming\n // this session (the dialog was opened for a chat that is not selected), a\n // slow poll of its detail feeds the SAME store path instead.\n const focusRefValue = useRef(focus);\n focusRefValue.current = focus;\n useEffect(() => {\n if (summary.phase !== 'waiting' && summary.phase !== 'cancelling') return undefined;\n const turnId = summary.turnId;\n let settled = false;\n const check = () => {\n if (settled) return;\n const outcome = turnOutcome(getVerseSessionState(session.id).events, turnId);\n if (outcome === null) return;\n settled = true;\n switch (outcome.kind) {\n case 'ok':\n setSummary({ phase: 'done' });\n setIncludeLastAssistant(true);\n void requestPreview({ includeLastAssistant: true, focus: focusRefValue.current });\n break;\n case 'cancelled':\n setSummary({ phase: 'failed', message: 'Summary stopped. The automatic preview is unchanged.' });\n break;\n case 'empty':\n setSummary({ phase: 'failed', message: `${sourceSeatLabel} finished without writing a summary. The automatic preview is unchanged.` });\n break;\n default:\n setSummary({\n phase: 'failed',\n message: `The summary turn failed${outcome.message ? `: ${outcome.message}` : ''}. The automatic preview is unchanged.`,\n });\n }\n };\n check();\n const unsubscribe = subscribeVerseStore(check);\n const timer = setInterval(() => {\n const stream = getVerseSessionState(session.id).stream;\n if (stream === 'open' || stream === 'connecting' || stream === 'reconnecting') return;\n fetchVerseSessionDetail(session.id)\n .then((detail) => seedVerseSession(session.id, detail.session, detail.events))\n .catch(() => { /* the next tick retries; the operator can also stop waiting */ });\n }, SUMMARY_POLL_MS);\n return () => {\n settled = true;\n unsubscribe();\n clearInterval(timer);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- keyed on the turn being waited for, not on every render's callbacks.\n }, [summary, session.id]);\n\n // ---- create ------------------------------------------------------------\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n const hasText = text.trim().length > 0;\n const createBlocked = unavailable\n ?? (!preview ? 'Build the handoff first.' : null)\n ?? (!hasText ? 'The handoff is empty — rebuild it or write one.' : null)\n ?? (overTurnLimit ? 'The handoff is over the 64 KB limit for one message. Trim it first.' : null)\n ?? (summarizing ? 'Wait for the summary to finish, or stop it.' : null);\n\n async function create() {\n if (!target || createBlocked !== null || creating) return;\n setCreating(true);\n setCreateError(null);\n const handoffText = text;\n try {\n const created = await gate.run(CREATE_REASON, () => createHandoffSession({\n source: session,\n seatId: target.seatId,\n model: target.model,\n contextMode: requestMode(option, mode),\n title: title.trim() || undefined,\n }));\n if (created === null) return;\n // Same bookkeeping ChatSection does for any new chat: the store knows\n // the record before its detail fetch lands, and the project remembers\n // the seat it was last started on.\n setVerseSession(created.id, created);\n rememberVerseSeat(created.projectPath, { seatId: created.seatId, model: created.model });\n onCreated(created, handoffText);\n onClose();\n } catch (err) {\n if (mounted.current) setCreateError(describeContextError(err));\n } finally {\n if (mounted.current) setCreating(false);\n }\n }\n\n // Escape on the token prompt must close only the prompt — both dialogs\n // listen on the document, so this one stands down while the prompt is up.\n const closeUnlessPrompting = () => {\n if (!gate.dialog.open) onClose();\n };\n\n const liveTokens = Math.ceil(text.length / 4);\n const rebuild = () => void requestPreview({ includeLastAssistant, focus });\n\n return (\n <>\n <Dialog open onClose={closeUnlessPrompting} titleId={titleId} title=\"Continue in a fresh chat\" initialFocusRef={focusRef}\n widthClassName={styles.dialogWidth}\n description={<>Start a new chat from a written handoff of “{session.title || 'Untitled chat'}” instead of its full history.</>}>\n <form className={styles.form} noValidate onSubmit={(event) => { event.preventDefault(); void create(); }}>\n {/* ---- the note ---- */}\n <div className={styles.field}>\n <label className={styles.label} htmlFor={focusId}>\n Focus for the next chat <span className={styles.optional}>optional</span>\n </label>\n <div className={styles.row}>\n <input id={focusId} ref={focusRef} className={styles.input} value={focus} maxLength={HANDOFF_FOCUS_MAX_CHARS}\n placeholder=\"e.g. finish the migration, then run the full test suite\" autoComplete=\"off\"\n onChange={(event) => setFocus(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n if (previewStatus !== 'loading') rebuild();\n }\n }} />\n <button type=\"button\" className={styles.secondary} onClick={rebuild}\n disabled={previewStatus === 'loading' || summarizing}>\n {edited ? 'Rebuild (replaces your edits)' : 'Rebuild'}\n </button>\n </div>\n </div>\n\n <div className={styles.field}>\n <label className={styles.label} htmlFor={textId}>Handoff — becomes the new chat’s first message</label>\n {previewStatus === 'locked' && !preview ? (\n <div className={styles.locked} role=\"status\">\n <p>Building the handoff needs the mutation token: it reads this chat’s log and runs <code>git diff --stat</code>. It spends nothing.</p>\n <button type=\"button\" className={styles.secondary} onClick={rebuild}>Unlock and build the handoff</button>\n </div>\n ) : (\n <textarea id={textId} className={styles.textarea} value={text} rows={12} spellCheck={false}\n aria-describedby={statsId} aria-busy={previewStatus === 'loading' ? true : undefined}\n disabled={!preview}\n placeholder={previewStatus === 'loading' ? 'Building the handoff from this chat’s log…' : ''}\n onChange={(event) => setText(event.target.value)} />\n )}\n <p id={statsId} className={styles.hint} aria-live=\"polite\">\n {previewStatus === 'loading'\n ? preview ? 'Rebuilding…' : 'Reading this chat’s log…'\n : preview ? (\n <>\n {text.length.toLocaleString()} chars · ~{liveTokens.toLocaleString()} tokens\n {' · '}{preview.stats.turnsCovered} {preview.stats.turnsCovered === 1 ? 'turn' : 'turns'}\n {' · '}{preview.stats.filesTouched} {preview.stats.filesTouched === 1 ? 'file' : 'files'} touched\n {edited ? ' · edited' : ''}\n {includeLastAssistant ? ` · includes ${sourceSeatLabel}’s own summary` : ''}\n </>\n ) : null}\n </p>\n {preview && preview.stats.truncated.length > 0 ? (\n <p className={styles.hint}>\n To stay under {VERSE_HANDOFF_MAX_CHARS.toLocaleString()} characters these sections were left out: {preview.stats.truncated.join(', ')}.\n </p>\n ) : null}\n {overTurnLimit ? (\n <p className={styles.error} role=\"alert\">\n Over the 64 KB limit for one message (counted as it is sent, line breaks and quotes encoded) — the new chat could\n not send it. Trim it first.\n </p>\n ) : overBudget ? (\n <p className={styles.warn}>\n Longer than the {VERSE_HANDOFF_MAX_CHARS.toLocaleString()}-character handoff budget. It can still be sent; the new chat just starts bigger.\n </p>\n ) : null}\n {previewStatus === 'error' && previewError ? (\n <p className={styles.error} role=\"alert\">\n Could not build the handoff: {previewError}{' '}\n <button type=\"button\" className={styles.link} onClick={rebuild}>Try again</button>\n </p>\n ) : null}\n </div>\n\n {/* ---- optional: the seat's own summary ---- */}\n <section className={styles.aside} aria-labelledby={`${titleId}-summary`}>\n <h3 id={`${titleId}-summary`} className={styles.label}>Better summary <span className={styles.optional}>optional, spends</span></h3>\n <p className={styles.hint}>\n The handoff above is assembled from this chat’s log. For one in the agent’s own words, ask {sourceSeatLabel} to\n write it first — its reply is added to the handoff. {turnCostSentence(session.engine, sourceSeatLabel)}\n </p>\n {summary.phase === 'waiting' || summary.phase === 'cancelling' ? (\n <div className={styles.row} role=\"status\">\n <span className={styles.pending} aria-hidden=\"true\" />\n <span className={styles.hint}>\n {summary.phase === 'cancelling' ? 'Stopping the summary…' : `Waiting for ${sourceSeatLabel} to finish its summary…`}\n </span>\n <button type=\"button\" className={styles.secondary} onClick={() => void stopSummary()}\n disabled={summary.phase === 'cancelling'}>Stop the summary</button>\n </div>\n ) : (\n <div className={styles.row}>\n <button type=\"button\" className={styles.secondary} onClick={() => void summarize()}\n disabled={summarizeBlocked !== null || summary.phase === 'sending'}>\n {summary.phase === 'sending' ? 'Sending…' : summary.phase === 'done' ? `Ask ${sourceSeatLabel} again` : `Ask ${sourceSeatLabel} to summarize first`}\n </button>\n {summary.phase === 'done' ? <span className={styles.hint} role=\"status\">Summary added.</span> : null}\n </div>\n )}\n {summarizeBlocked !== null && !summarizing ? <p className={styles.hint}>{summarizeBlocked}</p> : null}\n {summarizeBlocked === null && summary.phase === 'idle' && edited ? (\n <p className={styles.hint}>The handoff is rebuilt with the summary, which replaces your edits above.</p>\n ) : null}\n {summary.phase === 'failed' ? <p className={styles.error} role=\"alert\">{summary.message}</p> : null}\n </section>\n\n {/* ---- where it continues ---- */}\n <div className={styles.field}>\n <SeatSelector id={seatId} seats={seats} value={target} onChange={chooseTarget} label=\"Continue on\"\n modeFor={(seat, model) => (target && seat.id === target.seatId && model.id === target.model ? mode : 'standard')} />\n {unavailable ? <p className={styles.error} role=\"alert\">{unavailable}</p> : null}\n {reachCaveat ? <p className={styles.hint}>{reachCaveat}</p> : null}\n </div>\n\n {option && !unavailable ? (\n <div className={styles.field}>\n {expansiveOffered ? (\n <>\n <span id={modeLabelId} className={styles.label}>Context mode</span>\n <Segmented<VerseContextMode> aria-labelledby={modeLabelId} size=\"sm\" value={mode}\n onChange={(next) => setModeChoice(next)}\n options={[\n { value: 'standard', label: 'Standard' },\n { value: 'expansive', label: 'Expansive' },\n ]} />\n <p className={styles.hint}>\n {budgetLine(option, mode)}.{' '}\n {mode === 'expansive'\n ? `Expansive keeps far more of the conversation before compacting, but every turn re-sends all of it — each turn costs more usage.${expansiveCost ? ` ${expansiveCost}` : ''}`\n : 'Standard compacts sooner and keeps each turn cheaper. Expansive is one click away if the work needs it.'}\n </p>\n </>\n ) : budgetLine(option, 'standard') ? (\n <p className={styles.hint}>{budgetLine(option, 'standard')}.</p>\n ) : null}\n <p className={`${styles.fit} ${styles[`fit-${fit.tone}`] ?? ''}`} data-verdict={fit.verdict ?? 'unknown'}>\n {fit.text}\n </p>\n </div>\n ) : null}\n\n <div className={styles.field}>\n <label className={styles.label} htmlFor={nameId}>Title</label>\n <input id={nameId} className={styles.input} value={title} maxLength={TITLE_MAX_CHARS} autoComplete=\"off\"\n onChange={(event) => setTitle(event.target.value)} />\n </div>\n\n {createError ? <p className={styles.error} role=\"alert\">{createError}</p> : null}\n\n <p className={styles.cost}>\n Creating the chat is free — nothing is sent to a model. The handoff goes into the new chat’s composer; read it,\n then press Send. That first turn is the first thing spent.\n </p>\n <div className={styles.actions}>\n {createBlocked && preview ? <span className={styles.blocked}>{createBlocked}</span> : null}\n <button type=\"button\" className={styles.cancel} onClick={onClose}>Cancel</button>\n <button type=\"submit\" className={styles.primary} disabled={createBlocked !== null || creating}>\n {creating ? 'Creating…' : 'Create chat'}\n </button>\n </div>\n </form>\n </Dialog>\n <MutationTokenDialog open={gate.dialog.open} reason={gate.dialog.reason} tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\" onClose={gate.dialog.onClose} onUnlocked={gate.dialog.onUnlocked} />\n </>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,s as n}from"./index-afDA8cwW.js";import{C as r,E as i,O as a,S as o,T as s,a as c,b as l,d as u,o as d,t as f,v as p,w as m,x as h}from"./useChartWidth-MEXvDxDL.js";import{_ as g,c as _,h as v,l as y,m as b,p as x,u as S}from"./colors-B-vHsX1S.js";var C=n(e(),1),w={gauge:`_gauge_1y0vx_1`,readout:`_readout_1y0vx_8`,value:`_value_1y0vx_18`,unknownValue:`_unknownValue_1y0vx_24`,state:`_state_1y0vx_30`,caption:`_caption_1y0vx_43`,fit:`_fit_1y0vx_49`},T=t(),E={ok:`within limits`,warn:`near the limit`,danger:`at the limit`,unknown:`unknown`};function ee(e){let[t,n]=(0,C.useState)(0),[r,i]=(0,C.useState)(null);return(0,C.useLayoutEffect)(()=>{e.current!==r&&i(e.current)}),(0,C.useLayoutEffect)(()=>{let e=r;if(!e)return;let t=()=>{let t=Math.floor(e.getBoundingClientRect().width);n(e=>e===t?e:t)};if(t(),typeof ResizeObserver>`u`)return;let i=0,a=new ResizeObserver(()=>{cancelAnimationFrame(i),i=requestAnimationFrame(t)});return a.observe(e),()=>{cancelAnimationFrame(i),a.disconnect()}},[r]),t}function te(e,t){return e>0?Math.max(112,Math.min(t,Math.floor(e))):t}function D(e){return e===`danger`?g(`danger`):e===`warn`?g(`warning`):_}function O({title:e,description:t,caveat:n,status:r,value:i,warnAt:l=.7,dangerAt:f=.9,marker:h,caption:g,size:_=180,formatValue:v=e=>a(e),showState:y=!0}){let b=(0,C.useId)(),O=x((0,C.useId)()),k=(0,C.useRef)(null),A=te(ee(k),_),j=y?d(i,l,f):i===null?`unknown`:`ok`,M=Math.max(10,Math.round(A/12)),N=A/2-M/2-2,P=A/2,F=A/2,I=A/2+M/2+4,L=i===null?`unknown`:v(i),R=i===null?`${e}: unknown`:y?`${e}: ${L}, ${E[j]}`:`${e}: ${L}`,z=[{key:`value`,label:`Used`,value:L},...y?[{key:`state`,label:`State`,value:E[j]},{key:`warn`,label:`Warning at`,value:v(l)},{key:`danger`,label:`Limit at`,value:v(f)}]:[],...h?[{key:`marker`,label:h.label,value:v(h.value)}]:[]],B=[{key:`label`,label:`Measure`,render:e=>e.label},{key:`value`,label:`Value`,numeric:!0,render:e=>e.value}],V=h?u(P,F,N+M/2+3,Math.PI*(1-Math.min(1,Math.max(0,h.value)))):null,H=h?u(P,F,N-M/2-3,Math.PI*(1-Math.min(1,Math.max(0,h.value)))):null;return(0,T.jsx)(p,{title:e,description:t,caveat:n,status:r??{kind:`ready`},table:(0,T.jsx)(s,{caption:e,columns:B,rows:z,rowKey:e=>e.key}),children:(0,T.jsx)(`div`,{ref:k,className:w.fit,children:(0,T.jsxs)(`div`,{className:w.gauge,role:`meter`,"aria-label":e,"aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":i===null?void 0:Math.min(1,Math.max(0,i)),"aria-valuetext":R,"aria-describedby":g?b:void 0,"data-severity":j,children:[(0,T.jsxs)(`svg`,{className:m.svg,width:A,height:I,viewBox:`0 0 ${A} ${I}`,"aria-hidden":`true`,children:[(0,T.jsx)(`defs`,{children:(0,T.jsx)(o,{id:O})}),(0,T.jsx)(`path`,{"data-role":`track`,d:c(P,F,N,0,1),fill:`none`,stroke:i===null?`url(#${O})`:S,strokeWidth:M,strokeLinecap:`round`}),i!==null&&i>0?(0,T.jsx)(`path`,{"data-role":`fill`,d:c(P,F,N,0,Math.min(1,i)),fill:`none`,stroke:D(j),strokeWidth:M,strokeLinecap:`round`}):null,V&&H?(0,T.jsx)(`line`,{"data-role":`marker`,x1:H.x,y1:H.y,x2:V.x,y2:V.y,stroke:`var(--text-primary)`,strokeWidth:2,strokeLinecap:`round`}):null]}),(0,T.jsxs)(`div`,{className:w.readout,children:[(0,T.jsx)(`span`,{className:i===null?w.unknownValue:w.value,children:L}),y&&j!==`unknown`?(0,T.jsx)(`span`,{className:w.state,children:E[j]}):null,g?(0,T.jsx)(`span`,{id:b,className:w.caption,children:g}):null,h?(0,T.jsxs)(`span`,{className:w.caption,children:[h.label,`: `,v(h.value)]}):null]})]})})})}var k={scroll:`_scroll_ifd4t_3`,focus:`_focus_ifd4t_8`,num:`_num_ifd4t_13`};function A(e,t,n){let r=(t,n)=>{let r=e[t]?.[n];return r==null||!Number.isFinite(r)?null:r},i=e=>{let t=e.filter(e=>e!==null);return t.length?t.reduce((e,t)=>e+t,0):null},a=Array.from({length:t},(e,t)=>i(Array.from({length:n},(e,n)=>r(t,n)))),o=Array.from({length:n},(e,n)=>i(Array.from({length:t},(e,t)=>r(t,n)))),s=0;for(let e=0;e<t;e++)for(let t=0;t<n;t++)s=Math.max(s,r(e,t)??0);return{rows:a,columns:o,max:s,grand:i(a)}}var j=26,M=40,N=2,P=22,F=56;function I({title:e,description:t,caveat:n,status:a,rows:c,columns:u,values:d,unit:g=``,formatValue:_=i,showTotals:S=!0,defaultView:w,actions:E,width:ee,ariaLabel:te}){let D=(0,C.useRef)(null),O=f(D,ee),[I,L]=(0,C.useState)(null),R=(0,C.useId)(),z=x((0,C.useId)()),B=g?` ${g}`:``,V=A(d,c.length,u.length),H=V.grand!==null,ne=a??(c.length===0||u.length===0?{kind:`empty`}:H?{kind:`ready`}:{kind:`unknown`,reason:`no cell in this matrix was measured.`}),U=Math.max(72,Math.min(150,Math.round(O*.24))),re=S?74:0,W=S?M*.6:0,ie=O-U-re,G=Math.max(P,Math.min(112,Math.floor(ie/Math.max(1,u.length))-N)),K=Math.max(P,Math.min(F,30)),q=U,J=W+j,Y=q+u.length*(G+N)+re,ae=J+c.length*32,oe=Math.max(1,...V.rows.map(e=>e??0)),se=Math.max(1,...V.columns.map(e=>e??0)),ce=G>=28,le=Math.floor(U/7),X=(e,t)=>{let n=d[e]?.[t];return n==null||!Number.isFinite(n)?null:n},ue=e=>e===null?`url(#${z})`:e<=0?b(0):v(V.max>0?e/V.max:0),de=(e,t)=>{let n=X(e,t);return`${c[e].label} × ${u[t].label}: ${n===null?`not measured`:`${_(n)}${B}`}`};function fe(e){if(c.length===0||u.length===0)return;let t=I??{r:0,c:0},n=null;e.key===`ArrowRight`?n={r:t.r,c:t.c+1}:e.key===`ArrowLeft`?n={r:t.r,c:t.c-1}:e.key===`ArrowDown`?n={r:t.r+1,c:t.c}:e.key===`ArrowUp`?n={r:t.r-1,c:t.c}:e.key===`Home`?n={r:t.r,c:0}:e.key===`End`&&(n={r:t.r,c:u.length-1}),n&&(e.preventDefault(),L({r:Math.max(0,Math.min(c.length-1,n.r)),c:Math.max(0,Math.min(u.length-1,n.c))}))}let Z=null;for(let e=0;e<c.length;e++)for(let t=0;t<u.length;t++){let n=X(e,t);n!==null&&(!Z||n>Z.v)&&(Z={r:e,c:t,v:n})}let Q=c.length*u.length-d.flat().filter(e=>e!=null).length,pe=te??`${e}: ${c.length} × ${u.length} grid, ${V.grand===null?`nothing measured`:`${_(V.grand)}${B} in total`}`+(Z&&Z.v>0?`; most in ${c[Z.r].label} × ${u[Z.c].label} (${_(Z.v)})`:``)+(Q>0?`; ${Q} cell${Q===1?``:`s`} not measured`:``)+`.`,me=c.map((e,t)=>({id:e.id,label:e.label,index:t})),he=[{key:`__row`,label:``,render:e=>e.label},...u.map((e,t)=>({key:e.id,label:e.label,numeric:!0,render:e=>{let n=X(e.index,t);return n===null?`—`:_(n)}})),{key:`__total`,label:`Total`,numeric:!0,render:e=>V.rows[e.index]===null?`—`:_(V.rows[e.index])}],$=I;return(0,T.jsx)(p,{title:e,description:t,caveat:n,status:ne,defaultView:w,actions:E,table:(0,T.jsx)(s,{caption:e,columns:he,rows:me,rowKey:e=>e.id}),footer:(0,T.jsxs)(`div`,{className:m.legend,"aria-hidden":`true`,children:[(0,T.jsx)(`span`,{className:m.legendItem,children:`0`}),[0,1,2,3,4].map(e=>(0,T.jsx)(`span`,{className:m.swatch,style:{background:e===0?b(0):v(e/4)}},e)),(0,T.jsx)(`span`,{className:m.legendItem,children:V.max>0?_(V.max):`more`}),Q>0?(0,T.jsxs)(`span`,{className:m.legendItem,children:[(0,T.jsx)(`span`,{className:m.swatchHatch}),`not measured`]}):null]}),children:(0,T.jsxs)(`div`,{ref:D,className:`${m.plotWrap} ${m.focusable} ${k.scroll}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the arrow keys to move between cells.`,"aria-describedby":R,onFocus:()=>L(e=>e??{r:0,c:0}),onBlur:()=>L(null),onKeyDown:fe,children:[(0,T.jsxs)(`svg`,{className:m.svg,width:Y,height:ae,viewBox:`0 0 ${Y} ${ae}`,role:`img`,"aria-label":pe,children:[(0,T.jsx)(`defs`,{children:(0,T.jsx)(o,{id:z})}),S?u.map((e,t)=>{let n=V.columns[t]??null,r=n===null?0:Math.max(n>0?2:0,n/se*(W-4)),i=q+t*(G+N);return(0,T.jsx)(`g`,{"data-col-total":e.id,children:n===null?null:(0,T.jsx)(`rect`,{x:i+G*.2,y:W-r,width:G*.6,height:r,rx:2,fill:y})},`ct-${e.id}`)}):null,u.map((e,t)=>{let n=q+t*(G+N),r=Math.max(2,Math.floor((G-(e.engine?16:0))/7));return(0,T.jsxs)(`g`,{children:[e.engine?(0,T.jsx)(h,{engine:e.engine,x:n+2,y:W+5,height:14}):null,(0,T.jsx)(`text`,{className:m.label,x:n+(e.engine?18:G/2),y:W+j/2,dy:`0.32em`,textAnchor:e.engine?`start`:`middle`,children:e.label.length>r?`${e.label.slice(0,r-1)}…`:e.label})]},`ch-${e.id}`)}),c.map((e,t)=>{let n=J+t*32,r=V.rows[t]??null,i=r===null?0:Math.max(r>0?2:0,r/oe*M),a=q+u.length*(G+N)+6;return(0,T.jsxs)(`g`,{"data-row":e.id,children:[(0,T.jsx)(`text`,{className:m.label,x:U-8,y:n+K/2,dy:`0.32em`,textAnchor:`end`,children:e.label.length>le?`${e.label.slice(0,le-1)}…`:e.label}),u.map((r,i)=>{let a=X(t,i),o=q+i*(G+N),s=$?.r===t&&$.c===i;return(0,T.jsxs)(`g`,{children:[(0,T.jsx)(`rect`,{"data-cell":`${e.id}:${r.id}`,"data-value":a===null?`unknown`:a,className:`${a===null?m.unknownMark:``} ${s?k.focus:``}`,x:a===null?o+.5:o,y:a===null?n+.5:n,width:a===null?G-1:G,height:a===null?29:K,rx:3,fill:ue(a),onPointerEnter:()=>L({r:t,c:i}),onPointerLeave:()=>L(null)}),ce&&a!==null?(0,T.jsx)(`text`,{className:`${m.labelStrong} ${m.halo} ${k.num}`,x:o+G/2,y:n+K/2,dy:`0.32em`,textAnchor:`middle`,children:_(a)}):null]},r.id)}),S?(0,T.jsxs)(`g`,{"data-row-total":e.id,children:[r===null?null:(0,T.jsx)(`rect`,{x:a,y:n+K*.25,width:i,height:K*.5,rx:2,fill:y}),(0,T.jsx)(`text`,{className:m.tick,x:a+i+4,y:n+K/2,dy:`0.32em`,children:r===null?`—`:_(r)})]}):null]},e.id)})]}),(0,T.jsx)(`span`,{id:R,className:m.srOnly,"aria-live":`polite`,children:$?de($.r,$.c):``}),$?(0,T.jsx)(l,{left:r(q+$.c*(G+N)+G/2,Y,80),top:J+$.r*32,title:`${c[$.r].label} × ${u[$.c].label}`,rows:[{key:`v`,label:g||`Value`,value:X($.r,$.c)===null?null:_(X($.r,$.c))}]}):null]})})}export{O as n,I as t};
2
- //# sourceMappingURL=MatrixHeatmap-B_JWCjZx.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MatrixHeatmap-B_JWCjZx.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/Gauge.module.css","../../../../../../src/web-ui/components/charts/Gauge.tsx","../../../../../../src/web-ui/components/charts/MatrixHeatmap.module.css","../../../../../../src/web-ui/components/charts/MatrixHeatmap.tsx"],"sourcesContent":[".gauge {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--space-1);\n}\n\n.readout {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n margin-top: calc(-1 * var(--space-6));\n text-align: center;\n}\n\n/* Proportional figures for a standalone number (tabular only in columns). */\n.value {\n font-size: var(--text-2xl-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.unknownValue {\n font-size: var(--text-lg-size, var(--text-sm-size));\n font-weight: var(--font-weight-medium);\n color: var(--status-unknown-fg);\n}\n\n.state {\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n\n.gauge[data-severity='warn'] .state {\n color: var(--status-warning-fg);\n}\n\n.gauge[data-severity='danger'] .state {\n color: var(--status-danger-fg);\n}\n\n.caption {\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n\n/* V3.10: the measuring box — full card width, so the arc can size to it. */\n.fit {\n width: 100%;\n min-width: 0;\n display: flex;\n justify-content: center;\n}\n","/**\n * components/charts/Gauge.tsx — one fraction on a 180° arc: how much of a\n * window is used, how close a cap is. The fill carries SEVERITY (accent →\n * warning → danger at the thresholds) over a track that is a lighter step of\n * the same ramp; an optional marker shows a line that matters (e.g. the\n * reserve kept for interactive use). The number and a words-first state label\n * sit under the arc, so severity is never colour alone.\n *\n * Honesty: `null` is UNKNOWN — an empty track and \"unknown\", never 0%. Values\n * past 100% are drawn full and printed as they are (\"112%\").\n *\n * Semantics: role=\"meter\" with aria-valuenow/min/max/valuetext.\n */\nimport { useId, useLayoutEffect, useRef, useState } from 'react';\nimport { CHART_SEQUENTIAL, CHART_TRACK, hatchPatternId, toneColor } from './colors.js';\nimport { HatchPattern } from './ChartParts.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { gaugeArc, gaugeSeverity, polar, type GaugeSeverity } from './chart-math.js';\nimport { formatPercent } from './format.js';\nimport plot from './plot.module.css';\nimport styles from './Gauge.module.css';\n\nexport interface GaugeProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n /** Fraction used, 0..1 (may exceed 1). null = unknown. */\n value: number | null;\n /** Severity thresholds as fractions (defaults 0.7 / 0.9). */\n warnAt?: number;\n dangerAt?: number;\n /** A reference line on the arc, e.g. { value: 0.6, label: 'Autonomy cap' }. */\n marker?: { value: number; label: string };\n /** Words under the number, e.g. \"resets in 2h\". */\n caption?: string;\n /**\n * The LARGEST diameter in px (default 180). V3.10: the gauge fits its\n * container — two gauges side by side at 375 px each shrink (never below\n * MIN_GAUGE_SIZE) instead of widening the page.\n */\n size?: number;\n formatValue?: (fraction: number) => string;\n /**\n * Print the severity words (\"near the limit\"). Default true. Set false for\n * a fraction where higher is BETTER (a hit rate): the fill stays one\n * quantity hue and no limit language is used.\n */\n showState?: boolean;\n}\n\nconst SEVERITY_LABEL: Record<GaugeSeverity, string> = {\n ok: 'within limits',\n warn: 'near the limit',\n danger: 'at the limit',\n unknown: 'unknown',\n};\n\n/** Smallest diameter a gauge draws at; below it the readout would collide with the arc. */\nexport const MIN_GAUGE_SIZE = 112;\n\n/** The container's measured width (0 until laid out: jsdom, a hidden tab). */\nfunction useContainerWidth(ref: React.RefObject<HTMLElement | null>): number {\n const [width, setWidth] = useState(0);\n // Track the node: the gauge mounts after a loading frame (see useChartWidth).\n const [node, setNode] = useState<HTMLElement | null>(null);\n // Runs after every render on purpose (ref.current is not a dependency React\n // can see); the equality guard makes it settle in one pass, never a loop.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useLayoutEffect(() => {\n if (ref.current !== node) setNode(ref.current);\n });\n useLayoutEffect(() => {\n const el = node;\n if (!el) return undefined;\n const read = (): void => {\n const w = Math.floor(el.getBoundingClientRect().width);\n setWidth((prev) => (prev === w ? prev : w));\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 }, [node]);\n return width;\n}\n\n/** Diameter for a container: the largest that fits, clamped to [MIN_GAUGE_SIZE, max]. */\nexport function gaugeDiameter(containerWidth: number, max: number): number {\n if (!(containerWidth > 0)) return max;\n return Math.max(MIN_GAUGE_SIZE, Math.min(max, Math.floor(containerWidth)));\n}\n\nfunction severityColor(severity: GaugeSeverity): string {\n if (severity === 'danger') return toneColor('danger');\n if (severity === 'warn') return toneColor('warning');\n return CHART_SEQUENTIAL;\n}\n\ninterface Row {\n key: string;\n label: string;\n value: string;\n}\n\nexport function Gauge({\n title,\n description,\n caveat,\n status,\n value,\n warnAt = 0.7,\n dangerAt = 0.9,\n marker,\n caption,\n size: maxSize = 180,\n formatValue = (f) => formatPercent(f),\n showState = true,\n}: GaugeProps) {\n const captionId = useId();\n const hatchId = hatchPatternId(useId());\n const fitRef = useRef<HTMLDivElement>(null);\n const size = gaugeDiameter(useContainerWidth(fitRef), maxSize);\n const severity = showState ? gaugeSeverity(value, warnAt, dangerAt) : value === null ? 'unknown' : 'ok';\n const stroke = Math.max(10, Math.round(size / 12));\n const r = size / 2 - stroke / 2 - 2;\n const cx = size / 2;\n const cy = size / 2;\n const h = size / 2 + stroke / 2 + 4;\n const valueText = value === null ? 'unknown' : formatValue(value);\n const spoken = value === null ? `${title}: unknown` : showState ? `${title}: ${valueText}, ${SEVERITY_LABEL[severity]}` : `${title}: ${valueText}`;\n\n const rows: Row[] = [\n { key: 'value', label: 'Used', value: valueText },\n ...(showState\n ? [\n { key: 'state', label: 'State', value: SEVERITY_LABEL[severity] },\n { key: 'warn', label: 'Warning at', value: formatValue(warnAt) },\n { key: 'danger', label: 'Limit at', value: formatValue(dangerAt) },\n ]\n : []),\n ...(marker ? [{ key: 'marker', label: marker.label, value: formatValue(marker.value) }] : []),\n ];\n const columns: TableColumn<Row>[] = [\n { key: 'label', label: 'Measure', render: (row) => row.label },\n { key: 'value', label: 'Value', numeric: true, render: (row) => row.value },\n ];\n\n const markerOuter = marker ? polar(cx, cy, r + stroke / 2 + 3, Math.PI * (1 - Math.min(1, Math.max(0, marker.value)))) : null;\n const markerInner = marker ? polar(cx, cy, r - stroke / 2 - 3, Math.PI * (1 - Math.min(1, Math.max(0, marker.value)))) : null;\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={status ?? { kind: 'ready' }}\n table={<TableView caption={title} columns={columns} rows={rows} rowKey={(row) => row.key} />}\n >\n <div ref={fitRef} className={styles.fit}>\n <div\n className={styles.gauge}\n role=\"meter\"\n aria-label={title}\n aria-valuemin={0}\n aria-valuemax={1}\n aria-valuenow={value === null ? undefined : Math.min(1, Math.max(0, value))}\n aria-valuetext={spoken}\n aria-describedby={caption ? captionId : undefined}\n data-severity={severity}\n >\n <svg className={plot.svg} width={size} height={h} viewBox={`0 0 ${size} ${h}`} aria-hidden=\"true\">\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {/* Unknown: the track is hatched, not the pale ramp step a \"little\" value would get. */}\n <path\n data-role=\"track\"\n d={gaugeArc(cx, cy, r, 0, 1)}\n fill=\"none\"\n stroke={value === null ? `url(#${hatchId})` : CHART_TRACK}\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n />\n {value !== null && value > 0 ? (\n <path\n data-role=\"fill\"\n d={gaugeArc(cx, cy, r, 0, Math.min(1, value))}\n fill=\"none\"\n stroke={severityColor(severity)}\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n />\n ) : null}\n {markerOuter && markerInner ? (\n <line\n data-role=\"marker\"\n x1={markerInner.x}\n y1={markerInner.y}\n x2={markerOuter.x}\n y2={markerOuter.y}\n stroke=\"var(--text-primary)\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n />\n ) : null}\n </svg>\n <div className={styles.readout}>\n <span className={value === null ? styles.unknownValue : styles.value}>{valueText}</span>\n {showState && severity !== 'unknown' ? <span className={styles.state}>{SEVERITY_LABEL[severity]}</span> : null}\n {caption ? <span id={captionId} className={styles.caption}>{caption}</span> : null}\n {marker ? <span className={styles.caption}>{marker.label}: {formatValue(marker.value)}</span> : null}\n </div>\n </div>\n </div>\n </ChartFrame>\n );\n}\n","/* MatrixHeatmap — horizontal scroll when a wide matrix meets a narrow card,\n the focused-cell ring, and in-cell numbers. Tokens only. */\n.scroll {\n overflow-x: auto;\n overscroll-behavior-x: contain;\n}\n\n.focus {\n stroke: var(--border-focus);\n stroke-width: 2;\n}\n\n.num {\n font-variant-numeric: tabular-nums;\n pointer-events: none;\n}\n","/**\n * components/charts/MatrixHeatmap.tsx — a rows × columns grid of counts\n * (V3.10, SPEC-310C §5 Mind: insight KIND × ENGINE, faceted per repo;\n * r5/visual.md §2 \"MatrixHeatmap\").\n *\n * Encoding, one meaning per mark:\n * - a KNOWN value is a step of the fixed azure quantity ramp\n * (colors.ts quantityColor) — a TRUE ZERO is the faint heat-0 cell;\n * - an UNKNOWN value (null: nothing was measured for that cell, e.g. an\n * engine with no recorded reasoning) is the 45° unknown hatch with an\n * outline — never the palest step, which would claim \"a little\";\n * - row and column TOTALS sit in the margins as bars (right and top), so\n * \"which kind dominates\" reads without adding cells in your head.\n * A column may carry an engine: its header gets the 2px tick + monogram.\n *\n * Keyboard: the grid is one tab stop; arrows move a cell, Home/End jump\n * along the row; the focused cell is announced. The Table view has every\n * cell and both totals. At 375 px callers usually start on the table\n * (`defaultView=\"table\"`, SPEC-310C §5 \"Mind's matrix shows as a table\").\n */\nimport { useId, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { CHART_SEQUENTIAL_SOFT, hatchPatternId, heatColor, quantityColor, type ChartEngine } from './colors.js';\nimport { ChartFrame, type ChartStatus, type ChartView } from './ChartFrame.js';\nimport { ChartTooltip, EngineTick, HatchPattern, clampTooltipLeft } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { formatCompact } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport plot from './plot.module.css';\nimport styles from './MatrixHeatmap.module.css';\n\nexport interface MatrixAxisItem {\n id: string;\n label: string;\n /** Column-only: the engine this column stands for (tick + monogram in the header). */\n engine?: ChartEngine;\n}\n\nexport interface MatrixHeatmapProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n rows: MatrixAxisItem[];\n columns: MatrixAxisItem[];\n /** values[rowIndex][columnIndex]; null = not measured. */\n values: ReadonlyArray<ReadonlyArray<number | null>>;\n /** Unit word for spoken text and the table (\"insights\"). */\n unit?: string;\n formatValue?: (v: number) => string;\n /** Row / column totals as margin bars (default true). */\n showTotals?: boolean;\n defaultView?: ChartView;\n /** Extra header controls (e.g. the repo facet picker). */\n actions?: ReactNode;\n width?: number;\n ariaLabel?: string;\n}\n\ninterface Totals {\n rows: (number | null)[];\n columns: (number | null)[];\n max: number;\n grand: number | null;\n}\n\n/** Sum known values; a line with NO known value has an unknown (null) total, never 0. */\nexport function matrixTotals(values: ReadonlyArray<ReadonlyArray<number | null>>, rows: number, columns: number): Totals {\n const cell = (r: number, c: number): number | null => {\n const v = values[r]?.[c];\n return v === undefined || v === null || !Number.isFinite(v) ? null : v;\n };\n const sum = (xs: (number | null)[]): number | null => {\n const known = xs.filter((x): x is number => x !== null);\n return known.length ? known.reduce((a, b) => a + b, 0) : null;\n };\n const rowTotals = Array.from({ length: rows }, (_, r) => sum(Array.from({ length: columns }, (_, c) => cell(r, c))));\n const colTotals = Array.from({ length: columns }, (_, c) => sum(Array.from({ length: rows }, (_, r) => cell(r, c))));\n let max = 0;\n for (let r = 0; r < rows; r++) for (let c = 0; c < columns; c++) max = Math.max(max, cell(r, c) ?? 0);\n return { rows: rowTotals, columns: colTotals, max, grand: sum(rowTotals) };\n}\n\nconst HEADER_H = 26;\nconst MARGIN_BAR = 40;\nconst GAP = 2;\nconst MIN_CELL = 22;\nconst MAX_CELL = 56;\n\nexport function MatrixHeatmap({\n title,\n description,\n caveat,\n status,\n rows,\n columns,\n values,\n unit = '',\n formatValue = formatCompact,\n showTotals = true,\n defaultView,\n actions,\n width: fixedWidth,\n ariaLabel,\n}: MatrixHeatmapProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const [focus, setFocus] = useState<{ r: number; c: number } | null>(null);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const unitText = unit ? ` ${unit}` : '';\n\n const totals = matrixTotals(values, rows.length, columns.length);\n const anyKnown = totals.grand !== null;\n const resolvedStatus: ChartStatus = status ?? (rows.length === 0 || columns.length === 0\n ? { kind: 'empty' }\n : anyKnown ? { kind: 'ready' } : { kind: 'unknown', reason: 'no cell in this matrix was measured.' });\n\n const labelW = Math.max(72, Math.min(150, Math.round(width * 0.24)));\n const marginRight = showTotals ? MARGIN_BAR + 34 : 0;\n const marginTop = showTotals ? MARGIN_BAR * 0.6 : 0;\n const avail = width - labelW - marginRight;\n const cellW = Math.max(MIN_CELL, Math.min(MAX_CELL * 2, Math.floor(avail / Math.max(1, columns.length)) - GAP));\n const cellH = Math.max(MIN_CELL, Math.min(MAX_CELL, 30));\n const gridX = labelW;\n const gridY = marginTop + HEADER_H;\n const svgW = gridX + columns.length * (cellW + GAP) + marginRight;\n const svgH = gridY + rows.length * (cellH + GAP);\n const rowTotalMax = Math.max(1, ...totals.rows.map((t) => t ?? 0));\n const colTotalMax = Math.max(1, ...totals.columns.map((t) => t ?? 0));\n const showNumbers = cellW >= 28;\n const labelChars = Math.floor(labelW / 7);\n\n const cellValue = (r: number, c: number): number | null => {\n const v = values[r]?.[c];\n return v === undefined || v === null || !Number.isFinite(v) ? null : v;\n };\n const fill = (v: number | null): string => (v === null ? `url(#${hatchId})` : v <= 0 ? heatColor(0) : quantityColor(totals.max > 0 ? v / totals.max : 0));\n const describe = (r: number, c: number): string => {\n const v = cellValue(r, c);\n return `${rows[r]!.label} × ${columns[c]!.label}: ${v === null ? 'not measured' : `${formatValue(v)}${unitText}`}`;\n };\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (rows.length === 0 || columns.length === 0) return;\n const cur = focus ?? { r: 0, c: 0 };\n let next: { r: number; c: number } | null = null;\n if (e.key === 'ArrowRight') next = { r: cur.r, c: cur.c + 1 };\n else if (e.key === 'ArrowLeft') next = { r: cur.r, c: cur.c - 1 };\n else if (e.key === 'ArrowDown') next = { r: cur.r + 1, c: cur.c };\n else if (e.key === 'ArrowUp') next = { r: cur.r - 1, c: cur.c };\n else if (e.key === 'Home') next = { r: cur.r, c: 0 };\n else if (e.key === 'End') next = { r: cur.r, c: columns.length - 1 };\n if (!next) return;\n e.preventDefault();\n setFocus({ r: Math.max(0, Math.min(rows.length - 1, next.r)), c: Math.max(0, Math.min(columns.length - 1, next.c)) });\n }\n\n let peak: { r: number; c: number; v: number } | null = null;\n for (let r = 0; r < rows.length; r++) for (let c = 0; c < columns.length; c++) {\n const v = cellValue(r, c);\n if (v !== null && (!peak || v > peak.v)) peak = { r, c, v };\n }\n const unknownCells = rows.length * columns.length - values.flat().filter((v) => v !== null && v !== undefined).length;\n const summary = ariaLabel ?? `${title}: ${rows.length} × ${columns.length} grid, ${totals.grand === null ? 'nothing measured' : `${formatValue(totals.grand)}${unitText} in total`}` +\n (peak && peak.v > 0 ? `; most in ${rows[peak.r]!.label} × ${columns[peak.c]!.label} (${formatValue(peak.v)})` : '') +\n (unknownCells > 0 ? `; ${unknownCells} cell${unknownCells === 1 ? '' : 's'} not measured` : '') + '.';\n\n interface TableRow { id: string; label: string; index: number }\n const tableRows: TableRow[] = rows.map((r, index) => ({ id: r.id, label: r.label, index }));\n const tableColumns: TableColumn<TableRow>[] = [\n { key: '__row', label: '', render: (r) => r.label },\n ...columns.map((c, ci) => ({\n key: c.id,\n label: c.label,\n numeric: true,\n render: (r: TableRow) => {\n const v = cellValue(r.index, ci);\n return v === null ? '—' : formatValue(v);\n },\n })),\n { key: '__total', label: 'Total', numeric: true, render: (r) => (totals.rows[r.index] === null ? '—' : formatValue(totals.rows[r.index]!)) },\n ];\n\n const focusCell = focus;\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n defaultView={defaultView}\n actions={actions}\n table={<TableView caption={title} columns={tableColumns} rows={tableRows} rowKey={(r) => r.id} />}\n footer={\n <div className={plot.legend} aria-hidden=\"true\">\n <span className={plot.legendItem}>0</span>\n {[0, 1, 2, 3, 4].map((i) => (\n <span key={i} className={plot.swatch} style={{ background: i === 0 ? heatColor(0) : quantityColor(i / 4) }} />\n ))}\n <span className={plot.legendItem}>{totals.max > 0 ? formatValue(totals.max) : 'more'}</span>\n {unknownCells > 0 ? (\n <span className={plot.legendItem}>\n <span className={plot.swatchHatch} />\n not measured\n </span>\n ) : null}\n </div>\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable} ${styles.scroll}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the arrow keys to move between cells.`}\n aria-describedby={liveId}\n onFocus={() => setFocus((f) => f ?? { r: 0, c: 0 })}\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 {/* Column totals (top margin) */}\n {showTotals\n ? columns.map((c, ci) => {\n const t = totals.columns[ci] ?? null;\n const h = t === null ? 0 : Math.max(t > 0 ? 2 : 0, (t / colTotalMax) * (marginTop - 4));\n const x = gridX + ci * (cellW + GAP);\n return (\n <g key={`ct-${c.id}`} data-col-total={c.id}>\n {t === null ? null : <rect x={x + cellW * 0.2} y={marginTop - h} width={cellW * 0.6} height={h} rx={2} fill={CHART_SEQUENTIAL_SOFT} />}\n </g>\n );\n })\n : null}\n {/* Column headers */}\n {columns.map((c, ci) => {\n const x = gridX + ci * (cellW + GAP);\n const chars = Math.max(2, Math.floor((cellW - (c.engine ? 16 : 0)) / 7));\n return (\n <g key={`ch-${c.id}`}>\n {c.engine ? <EngineTick engine={c.engine} x={x + 2} y={marginTop + 5} height={HEADER_H - 12} /> : null}\n <text className={plot.label} x={x + (c.engine ? 18 : cellW / 2)} y={marginTop + HEADER_H / 2} dy=\"0.32em\" textAnchor={c.engine ? 'start' : 'middle'}>\n {c.label.length > chars ? `${c.label.slice(0, chars - 1)}…` : c.label}\n </text>\n </g>\n );\n })}\n {rows.map((row, ri) => {\n const y = gridY + ri * (cellH + GAP);\n const t = totals.rows[ri] ?? null;\n const barW = t === null ? 0 : Math.max(t > 0 ? 2 : 0, (t / rowTotalMax) * MARGIN_BAR);\n const barX = gridX + columns.length * (cellW + GAP) + 6;\n return (\n <g key={row.id} data-row={row.id}>\n <text className={plot.label} x={labelW - 8} y={y + cellH / 2} dy=\"0.32em\" textAnchor=\"end\">\n {row.label.length > labelChars ? `${row.label.slice(0, labelChars - 1)}…` : row.label}\n </text>\n {columns.map((col, ci) => {\n const v = cellValue(ri, ci);\n const x = gridX + ci * (cellW + GAP);\n const isFocus = focusCell?.r === ri && focusCell.c === ci;\n return (\n <g key={col.id}>\n <rect\n data-cell={`${row.id}:${col.id}`}\n data-value={v === null ? 'unknown' : v}\n className={`${v === null ? plot.unknownMark : ''} ${isFocus ? styles.focus : ''}`}\n x={v === null ? x + 0.5 : x}\n y={v === null ? y + 0.5 : y}\n width={v === null ? cellW - 1 : cellW}\n height={v === null ? cellH - 1 : cellH}\n rx={3}\n fill={fill(v)}\n onPointerEnter={() => setFocus({ r: ri, c: ci })}\n onPointerLeave={() => setFocus(null)}\n />\n {showNumbers && v !== null ? (\n <text className={`${plot.labelStrong} ${plot.halo} ${styles.num}`} x={x + cellW / 2} y={y + cellH / 2} dy=\"0.32em\" textAnchor=\"middle\">\n {formatValue(v)}\n </text>\n ) : null}\n </g>\n );\n })}\n {showTotals ? (\n <g data-row-total={row.id}>\n {t === null ? null : <rect x={barX} y={y + cellH * 0.25} width={barW} height={cellH * 0.5} rx={2} fill={CHART_SEQUENTIAL_SOFT} />}\n <text className={plot.tick} x={barX + barW + 4} y={y + cellH / 2} dy=\"0.32em\">\n {t === null ? '—' : formatValue(t)}\n </text>\n </g>\n ) : null}\n </g>\n );\n })}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">\n {focusCell ? describe(focusCell.r, focusCell.c) : ''}\n </span>\n {focusCell ? (\n <ChartTooltip\n left={clampTooltipLeft(gridX + focusCell.c * (cellW + GAP) + cellW / 2, svgW, 80)}\n top={gridY + focusCell.r * (cellH + GAP)}\n title={`${rows[focusCell.r]!.label} × ${columns[focusCell.c]!.label}`}\n rows={[{ key: 'v', label: unit || 'Value', value: cellValue(focusCell.r, focusCell.c) === null ? null : formatValue(cellValue(focusCell.r, focusCell.c)!) }]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{n as e}from"./index-afDA8cwW.js";import{AppsSection as t}from"./AppsSection-CXxbfPJQ.js";var n=e();function r(){return(0,n.jsx)(t,{focusGroup:`mcp-servers`})}export{r as McpSection};
2
- //# sourceMappingURL=McpSection-1UncWBpW.js.map
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MessageMarkdownRenderer-CZsF77ZM.js","assets/index-afDA8cwW.js"])))=>i.map(i=>d[i]);
2
- import{a as e,n as t,s as n,t as r}from"./index-afDA8cwW.js";var i=n(e(),1),a={transcriptWrap:`_transcriptWrap_yrgz2_5`,scrollArea:`_scrollArea_yrgz2_7`,transcript:`_transcript_yrgz2_5`,list:`_list_yrgz2_20`,item:`_item_yrgz2_30`,skeleton:`_skeleton_yrgz2_32`,skeletonUser:`_skeletonUser_yrgz2_44`,loadError:`_loadError_yrgz2_45`,empty:`_empty_yrgz2_68`,emptyTitle:`_emptyTitle_yrgz2_69`,emptyBody:`_emptyBody_yrgz2_78`,user:`_user_yrgz2_81`,userText:`_userText_yrgz2_82`,assistant:`_assistant_yrgz2_93`,markdown:`_markdown_yrgz2_37`,codeHead:`_codeHead_yrgz2_188`,codeLang:`_codeLang_yrgz2_205`,copy:`_copy_yrgz2_204`,streaming:`_streaming_yrgz2_231`,"verse-caret":`_verse-caret_yrgz2_1`,tool:`_tool_yrgz2_245`,toolRun:`_toolRun_yrgz2_246`,toolLine:`_toolLine_yrgz2_248`,toolArg:`_toolArg_yrgz2_266`,toolState:`_toolState_yrgz2_266`,toolGlyph:`_toolGlyph_yrgz2_277`,toolName:`_toolName_yrgz2_287`,toolFailed:`_toolFailed_yrgz2_311`,toolBody:`_toolBody_yrgz2_314`,toolRunBody:`_toolRunBody_yrgz2_315`,toolRunList:`_toolRunList_yrgz2_322`,toolLabel:`_toolLabel_yrgz2_324`,toolPre:`_toolPre_yrgz2_333`,toolPending:`_toolPending_yrgz2_348`,note:`_note_yrgz2_351`,noteError:`_noteError_yrgz2_357`,noteHint:`_noteHint_yrgz2_359`,noteRecovered:`_noteRecovered_yrgz2_367`,noteLead:`_noteLead_yrgz2_368`,meta:`_meta_yrgz2_369`,noteDuration:`_noteDuration_yrgz2_370`,metaText:`_metaText_yrgz2_374`,jump:`_jump_yrgz2_381`,jumpUnseen:`_jumpUnseen_yrgz2_404`,turn:`_turn_yrgz2_427`,turnSettled:`_turnSettled_yrgz2_449`,turnItems:`_turnItems_yrgz2_458`,"verse-flash":`_verse-flash_yrgz2_1`,turnErrorJump:`_turnErrorJump_yrgz2_494`,toolDelta:`_toolDelta_yrgz2_512`,toolAdd:`_toolAdd_yrgz2_520`,toolDel:`_toolDel_yrgz2_512`,toolNote:`_toolNote_yrgz2_523`,compaction:`_compaction_yrgz2_544`,compactionRule:`_compactionRule_yrgz2_549`,compactionText:`_compactionText_yrgz2_550`,compactionTitle:`_compactionTitle_yrgz2_558`,compactionNote:`_compactionNote_yrgz2_565`,continued:`_continued_yrgz2_568`,continuedLabel:`_continuedLabel_yrgz2_576`,continuedTitle:`_continuedTitle_yrgz2_577`,continuedLink:`_continuedLink_yrgz2_578`},o=t(),s=null,c=null;function l(){return c??=r(()=>import(`./MessageMarkdownRenderer-CZsF77ZM.js`).then(e=>s=e,e=>{throw c=null,e}),__vite__mapDeps([0,1])),c}typeof window<`u`&&l().catch(()=>void 0);function u(){let[e,t]=(0,i.useState)(s);return(0,i.useEffect)(()=>{if(e)return;let n=!0;return l().then(e=>{n&&t(e)},()=>void 0),()=>{n=!1}},[e]),e}function d({text:e}){return(0,o.jsx)(`div`,{className:a.markdown,"data-markdown-pending":``,children:(0,o.jsx)(`p`,{style:{whiteSpace:`pre-wrap`},children:e})})}var f=(0,i.memo)(function({text:e,streaming:t=!1}){let n=u();return n?(0,o.jsx)(n.RenderedMarkdown,{text:e,streaming:t}):(0,o.jsx)(d,{text:e})});export{a as n,f as t};
3
- //# sourceMappingURL=MessageMarkdown-C4pl9LI5.js.map
@@ -1 +0,0 @@
1
- ._transcriptWrap_yrgz2_5,._scrollArea_yrgz2_7{flex-direction:column;flex:1;min-height:0;display:flex;position:relative}@media (min-width:768px){._transcript_yrgz2_5[data-has-rail]{padding-right:calc(var(--space-6) + var(--space-8))}}._transcript_yrgz2_5{min-height:0;padding:var(--space-8) var(--space-6) var(--space-6);scrollbar-gutter:stable;scroll-behavior:smooth;flex:1;overflow-y:auto}._list_yrgz2_20{gap:var(--space-6);width:100%;max-width:var(--measure-read);flex-direction:column;margin:0 auto;padding:0;list-style:none;display:flex}._item_yrgz2_30{min-width:0}._skeleton_yrgz2_32{max-width:var(--measure-read);gap:calc(var(--text-base-line-relaxed) - var(--text-base-line));flex-direction:column;margin:0 auto;display:flex}._skeletonUser_yrgz2_44{margin-block:var(--space-2);padding-left:var(--space-4)}._loadError_yrgz2_45{gap:var(--space-3);max-width:var(--measure-read);margin:var(--space-8) auto 0;padding-left:var(--space-4);border-left:2px solid var(--status-danger-solid);color:var(--text-secondary);font-size:var(--text-sm-size);justify-items:start;display:grid}._loadError_yrgz2_45 button{min-height:var(--control-h-sm);padding:0 var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--text-primary);font-size:var(--text-xs-size);transition:background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard)}._loadError_yrgz2_45 button:hover{background:var(--bg-hover);border-color:var(--border-strong)}._loadError_yrgz2_45 button:active{background:var(--bg-active)}._empty_yrgz2_68{max-width:var(--measure-read);color:var(--text-secondary);margin:clamp(24px,12vh,120px) auto 0}._emptyTitle_yrgz2_69{font-family:var(--font-display);font-size:var(--text-xl-size);line-height:var(--text-xl-line);font-weight:var(--font-weight-medium);letter-spacing:var(--tracking-display,-.02em);color:var(--text-primary);margin-bottom:var(--space-2)}._emptyBody_yrgz2_78{font-size:var(--text-sm-size);line-height:var(--text-sm-line);max-width:52ch}._user_yrgz2_81{display:block}._userText_yrgz2_82{padding-left:var(--space-4);border-left:2px solid var(--border-strong);color:var(--text-secondary);white-space:pre-wrap;overflow-wrap:anywhere;font-size:var(--text-base-size);line-height:var(--text-base-line-relaxed)}._assistant_yrgz2_93{display:block}._markdown_yrgz2_37{color:var(--text-primary);font-size:var(--text-base-size);line-height:var(--text-base-line-relaxed);overflow-wrap:anywhere}._markdown_yrgz2_37>*+*{margin-top:var(--space-4)}._markdown_yrgz2_37 p{margin:0}._markdown_yrgz2_37 h1,._markdown_yrgz2_37 h2,._markdown_yrgz2_37 h3,._markdown_yrgz2_37 h4{font-family:var(--font-display);letter-spacing:var(--tracking-display,-.02em);font-weight:var(--font-weight-semibold);margin-top:var(--space-6);margin-bottom:calc(-1 * var(--space-1))}._markdown_yrgz2_37 h1{font-size:var(--text-xl-size);line-height:var(--text-xl-line)}._markdown_yrgz2_37 h2{font-size:var(--text-lg-size);line-height:var(--text-lg-line)}._markdown_yrgz2_37 h3{font-size:var(--text-md-size);line-height:var(--text-md-line)}._markdown_yrgz2_37 h4{font-size:var(--text-base-size);font-weight:var(--font-weight-medium)}._markdown_yrgz2_37 ul,._markdown_yrgz2_37 ol{margin-block:0;padding-left:1.5em}._markdown_yrgz2_37 ul{list-style:outside}._markdown_yrgz2_37 ol{list-style:decimal}._markdown_yrgz2_37 ul ul{list-style:circle}._markdown_yrgz2_37 li{padding-left:.15em}._markdown_yrgz2_37 li::marker{color:var(--text-tertiary)}._markdown_yrgz2_37 li+li,._markdown_yrgz2_37 li>ul,._markdown_yrgz2_37 li>ol{margin-top:var(--space-2)}._markdown_yrgz2_37 a{color:var(--text-link);text-underline-offset:2px;text-decoration:underline}._markdown_yrgz2_37 blockquote{padding-left:var(--space-4);border-left:2px solid var(--border-strong);color:var(--text-secondary);margin:0}._markdown_yrgz2_37 hr{border:0;border-top:1px solid var(--border-subtle);margin-block:var(--space-6)}._markdown_yrgz2_37 table{border-collapse:collapse;font-size:var(--text-sm-size);max-width:100%;display:block;overflow-x:auto}._markdown_yrgz2_37 th,._markdown_yrgz2_37 td{padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--border-subtle);text-align:left;vertical-align:top}._markdown_yrgz2_37 th{border-bottom-color:var(--border-default);font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary)}._markdown_yrgz2_37 tr:last-child td{border-bottom:0}._markdown_yrgz2_37 img{border-radius:var(--radius-xs)}._markdown_yrgz2_37 code{font-family:var(--font-mono);background:var(--bg-code);border-radius:var(--radius-xs);padding:.1em .3em;font-size:.92em}._markdown_yrgz2_37 pre{padding:var(--space-4);padding-top:var(--control-h-xs);border:1px solid var(--border-subtle);border-radius:var(--radius-sm);background:var(--bg-code);font-size:var(--text-sm-size);line-height:var(--text-sm-line-relaxed);tab-size:2;margin:0;position:relative;overflow-x:auto}._markdown_yrgz2_37 pre code{font-size:inherit;white-space:pre;background:0 0;padding:0}._codeHead_yrgz2_188{justify-content:space-between;align-items:center;gap:var(--space-2);height:var(--control-h-xs);padding:0 var(--space-2) 0 var(--space-4);pointer-events:none;display:flex;position:absolute;top:0;left:0;right:0}._codeLang_yrgz2_205{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-secondary)}._copy_yrgz2_204{pointer-events:auto;min-height:calc(var(--control-h-xs) - var(--space-1));padding:0 var(--space-2);border-radius:var(--radius-xs);color:var(--text-secondary);font-family:var(--font-ui);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-medium);opacity:0;transition:opacity var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard)}._markdown_yrgz2_37 pre:hover ._copy_yrgz2_204,._copy_yrgz2_204:focus-visible{opacity:1}._copy_yrgz2_204:hover{color:var(--text-primary);background:var(--bg-hover)}._copy_yrgz2_204:active{background:var(--bg-active)}._streaming_yrgz2_231>:last-child:after{content:"";vertical-align:-.15em;background:var(--accent-500);width:2px;height:1em;animation:_verse-caret_yrgz2_1 1.2s var(--ease-standard) infinite;margin-left:2px;display:inline-block}._tool_yrgz2_245,._toolRun_yrgz2_246{font-size:var(--text-sm-size)}._toolLine_yrgz2_248{align-items:center;gap:var(--space-2);min-height:var(--density-row-sm);padding-left:var(--space-3);border-left:2px solid var(--border-subtle);cursor:pointer;color:var(--text-tertiary);grid-template-columns:12px auto minmax(0,1fr) auto;list-style:none;display:grid}._toolLine_yrgz2_248::-webkit-details-marker{display:none}._toolLine_yrgz2_248{transition:color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard)}._toolLine_yrgz2_248:hover{color:var(--text-secondary);background:var(--bg-hover)}._toolLine_yrgz2_248:active{background:var(--bg-active)}._toolLine_yrgz2_248:hover ._toolArg_yrgz2_266,._toolLine_yrgz2_248:hover ._toolState_yrgz2_266,._toolLine_yrgz2_248:active ._toolArg_yrgz2_266,._toolLine_yrgz2_248:active ._toolState_yrgz2_266{color:var(--text-secondary)}._toolGlyph_yrgz2_277{width:12px;height:12px;transition:transform var(--duration-fast) var(--ease-standard);border:1px solid;border-radius:2px}._tool_yrgz2_245[open]>._toolLine_yrgz2_248>._toolGlyph_yrgz2_277,._toolRun_yrgz2_246[open]>._toolLine_yrgz2_248>._toolGlyph_yrgz2_277{background:currentColor}._toolName_yrgz2_287{font-family:var(--font-mono);font-size:var(--text-xs-size);color:var(--text-secondary);white-space:nowrap}._toolArg_yrgz2_266{text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:var(--text-xs-size);color:var(--text-tertiary);overflow:hidden}._toolState_yrgz2_266{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-variant-numeric:tabular-nums;color:var(--text-tertiary);white-space:nowrap;justify-self:end}._toolFailed_yrgz2_311>._toolLine_yrgz2_248{border-left-color:var(--status-danger-solid)}._toolFailed_yrgz2_311>._toolLine_yrgz2_248>._toolState_yrgz2_266{color:var(--status-danger-fg)}._toolBody_yrgz2_314,._toolRunBody_yrgz2_315{gap:var(--space-3);margin-top:var(--space-2);padding-left:var(--space-3);border-left:2px solid var(--border-subtle);display:grid}._toolRunList_yrgz2_322{gap:var(--space-2);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}._toolRunList_yrgz2_322>li{min-width:0}._toolLabel_yrgz2_324{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary);margin-bottom:var(--space-1)}._toolPre_yrgz2_333{max-height:360px;padding:var(--space-3);border:1px solid var(--border-subtle);border-radius:var(--radius-xs);background:var(--bg-code);font-family:var(--font-mono);font-size:var(--text-xs-size);line-height:var(--text-xs-line-relaxed);white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text-primary);margin:0;overflow:auto}._toolPending_yrgz2_348{color:var(--text-tertiary);font-size:var(--text-xs-size)}._note_yrgz2_351{padding-left:var(--space-4);border-left:2px solid var(--border-subtle);color:var(--text-tertiary);font-size:var(--text-sm-size)}._noteError_yrgz2_357{border-left-color:var(--status-danger-solid);color:var(--status-danger-fg)}._noteHint_yrgz2_359{margin-top:var(--space-1);color:var(--text-secondary);font-size:var(--text-xs-size);line-height:var(--text-xs-line-relaxed);display:block}._noteRecovered_yrgz2_367{border-left-color:var(--status-info-solid);color:var(--text-secondary)}._noteLead_yrgz2_368{color:var(--status-info-fg);font-weight:var(--font-weight-medium)}._meta_yrgz2_369{padding-left:var(--space-4)}._noteDuration_yrgz2_370{font-family:var(--font-display);font-variant-numeric:tabular-nums}._metaText_yrgz2_374{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-variant-numeric:tabular-nums;color:var(--text-tertiary)}._jump_yrgz2_381{left:50%;bottom:var(--space-4);align-items:center;gap:var(--space-2);min-height:var(--control-h-sm);padding:0 var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-full);background:var(--bg-surface-raised);color:var(--text-secondary);font-size:var(--text-xs-size);font-weight:var(--font-weight-medium);box-shadow:var(--shadow-menu,var(--shadow-md));transition:color var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard);display:inline-flex;position:absolute;transform:translate(-50%)}._jump_yrgz2_381:hover{color:var(--text-primary);border-color:var(--border-strong)}._jump_yrgz2_381:active{background:var(--bg-active)}._jumpUnseen_yrgz2_404{border-color:var(--accent-500);color:var(--text-primary)}@keyframes _verse-caret_yrgz2_1{50%{opacity:.15}}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._transcript_yrgz2_5{scroll-behavior:auto}:root:not([data-motion=full]) ._streaming_yrgz2_231>:last-child:after{animation:none}}:root[data-motion=reduce] ._streaming_yrgz2_231>:last-child:after{animation:none}:root[data-motion=reduce] ._transcript_yrgz2_5{scroll-behavior:auto}@media (max-width:900px){._transcript_yrgz2_5{padding:var(--space-5) var(--space-4)}}._turn_yrgz2_427{min-width:0;scroll-margin-block:var(--space-6);border-radius:var(--radius-xs);display:block}._turnSettled_yrgz2_449{content-visibility:auto;contain-intrinsic-size:auto 320px}._turn_yrgz2_427:focus-visible{outline:2px solid var(--accent-500);outline-offset:var(--space-2);box-shadow:none}._turnItems_yrgz2_458{gap:var(--space-6);flex-direction:column;min-width:0;margin:0;padding:0;list-style:none;display:flex}._turn_yrgz2_427[data-match]{box-shadow:-2px 0 0 0 var(--text-tertiary)}._turn_yrgz2_427[data-match=active]{box-shadow:-2px 0 0 0 var(--accent-500)}._turn_yrgz2_427[data-flash],[data-flash]{animation:_verse-flash_yrgz2_1 1.4s var(--ease-standard) 1}@keyframes _verse-flash_yrgz2_1{0%,60%{background:var(--bg-selected)}to{background:0 0}}._turnErrorJump_yrgz2_494{margin-top:var(--space-3);min-height:var(--control-h-xs);padding:0 var(--space-2);border:0;border-left:2px solid var(--status-danger-solid);color:var(--status-danger-fg);font-size:var(--text-xs-size);cursor:pointer;transition:background var(--duration-fast) var(--ease-standard);background:0 0;align-items:center;display:inline-flex}._turnErrorJump_yrgz2_494:hover{background:var(--status-danger-bg)}._toolLine_yrgz2_248{grid-template-columns:12px auto minmax(0,1fr) auto auto}._toolDelta_yrgz2_512{gap:var(--space-2);font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-variant-numeric:tabular-nums;white-space:nowrap;display:inline-flex}._toolAdd_yrgz2_520{color:var(--status-success-fg)}._toolDel_yrgz2_512{color:var(--status-danger-fg)}._toolNote_yrgz2_523{margin-top:var(--space-2);color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:var(--text-xs-line-relaxed)}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._turn_yrgz2_427[data-flash],:root:not([data-motion=full]) [data-flash]{animation:none}}:root[data-motion=reduce] ._turn_yrgz2_427[data-flash],:root[data-motion=reduce] [data-flash]{animation:none}._compaction_yrgz2_544{align-items:center;gap:var(--space-3);display:flex}._compactionRule_yrgz2_549{min-width:var(--space-4);background:var(--border-subtle);flex:1;height:1px}._compactionText_yrgz2_550{text-align:center;flex-direction:column;flex:0 auto;align-items:center;gap:2px;display:flex}._compactionTitle_yrgz2_558{font-family:var(--font-display);font-size:var(--text-xs-size);font-variant-numeric:tabular-nums;font-weight:var(--font-weight-medium);color:var(--text-secondary)}._compactionNote_yrgz2_565{font-size:var(--text-2xs-size,11px);color:var(--text-tertiary)}._continued_yrgz2_568{max-width:var(--measure-read);margin:0 auto var(--space-6);padding-left:var(--space-4);border-left:2px solid var(--accent-500);color:var(--text-tertiary);font-size:var(--text-sm-size)}._continuedLabel_yrgz2_576{color:var(--text-tertiary)}._continuedTitle_yrgz2_577{color:var(--text-secondary);font-weight:var(--font-weight-medium)}._continuedLink_yrgz2_578{color:var(--text-primary);font-weight:var(--font-weight-medium);text-decoration:underline;-webkit-text-decoration-color:var(--border-strong);text-decoration-color:var(--border-strong);text-underline-offset:2px}._continuedLink_yrgz2_578:hover{-webkit-text-decoration-color:var(--accent-500);text-decoration-color:var(--accent-500)}
@@ -1,2 +0,0 @@
1
- import{a as e,n as t,s as n}from"./index-afDA8cwW.js";import{h as r,m as i}from"./global-DVgMguLr.js";import{t as a}from"./RefreshIndicator-CnhEovMZ.js";import{t as o}from"./AreaTrend-gUVXkfhf.js";import{n as s,t as c}from"./MatrixHeatmap-B_JWCjZx.js";import{n as l}from"./viewport-ZB86jdES.js";import{r as u}from"./section-visibility-CSrsTcwK.js";import{h as d}from"./VerseConsoleApp-bjARLPwN.js";import{l as f}from"./format-BNYWGJat.js";import{a as p,d as m,l as h}from"./surface-data-ZtCegYMQ.js";import{a as g,i as _,n as v,r as y,s as b,t as x}from"./mind.module-BzhAlg3e.js";import{n as S,t as C}from"./actions-Bszsdpms.js";import{a as w,i as T,n as E,r as D,t as O}from"./Surface-CiYOdNKQ.js";import{a as k,i as A,o as j,r as M,t as N}from"./LeaderCard-BuSDeATv.js";var P=n(e(),1),F=t(),I={hit:`✓`,miss:`✗`,pending:`…`,ungraded:`—`};function L(e){let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleDateString(`en-US`,{weekday:`short`,month:`short`,day:`numeric`}):`—`}function R({read:e,actions:t}){let n=e?.value??null,r=n?.timeline??[],i=n?.latest?.id??null,a=n?.latest?.actions.some(e=>k(n.actions.find(t=>t.id===e.id)??e))??!1;return(0,F.jsx)(O,{title:`Memos`,caption:n?`${r.length} in view · each move graded 7 days later`:void 0,children:e?n?r.length===0?(0,F.jsxs)(E,{children:[`No memos yet`,n.lastRun?` — last run: ${n.lastRun.reason??n.lastRun.outcome}`:``,`.`]}):(0,F.jsx)(`ol`,{className:x.timeline,children:r.map(e=>{let n=j(e),r=A(e.expectedDelta);return(0,F.jsxs)(`li`,{className:x.memo,"data-outcome":n,id:d(`memo-${e.id}`),children:[(0,F.jsx)(`span`,{className:x.memoDay,children:L(e.at)}),(0,F.jsx)(`span`,{className:x.mark,"data-outcome":n,"aria-hidden":`true`,children:I[n]}),(0,F.jsxs)(`div`,{className:x.memoBody,children:[(0,F.jsx)(`span`,{className:x.memoMove,children:e.move??(e.status===`ok`?`No move`:`No memo (${e.status.replace(/-/g,` `)})`)}),e.bottleneck?(0,F.jsxs)(`span`,{className:x.memoWhy,children:[`Bottleneck: `,e.bottleneck]}):null,(0,F.jsxs)(`span`,{className:x.memoMeta,children:[r?`Expected ${r}`:`No expected delta`,` · `,(0,F.jsx)(`span`,{"data-outcome":n,children:n===`hit`||n===`miss`?`${M[n]} (actual ${e.outcome?.actualDelta===null||e.outcome?.actualDelta===void 0?`—`:`${e.outcome.actualDelta>=0?`+`:``}${e.outcome.actualDelta}`})`:M[n]}),` · ${e.actionCount} action${e.actionCount===1?``:`s`}`]})]}),e.id===i&&a?(0,F.jsx)(`button`,{type:`button`,className:x.veto,"aria-label":`Veto the memo of ${L(e.at)}`,disabled:t.busy||t.readOnly,onClick:()=>t.act(()=>h({action:`veto-memo`,memoId:e.id}),`Veto the whole memo`,{confirm:{title:`Veto this memo?`,body:`Every applied action is undone exactly and every scheduled one is cancelled. The Leader records the veto.`,confirmLabel:`Veto memo`,destructive:!0}}),children:`Veto`}):null]},e.id)})}):(0,F.jsx)(E,{tone:`unknown`,children:e.reason??`The Leader did not answer.`}):(0,F.jsx)(`p`,{className:x.muted,"aria-busy":`true`,children:`Reading the Leader…`})})}function z({read:e}){let t=e?.value??null,n=t?.hitRate??null,r=(t?.standards??[]).filter(e=>e.retiredAt===null);return(0,F.jsxs)(`div`,{className:x.stack,children:[(0,F.jsx)(s,{title:`Leader hit rate`,description:n?`${n.hits} of ${n.graded} graded moves · ${n.windowDays} days`:void 0,status:e?t?void 0:{kind:`unknown`,reason:e.reason??`the Leader did not answer.`}:{kind:`loading`},value:n?.rate??null,showState:!1,caption:n&&n.rate===null?`nothing graded yet — moves are graded 7 days after they are made`:void 0,size:180}),(0,F.jsx)(O,{title:`Standards`,caption:t?`${r.length} in force`:void 0,children:t?r.length===0?(0,F.jsx)(E,{children:`No standards yet.`}):(0,F.jsx)(`ul`,{className:x.standards,children:r.map(e=>(0,F.jsxs)(`li`,{children:[(0,F.jsx)(`span`,{className:x.standardRule,children:e.rule}),(0,F.jsxs)(`span`,{className:x.standardMeta,children:[e.appliesTo,` · `,e.source===`mason`?`yours`:`Leader`,` · `,f(e.addedAt)]})]},e.id))}):(0,F.jsx)(E,{tone:`unknown`,children:e?.reason??`The Leader did not answer.`})})]})}var B={high:`High`,warn:`Worth a look`,info:`FYI`};function V({insights:e,reason:t,loading:n=!1}){return n?(0,F.jsx)(`p`,{className:x.muted,"aria-busy":`true`,children:`Reading the reasoning digest…`}):t===null?e.length===0?(0,F.jsx)(E,{children:`No loops, repeated failures or verification gaps in the last 30 days.`}):(0,F.jsx)(`ul`,{className:x.insights,"aria-label":`Reasoning insights`,children:e.map(e=>(0,F.jsxs)(`li`,{className:x.insight,"data-severity":e.severity,children:[(0,F.jsxs)(`span`,{className:x.insightKind,children:[(0,F.jsx)(T,{children:v[e.kind]}),(0,F.jsx)(`span`,{className:x.insightSeverity,"data-severity":e.severity,children:B[e.severity]})]}),(0,F.jsx)(`span`,{className:x.insightTitle,children:e.title}),(0,F.jsx)(`span`,{className:x.insightMeta,children:[e.repo,e.engine,`${e.count}×`,`last ${f(e.lastAt)}`].filter(Boolean).join(` · `)})]},e.id))}):(0,F.jsx)(E,{tone:`unknown`,children:t})}function H({read:e,actions:t}){let n=e?.value??null,r=n?.actions??[];return(0,F.jsx)(O,{title:`Action log`,caption:n?`Newest first · Veto runs the recorded inverse`:void 0,children:e?n?r.length===0?(0,F.jsx)(E,{children:`The Leader has not acted yet.`}):(0,F.jsx)(`ul`,{className:x.log,"aria-label":`Leader actions`,children:r.map(e=>(0,F.jsx)(N,{action:e,actions:t},e.id))}):(0,F.jsx)(E,{tone:`unknown`,children:e.reason??`The Leader did not answer.`}):(0,F.jsx)(`p`,{className:x.muted,"aria-busy":`true`,children:`Reading the action log…`})})}var U=6e4;function W(){let{compact:e}=l(),t=i(p),n=i(m,{freshMs:6e4}),s=r(p),f=r(m);u(()=>{s(),f()},U);let h=S(),v=(0,P.useId)(),T=n.data?.value??null,E=(0,P.useMemo)(()=>_(T),[T]),[k,A]=(0,P.useState)(null),j=k!==null&&E.includes(k)?k:null,M=(0,P.useMemo)(()=>y(T,j),[T,j]),N=b(T),I=g(T),L=(e,t)=>n.data?T?e?{kind:`ready`}:{kind:`empty`,message:t}:{kind:`unknown`,reason:n.data.reason??`the reasoning digest did not answer.`}:{kind:`loading`},B=T?T.totals.steps>0:!1;return(0,F.jsxs)(w,{title:`Mind`,actions:[t,n].some(e=>e.status===`refreshing`)?(0,F.jsx)(a,{}):null,lead:(0,F.jsx)(C,{actions:h}),children:[(0,F.jsx)(D,{span:8,children:(0,F.jsx)(R,{read:t.data,actions:h})}),(0,F.jsx)(D,{span:4,children:(0,F.jsx)(z,{read:t.data})}),(0,F.jsx)(D,{span:12,children:(0,F.jsx)(O,{title:`What the reasoning shows`,caption:T?`Last 30 days · ${T.totals.steps.toLocaleString(`en-US`)} reasoning steps across ${T.totals.sessions} sessions`:void 0,children:(0,F.jsx)(`div`,{id:d(`insights`),children:(0,F.jsx)(V,{insights:N,loading:!n.data,reason:!n.data||T?null:n.data.reason??`The reasoning digest did not answer.`})})})}),(0,F.jsx)(D,{span:8,children:(0,F.jsx)(c,{title:`Insights by kind and engine`,description:j?`In ${j}`:`All repos · 30 days`,status:L(B&&M.columns.length>0,`No reasoning was recorded in the last 30 days.`),rows:M.rows,columns:M.columns,values:M.values,unit:`insights`,defaultView:e?`table`:`chart`,actions:E.length>1?(0,F.jsxs)(`label`,{className:x.facet,htmlFor:v,children:[`Repo`,(0,F.jsxs)(`select`,{id:v,value:j??``,onChange:e=>A(e.target.value||null),children:[(0,F.jsx)(`option`,{value:``,children:`All`}),E.map(e=>(0,F.jsx)(`option`,{value:e,children:e},e))]})]}):null})}),(0,F.jsx)(D,{span:4,children:(0,F.jsx)(o,{title:`Struggles and wins`,description:`Per day · days with no reasoning are gaps`,status:L(B,`No reasoning was recorded in the last 30 days.`),series:I,height:200})}),(0,F.jsx)(D,{span:12,children:(0,F.jsx)(H,{read:t.data,actions:h})}),h.dialogs]})}export{U as MIND_POLL_MS,W as MindSection};
2
- //# sourceMappingURL=MindSection-C3fCw_fD.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MindSection-C3fCw_fD.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mind/MindCards.tsx","../../../../../../src/web-ui/routes/verse/sections/MindSection.tsx"],"sourcesContent":["/**\n * routes/verse/mind/MindCards.tsx — Mind's cards (SPEC-310B §6, SPEC-310C §5;\n * unit C7): the memo timeline with each move's 7-day outcome ✓/✗ and Veto,\n * the hit-rate gauge with the standards, three A7 insight cards and the\n * action log. Everything the Leader or A7 wrote is untrusted text: rendered\n * as plain text, never as markdown or a link.\n */\nimport type { ReasoningInsight } from '../../../../core/reasoning/types.js';\nimport type { LeaderAction, LeaderStateV1 } from '../../../../core/vision/leader-types.js';\nimport { Gauge } from '../../../components/charts/Gauge.js';\nimport { formatRelative } from '../autonomy/format.js';\nimport type { SurfaceActions } from '../command/actions.js';\nimport { ActionRow } from '../command/LeaderCard.js';\nimport { anchorId } from '../command/nav.js';\nimport { Card, CardNote, MicroLabel } from '../command/Surface.js';\nimport { postLeader, type OptionalRead } from '../command/surface-data.js';\nimport { KIND_LABEL } from './mind-model.js';\nimport { OUTCOME_WORD, expectedDeltaText, isVetoable, outcomeMark } from './leader-model.js';\nimport styles from './mind.module.css';\n\nconst MARK: Record<ReturnType<typeof outcomeMark>, string> = { hit: '✓', miss: '✗', pending: '…', ungraded: '—' };\n\nfunction dayHeading(iso: string): string {\n const t = Date.parse(iso);\n return Number.isFinite(t) ? new Date(t).toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' }) : '—';\n}\n\nexport function MemoTimeline({ read, actions }: { read: OptionalRead<LeaderStateV1> | undefined; actions: SurfaceActions }) {\n const state = read?.value ?? null;\n const memos = state?.timeline ?? [];\n const latestId = state?.latest?.id ?? null;\n const latestVetoable = state?.latest?.actions.some((a) => isVetoable(state.actions.find((x) => x.id === a.id) ?? a)) ?? false;\n return (\n <Card title=\"Memos\" caption={state ? `${memos.length} in view · each move graded 7 days later` : undefined}>\n {!read ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the Leader…</p>\n ) : !state ? (\n <CardNote tone=\"unknown\">{read.reason ?? 'The Leader did not answer.'}</CardNote>\n ) : memos.length === 0 ? (\n <CardNote>No memos yet{state.lastRun ? ` — last run: ${state.lastRun.reason ?? state.lastRun.outcome}` : ''}.</CardNote>\n ) : (\n <ol className={styles.timeline}>\n {memos.map((m) => {\n const mark = outcomeMark(m);\n const delta = expectedDeltaText(m.expectedDelta);\n return (\n <li key={m.id} className={styles.memo} data-outcome={mark} id={anchorId(`memo-${m.id}`)}>\n <span className={styles.memoDay}>{dayHeading(m.at)}</span>\n <span className={styles.mark} data-outcome={mark} aria-hidden=\"true\">{MARK[mark]}</span>\n <div className={styles.memoBody}>\n <span className={styles.memoMove}>{m.move ?? (m.status === 'ok' ? 'No move' : `No memo (${m.status.replace(/-/g, ' ')})`)}</span>\n {m.bottleneck ? <span className={styles.memoWhy}>Bottleneck: {m.bottleneck}</span> : null}\n <span className={styles.memoMeta}>\n {delta ? `Expected ${delta}` : 'No expected delta'}\n {' · '}\n <span data-outcome={mark}>\n {mark === 'hit' || mark === 'miss'\n ? `${OUTCOME_WORD[mark]} (actual ${m.outcome?.actualDelta === null || m.outcome?.actualDelta === undefined ? '—' : `${m.outcome.actualDelta >= 0 ? '+' : ''}${m.outcome.actualDelta}`})`\n : OUTCOME_WORD[mark]}\n </span>\n {` · ${m.actionCount} action${m.actionCount === 1 ? '' : 's'}`}\n </span>\n </div>\n {m.id === latestId && latestVetoable ? (\n <button\n type=\"button\"\n className={styles.veto}\n aria-label={`Veto the memo of ${dayHeading(m.at)}`}\n disabled={actions.busy || actions.readOnly}\n onClick={() =>\n actions.act(() => postLeader({ action: 'veto-memo', memoId: m.id }), 'Veto the whole memo', {\n confirm: {\n title: 'Veto this memo?',\n body: 'Every applied action is undone exactly and every scheduled one is cancelled. The Leader records the veto.',\n confirmLabel: 'Veto memo',\n destructive: true,\n },\n })\n }\n >\n Veto\n </button>\n ) : null}\n </li>\n );\n })}\n </ol>\n )}\n </Card>\n );\n}\n\nexport function HitRateCard({ read }: { read: OptionalRead<LeaderStateV1> | undefined }) {\n const state = read?.value ?? null;\n const hr = state?.hitRate ?? null;\n const standards = (state?.standards ?? []).filter((s) => s.retiredAt === null);\n return (\n <div className={styles.stack}>\n <Gauge\n title=\"Leader hit rate\"\n description={hr ? `${hr.hits} of ${hr.graded} graded moves · ${hr.windowDays} days` : undefined}\n status={!read ? { kind: 'loading' } : !state ? { kind: 'unknown', reason: read.reason ?? 'the Leader did not answer.' } : undefined}\n value={hr?.rate ?? null}\n showState={false}\n caption={hr && hr.rate === null ? 'nothing graded yet — moves are graded 7 days after they are made' : undefined}\n size={180}\n />\n <Card title=\"Standards\" caption={state ? `${standards.length} in force` : undefined}>\n {!state ? (\n <CardNote tone=\"unknown\">{read?.reason ?? 'The Leader did not answer.'}</CardNote>\n ) : standards.length === 0 ? (\n <CardNote>No standards yet.</CardNote>\n ) : (\n <ul className={styles.standards}>\n {standards.map((s) => (\n <li key={s.id}>\n <span className={styles.standardRule}>{s.rule}</span>\n <span className={styles.standardMeta}>\n {s.appliesTo} · {s.source === 'mason' ? 'yours' : 'Leader'} · {formatRelative(s.addedAt)}\n </span>\n </li>\n ))}\n </ul>\n )}\n </Card>\n </div>\n );\n}\n\nconst SEVERITY_WORD = { high: 'High', warn: 'Worth a look', info: 'FYI' } as const;\n\nexport function InsightCards({ insights, reason, loading = false }: { insights: ReasoningInsight[]; reason: string | null; loading?: boolean }) {\n if (loading) return <p className={styles.muted} aria-busy=\"true\">Reading the reasoning digest…</p>;\n if (reason !== null) return <CardNote tone=\"unknown\">{reason}</CardNote>;\n if (insights.length === 0) {\n return <CardNote>No loops, repeated failures or verification gaps in the last 30 days.</CardNote>;\n }\n return (\n <ul className={styles.insights} aria-label=\"Reasoning insights\">\n {insights.map((i) => (\n <li key={i.id} className={styles.insight} data-severity={i.severity}>\n <span className={styles.insightKind}>\n <MicroLabel>{KIND_LABEL[i.kind]}</MicroLabel>\n <span className={styles.insightSeverity} data-severity={i.severity}>{SEVERITY_WORD[i.severity]}</span>\n </span>\n <span className={styles.insightTitle}>{i.title}</span>\n <span className={styles.insightMeta}>\n {[i.repo, i.engine, `${i.count}×`, `last ${formatRelative(i.lastAt)}`].filter(Boolean).join(' · ')}\n </span>\n </li>\n ))}\n </ul>\n );\n}\n\nexport function ActionLog({ read, actions }: { read: OptionalRead<LeaderStateV1> | undefined; actions: SurfaceActions }) {\n const state = read?.value ?? null;\n const list: LeaderAction[] = state?.actions ?? [];\n return (\n <Card title=\"Action log\" caption={state ? 'Newest first · Veto runs the recorded inverse' : undefined}>\n {!read ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the action log…</p>\n ) : !state ? (\n <CardNote tone=\"unknown\">{read.reason ?? 'The Leader did not answer.'}</CardNote>\n ) : list.length === 0 ? (\n <CardNote>The Leader has not acted yet.</CardNote>\n ) : (\n <ul className={styles.log} aria-label=\"Leader actions\">\n {list.map((a) => (\n <ActionRow key={a.id} action={a} actions={actions} />\n ))}\n </ul>\n )}\n </Card>\n );\n}\n","/**\n * routes/verse/sections/MindSection.tsx — ⌘4 Mind: what did the Leader\n * decide, and was it right? (SPEC-310B §6, SPEC-310C §5; unit C7)\n *\n * Memo timeline with 7-day outcomes ✓/✗ and Veto (8) | Hit-rate gauge + standards (4)\n * Three A7 insight cards (12)\n * Insight matrix kind × engine, per repo (8) | Reasoning trends (4)\n * Action log with Veto (12)\n *\n * At 375 px one column in that order, and the matrix starts on its table\n * (a 6 × 4 grid of 22 px cells says less than its table on a phone).\n */\nimport { useId, useMemo, useState } from 'react';\nimport { AreaTrend } from '../../../components/charts/AreaTrend.js';\nimport type { ChartStatus } from '../../../components/charts/ChartFrame.js';\nimport { MatrixHeatmap } from '../../../components/charts/MatrixHeatmap.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { ActionStatus, useSurfaceActions } from '../command/actions.js';\nimport { anchorId } from '../command/nav.js';\nimport { Card, Cell, Surface } from '../command/Surface.js';\nimport { leaderQuery, reasoningDigestQuery } from '../command/surface-data.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { useViewport } from '../shell/viewport.js';\nimport { ActionLog, HitRateCard, InsightCards, MemoTimeline } from '../mind/MindCards.js';\nimport { insightMatrix, insightRepos, reasoningTrendSeries, topInsights } from '../mind/mind-model.js';\nimport styles from '../mind/mind.module.css';\n\nexport const MIND_POLL_MS = 60_000;\n\nexport function MindSection() {\n const { compact } = useViewport();\n const leader = useQuery(leaderQuery);\n const digest = useQuery(reasoningDigestQuery, { freshMs: 60_000 });\n const refetchLeader = useRefetch(leaderQuery);\n const refetchDigest = useRefetch(reasoningDigestQuery);\n usePollWhileVisible(() => {\n refetchLeader();\n refetchDigest();\n }, MIND_POLL_MS);\n const actions = useSurfaceActions();\n const facetId = useId();\n\n const d = digest.data?.value ?? null;\n const repos = useMemo(() => insightRepos(d), [d]);\n const [repo, setRepo] = useState<string | null>(null);\n const facet = repo !== null && repos.includes(repo) ? repo : null;\n const matrix = useMemo(() => insightMatrix(d, facet), [d, facet]);\n const top = topInsights(d);\n const trends = reasoningTrendSeries(d);\n\n const digestStatus = (hasData: boolean, empty: string): ChartStatus =>\n !digest.data ? { kind: 'loading' } : !d ? { kind: 'unknown', reason: digest.data.reason ?? 'the reasoning digest did not answer.' } : hasData ? { kind: 'ready' } : { kind: 'empty', message: empty };\n const reasoned = d ? d.totals.steps > 0 : false;\n\n return (\n <Surface title=\"Mind\" actions={[leader, digest].some((q) => q.status === 'refreshing') ? <RefreshIndicator /> : null} lead={<ActionStatus actions={actions} />}>\n <Cell span={8}>\n <MemoTimeline read={leader.data} actions={actions} />\n </Cell>\n <Cell span={4}>\n <HitRateCard read={leader.data} />\n </Cell>\n <Cell span={12}>\n <Card title=\"What the reasoning shows\" caption={d ? `Last 30 days · ${d.totals.steps.toLocaleString('en-US')} reasoning steps across ${d.totals.sessions} sessions` : undefined}>\n <div id={anchorId('insights')}>\n <InsightCards insights={top} loading={!digest.data} reason={!digest.data || d ? null : (digest.data.reason ?? 'The reasoning digest did not answer.')} />\n </div>\n </Card>\n </Cell>\n <Cell span={8}>\n <MatrixHeatmap\n title=\"Insights by kind and engine\"\n description={facet ? `In ${facet}` : 'All repos · 30 days'}\n status={digestStatus(reasoned && matrix.columns.length > 0, 'No reasoning was recorded in the last 30 days.')}\n rows={matrix.rows}\n columns={matrix.columns}\n values={matrix.values}\n unit=\"insights\"\n defaultView={compact ? 'table' : 'chart'}\n actions={\n repos.length > 1 ? (\n <label className={styles.facet} htmlFor={facetId}>\n Repo\n <select id={facetId} value={facet ?? ''} onChange={(e) => setRepo(e.target.value || null)}>\n <option value=\"\">All</option>\n {repos.map((r) => (\n <option key={r} value={r}>\n {r}\n </option>\n ))}\n </select>\n </label>\n ) : null\n }\n />\n </Cell>\n <Cell span={4}>\n <AreaTrend\n title=\"Struggles and wins\"\n description=\"Per day · days with no reasoning are gaps\"\n status={digestStatus(reasoned, 'No reasoning was recorded in the last 30 days.')}\n series={trends}\n height={200}\n />\n </Cell>\n <Cell span={12}>\n <ActionLog read={leader.data} actions={actions} />\n </Cell>\n {actions.dialogs}\n </Surface>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as e,i as t,n,s as r}from"./index-afDA8cwW.js";import{p as i}from"./global-DVgMguLr.js";var a=r(t(),1),o=r(e(),1),s=[`a[href]`,`button:not([disabled])`,`input:not([disabled])`,`select:not([disabled])`,`textarea:not([disabled])`,`[tabindex]:not([tabindex="-1"])`].join(`,`);function c(e){return Array.from(e.querySelectorAll(s)).filter(e=>e.offsetParent!==null)}function l({open:e,containerRef:t,onClose:n,initialFocusRef:r}){(0,o.useEffect)(()=>{if(!e)return;let n=document.activeElement;return(r?.current??t.current)?.focus({preventScroll:!0}),()=>{n?.focus?.({preventScroll:!0})}},[e]),(0,o.useEffect)(()=>{if(!e)return;function r(e){if(e.key===`Escape`){e.stopPropagation(),n();return}if(e.key!==`Tab`)return;let r=t.current;if(!r)return;let i=c(r);if(i.length===0)return;let a=i[0],o=i[i.length-1];e.shiftKey&&document.activeElement===a?(e.preventDefault(),o.focus()):!e.shiftKey&&document.activeElement===o&&(e.preventDefault(),a.focus())}return document.addEventListener(`keydown`,r,!0),()=>document.removeEventListener(`keydown`,r,!0)},[e,n])}var u={backdrop:`_backdrop_10r5p_1`,fade:`_fade_10r5p_1`,dialog:`_dialog_10r5p_13`,rise:`_rise_10r5p_1`,title:`_title_10r5p_25`,description:`_description_10r5p_36`},d=n();function f({open:e,onClose:t,titleId:n,title:r,description:i,children:s,initialFocusRef:c,widthClassName:f}){let p=(0,o.useRef)(null);return l({open:e,containerRef:p,onClose:t,initialFocusRef:c}),e?(0,a.createPortal)((0,d.jsx)(`div`,{className:u.backdrop,onMouseDown:e=>e.target===e.currentTarget&&t(),children:(0,d.jsxs)(`div`,{ref:p,className:`${u.dialog} ${f??``}`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":n,tabIndex:-1,children:[(0,d.jsx)(`h2`,{id:n,className:u.title,children:r}),i?(0,d.jsx)(`p`,{className:u.description,children:i}):null,s]})}),document.body):null}var p={body:`_body_1kukj_1`,form:`_form_1kukj_8`,label:`_label_1kukj_14`,inputRow:`_inputRow_1kukj_19`,input:`_input_1kukj_19`,reveal:`_reveal_1kukj_40`,error:`_error_1kukj_51`,actions:`_actions_1kukj_56`,cancel:`_cancel_1kukj_63`,submit:`_submit_1kukj_72`},m=/^[a-f0-9]{64}$/;function h({open:e,onClose:t,onUnlocked:n,reason:r,tokenLabel:a=`Mutation token`,tokenHelp:s=`the mutation token ashlr serve printed`}){let{setToken:c}=i(),[l,u]=(0,o.useState)(``),[h,g]=(0,o.useState)(!1),[_,v]=(0,o.useState)(null),y=(0,o.useRef)(null),b=(0,o.useId)(),x=(0,o.useId)();function S(e){e.preventDefault();let r=l.trim();if(!m.test(r)){v(`Expected 64 hex characters — ${s}.`);return}c(r),u(``),v(null),t(),n?.()}return(0,d.jsxs)(f,{open:e,onClose:t,titleId:b,title:`Unlock actions`,initialFocusRef:y,children:[(0,d.jsxs)(`p`,{className:p.body,children:[r??`This action mutates the fleet and requires the dispatch token.`,` It is held in memory only, for this browser tab, and is cleared automatically after 20 minutes idle.`]}),(0,d.jsxs)(`form`,{onSubmit:S,className:p.form,noValidate:!0,children:[(0,d.jsx)(`label`,{htmlFor:x,className:p.label,children:a}),(0,d.jsxs)(`div`,{className:p.inputRow,children:[(0,d.jsx)(`input`,{ref:y,id:x,type:h?`text`:`password`,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,className:p.input,value:l,onChange:e=>u(e.target.value),"aria-invalid":_?!0:void 0,placeholder:`64 hex characters`}),(0,d.jsx)(`button`,{type:`button`,className:p.reveal,onClick:()=>g(e=>!e),"aria-pressed":h,children:h?`Hide`:`Show`})]}),_?(0,d.jsx)(`p`,{className:p.error,role:`alert`,children:_}):null,(0,d.jsxs)(`div`,{className:p.actions,children:[(0,d.jsx)(`button`,{type:`button`,className:p.cancel,onClick:t,children:`Cancel`}),(0,d.jsx)(`button`,{type:`submit`,className:p.submit,disabled:l.trim().length===0,children:`Unlock`})]})]})]})}export{f as n,l as r,h as t};
2
- //# sourceMappingURL=MutationTokenDialog-Dn0tzCrh.js.map