@ashlr/hub 3.11.5 → 3.13.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 (408) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/README.md +29 -16
  3. package/dist/authority-surface.json +91 -45
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/authority.d.ts +145 -33
  6. package/dist/cli/authority.js +1196 -313
  7. package/dist/cli/authority.js.map +1 -1
  8. package/dist/cli/cloud.js +12 -3
  9. package/dist/cli/cloud.js.map +1 -1
  10. package/dist/core/authority/protected-paths.js +11 -0
  11. package/dist/core/authority/protected-paths.js.map +1 -1
  12. package/dist/core/authority/resident.d.ts +101 -0
  13. package/dist/core/authority/resident.js +246 -0
  14. package/dist/core/authority/resident.js.map +1 -0
  15. package/dist/core/authority/trust-roots.js +7 -1
  16. package/dist/core/authority/trust-roots.js.map +1 -1
  17. package/dist/core/authority/types.d.ts +43 -0
  18. package/dist/core/authority/types.js +6 -0
  19. package/dist/core/authority/types.js.map +1 -1
  20. package/dist/core/cloud/budget.js +11 -1
  21. package/dist/core/cloud/budget.js.map +1 -1
  22. package/dist/core/cloud/cloud-api.d.ts +25 -2
  23. package/dist/core/cloud/cloud-api.js +139 -5
  24. package/dist/core/cloud/cloud-api.js.map +1 -1
  25. package/dist/core/cloud/pr-actions.d.ts +93 -0
  26. package/dist/core/cloud/pr-actions.js +436 -0
  27. package/dist/core/cloud/pr-actions.js.map +1 -0
  28. package/dist/core/cloud/pr-preview.d.ts +128 -0
  29. package/dist/core/cloud/pr-preview.js +228 -0
  30. package/dist/core/cloud/pr-preview.js.map +1 -0
  31. package/dist/core/cloud/store.d.ts +2 -0
  32. package/dist/core/cloud/store.js +28 -0
  33. package/dist/core/cloud/store.js.map +1 -1
  34. package/dist/core/cloud/timeline-api.d.ts +24 -0
  35. package/dist/core/cloud/timeline-api.js +46 -0
  36. package/dist/core/cloud/timeline-api.js.map +1 -0
  37. package/dist/core/cloud/timeline-types.d.ts +62 -0
  38. package/dist/core/cloud/timeline-types.js +36 -0
  39. package/dist/core/cloud/timeline-types.js.map +1 -0
  40. package/dist/core/cloud/timeline.d.ts +102 -0
  41. package/dist/core/cloud/timeline.js +919 -0
  42. package/dist/core/cloud/timeline.js.map +1 -0
  43. package/dist/core/cloud/tracker.js +67 -0
  44. package/dist/core/cloud/tracker.js.map +1 -1
  45. package/dist/core/cloud/types.d.ts +38 -0
  46. package/dist/core/cloud/types.js +1 -1
  47. package/dist/core/cloud/types.js.map +1 -1
  48. package/dist/core/daemon/service-install-authority.d.ts +10 -2
  49. package/dist/core/daemon/service-install-authority.js +14 -5
  50. package/dist/core/daemon/service-install-authority.js.map +1 -1
  51. package/dist/core/daemon/service.d.ts +15 -0
  52. package/dist/core/daemon/service.js +26 -0
  53. package/dist/core/daemon/service.js.map +1 -1
  54. package/dist/core/fleet/cloud-intake.d.ts +95 -0
  55. package/dist/core/fleet/cloud-intake.js +557 -0
  56. package/dist/core/fleet/cloud-intake.js.map +1 -0
  57. package/dist/core/fleet/dispatch-router.d.ts +13 -0
  58. package/dist/core/fleet/dispatch-router.js +32 -8
  59. package/dist/core/fleet/dispatch-router.js.map +1 -1
  60. package/dist/core/fleet/fleet-merge-state.d.ts +10 -0
  61. package/dist/core/fleet/fleet-merge-state.js.map +1 -1
  62. package/dist/core/fleet/host-merge.d.ts +5 -0
  63. package/dist/core/fleet/host-merge.js +11 -0
  64. package/dist/core/fleet/host-merge.js.map +1 -1
  65. package/dist/core/fleet/merge-gates.d.ts +8 -0
  66. package/dist/core/fleet/merge-gates.js +25 -5
  67. package/dist/core/fleet/merge-gates.js.map +1 -1
  68. package/dist/core/fleet/standing-merge-pass.js +30 -0
  69. package/dist/core/fleet/standing-merge-pass.js.map +1 -1
  70. package/dist/core/fleet/tick-hooks-live.d.ts +9 -0
  71. package/dist/core/fleet/tick-hooks-live.js +44 -5
  72. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  73. package/dist/core/fleet/verify-check-run.d.ts +90 -0
  74. package/dist/core/fleet/verify-check-run.js +274 -0
  75. package/dist/core/fleet/verify-check-run.js.map +1 -0
  76. package/dist/core/routing/budget-api.d.ts +11 -0
  77. package/dist/core/routing/budget-api.js +64 -8
  78. package/dist/core/routing/budget-api.js.map +1 -1
  79. package/dist/core/routing/budget-store.d.ts +22 -1
  80. package/dist/core/routing/budget-store.js +22 -8
  81. package/dist/core/routing/budget-store.js.map +1 -1
  82. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  83. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +8 -2
  84. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +7 -1
  85. package/dist/core/verse/account-health.js +9 -3
  86. package/dist/core/verse/account-health.js.map +1 -1
  87. package/dist/core/verse/activity-api.d.ts +5 -1
  88. package/dist/core/verse/activity-api.js +62 -14
  89. package/dist/core/verse/activity-api.js.map +1 -1
  90. package/dist/core/verse/authority-api.d.ts +9 -1
  91. package/dist/core/verse/authority-api.js +82 -2
  92. package/dist/core/verse/authority-api.js.map +1 -1
  93. package/dist/core/verse/seat-readiness.d.ts +25 -0
  94. package/dist/core/verse/seat-readiness.js +43 -6
  95. package/dist/core/verse/seat-readiness.js.map +1 -1
  96. package/dist/core/verse/verse-api.d.ts +3 -1
  97. package/dist/core/verse/verse-api.js +6 -0
  98. package/dist/core/verse/verse-api.js.map +1 -1
  99. package/dist/core/web/public/next/assets/{ActionMenu-DffwPklw.js → ActionMenu-Dwjk6rUQ.js} +2 -2
  100. package/dist/core/web/public/next/assets/{ActionMenu-DffwPklw.js.map → ActionMenu-Dwjk6rUQ.js.map} +1 -1
  101. package/dist/core/web/public/next/assets/Advanced-cVYTAsfB.js +2 -0
  102. package/dist/core/web/public/next/assets/{Advanced-CxzE6ekM.js.map → Advanced-cVYTAsfB.js.map} +1 -1
  103. package/dist/core/web/public/next/assets/App-IsaWDsdF.js +7 -0
  104. package/dist/core/web/public/next/assets/{App-DFlp-vdv.js.map → App-IsaWDsdF.js.map} +1 -1
  105. package/dist/core/web/public/next/assets/AppsSection-DDqeSrty.js +2 -0
  106. package/dist/core/web/public/next/assets/{AppsSection-Ct2O605-.js.map → AppsSection-DDqeSrty.js.map} +1 -1
  107. package/dist/core/web/public/next/assets/{AreaTrend-o-GLl2Is.js → AreaTrend-C32rUaxm.js} +2 -2
  108. package/dist/core/web/public/next/assets/{AreaTrend-o-GLl2Is.js.map → AreaTrend-C32rUaxm.js.map} +1 -1
  109. package/dist/core/web/public/next/assets/AutonomyOffState-CmSSTHVe.css +1 -0
  110. package/dist/core/web/public/next/assets/AutonomyOffState-CpFYS3tQ.js +3 -0
  111. package/dist/core/web/public/next/assets/AutonomyOffState-CpFYS3tQ.js.map +1 -0
  112. package/dist/core/web/public/next/assets/AutonomySection-Dwn8UtOy.js +2 -0
  113. package/dist/core/web/public/next/assets/{AutonomySection-BTg7yVa1.js.map → AutonomySection-Dwn8UtOy.js.map} +1 -1
  114. package/dist/core/web/public/next/assets/{BranchBar-BjPFtGsj.js → BranchBar-ISZ7xUCj.js} +2 -2
  115. package/dist/core/web/public/next/assets/{BranchBar-BjPFtGsj.js.map → BranchBar-ISZ7xUCj.js.map} +1 -1
  116. package/dist/core/web/public/next/assets/BudgetControl-BARVp-En.js +2 -0
  117. package/dist/core/web/public/next/assets/BudgetControl-BARVp-En.js.map +1 -0
  118. package/dist/core/web/public/next/assets/{Button-OjVJSrFq.js → Button-DtE0rlWD.js} +2 -2
  119. package/dist/core/web/public/next/assets/{Button-OjVJSrFq.js.map → Button-DtE0rlWD.js.map} +1 -1
  120. package/dist/core/web/public/next/assets/{CapacityStrip-Bx4c3dxD.js → CapacityStrip-DKbKA_Aa.js} +2 -2
  121. package/dist/core/web/public/next/assets/{CapacityStrip-Bx4c3dxD.js.map → CapacityStrip-DKbKA_Aa.js.map} +1 -1
  122. package/dist/core/web/public/next/assets/{ChartFrame-B_w2Siqg.js → ChartFrame-DK_BDXCt.js} +2 -2
  123. package/dist/core/web/public/next/assets/{ChartFrame-B_w2Siqg.js.map → ChartFrame-DK_BDXCt.js.map} +1 -1
  124. package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js +3 -0
  125. package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js.map +1 -0
  126. package/dist/core/web/public/next/assets/{CloudBudgetForm-5Gf4iAok.js → CloudBudgetForm-CvjK4Oh6.js} +2 -2
  127. package/dist/core/web/public/next/assets/{CloudBudgetForm-5Gf4iAok.js.map → CloudBudgetForm-CvjK4Oh6.js.map} +1 -1
  128. package/dist/core/web/public/next/assets/{CommandPalette-iTpk6I8r.js → CommandPalette-DzPsth0u.js} +2 -2
  129. package/dist/core/web/public/next/assets/{CommandPalette-iTpk6I8r.js.map → CommandPalette-DzPsth0u.js.map} +1 -1
  130. package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js +3 -0
  131. package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js.map +1 -0
  132. package/dist/core/web/public/next/assets/{ConfirmDialog-_S9iE-cJ.js → ConfirmDialog-CLUhzaBj.js} +2 -2
  133. package/dist/core/web/public/next/assets/{ConfirmDialog-_S9iE-cJ.js.map → ConfirmDialog-CLUhzaBj.js.map} +1 -1
  134. package/dist/core/web/public/next/assets/{DeleteChatDialog-KUYUygiA.js → DeleteChatDialog-C_eDhV8b.js} +2 -2
  135. package/dist/core/web/public/next/assets/{DeleteChatDialog-KUYUygiA.js.map → DeleteChatDialog-C_eDhV8b.js.map} +1 -1
  136. package/dist/core/web/public/next/assets/{Dialog-BuIaG6HF.js → Dialog-BRd_B9OE.js} +2 -2
  137. package/dist/core/web/public/next/assets/{Dialog-BuIaG6HF.js.map → Dialog-BRd_B9OE.js.map} +1 -1
  138. package/dist/core/web/public/next/assets/{DiffPane-De4IQt82.js → DiffPane-Cpr9soB2.js} +2 -2
  139. package/dist/core/web/public/next/assets/{DiffPane-De4IQt82.js.map → DiffPane-Cpr9soB2.js.map} +1 -1
  140. package/dist/core/web/public/next/assets/{DiffViewer-B75t6Ile.js → DiffViewer-CNwd0W3Q.js} +2 -2
  141. package/dist/core/web/public/next/assets/{DiffViewer-B75t6Ile.js.map → DiffViewer-CNwd0W3Q.js.map} +1 -1
  142. package/dist/core/web/public/next/assets/DockHost-BcEq2qaS.js +2 -0
  143. package/dist/core/web/public/next/assets/{DockHost-BPqyhtCP.js.map → DockHost-BcEq2qaS.js.map} +1 -1
  144. package/dist/core/web/public/next/assets/{EmptyState-DXkT4vhW.js → EmptyState-DsN1H6MC.js} +2 -2
  145. package/dist/core/web/public/next/assets/{EmptyState-DXkT4vhW.js.map → EmptyState-DsN1H6MC.js.map} +1 -1
  146. package/dist/core/web/public/next/assets/{Epistemic-CfqFe_aP.js → Epistemic-fycQTBRO.js} +2 -2
  147. package/dist/core/web/public/next/assets/{Epistemic-CfqFe_aP.js.map → Epistemic-fycQTBRO.js.map} +1 -1
  148. package/dist/core/web/public/next/assets/EvidenceTimeline-PBDAiSuG.css +1 -0
  149. package/dist/core/web/public/next/assets/EvidenceTimeline-sCCAdnBK.js +2 -0
  150. package/dist/core/web/public/next/assets/EvidenceTimeline-sCCAdnBK.js.map +1 -0
  151. package/dist/core/web/public/next/assets/{FleetSection-B7f-XBiX.js → FleetSection-BG8iGraG.js} +3 -3
  152. package/dist/core/web/public/next/assets/{FleetSection-B7f-XBiX.js.map → FleetSection-BG8iGraG.js.map} +1 -1
  153. package/dist/core/web/public/next/assets/{Funnel-pXYySwXQ.js → Funnel-B88_wpA4.js} +2 -2
  154. package/dist/core/web/public/next/assets/{Funnel-pXYySwXQ.js.map → Funnel-B88_wpA4.js.map} +1 -1
  155. package/dist/core/web/public/next/assets/{GearTray-gj6lT7ba.js → GearTray-CpDt0xwj.js} +2 -2
  156. package/dist/core/web/public/next/assets/{GearTray-gj6lT7ba.js.map → GearTray-CpDt0xwj.js.map} +1 -1
  157. package/dist/core/web/public/next/assets/{GrowthSection-D8e9m9Wy.js → GrowthSection-BvZezOsX.js} +2 -2
  158. package/dist/core/web/public/next/assets/{GrowthSection-D8e9m9Wy.js.map → GrowthSection-BvZezOsX.js.map} +1 -1
  159. package/dist/core/web/public/next/assets/{HandoffDialog-VfKxKhxF.js → HandoffDialog-B1G6gQyk.js} +2 -2
  160. package/dist/core/web/public/next/assets/{HandoffDialog-VfKxKhxF.js.map → HandoffDialog-B1G6gQyk.js.map} +1 -1
  161. package/dist/core/web/public/next/assets/{Input-u1YR_Ogl.js → Input-CI0yBHmn.js} +2 -2
  162. package/dist/core/web/public/next/assets/{Input-u1YR_Ogl.js.map → Input-CI0yBHmn.js.map} +1 -1
  163. package/dist/core/web/public/next/assets/{LeaderCard-BDELBrnx.js → LeaderCard-BxxiEg4e.js} +2 -2
  164. package/dist/core/web/public/next/assets/{LeaderCard-BDELBrnx.js.map → LeaderCard-BxxiEg4e.js.map} +1 -1
  165. package/dist/core/web/public/next/assets/{MatrixHeatmap-NKLF2srR.js → MatrixHeatmap-iPFEU2Tv.js} +2 -2
  166. package/dist/core/web/public/next/assets/{MatrixHeatmap-NKLF2srR.js.map → MatrixHeatmap-iPFEU2Tv.js.map} +1 -1
  167. package/dist/core/web/public/next/assets/McpSection-nuXer4K-.js +2 -0
  168. package/dist/core/web/public/next/assets/{McpSection-D1tDvlRa.js.map → McpSection-nuXer4K-.js.map} +1 -1
  169. package/dist/core/web/public/next/assets/{MessageMarkdown-DlfLEJxu.js → MessageMarkdown-BCe4TsXk.js} +3 -3
  170. package/dist/core/web/public/next/assets/{MessageMarkdown-DlfLEJxu.js.map → MessageMarkdown-BCe4TsXk.js.map} +1 -1
  171. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-BYZzI115.js → MessageMarkdownRenderer-DL3LU5kL.js} +2 -2
  172. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-BYZzI115.js.map → MessageMarkdownRenderer-DL3LU5kL.js.map} +1 -1
  173. package/dist/core/web/public/next/assets/{Meter-BSVhU43Q.js → Meter-b69LM0mU.js} +2 -2
  174. package/dist/core/web/public/next/assets/{Meter-BSVhU43Q.js.map → Meter-b69LM0mU.js.map} +1 -1
  175. package/dist/core/web/public/next/assets/{MindSection-lqV2e_Sq.js → MindSection-Dc5v5rH3.js} +2 -2
  176. package/dist/core/web/public/next/assets/{MindSection-lqV2e_Sq.js.map → MindSection-Dc5v5rH3.js.map} +1 -1
  177. package/dist/core/web/public/next/assets/{MutationTokenDialog-CLGP72g6.js → MutationTokenDialog-Bm34BNVV.js} +2 -2
  178. package/dist/core/web/public/next/assets/{MutationTokenDialog-CLGP72g6.js.map → MutationTokenDialog-Bm34BNVV.js.map} +1 -1
  179. package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js +3 -0
  180. package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js.map +1 -0
  181. package/dist/core/web/public/next/assets/NeedsYouList-CH6Mq-E_.css +1 -0
  182. package/dist/core/web/public/next/assets/NeedsYouList-D5Kk549g.js +2 -0
  183. package/dist/core/web/public/next/assets/{NeedsYouList-eBOlJr0b.js.map → NeedsYouList-D5Kk549g.js.map} +1 -1
  184. package/dist/core/web/public/next/assets/{NewChatDialog-DoYTH26M.js → NewChatDialog-BqFTWgHU.js} +2 -2
  185. package/dist/core/web/public/next/assets/{NewChatDialog-DoYTH26M.js.map → NewChatDialog-BqFTWgHU.js.map} +1 -1
  186. package/dist/core/web/public/next/assets/OnboardingFlow-DcDsguAM.js +3 -0
  187. package/dist/core/web/public/next/assets/OnboardingFlow-DcDsguAM.js.map +1 -0
  188. package/dist/core/web/public/next/assets/OnboardingGate-BZafM1Vf.js +3 -0
  189. package/dist/core/web/public/next/assets/{OnboardingGate-DrDEVBqw.js.map → OnboardingGate-BZafM1Vf.js.map} +1 -1
  190. package/dist/core/web/public/next/assets/{PreviewPane-ULN673zm.js → PreviewPane-zT3gK9TD.js} +2 -2
  191. package/dist/core/web/public/next/assets/{PreviewPane-ULN673zm.js.map → PreviewPane-zT3gK9TD.js.map} +1 -1
  192. package/dist/core/web/public/next/assets/{ProviderLogo-8WaUjTlN.js → ProviderLogo-AwHn2sKm.js} +2 -2
  193. package/dist/core/web/public/next/assets/{ProviderLogo-8WaUjTlN.js.map → ProviderLogo-AwHn2sKm.js.map} +1 -1
  194. package/dist/core/web/public/next/assets/{RailStatus-Ckw9nvYU.js → RailStatus-xHrovWvI.js} +2 -2
  195. package/dist/core/web/public/next/assets/{RailStatus-Ckw9nvYU.js.map → RailStatus-xHrovWvI.js.map} +1 -1
  196. package/dist/core/web/public/next/assets/{RefreshIndicator-DGubF4vR.js → RefreshIndicator-SEFZlMB2.js} +2 -2
  197. package/dist/core/web/public/next/assets/{RefreshIndicator-DGubF4vR.js.map → RefreshIndicator-SEFZlMB2.js.map} +1 -1
  198. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BahEaY4d.js → ResourcePoolConsoleApp-CAxPQ4sZ.js} +3 -3
  199. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BahEaY4d.js.map → ResourcePoolConsoleApp-CAxPQ4sZ.js.map} +1 -1
  200. package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js +3 -0
  201. package/dist/core/web/public/next/assets/{ResourcesChrome-C2ZrA7la.js.map → ResourcesChrome-BnhnEdJe.js.map} +1 -1
  202. package/dist/core/web/public/next/assets/{ResourcesDrawer-BC93fzwQ.js → ResourcesDrawer-BAFGodny.js} +2 -2
  203. package/dist/core/web/public/next/assets/{ResourcesDrawer-BC93fzwQ.js.map → ResourcesDrawer-BAFGodny.js.map} +1 -1
  204. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BvhHNpE_.js → RouteErrorBoundary-C8WGiixc.js} +2 -2
  205. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BvhHNpE_.js.map → RouteErrorBoundary-C8WGiixc.js.map} +1 -1
  206. package/dist/core/web/public/next/assets/{RunInCloudAction-Dywfnw0C.js → RunInCloudAction-1-IPLYhf.js} +2 -2
  207. package/dist/core/web/public/next/assets/{RunInCloudAction-Dywfnw0C.js.map → RunInCloudAction-1-IPLYhf.js.map} +1 -1
  208. package/dist/core/web/public/next/assets/{SeatSelector-CH7hTgwy.js → SeatSelector-DpwNiX8F.js} +2 -2
  209. package/dist/core/web/public/next/assets/{SeatSelector-CH7hTgwy.js.map → SeatSelector-DpwNiX8F.js.map} +1 -1
  210. package/dist/core/web/public/next/assets/{Segmented-Wynbg0F5.js → Segmented-Wt1ATod9.js} +2 -2
  211. package/dist/core/web/public/next/assets/{Segmented-Wynbg0F5.js.map → Segmented-Wt1ATod9.js.map} +1 -1
  212. package/dist/core/web/public/next/assets/{Select-DMyLCkId.js → Select-By-V9lMc.js} +2 -2
  213. package/dist/core/web/public/next/assets/{Select-DMyLCkId.js.map → Select-By-V9lMc.js.map} +1 -1
  214. package/dist/core/web/public/next/assets/{SessionGate-8RtQFWeZ.js → SessionGate-WROS02tK.js} +2 -2
  215. package/dist/core/web/public/next/assets/{SessionGate-8RtQFWeZ.js.map → SessionGate-WROS02tK.js.map} +1 -1
  216. package/dist/core/web/public/next/assets/{SessionInsightChip-zBJbKv2L.js → SessionInsightChip-DNUcruwp.js} +2 -2
  217. package/dist/core/web/public/next/assets/{SessionInsightChip-zBJbKv2L.js.map → SessionInsightChip-DNUcruwp.js.map} +1 -1
  218. package/dist/core/web/public/next/assets/{SessionSearch-DfJIcxxM.js → SessionSearch-UHtt7a8f.js} +2 -2
  219. package/dist/core/web/public/next/assets/{SessionSearch-DfJIcxxM.js.map → SessionSearch-UHtt7a8f.js.map} +1 -1
  220. package/dist/core/web/public/next/assets/{SettingsSection-Da9RYyH5.js → SettingsSection-Bf74l0Gj.js} +2 -2
  221. package/dist/core/web/public/next/assets/{SettingsSection-Da9RYyH5.js.map → SettingsSection-Bf74l0Gj.js.map} +1 -1
  222. package/dist/core/web/public/next/assets/SetupChecklist-BhZpFLsj.css +1 -0
  223. package/dist/core/web/public/next/assets/SetupChecklist-CzpEcfOl.js +2 -0
  224. package/dist/core/web/public/next/assets/SetupChecklist-CzpEcfOl.js.map +1 -0
  225. package/dist/core/web/public/next/assets/{Sheet-DhXyIDmq.js → Sheet-HkBOBMTT.js} +2 -2
  226. package/dist/core/web/public/next/assets/{Sheet-DhXyIDmq.js.map → Sheet-HkBOBMTT.js.map} +1 -1
  227. package/dist/core/web/public/next/assets/{ShortcutsOverlay-Bi5f-wUw.js → ShortcutsOverlay-DiigiT8H.js} +2 -2
  228. package/dist/core/web/public/next/assets/{ShortcutsOverlay-Bi5f-wUw.js.map → ShortcutsOverlay-DiigiT8H.js.map} +1 -1
  229. package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js +3 -0
  230. package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js.map +1 -0
  231. package/dist/core/web/public/next/assets/{Slider-Bd9YFWEV.js → Slider-DaEDws-b.js} +2 -2
  232. package/dist/core/web/public/next/assets/{Slider-Bd9YFWEV.js.map → Slider-DaEDws-b.js.map} +1 -1
  233. package/dist/core/web/public/next/assets/{StatTile-DScTd3c-.js → StatTile-CTX41O6y.js} +2 -2
  234. package/dist/core/web/public/next/assets/{StatTile-DScTd3c-.js.map → StatTile-CTX41O6y.js.map} +1 -1
  235. package/dist/core/web/public/next/assets/{StatusBadge-DQ1UtQAJ.js → StatusBadge-CXG3iNL4.js} +2 -2
  236. package/dist/core/web/public/next/assets/{StatusBadge-DQ1UtQAJ.js.map → StatusBadge-CXG3iNL4.js.map} +1 -1
  237. package/dist/core/web/public/next/assets/{StepBand-BB3IJxhr.js → StepBand-jJTqYIdX.js} +2 -2
  238. package/dist/core/web/public/next/assets/{StepBand-BB3IJxhr.js.map → StepBand-jJTqYIdX.js.map} +1 -1
  239. package/dist/core/web/public/next/assets/{Surface-DWMtQe3Q.js → Surface-5bNA08tK.js} +2 -2
  240. package/dist/core/web/public/next/assets/{Surface-DWMtQe3Q.js.map → Surface-5bNA08tK.js.map} +1 -1
  241. package/dist/core/web/public/next/assets/{Swimlane-DcENqtdp.js → Swimlane-LrslsGxw.js} +2 -2
  242. package/dist/core/web/public/next/assets/{Swimlane-DcENqtdp.js.map → Swimlane-LrslsGxw.js.map} +1 -1
  243. package/dist/core/web/public/next/assets/{Switch-CenChEYf.js → Switch-BmCzfFnu.js} +2 -2
  244. package/dist/core/web/public/next/assets/{Switch-CenChEYf.js.map → Switch-BmCzfFnu.js.map} +1 -1
  245. package/dist/core/web/public/next/assets/{Tag-D4k5E3u0.js → Tag-WSUIaMVy.js} +2 -2
  246. package/dist/core/web/public/next/assets/{Tag-D4k5E3u0.js.map → Tag-WSUIaMVy.js.map} +1 -1
  247. package/dist/core/web/public/next/assets/{TerminalPane-DCQTukcE.js → TerminalPane-BVFgYX6K.js} +5 -5
  248. package/dist/core/web/public/next/assets/{TerminalPane-DCQTukcE.js.map → TerminalPane-BVFgYX6K.js.map} +1 -1
  249. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DsuWT0pi.js → UniverseConsoleApp-BpphLqoz.js} +2 -2
  250. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DsuWT0pi.js.map → UniverseConsoleApp-BpphLqoz.js.map} +1 -1
  251. package/dist/core/web/public/next/assets/{UniverseView-DyI5ApsA.js → UniverseView-DbpbSMwO.js} +4 -4
  252. package/dist/core/web/public/next/assets/{UniverseView-DyI5ApsA.js.map → UniverseView-DbpbSMwO.js.map} +1 -1
  253. package/dist/core/web/public/next/assets/{UsageSection-Imr28nwK.js → UsageSection-CUlaKtws.js} +3 -3
  254. package/dist/core/web/public/next/assets/{UsageSection-Imr28nwK.js.map → UsageSection-CUlaKtws.js.map} +1 -1
  255. package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js +3 -0
  256. package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js.map +1 -0
  257. package/dist/core/web/public/next/assets/{Workspace-CpxBO98E.js → Workspace-RXy0pqp6.js} +5 -5
  258. package/dist/core/web/public/next/assets/{Workspace-CpxBO98E.js.map → Workspace-RXy0pqp6.js.map} +1 -1
  259. package/dist/core/web/public/next/assets/{actions-DE8NoWV_.js → actions-BZTidCXZ.js} +2 -2
  260. package/dist/core/web/public/next/assets/{actions-DE8NoWV_.js.map → actions-BZTidCXZ.js.map} +1 -1
  261. package/dist/core/web/public/next/assets/{apps-model-CFGCUu9p.js → apps-model-CHO133qt.js} +2 -2
  262. package/dist/core/web/public/next/assets/{apps-model-CFGCUu9p.js.map → apps-model-CHO133qt.js.map} +1 -1
  263. package/dist/core/web/public/next/assets/{authority-model-CmnfJzmM.js → authority-model-8NeAEwAF.js} +2 -2
  264. package/dist/core/web/public/next/assets/{authority-model-CmnfJzmM.js.map → authority-model-8NeAEwAF.js.map} +1 -1
  265. package/dist/core/web/public/next/assets/{budget-queries-DjrPRFwl.js → budget-queries-DFF-3ICg.js} +2 -2
  266. package/dist/core/web/public/next/assets/{budget-queries-DjrPRFwl.js.map → budget-queries-DFF-3ICg.js.map} +1 -1
  267. package/dist/core/web/public/next/assets/{capacity-strip-model-C7cdQnuK.js → capacity-strip-model-5ViUgUlP.js} +2 -2
  268. package/dist/core/web/public/next/assets/{capacity-strip-model-C7cdQnuK.js.map → capacity-strip-model-5ViUgUlP.js.map} +1 -1
  269. package/dist/core/web/public/next/assets/{charts-DUD_jprE.js → charts-CzxWrZn7.js} +2 -2
  270. package/dist/core/web/public/next/assets/{charts-DUD_jprE.js.map → charts-CzxWrZn7.js.map} +1 -1
  271. package/dist/core/web/public/next/assets/cloud-model-CfRydq8N.js +2 -0
  272. package/dist/core/web/public/next/assets/{cloud-model-DoxBMDvx.js.map → cloud-model-CfRydq8N.js.map} +1 -1
  273. package/dist/core/web/public/next/assets/{cloud-queries-CTGvO-k-.js → cloud-queries-DmptbjS8.js} +2 -2
  274. package/dist/core/web/public/next/assets/{cloud-queries-CTGvO-k-.js.map → cloud-queries-DmptbjS8.js.map} +1 -1
  275. package/dist/core/web/public/next/assets/{command-catalog-CmrHNFzh.js → command-catalog-ffCAijVY.js} +2 -2
  276. package/dist/core/web/public/next/assets/{command-catalog-CmrHNFzh.js.map → command-catalog-ffCAijVY.js.map} +1 -1
  277. package/dist/core/web/public/next/assets/{context-model-2Owp2jYF.js → context-model-Bb15chFt.js} +2 -2
  278. package/dist/core/web/public/next/assets/{context-model-2Owp2jYF.js.map → context-model-Bb15chFt.js.map} +1 -1
  279. package/dist/core/web/public/next/assets/{context-model-9xywbXxX.js → context-model-CDeyP0cA.js} +2 -2
  280. package/dist/core/web/public/next/assets/{context-model-9xywbXxX.js.map → context-model-CDeyP0cA.js.map} +1 -1
  281. package/dist/core/web/public/next/assets/{context-queries-wvcRnV-I.js → context-queries-_9bFWb9v.js} +2 -2
  282. package/dist/core/web/public/next/assets/{context-queries-wvcRnV-I.js.map → context-queries-_9bFWb9v.js.map} +1 -1
  283. package/dist/core/web/public/next/assets/{control-queries-DB6Kh7UN.js → control-queries-CXtmZZH6.js} +2 -2
  284. package/dist/core/web/public/next/assets/{control-queries-DB6Kh7UN.js.map → control-queries-CXtmZZH6.js.map} +1 -1
  285. package/dist/core/web/public/next/assets/copy-setup-BIp0iaiZ.js +2 -0
  286. package/dist/core/web/public/next/assets/copy-setup-BIp0iaiZ.js.map +1 -0
  287. package/dist/core/web/public/next/assets/{dock-icons-BBUGl4tE.js → dock-icons-Cc43W7r4.js} +2 -2
  288. package/dist/core/web/public/next/assets/{dock-icons-BBUGl4tE.js.map → dock-icons-Cc43W7r4.js.map} +1 -1
  289. package/dist/core/web/public/next/assets/{fleet-model-BRfRWkZl.js → fleet-model-DOK8ZtEt.js} +2 -2
  290. package/dist/core/web/public/next/assets/{fleet-model-BRfRWkZl.js.map → fleet-model-DOK8ZtEt.js.map} +1 -1
  291. package/dist/core/web/public/next/assets/{fleet-queries-tU6UEXN2.js → fleet-queries-BeEAqD6y.js} +2 -2
  292. package/dist/core/web/public/next/assets/{fleet-queries-tU6UEXN2.js.map → fleet-queries-BeEAqD6y.js.map} +1 -1
  293. package/dist/core/web/public/next/assets/{focus-trap-BGOceFvj.js → focus-trap-ChZ5EFfM.js} +2 -2
  294. package/dist/core/web/public/next/assets/{focus-trap-BGOceFvj.js.map → focus-trap-ChZ5EFfM.js.map} +1 -1
  295. package/dist/core/web/public/next/assets/format-BmH2yWL6.js +2 -0
  296. package/dist/core/web/public/next/assets/format-BmH2yWL6.js.map +1 -0
  297. package/dist/core/web/public/next/assets/{git-model-53iRLInY.js → git-model-BFwAVbxF.js} +2 -2
  298. package/dist/core/web/public/next/assets/{git-model-53iRLInY.js.map → git-model-BFwAVbxF.js.map} +1 -1
  299. package/dist/core/web/public/next/assets/global-y_exIyAP.js +2 -0
  300. package/dist/core/web/public/next/assets/{global-CXHHMz9o.js.map → global-y_exIyAP.js.map} +1 -1
  301. package/dist/core/web/public/next/assets/{guarded-runners-B8zFVBVZ.js → guarded-runners-Cd4POBtI.js} +2 -2
  302. package/dist/core/web/public/next/assets/{guarded-runners-B8zFVBVZ.js.map → guarded-runners-Cd4POBtI.js.map} +1 -1
  303. package/dist/core/web/public/next/assets/{icons-D4s-jlxX.js → icons-CygCEFWs.js} +2 -2
  304. package/dist/core/web/public/next/assets/{icons-D4s-jlxX.js.map → icons-CygCEFWs.js.map} +1 -1
  305. package/dist/core/web/public/next/assets/{index-BG177cPN.js → index-CyK31YRm.js} +3 -3
  306. package/dist/core/web/public/next/assets/{index-BG177cPN.js.map → index-CyK31YRm.js.map} +1 -1
  307. package/dist/core/web/public/next/assets/{live-model-CEf01wrW.js → live-model-D7hilYFk.js} +2 -2
  308. package/dist/core/web/public/next/assets/live-model-D7hilYFk.js.map +1 -0
  309. package/dist/core/web/public/next/assets/{mind.module-D_xk6HIQ.js → mind.module-B15k0Y9q.js} +2 -2
  310. package/dist/core/web/public/next/assets/{mind.module-D_xk6HIQ.js.map → mind.module-B15k0Y9q.js.map} +1 -1
  311. package/dist/core/web/public/next/assets/mutations-CWlxEMEm.js +2 -0
  312. package/dist/core/web/public/next/assets/{mutations-CbTSofVH.js.map → mutations-CWlxEMEm.js.map} +1 -1
  313. package/dist/core/web/public/next/assets/{nav-CmZcbPFJ.js → nav-mimleI0R.js} +2 -2
  314. package/dist/core/web/public/next/assets/{nav-CmZcbPFJ.js.map → nav-mimleI0R.js.map} +1 -1
  315. package/dist/core/web/public/next/assets/{overnight-queries-CR0b_j-V.js → overnight-queries-DJ4mZKSj.js} +2 -2
  316. package/dist/core/web/public/next/assets/{overnight-queries-CR0b_j-V.js.map → overnight-queries-DJ4mZKSj.js.map} +1 -1
  317. package/dist/core/web/public/next/assets/primitives-DMijqcu0.js +1 -0
  318. package/dist/core/web/public/next/assets/{queries-rvRsAGW2.js → queries-Bw1McHTj.js} +2 -2
  319. package/dist/core/web/public/next/assets/{queries-rvRsAGW2.js.map → queries-Bw1McHTj.js.map} +1 -1
  320. package/dist/core/web/public/next/assets/{reasoning-pref-DMPQkujg.js → reasoning-pref-KkhI_5-j.js} +2 -2
  321. package/dist/core/web/public/next/assets/{reasoning-pref-DMPQkujg.js.map → reasoning-pref-KkhI_5-j.js.map} +1 -1
  322. package/dist/core/web/public/next/assets/{reveal-anchor-BKk2wZZZ.js → reveal-anchor-CCCx_kfT.js} +2 -2
  323. package/dist/core/web/public/next/assets/{reveal-anchor-BKk2wZZZ.js.map → reveal-anchor-CCCx_kfT.js.map} +1 -1
  324. package/dist/core/web/public/next/assets/{seat-subscription-CLn2ReSZ.js → seat-subscription-BhUUz7VL.js} +2 -2
  325. package/dist/core/web/public/next/assets/{seat-subscription-CLn2ReSZ.js.map → seat-subscription-BhUUz7VL.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/{sidebar-model-CjQLvdag.js → sidebar-model-Dcd437cf.js} +2 -2
  327. package/dist/core/web/public/next/assets/{sidebar-model-CjQLvdag.js.map → sidebar-model-Dcd437cf.js.map} +1 -1
  328. package/dist/core/web/public/next/assets/{slots-DRxNosZg.js → slots-BL_J5mmV.js} +3 -3
  329. package/dist/core/web/public/next/assets/{slots-DRxNosZg.js.map → slots-BL_J5mmV.js.map} +1 -1
  330. package/dist/core/web/public/next/assets/{surface-data-DshUC_TU.js → surface-data-C3UAQ4QX.js} +2 -2
  331. package/dist/core/web/public/next/assets/{surface-data-DshUC_TU.js.map → surface-data-C3UAQ4QX.js.map} +1 -1
  332. package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js +2 -0
  333. package/dist/core/web/public/next/assets/{surface-prefetch-DO8r4ttQ.js.map → surface-prefetch-BXKjPsV5.js.map} +1 -1
  334. package/dist/core/web/public/next/assets/{tasks-model-BKPFZAmZ.js → tasks-model-CzHvclVm.js} +2 -2
  335. package/dist/core/web/public/next/assets/{tasks-model-BKPFZAmZ.js.map → tasks-model-CzHvclVm.js.map} +1 -1
  336. package/dist/core/web/public/next/assets/{terminal-icons-DoeQkP3y.js → terminal-icons-BwgQTQP0.js} +2 -2
  337. package/dist/core/web/public/next/assets/{terminal-icons-DoeQkP3y.js.map → terminal-icons-BwgQTQP0.js.map} +1 -1
  338. package/dist/core/web/public/next/assets/types-IYKrYLku.js +2 -0
  339. package/dist/core/web/public/next/assets/types-IYKrYLku.js.map +1 -0
  340. package/dist/core/web/public/next/assets/{usage-queries-MnUeYzwp.js → usage-queries-pXxvy54x.js} +2 -2
  341. package/dist/core/web/public/next/assets/{usage-queries-MnUeYzwp.js.map → usage-queries-pXxvy54x.js.map} +1 -1
  342. package/dist/core/web/public/next/assets/{use-guarded-action-P12MfNwU.js → use-guarded-action-EgVWjM5c.js} +2 -2
  343. package/dist/core/web/public/next/assets/{use-guarded-action-P12MfNwU.js.map → use-guarded-action-EgVWjM5c.js.map} +1 -1
  344. package/dist/core/web/public/next/assets/{use-ticker-DIvAZ4Ey.js → use-ticker-BoqFxRFG.js} +2 -2
  345. package/dist/core/web/public/next/assets/{use-ticker-DIvAZ4Ey.js.map → use-ticker-BoqFxRFG.js.map} +1 -1
  346. package/dist/core/web/public/next/assets/{use-token-gate-DfEja7Wr.js → use-token-gate-DSNIIpI6.js} +2 -2
  347. package/dist/core/web/public/next/assets/{use-token-gate-DfEja7Wr.js.map → use-token-gate-DSNIIpI6.js.map} +1 -1
  348. package/dist/core/web/public/next/assets/{useOnboarding-CkOHadqC.js → useOnboarding-Bk0VnkxQ.js} +2 -2
  349. package/dist/core/web/public/next/assets/{useOnboarding-CkOHadqC.js.map → useOnboarding-Bk0VnkxQ.js.map} +1 -1
  350. package/dist/core/web/public/next/assets/{useSeatsRefresh-BDlbDlIU.js → useSeatsRefresh-q7Id9RcW.js} +2 -2
  351. package/dist/core/web/public/next/assets/{useSeatsRefresh-BDlbDlIU.js.map → useSeatsRefresh-q7Id9RcW.js.map} +1 -1
  352. package/dist/core/web/public/next/assets/{useVerseTranscript-BGtA55k2.js → useVerseTranscript-CqH51rt9.js} +2 -2
  353. package/dist/core/web/public/next/assets/{useVerseTranscript-BGtA55k2.js.map → useVerseTranscript-CqH51rt9.js.map} +1 -1
  354. package/dist/core/web/public/next/assets/{verse-icons-wOet9JZy.js → verse-icons-DsG1dOQx.js} +2 -2
  355. package/dist/core/web/public/next/assets/{verse-icons-wOet9JZy.js.map → verse-icons-DsG1dOQx.js.map} +1 -1
  356. package/dist/core/web/public/next/assets/{verse-model-CSzzdyu2.js → verse-model-JTuvRBVK.js} +2 -2
  357. package/dist/core/web/public/next/assets/{verse-model-CSzzdyu2.js.map → verse-model-JTuvRBVK.js.map} +1 -1
  358. package/dist/core/web/public/next/assets/{warmup-CecO_Nk0.js → warmup-Bv1RumVq.js} +3 -3
  359. package/dist/core/web/public/next/assets/{warmup-CecO_Nk0.js.map → warmup-Bv1RumVq.js.map} +1 -1
  360. package/dist/core/web/public/next/assets/why-seat-model-Cau8qG6O.js +2 -0
  361. package/dist/core/web/public/next/assets/why-seat-model-Cau8qG6O.js.map +1 -0
  362. package/dist/core/web/public/next/assets/{workspace-model-BdIVybKr.js → workspace-model-D-SLfads.js} +2 -2
  363. package/dist/core/web/public/next/assets/{workspace-model-BdIVybKr.js.map → workspace-model-D-SLfads.js.map} +1 -1
  364. package/dist/core/web/public/next/index.html +1 -1
  365. package/dist/release-dependency-inventory.json +1 -1
  366. package/docs/AUTONOMY-GAP.md +1 -1
  367. package/package.json +1 -1
  368. package/dist/core/web/public/next/assets/Advanced-CxzE6ekM.js +0 -2
  369. package/dist/core/web/public/next/assets/App-DFlp-vdv.js +0 -7
  370. package/dist/core/web/public/next/assets/AppsSection-Ct2O605-.js +0 -2
  371. package/dist/core/web/public/next/assets/AutonomyOffState-CXhXpsim.js +0 -2
  372. package/dist/core/web/public/next/assets/AutonomyOffState-CXhXpsim.js.map +0 -1
  373. package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +0 -1
  374. package/dist/core/web/public/next/assets/AutonomySection-BTg7yVa1.js +0 -2
  375. package/dist/core/web/public/next/assets/BudgetControl-ng6swoZp.js +0 -2
  376. package/dist/core/web/public/next/assets/BudgetControl-ng6swoZp.js.map +0 -1
  377. package/dist/core/web/public/next/assets/ChatSection-Bisj9R6E.js +0 -3
  378. package/dist/core/web/public/next/assets/ChatSection-Bisj9R6E.js.map +0 -1
  379. package/dist/core/web/public/next/assets/CommandSection-D8ZihzvE.js +0 -2
  380. package/dist/core/web/public/next/assets/CommandSection-D8ZihzvE.js.map +0 -1
  381. package/dist/core/web/public/next/assets/DockHost-BPqyhtCP.js +0 -2
  382. package/dist/core/web/public/next/assets/McpSection-D1tDvlRa.js +0 -2
  383. package/dist/core/web/public/next/assets/NeedsYouDrawer-D992XTOn.js +0 -2
  384. package/dist/core/web/public/next/assets/NeedsYouDrawer-D992XTOn.js.map +0 -1
  385. package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +0 -1
  386. package/dist/core/web/public/next/assets/NeedsYouList-eBOlJr0b.js +0 -2
  387. package/dist/core/web/public/next/assets/OnboardingFlow-D3yfITK1.js +0 -2
  388. package/dist/core/web/public/next/assets/OnboardingFlow-D3yfITK1.js.map +0 -1
  389. package/dist/core/web/public/next/assets/OnboardingGate-DrDEVBqw.js +0 -3
  390. package/dist/core/web/public/next/assets/ResourcesChrome-C2ZrA7la.js +0 -3
  391. package/dist/core/web/public/next/assets/Sidebar-BuO3sViG.js +0 -3
  392. package/dist/core/web/public/next/assets/Sidebar-BuO3sViG.js.map +0 -1
  393. package/dist/core/web/public/next/assets/VerseConsoleApp-DeuBEvAO.js +0 -3
  394. package/dist/core/web/public/next/assets/VerseConsoleApp-DeuBEvAO.js.map +0 -1
  395. package/dist/core/web/public/next/assets/cloud-model-DoxBMDvx.js +0 -2
  396. package/dist/core/web/public/next/assets/copy-setup-CJQhFl-4.js +0 -2
  397. package/dist/core/web/public/next/assets/copy-setup-CJQhFl-4.js.map +0 -1
  398. package/dist/core/web/public/next/assets/format-DEAaVF6X.js +0 -2
  399. package/dist/core/web/public/next/assets/format-DEAaVF6X.js.map +0 -1
  400. package/dist/core/web/public/next/assets/global-CXHHMz9o.js +0 -2
  401. package/dist/core/web/public/next/assets/live-model-CEf01wrW.js.map +0 -1
  402. package/dist/core/web/public/next/assets/mutations-CbTSofVH.js +0 -2
  403. package/dist/core/web/public/next/assets/primitives-DNI-uJBd.js +0 -1
  404. package/dist/core/web/public/next/assets/surface-prefetch-DO8r4ttQ.js +0 -2
  405. package/dist/core/web/public/next/assets/types-D5XOdyw8.js +0 -2
  406. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +0 -1
  407. package/dist/core/web/public/next/assets/why-seat-model-D68ZA7G8.js +0 -2
  408. package/dist/core/web/public/next/assets/why-seat-model-D68ZA7G8.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyState-DXkT4vhW.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/EmptyState.module.css","../../../../../../src/web-ui/components/primitives/EmptyState.tsx"],"sourcesContent":["/**\n * The designed dead-end. DESIGN-V2 §1.2 allows no cards and no nested boxes,\n * and §5 asks an empty state to read as \"a single quiet line, one action\" —\n * so this is NOT a dashed box on a filled ground. It was one, which meant\n * every empty panel grew a second border inside the panel's own hairline and\n * announced the absence of data louder than the data would have been.\n *\n * What carries it instead: a 2px left rule (the same device the transcript\n * uses for a user turn, a blockquote and a failed tool call), left-aligned\n * text on the surface it already sits on, and one action. Tone moves the rule\n * and the glyph only — never a fill, never a border box.\n */\n.empty {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--space-2);\n padding: var(--space-6) 0 var(--space-6) var(--space-4);\n border-left: 2px solid var(--border-strong);\n text-align: left;\n}\n\n.compact {\n padding: var(--space-4) 0 var(--space-4) var(--space-3);\n gap: var(--space-1);\n}\n\n.icon {\n display: inline-flex;\n color: var(--text-tertiary);\n}\n\n.title {\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-medium);\n letter-spacing: var(--tracking-display);\n color: var(--text-primary);\n}\n\n.body {\n max-width: 52ch;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n\n.action {\n margin-top: var(--space-1);\n}\n\n/* Tone is carried by the rule and the glyph. The text stays neutral so the\n state never reads as a filled alert banner (§1.1: one accent per screen,\n colour only where it carries meaning). */\n.error {\n border-left-color: var(--status-danger-solid);\n}\n.error .icon {\n color: var(--status-danger-fg);\n}\n\n.unauthorized {\n border-left-color: var(--status-warning-solid);\n}\n.unauthorized .icon {\n color: var(--status-warning-fg);\n}\n","/**\n * components/primitives/EmptyState.tsx — the designed state for \"there is\n * genuinely nothing here\" (design doc §1.6: honest states).\n *\n * It takes a TITLE and a BODY because an empty surface has to say what it\n * means — \"No enrolled repositories\" is a fact, \"the daemon will do nothing\n * until you enroll one\" is the consequence the operator needs. `tone=\"error\"`\n * and `tone=\"unauthorized\"` cover the other two dead ends so no view has to\n * invent its own.\n */\nimport type { ReactNode } from 'react';\nimport styles from './EmptyState.module.css';\n\nexport interface EmptyStateProps {\n title: ReactNode;\n /** What it means / what to do about it. */\n body?: ReactNode;\n /** 16px glyph from ./icons.tsx. */\n icon?: ReactNode;\n /** A single action — usually the thing that resolves the emptiness. */\n action?: ReactNode;\n tone?: 'neutral' | 'error' | 'unauthorized';\n /** Tighter padding for a panel rather than a whole view. */\n compact?: boolean;\n className?: string;\n}\n\nexport function EmptyState({\n title,\n body,\n icon,\n action,\n tone = 'neutral',\n compact = false,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={`${styles.empty} ${styles[tone]} ${compact ? styles.compact : ''} ${className ?? ''}`}\n role={tone === 'error' ? 'alert' : undefined}\n >\n {icon ? <span className={styles.icon}>{icon}</span> : null}\n <p className={styles.title}>{title}</p>\n {body ? <p className={styles.body}>{body}</p> : null}\n {action ? <div className={styles.action}>{action}</div> : null}\n </div>\n );\n}\n"],"mappings":"sQC2BA,SAAgB,EAAW,CACzB,QACA,OACA,OACA,SACA,OAAO,UACP,UAAU,GACV,aACkB,CAClB,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,GAAM,GAAG,EAAU,EAAO,QAAU,GAAG,GAAG,GAAa,KAC5F,KAAM,IAAS,QAAU,QAAU,IAAA,GAFrC,SAAA,CAIG,GAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAO,SAAA,CAAW,CAAA,EAAI,MACtD,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAQ,SAAA,CAAS,CAAA,EACrC,GAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAO,SAAA,CAAQ,CAAA,EAAI,KAC/C,GAAS,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OAAS,SAAA,CAAY,CAAA,EAAI,IACvD,GAET"}
1
+ {"version":3,"file":"EmptyState-DsN1H6MC.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/EmptyState.module.css","../../../../../../src/web-ui/components/primitives/EmptyState.tsx"],"sourcesContent":["/**\n * The designed dead-end. DESIGN-V2 §1.2 allows no cards and no nested boxes,\n * and §5 asks an empty state to read as \"a single quiet line, one action\" —\n * so this is NOT a dashed box on a filled ground. It was one, which meant\n * every empty panel grew a second border inside the panel's own hairline and\n * announced the absence of data louder than the data would have been.\n *\n * What carries it instead: a 2px left rule (the same device the transcript\n * uses for a user turn, a blockquote and a failed tool call), left-aligned\n * text on the surface it already sits on, and one action. Tone moves the rule\n * and the glyph only — never a fill, never a border box.\n */\n.empty {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--space-2);\n padding: var(--space-6) 0 var(--space-6) var(--space-4);\n border-left: 2px solid var(--border-strong);\n text-align: left;\n}\n\n.compact {\n padding: var(--space-4) 0 var(--space-4) var(--space-3);\n gap: var(--space-1);\n}\n\n.icon {\n display: inline-flex;\n color: var(--text-tertiary);\n}\n\n.title {\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-medium);\n letter-spacing: var(--tracking-display);\n color: var(--text-primary);\n}\n\n.body {\n max-width: 52ch;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n\n.action {\n margin-top: var(--space-1);\n}\n\n/* Tone is carried by the rule and the glyph. The text stays neutral so the\n state never reads as a filled alert banner (§1.1: one accent per screen,\n colour only where it carries meaning). */\n.error {\n border-left-color: var(--status-danger-solid);\n}\n.error .icon {\n color: var(--status-danger-fg);\n}\n\n.unauthorized {\n border-left-color: var(--status-warning-solid);\n}\n.unauthorized .icon {\n color: var(--status-warning-fg);\n}\n","/**\n * components/primitives/EmptyState.tsx — the designed state for \"there is\n * genuinely nothing here\" (design doc §1.6: honest states).\n *\n * It takes a TITLE and a BODY because an empty surface has to say what it\n * means — \"No enrolled repositories\" is a fact, \"the daemon will do nothing\n * until you enroll one\" is the consequence the operator needs. `tone=\"error\"`\n * and `tone=\"unauthorized\"` cover the other two dead ends so no view has to\n * invent its own.\n */\nimport type { ReactNode } from 'react';\nimport styles from './EmptyState.module.css';\n\nexport interface EmptyStateProps {\n title: ReactNode;\n /** What it means / what to do about it. */\n body?: ReactNode;\n /** 16px glyph from ./icons.tsx. */\n icon?: ReactNode;\n /** A single action — usually the thing that resolves the emptiness. */\n action?: ReactNode;\n tone?: 'neutral' | 'error' | 'unauthorized';\n /** Tighter padding for a panel rather than a whole view. */\n compact?: boolean;\n className?: string;\n}\n\nexport function EmptyState({\n title,\n body,\n icon,\n action,\n tone = 'neutral',\n compact = false,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={`${styles.empty} ${styles[tone]} ${compact ? styles.compact : ''} ${className ?? ''}`}\n role={tone === 'error' ? 'alert' : undefined}\n >\n {icon ? <span className={styles.icon}>{icon}</span> : null}\n <p className={styles.title}>{title}</p>\n {body ? <p className={styles.body}>{body}</p> : null}\n {action ? <div className={styles.action}>{action}</div> : null}\n </div>\n );\n}\n"],"mappings":"sQC2BA,SAAgB,EAAW,CACzB,QACA,OACA,OACA,SACA,OAAO,UACP,UAAU,GACV,aACkB,CAClB,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,GAAM,GAAG,EAAU,EAAO,QAAU,GAAG,GAAG,GAAa,KAC5F,KAAM,IAAS,QAAU,QAAU,IAAA,GAFrC,SAAA,CAIG,GAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAO,SAAA,CAAW,CAAA,EAAI,MACtD,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAQ,SAAA,CAAS,CAAA,EACrC,GAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAO,SAAA,CAAQ,CAAA,EAAI,KAC/C,GAAS,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OAAS,SAAA,CAAY,CAAA,EAAI,IACvD,GAET"}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./index-BG177cPN.js";var t={unknown:`_unknown_4gf0c_1`,dot:`_dot_4gf0c_11`,badge:`_badge_4gf0c_19`},n=e();function r(e){return!e||e.sourceState===`healthy`&&e.complete!==!1}function i({quality:e,children:i,renderControl:a,label:o}){if(r(e))return(0,n.jsxs)(n.Fragment,{children:[i,a?.()]});let s=e?.reason;return(0,n.jsxs)(`span`,{className:t.unknown,title:s?`Unavailable: ${s}`:`Source data unavailable`,children:[(0,n.jsx)(`span`,{className:t.dot,"aria-hidden":`true`}),`unknown`,o?(0,n.jsxs)(`span`,{className:`visually-hidden`,children:[` (`,o,`)`]}):null]})}function a({quality:e,label:i}){return r(e)?null:(0,n.jsxs)(`span`,{className:t.badge,title:e?.reason??`Source data unavailable`,children:[i?`${i}: `:``,`unknown`]})}export{a as n,r,i as t};
2
- //# sourceMappingURL=Epistemic-CfqFe_aP.js.map
1
+ import{n as e}from"./index-CyK31YRm.js";var t={unknown:`_unknown_4gf0c_1`,dot:`_dot_4gf0c_11`,badge:`_badge_4gf0c_19`},n=e();function r(e){return!e||e.sourceState===`healthy`&&e.complete!==!1}function i({quality:e,children:i,renderControl:a,label:o}){if(r(e))return(0,n.jsxs)(n.Fragment,{children:[i,a?.()]});let s=e?.reason;return(0,n.jsxs)(`span`,{className:t.unknown,title:s?`Unavailable: ${s}`:`Source data unavailable`,children:[(0,n.jsx)(`span`,{className:t.dot,"aria-hidden":`true`}),`unknown`,o?(0,n.jsxs)(`span`,{className:`visually-hidden`,children:[` (`,o,`)`]}):null]})}function a({quality:e,label:i}){return r(e)?null:(0,n.jsxs)(`span`,{className:t.badge,title:e?.reason??`Source data unavailable`,children:[i?`${i}: `:``,`unknown`]})}export{a as n,r,i as t};
2
+ //# sourceMappingURL=Epistemic-fycQTBRO.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Epistemic-CfqFe_aP.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Epistemic.module.css","../../../../../../src/web-ui/components/primitives/Epistemic.tsx"],"sourcesContent":[".unknown {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n color: var(--status-unknown-fg);\n font-size: var(--text-sm-size);\n font-style: italic;\n cursor: help;\n}\n\n.dot {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--status-unknown-solid);\n flex-shrink: 0;\n}\n\n.badge {\n display: inline-flex;\n align-items: center;\n padding: 1px var(--space-2);\n border-radius: var(--radius-xs);\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n font-size: var(--text-xs-size);\n font-style: italic;\n cursor: help;\n}\n","/**\n * components/primitives/Epistemic.tsx — the one thing the old UI got right,\n * promoted to a first-class primitive (foundation brief, item 7).\n *\n * When a piece of data's `sourceQuality.sourceState` is 'degraded' or\n * 'unknown'/'missing', this component displays \"unknown\" (never a stale or\n * guessed value dressed up as current) AND withholds any control built on\n * top of it (`renderControl` simply never runs). Every future view should\n * wrap sourceQuality-bearing fields in this rather than reinventing the\n * check — that is the whole point of making it a primitive instead of a\n * convention someone has to remember.\n *\n * Reference (old, correct behavior this replaces): app.js:311-314, :336-347.\n */\nimport type { ReactNode } from 'react';\nimport type { SourceQuality } from '../../data/api-types.js';\nimport styles from './Epistemic.module.css';\n\nexport function isKnown(quality: SourceQuality | undefined): boolean {\n if (!quality) return true; // absent quality metadata => field predates the pattern; trust it.\n return quality.sourceState === 'healthy' && quality.complete !== false;\n}\n\nexport interface EpistemicProps {\n quality: SourceQuality | undefined;\n /** Rendered when the value is known-good. */\n children: ReactNode;\n /**\n * A control (button, toggle, link) whose action depends on this data\n * being trustworthy — e.g. \"restart daemon\" next to daemon.running.\n * Omitted entirely (not disabled — omitted) when the source is degraded,\n * so an operator never sees an actionable-looking control wired to a\n * guess.\n */\n renderControl?: () => ReactNode;\n /** Optional label used in the \"unknown\" state, e.g. \"daemon status\". */\n label?: string;\n}\n\nexport function Epistemic({ quality, children, renderControl, label }: EpistemicProps): ReactNode {\n if (isKnown(quality)) {\n return (\n <>\n {children}\n {renderControl?.()}\n </>\n );\n }\n\n const reason = quality?.reason;\n return (\n <span className={styles.unknown} title={reason ? `Unavailable: ${reason}` : 'Source data unavailable'}>\n <span className={styles.dot} aria-hidden=\"true\" />\n unknown\n {label ? <span className=\"visually-hidden\"> ({label})</span> : null}\n </span>\n );\n}\n\n/** Small inline badge form, for table cells / dense rows. */\nexport function EpistemicBadge({ quality, label }: { quality: SourceQuality | undefined; label?: string }): ReactNode {\n if (isKnown(quality)) return null;\n return (\n <span className={styles.badge} title={quality?.reason ?? 'Source data unavailable'}>\n {label ? `${label}: ` : ''}unknown\n </span>\n );\n}\n"],"mappings":"6HCkBA,SAAgB,EAAQ,EAA6C,CAEnE,MADA,CAAK,GACE,EAAQ,cAAgB,WAAa,EAAQ,WAAa,EACnE,CAkBA,SAAgB,EAAU,CAAE,UAAS,WAAU,gBAAe,SAAoC,CAChG,GAAI,EAAQ,CAAO,EACjB,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,EACA,IAAgB,CACjB,CAAA,CAAA,EAIN,IAAM,EAAS,GAAS,OACxB,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,MAAO,EAAS,gBAAgB,IAAW,0BAA5E,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAK,cAAY,MAAQ,CAAA,EAAC,UAEjD,GAAQ,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,kBAAhB,SAAA,CAAkC,KAAG,EAAM,GAAO,CAAI,CAAA,EAAA,IAC3D,GAEV,CAGA,SAAgB,EAAe,CAAE,UAAS,SAA4E,CAEpH,OADI,EAAQ,CAAO,EAAU,MAE3B,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAO,MAAO,GAAS,QAAU,0BAAzD,SAAA,CACG,EAAQ,GAAG,EAAM,IAAM,GAAG,SACvB,GAEV"}
1
+ {"version":3,"file":"Epistemic-fycQTBRO.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Epistemic.module.css","../../../../../../src/web-ui/components/primitives/Epistemic.tsx"],"sourcesContent":[".unknown {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n color: var(--status-unknown-fg);\n font-size: var(--text-sm-size);\n font-style: italic;\n cursor: help;\n}\n\n.dot {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--status-unknown-solid);\n flex-shrink: 0;\n}\n\n.badge {\n display: inline-flex;\n align-items: center;\n padding: 1px var(--space-2);\n border-radius: var(--radius-xs);\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n font-size: var(--text-xs-size);\n font-style: italic;\n cursor: help;\n}\n","/**\n * components/primitives/Epistemic.tsx — the one thing the old UI got right,\n * promoted to a first-class primitive (foundation brief, item 7).\n *\n * When a piece of data's `sourceQuality.sourceState` is 'degraded' or\n * 'unknown'/'missing', this component displays \"unknown\" (never a stale or\n * guessed value dressed up as current) AND withholds any control built on\n * top of it (`renderControl` simply never runs). Every future view should\n * wrap sourceQuality-bearing fields in this rather than reinventing the\n * check — that is the whole point of making it a primitive instead of a\n * convention someone has to remember.\n *\n * Reference (old, correct behavior this replaces): app.js:311-314, :336-347.\n */\nimport type { ReactNode } from 'react';\nimport type { SourceQuality } from '../../data/api-types.js';\nimport styles from './Epistemic.module.css';\n\nexport function isKnown(quality: SourceQuality | undefined): boolean {\n if (!quality) return true; // absent quality metadata => field predates the pattern; trust it.\n return quality.sourceState === 'healthy' && quality.complete !== false;\n}\n\nexport interface EpistemicProps {\n quality: SourceQuality | undefined;\n /** Rendered when the value is known-good. */\n children: ReactNode;\n /**\n * A control (button, toggle, link) whose action depends on this data\n * being trustworthy — e.g. \"restart daemon\" next to daemon.running.\n * Omitted entirely (not disabled — omitted) when the source is degraded,\n * so an operator never sees an actionable-looking control wired to a\n * guess.\n */\n renderControl?: () => ReactNode;\n /** Optional label used in the \"unknown\" state, e.g. \"daemon status\". */\n label?: string;\n}\n\nexport function Epistemic({ quality, children, renderControl, label }: EpistemicProps): ReactNode {\n if (isKnown(quality)) {\n return (\n <>\n {children}\n {renderControl?.()}\n </>\n );\n }\n\n const reason = quality?.reason;\n return (\n <span className={styles.unknown} title={reason ? `Unavailable: ${reason}` : 'Source data unavailable'}>\n <span className={styles.dot} aria-hidden=\"true\" />\n unknown\n {label ? <span className=\"visually-hidden\"> ({label})</span> : null}\n </span>\n );\n}\n\n/** Small inline badge form, for table cells / dense rows. */\nexport function EpistemicBadge({ quality, label }: { quality: SourceQuality | undefined; label?: string }): ReactNode {\n if (isKnown(quality)) return null;\n return (\n <span className={styles.badge} title={quality?.reason ?? 'Source data unavailable'}>\n {label ? `${label}: ` : ''}unknown\n </span>\n );\n}\n"],"mappings":"6HCkBA,SAAgB,EAAQ,EAA6C,CAEnE,MADA,CAAK,GACE,EAAQ,cAAgB,WAAa,EAAQ,WAAa,EACnE,CAkBA,SAAgB,EAAU,CAAE,UAAS,WAAU,gBAAe,SAAoC,CAChG,GAAI,EAAQ,CAAO,EACjB,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,EACA,IAAgB,CACjB,CAAA,CAAA,EAIN,IAAM,EAAS,GAAS,OACxB,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,MAAO,EAAS,gBAAgB,IAAW,0BAA5E,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAK,cAAY,MAAQ,CAAA,EAAC,UAEjD,GAAQ,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,kBAAhB,SAAA,CAAkC,KAAG,EAAM,GAAO,CAAI,CAAA,EAAA,IAC3D,GAEV,CAGA,SAAgB,EAAe,CAAE,UAAS,SAA4E,CAEpH,OADI,EAAQ,CAAO,EAAU,MAE3B,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAO,MAAO,GAAS,QAAU,0BAAzD,SAAA,CACG,EAAQ,GAAG,EAAM,IAAM,GAAG,SACvB,GAEV"}
@@ -0,0 +1 @@
1
+ ._summaryRow_71hqu_11{justify-content:space-between;align-items:center;gap:var(--space-2);margin-bottom:var(--space-3);display:flex}._summary_71hqu_11,._muted_71hqu_20{color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:var(--text-xs-line);margin:0}._notice_71hqu_27{padding:var(--space-2) var(--space-3);border:1px solid var(--border-subtle);border-radius:var(--radius-sm);color:var(--text-secondary);font-size:var(--text-xs-size);line-height:var(--text-xs-line-relaxed);overflow-wrap:break-word;margin:0}._steps_71hqu_38{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}._step_71hqu_38{grid-template-columns:var(--space-4) minmax(0, 1fr);gap:0 var(--space-3);display:grid}._rail_71hqu_52{padding-top:var(--space-1);flex-direction:column;align-items:center;display:flex}._node_71hqu_59{border:1.5px solid var(--border-strong);border-radius:var(--radius-full);background:var(--border-strong);flex-shrink:0;width:9px;height:9px}._step_71hqu_38[data-badge=verified] ._node_71hqu_59{border-color:var(--status-success-solid);background:var(--status-success-solid)}._step_71hqu_38[data-badge=claim] ._node_71hqu_59{border-color:var(--status-warning-solid);background:var(--status-warning-solid)}._step_71hqu_38[data-reached=false] ._node_71hqu_59{background:var(--bg-surface)}._line_71hqu_82{width:1px;min-height:var(--space-3);margin-top:var(--space-1);background:var(--border-subtle);flex:auto}._content_71hqu_90{gap:var(--space-1);min-width:0;padding-bottom:var(--space-4);flex-direction:column;display:flex}._head_71hqu_98{justify-content:space-between;align-items:center;gap:var(--space-2);display:flex}._label_71hqu_105{color:var(--text-tertiary);font-size:var(--text-xs-size);font-weight:var(--font-weight-medium);line-height:var(--text-xs-line)}._badge_71hqu_112{flex-shrink:0;display:inline-flex}._title_71hqu_117{color:var(--text-primary);font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);line-height:var(--text-sm-line);overflow-wrap:break-word;margin:0}._step_71hqu_38[data-reached=false] ._title_71hqu_117{color:var(--text-secondary);font-weight:var(--font-weight-regular)}._detail_71hqu_131{color:var(--text-secondary);font-size:var(--text-xs-size);line-height:var(--text-xs-line-relaxed);overflow-wrap:break-word;margin:0}._meta_71hqu_139{align-items:center;gap:var(--space-1) var(--space-2);color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:var(--text-xs-line);flex-wrap:wrap;margin:0;display:flex}._meta_71hqu_139>span+span:before{content:"·";margin-right:var(--space-2)}._link_71hqu_155{align-items:center;gap:var(--space-1);color:var(--text-link);white-space:nowrap;text-decoration:none;display:inline-flex}._link_71hqu_155:hover{text-decoration:underline}._link_71hqu_155:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}
@@ -0,0 +1,2 @@
1
+ import{a as e,c as t,n}from"./index-CyK31YRm.js";import{c as r,h as i,m as a,o}from"./global-y_exIyAP.js";import{n as s}from"./StatusBadge-CXG3iNL4.js";import{v as c}from"./context-model-Bb15chFt.js";import{n as l}from"./Button-DtE0rlWD.js";import{_ as u,c as d}from"./icons-CygCEFWs.js";import{r as f}from"./types-IYKrYLku.js";import{t as p}from"./Sheet-HkBOBMTT.js";import{T as m,_ as h}from"./cloud-model-CfRydq8N.js";var g=t(e(),1);function _(e){return`/api/verse/cloud/tasks/${encodeURIComponent(e)}/timeline`}var v=[`objective`,`launch`,`worker`,`report`,`pr`,`diff`,`checks`,`gates`,`merge`,`release`,`health`,`cost`],y={verified:`Verified`,claim:`Claim`,estimate:`Estimate`,unknown:`Unknown`},b={verified:`Read from a record Verse or GitHub wrote, not from the session.`,claim:`The cloud session’s own say-so. Nothing checked it.`,estimate:`An estimate fixed at launch; the real balance is on claude.ai.`,unknown:`Nothing was recorded, or the record could not be read.`},x={objective:`Objective`,launch:`Session`,worker:`Worker`,report:`Report`,pr:`Pull request`,diff:`Diff`,checks:`Checks`,gates:`Merge gates`,merge:`Merge`,release:`Release`,health:`Health`,cost:`Cost`};function S(e){return e.verified===!0?`verified`:e.verified===!1?e.kind===`cost`?`estimate`:`claim`:`unknown`}var C=[!0,!1,`unknown`];function w(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function T(e){if(!w(e))return null;let t=e.kind;if(typeof t!=`string`||!v.includes(t)||!C.includes(e.verified)||typeof e.title!=`string`||typeof e.detail!=`string`||typeof e.source!=`string`||e.at!==null&&typeof e.at!=`string`)return null;let n={kind:t,at:e.at,title:e.title,detail:e.detail,source:e.source,verified:e.verified,reached:e.reached!==!1},r=e.link;if(w(r)&&typeof r.href==`string`&&typeof r.label==`string`){let e=h(r.href,`github.com`)??h(r.href,`claude.ai`);e&&(n.link={href:e,label:r.label})}return n}function E(e){if(!w(e)||e.v!==1||typeof e.taskId!=`string`||!Array.isArray(e.steps))return null;let t=e.steps.map(T).filter(e=>e!==null);return{v:1,generatedAt:typeof e.generatedAt==`string`?e.generatedAt:``,taskId:e.taskId,repo:typeof e.repo==`string`?e.repo:``,title:typeof e.title==`string`?e.title:``,state:typeof e.state==`string`?e.state:``,steps:t}}function D(e,t=Date.now()){return c(e.at,t)}function O(e){return m(e)}function k(e){let t=0,n=0,r=0;for(let i of e){if(!i.reached)continue;let e=S(i);e===`verified`?t+=1:e===`unknown`?r+=1:n+=1}let i=[`${t} verified`];return n>0&&i.push(`${n} ${n===1?`claim or estimate`:`claims or estimates`}`),r>0&&i.push(`${r} unknown`),{verified:t,claims:n,unknown:r,text:i.join(` · `)}}var A={summaryRow:`_summaryRow_71hqu_11`,summary:`_summary_71hqu_11`,muted:`_muted_71hqu_20`,notice:`_notice_71hqu_27`,steps:`_steps_71hqu_38`,step:`_step_71hqu_38`,rail:`_rail_71hqu_52`,node:`_node_71hqu_59`,line:`_line_71hqu_82`,content:`_content_71hqu_90`,head:`_head_71hqu_98`,label:`_label_71hqu_105`,badge:`_badge_71hqu_112`,title:`_title_71hqu_117`,detail:`_detail_71hqu_131`,meta:`_meta_71hqu_139`,link:`_link_71hqu_155`},j=n(),M={verified:`success`,claim:`warning`,estimate:`neutral`,unknown:`unknown`};function N(e){return e instanceof o?e.status===404?`Verse has no evidence for this task — it is not in the task store, or this build has no timeline yet.`:e.status===503?`The timeline failed to load on the server.`:`The timeline answered HTTP ${e.status}.`:`The timeline could not be reached.`}function P(e){return{key:`verse-cloud-timeline-${e}`,fetch:async t=>{if(!f.test(e))return{timeline:null,reason:`That task id is not one Verse issued.`};try{let n=E(await r(_(e),t));return n?{timeline:n,reason:null}:{timeline:null,reason:`Unrecognized response — update Ashlr.`}}catch(e){if(e instanceof o&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{timeline:null,reason:N(e)}}}}}function F({step:e,now:t,last:n}){let r=S(e),i=D(e,t),a=O(e.detail);return(0,j.jsxs)(`li`,{className:A.step,"data-badge":r,"data-reached":e.reached?`true`:`false`,"data-kind":e.kind,children:[(0,j.jsxs)(`span`,{className:A.rail,"aria-hidden":`true`,children:[(0,j.jsx)(`span`,{className:A.node}),n?null:(0,j.jsx)(`span`,{className:A.line})]}),(0,j.jsxs)(`div`,{className:A.content,children:[(0,j.jsxs)(`div`,{className:A.head,children:[(0,j.jsx)(`span`,{className:A.label,children:x[e.kind]}),(0,j.jsx)(`span`,{className:A.badge,title:b[r],children:(0,j.jsx)(s,{status:r,tone:M[r],children:r===`verified`?`✓ ${y[r]}`:y[r]})})]}),(0,j.jsx)(`p`,{className:A.title,children:O(e.title)}),a?(0,j.jsx)(`p`,{className:A.detail,children:a}):null,(0,j.jsxs)(`p`,{className:A.meta,children:[(0,j.jsx)(`span`,{children:e.source}),i?(0,j.jsx)(`span`,{children:i}):null,e.link?(0,j.jsxs)(`a`,{className:A.link,href:e.link.href,target:`_blank`,rel:`noreferrer noopener`,children:[e.link.label,` `,(0,j.jsx)(d,{width:11,height:11,"aria-hidden":`true`})]}):null]})]})]})}function I({taskId:e,now:t}){let n=(0,g.useMemo)(()=>P(e),[e]),r=a(n,{freshMs:15e3}),o=i(n),s=r.data?.timeline??null,c=s?k(s.steps):null;return!r.data&&!r.error?(0,j.jsx)(`p`,{className:A.muted,"aria-busy":`true`,children:`Reading the evidence…`}):s?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsxs)(`div`,{className:A.summaryRow,children:[(0,j.jsx)(`p`,{className:A.summary,children:c?.text}),(0,j.jsx)(l,{size:`sm`,variant:`ghost`,icon:(0,j.jsx)(u,{width:14,height:14}),"aria-label":`Re-read the evidence`,onClick:o})]}),(0,j.jsx)(`ol`,{className:A.steps,"aria-label":`Evidence, from objective to cost`,children:s.steps.map((e,n)=>(0,j.jsx)(F,{step:e,now:t,last:n===s.steps.length-1},e.kind))})]}):(0,j.jsx)(`p`,{className:A.notice,role:`note`,children:r.data?.reason??r.error?.message??`The timeline did not answer.`})}function L({taskId:e,title:t,open:n,onClose:r,now:i=Date.now()}){let a=(0,g.useId)();return(0,j.jsx)(p,{open:n,onClose:r,titleId:a,width:520,title:`Evidence`,description:t,children:n?(0,j.jsx)(I,{taskId:e,now:i}):null})}export{L as EvidenceTimeline,L as default,P as cloudTimelineQuery};
2
+ //# sourceMappingURL=EvidenceTimeline-sCCAdnBK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvidenceTimeline-sCCAdnBK.js","names":[],"sources":["../../../../../../src/core/cloud/timeline-types.ts","../../../../../../src/web-ui/routes/verse/cloud/timeline-model.ts","../../../../../../src/web-ui/routes/verse/cloud/evidence-timeline.module.css","../../../../../../src/web-ui/routes/verse/cloud/EvidenceTimeline.tsx"],"sourcesContent":["/**\n * Cloud task evidence timeline — the HTTP contract (3.13).\n *\n * GET /api/verse/cloud/tasks/<id>/timeline → CloudTimelineResponse\n *\n * One ordered chain per cloud task, from the objective to what it cost:\n *\n * objective → launch → worker (model / account) → report (a CLAIM) → PR\n * → diff → checks → merge gates → merge → release → health → cost\n *\n * Every step says where it came from (`source`) and how much it can be\n * trusted (`verified`):\n * true a record Verse (or GitHub, through the tracker) wrote itself —\n * the task store, the fleet merge record, the hash-chained\n * authority ledger, the post-merge watch, local git.\n * false someone's say-so. The session's own report is ALWAYS this,\n * and so is the cost, which is an estimate fixed at launch.\n * 'unknown' nothing was recorded, or the record could not be read.\n *\n * Steps are always present and always in this order, so the chain reads the\n * same for every task; a stage the task has not reached says so\n * (`reached: false`) instead of disappearing.\n *\n * NODE-FREE on purpose: the web UI imports these types and the path helper.\n */\n\nexport const CLOUD_TIMELINE_SCHEMA_VERSION = 1 as const;\n\n/** `/api/verse/cloud/tasks/<id>/timeline` — the id is checked against CLOUD_TASK_ID_PATTERN by the route. */\nexport const CLOUD_TIMELINE_PATH_RE = /^\\/api\\/verse\\/cloud\\/tasks\\/([^/]+)\\/timeline$/;\n\nexport function cloudTimelinePath(taskId: string): string {\n return `/api/verse/cloud/tasks/${encodeURIComponent(taskId)}/timeline`;\n}\n\nexport type TimelineStepKind =\n | 'objective'\n | 'launch'\n | 'worker'\n | 'report'\n | 'pr'\n | 'diff'\n | 'checks'\n | 'gates'\n | 'merge'\n | 'release'\n | 'health'\n | 'cost';\n\n/** The fixed order every timeline uses. */\nexport const TIMELINE_STEP_ORDER: readonly TimelineStepKind[] = [\n 'objective', 'launch', 'worker', 'report', 'pr', 'diff', 'checks', 'gates', 'merge', 'release', 'health', 'cost',\n];\n\nexport type TimelineVerified = true | false | 'unknown';\n\nexport interface TimelineLink {\n /** https only: claude.ai, github.com. */\n href: string;\n label: string;\n}\n\nexport interface TimelineStep {\n kind: TimelineStepKind;\n /** ISO time the evidence was recorded; null when no time was recorded (never guessed). */\n at: string | null;\n /** One short line (\"PR #512 merged\"). */\n title: string;\n /** Plain sentences; scrubbed. May be empty. */\n detail: string;\n /** Where the evidence came from, in operator words (\"authority ledger\", \"session report\"). */\n source: string;\n verified: TimelineVerified;\n /** False while the task has not reached this stage (it may never). */\n reached: boolean;\n link?: TimelineLink;\n}\n\nexport interface CloudTimelineResponse {\n v: typeof CLOUD_TIMELINE_SCHEMA_VERSION;\n generatedAt: string;\n taskId: string;\n repo: string;\n title: string;\n state: string;\n steps: TimelineStep[];\n}\n","/**\n * routes/verse/cloud/timeline-model.ts — the evidence timeline's words and\n * decisions as pure functions (3.13; server: core/cloud/timeline.ts). No React.\n *\n * Copy rules, on top of the cloud lane's (cloud-model.ts):\n * - every step carries a WORD for how far it can be trusted — \"Verified\",\n * \"Claim\", \"Estimate\" or \"Unknown\" — never a colour or an icon alone;\n * - the session's report is a claim and the cost an estimate, whatever the\n * server sends: the badge is derived from `verified`, and `false` can only\n * ever read as Claim / Estimate;\n * - times are local and relative; a step with no recorded time shows none\n * (it is never back-filled from a neighbour).\n */\nimport {\n TIMELINE_STEP_ORDER,\n type CloudTimelineResponse,\n type TimelineStep,\n type TimelineStepKind,\n type TimelineVerified,\n} from '../../../../core/cloud/timeline-types.js';\nimport { scrubSecrets } from '../../../../core/util/scrub.js';\nimport { relativePhrase } from '../context/context-model.js';\nimport { safeHref } from './cloud-model.js';\n\nexport type TimelineBadge = 'verified' | 'claim' | 'estimate' | 'unknown';\n\nexport const BADGE_WORD: Record<TimelineBadge, string> = {\n verified: 'Verified',\n claim: 'Claim',\n estimate: 'Estimate',\n unknown: 'Unknown',\n};\n\n/** Tooltip / screen-reader sentence for each badge. */\nexport const BADGE_MEANING: Record<TimelineBadge, string> = {\n verified: 'Read from a record Verse or GitHub wrote, not from the session.',\n claim: 'The cloud session’s own say-so. Nothing checked it.',\n estimate: 'An estimate fixed at launch; the real balance is on claude.ai.',\n unknown: 'Nothing was recorded, or the record could not be read.',\n};\n\nexport const STEP_LABEL: Record<TimelineStepKind, string> = {\n objective: 'Objective',\n launch: 'Session',\n worker: 'Worker',\n report: 'Report',\n pr: 'Pull request',\n diff: 'Diff',\n checks: 'Checks',\n gates: 'Merge gates',\n merge: 'Merge',\n release: 'Release',\n health: 'Health',\n cost: 'Cost',\n};\n\nexport function badgeFor(step: Pick<TimelineStep, 'kind' | 'verified'>): TimelineBadge {\n if (step.verified === true) return 'verified';\n if (step.verified === false) return step.kind === 'cost' ? 'estimate' : 'claim';\n return 'unknown';\n}\n\nconst VERIFIED_VALUES: readonly TimelineVerified[] = [true, false, 'unknown'];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction narrowStep(raw: unknown): TimelineStep | null {\n if (!isRecord(raw)) return null;\n const kind = raw['kind'];\n if (typeof kind !== 'string' || !(TIMELINE_STEP_ORDER as readonly string[]).includes(kind)) return null;\n if (!VERIFIED_VALUES.includes(raw['verified'] as TimelineVerified)) return null;\n if (typeof raw['title'] !== 'string' || typeof raw['detail'] !== 'string' || typeof raw['source'] !== 'string') return null;\n if (raw['at'] !== null && typeof raw['at'] !== 'string') return null;\n const step: TimelineStep = {\n kind: kind as TimelineStepKind,\n at: raw['at'] as string | null,\n title: raw['title'],\n detail: raw['detail'],\n source: raw['source'],\n verified: raw['verified'] as TimelineVerified,\n reached: raw['reached'] !== false,\n };\n const link = raw['link'];\n if (isRecord(link) && typeof link['href'] === 'string' && typeof link['label'] === 'string') {\n // Only these hosts ever become links, whatever the server sent.\n const href = safeHref(link['href'], 'github.com') ?? safeHref(link['href'], 'claude.ai');\n if (href) step.link = { href, label: link['label'] };\n }\n return step;\n}\n\n/**\n * Just enough structure that no render can crash; an unknown step kind or a\n * malformed step is dropped rather than guessed at. Null when the envelope\n * itself is unrecognisable.\n */\nexport function narrowTimeline(raw: unknown): CloudTimelineResponse | null {\n if (!isRecord(raw) || raw['v'] !== 1 || typeof raw['taskId'] !== 'string' || !Array.isArray(raw['steps'])) return null;\n const steps = raw['steps'].map(narrowStep).filter((s): s is TimelineStep => s !== null);\n return {\n v: 1,\n generatedAt: typeof raw['generatedAt'] === 'string' ? raw['generatedAt'] : '',\n taskId: raw['taskId'],\n repo: typeof raw['repo'] === 'string' ? raw['repo'] : '',\n title: typeof raw['title'] === 'string' ? raw['title'] : '',\n state: typeof raw['state'] === 'string' ? raw['state'] : '',\n steps,\n };\n}\n\n/** \"5m ago\" / \"on Sep 24\", or null when the step recorded no time. */\nexport function stepWhen(step: Pick<TimelineStep, 'at'>, now: number = Date.now()): string | null {\n return relativePhrase(step.at, now);\n}\n\n/** Server prose is already scrubbed; scrub again so the panel is safe outside the HTTP sanitizer too. */\nexport function stepText(text: string): string {\n return scrubSecrets(text);\n}\n\nexport interface TimelineSummary {\n verified: number;\n claims: number;\n unknown: number;\n /** \"7 verified · 2 claims · 3 unknown\" */\n text: string;\n}\n\n/** Counts over the stages the task has REACHED — pending stages are not \"unknown evidence\". */\nexport function timelineSummary(steps: readonly TimelineStep[]): TimelineSummary {\n let verified = 0;\n let claims = 0;\n let unknown = 0;\n for (const step of steps) {\n if (!step.reached) continue;\n const badge = badgeFor(step);\n if (badge === 'verified') verified += 1;\n else if (badge === 'unknown') unknown += 1;\n else claims += 1;\n }\n const parts = [`${verified} verified`];\n if (claims > 0) parts.push(`${claims} ${claims === 1 ? 'claim or estimate' : 'claims or estimates'}`);\n if (unknown > 0) parts.push(`${unknown} unknown`);\n return { verified, claims, unknown, text: parts.join(' · ') };\n}\n","/*\n * routes/verse/cloud/evidence-timeline.module.css — a cloud task's evidence\n * chain (3.13). Tokens only (style-scan-310): no raw hex colour, no px font\n * size, every colour follows the theme. Long text wraps at word boundaries;\n * nothing is ellipsized — evidence is read, not skimmed.\n *\n * The rail: a filled node for a reached stage (its colour follows the trust\n * badge), a hollow one for a stage not reached, joined by a hairline.\n */\n\n.summaryRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n margin-bottom: var(--space-3);\n}\n\n.summary,\n.muted {\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.notice {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n overflow-wrap: break-word;\n}\n\n.steps {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.step {\n display: grid;\n grid-template-columns: var(--space-4) minmax(0, 1fr);\n gap: 0 var(--space-3);\n}\n\n.rail {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding-top: var(--space-1);\n}\n\n.node {\n width: 9px;\n height: 9px;\n flex-shrink: 0;\n border: 1.5px solid var(--border-strong);\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n\n.step[data-badge='verified'] .node {\n border-color: var(--status-success-solid);\n background: var(--status-success-solid);\n}\n\n.step[data-badge='claim'] .node {\n border-color: var(--status-warning-solid);\n background: var(--status-warning-solid);\n}\n\n.step[data-reached='false'] .node {\n background: var(--bg-surface);\n}\n\n.line {\n flex: 1 1 auto;\n width: 1px;\n min-height: var(--space-3);\n margin-top: var(--space-1);\n background: var(--border-subtle);\n}\n\n.content {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n padding-bottom: var(--space-4);\n}\n\n.head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.label {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-medium);\n line-height: var(--text-xs-line);\n}\n\n.badge {\n display: inline-flex;\n flex-shrink: 0;\n}\n\n.title {\n margin: 0;\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n line-height: var(--text-sm-line);\n overflow-wrap: break-word;\n}\n\n.step[data-reached='false'] .title {\n color: var(--text-secondary);\n font-weight: var(--font-weight-regular);\n}\n\n.detail {\n margin: 0;\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n overflow-wrap: break-word;\n}\n\n.meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-1) var(--space-2);\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.meta > span + span::before {\n content: '·';\n margin-right: var(--space-2);\n}\n\n.link {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n color: var(--text-link);\n text-decoration: none;\n white-space: nowrap;\n}\n\n.link:hover {\n text-decoration: underline;\n}\n\n.link:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 2px;\n}\n","/**\n * routes/verse/cloud/EvidenceTimeline.tsx — one cloud task's evidence chain\n * (3.13), in a side sheet opened from its row on Command's cloud card.\n *\n * Evidence [↻] [×]\n * Fix the flaky tracker test · ashlrai/ashlr-hub\n * 7 verified · 2 claims or estimates · 1 unknown\n * ● Objective Fix the flaky tracker test Verified\n * │ From New cloud task, requested by mason…\n * │ cloud task record · 2h ago\n * ● Report Session reports “done” (unverified) Claim\n * ○ Release Release unknown Unknown\n * …\n *\n * Reads GET /api/verse/cloud/tasks/<id>/timeline (core/cloud/timeline-api.ts)\n * only while open. Every step shows a trust WORD (timeline-model.ts): the\n * session's report is always a Claim and the cost an Estimate. Stages the\n * task has not reached are drawn hollow and quiet, never hidden, so the\n * chain always reads end to end.\n *\n * LAZY: CloudCard imports this with React.lazy, so none of it costs chat\n * first-paint bytes (cloud-queries.ts rule).\n */\nimport { useId, useMemo } from 'react';\nimport { cloudTimelinePath, type CloudTimelineResponse, type TimelineStep } from '../../../../core/cloud/timeline-types.js';\nimport { CLOUD_TASK_ID_PATTERN } from '../../../../core/cloud/types.js';\nimport { IconButton } from '../../../components/primitives/Button.js';\nimport { IconExternalLink, IconRefresh } from '../../../components/primitives/icons.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport { ApiError, apiGet } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport {\n BADGE_MEANING,\n BADGE_WORD,\n badgeFor,\n narrowTimeline,\n STEP_LABEL,\n stepText,\n stepWhen,\n timelineSummary,\n type TimelineBadge,\n} from './timeline-model.js';\nimport styles from './evidence-timeline.module.css';\n\nconst BADGE_TONE: Record<TimelineBadge, Tone> = {\n verified: 'success',\n claim: 'warning',\n estimate: 'neutral',\n unknown: 'unknown',\n};\n\nexport type TimelineRead = { timeline: CloudTimelineResponse; reason: null } | { timeline: null; reason: string };\n\n/** Operator words for a timeline read that did not answer — never a path, never a trace. */\nfunction absence(err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) return 'Verse has no evidence for this task — it is not in the task store, or this build has no timeline yet.';\n if (err.status === 503) return 'The timeline failed to load on the server.';\n return `The timeline answered HTTP ${err.status}.`;\n }\n return 'The timeline could not be reached.';\n}\n\nexport function cloudTimelineQuery(taskId: string): QueryDef<TimelineRead> {\n return {\n key: `verse-cloud-timeline-${taskId}`,\n fetch: async (signal) => {\n // The id came from the server, but it is spliced into a request path.\n if (!CLOUD_TASK_ID_PATTERN.test(taskId)) return { timeline: null, reason: 'That task id is not one Verse issued.' };\n try {\n const timeline = narrowTimeline(await apiGet<unknown>(cloudTimelinePath(taskId), signal));\n return timeline ? { timeline, reason: null } : { timeline: null, reason: 'Unrecognized response — update Ashlr.' };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { timeline: null, reason: absence(err) };\n }\n },\n };\n}\n\nfunction StepRow({ step, now, last }: { step: TimelineStep; now: number; last: boolean }) {\n const badge = badgeFor(step);\n const when = stepWhen(step, now);\n const detail = stepText(step.detail);\n return (\n <li className={styles.step} data-badge={badge} data-reached={step.reached ? 'true' : 'false'} data-kind={step.kind}>\n <span className={styles.rail} aria-hidden=\"true\">\n <span className={styles.node} />\n {last ? null : <span className={styles.line} />}\n </span>\n <div className={styles.content}>\n <div className={styles.head}>\n <span className={styles.label}>{STEP_LABEL[step.kind]}</span>\n <span className={styles.badge} title={BADGE_MEANING[badge]}>\n <StatusBadge status={badge} tone={BADGE_TONE[badge]}>\n {badge === 'verified' ? `✓ ${BADGE_WORD[badge]}` : BADGE_WORD[badge]}\n </StatusBadge>\n </span>\n </div>\n <p className={styles.title}>{stepText(step.title)}</p>\n {detail ? <p className={styles.detail}>{detail}</p> : null}\n <p className={styles.meta}>\n <span>{step.source}</span>\n {when ? <span>{when}</span> : null}\n {step.link ? (\n <a className={styles.link} href={step.link.href} target=\"_blank\" rel=\"noreferrer noopener\">\n {step.link.label} <IconExternalLink width={11} height={11} aria-hidden=\"true\" />\n </a>\n ) : null}\n </p>\n </div>\n </li>\n );\n}\n\nexport interface EvidenceTimelineProps {\n taskId: string;\n /** The row's title, shown while the timeline loads. */\n title: string;\n open: boolean;\n onClose: () => void;\n now?: number;\n}\n\nfunction Body({ taskId, now }: { taskId: string; now: number }) {\n const def = useMemo(() => cloudTimelineQuery(taskId), [taskId]);\n const read = useQuery(def, { freshMs: 15_000 });\n const refetch = useRefetch(def);\n const timeline = read.data?.timeline ?? null;\n const summary = timeline ? timelineSummary(timeline.steps) : null;\n if (!read.data && !read.error) return <p className={styles.muted} aria-busy=\"true\">Reading the evidence…</p>;\n if (!timeline) {\n return <p className={styles.notice} role=\"note\">{read.data?.reason ?? read.error?.message ?? 'The timeline did not answer.'}</p>;\n }\n return (\n <>\n <div className={styles.summaryRow}>\n <p className={styles.summary}>{summary?.text}</p>\n <IconButton size=\"sm\" variant=\"ghost\" icon={<IconRefresh width={14} height={14} />} aria-label=\"Re-read the evidence\" onClick={refetch} />\n </div>\n <ol className={styles.steps} aria-label=\"Evidence, from objective to cost\">\n {timeline.steps.map((step, i) => (\n <StepRow key={step.kind} step={step} now={now} last={i === timeline.steps.length - 1} />\n ))}\n </ol>\n </>\n );\n}\n\nexport function EvidenceTimeline({ taskId, title, open, onClose, now = Date.now() }: EvidenceTimelineProps) {\n const titleId = useId();\n return (\n <Sheet open={open} onClose={onClose} titleId={titleId} width={520} title=\"Evidence\" description={title}>\n {open ? <Body taskId={taskId} now={now} /> : null}\n </Sheet>\n );\n}\n\nexport default EvidenceTimeline;\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Advanced-CxzE6ekM.js","assets/Epistemic-CfqFe_aP.js","assets/StatusBadge-DQ1UtQAJ.js","assets/ConfirmDialog-_S9iE-cJ.js","assets/Segmented-Wynbg0F5.js","assets/workspace-model-BdIVybKr.js","assets/Meter-BSVhU43Q.js","assets/Select-DMyLCkId.js","assets/fleet-model-BRfRWkZl.js","assets/fleet-queries-tU6UEXN2.js","assets/global-BlI2BYa1.css","assets/Epistemic-OaGnEJkn.css","assets/StatusBadge-BVi0IBb9.css","assets/Dialog-tQ8kFulD.css","assets/MutationTokenDialog-CrfJ0PdD.css","assets/ConfirmDialog-Dx15x0Ho.css","assets/RefreshIndicator-CVv22U_j.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.css","assets/Segmented-BnjHbKzH.css","assets/Meter-CYt9KpM0.css","assets/Select-DSu5ghId.css","assets/Advanced-Bywv_iYR.css"])))=>i.map(i=>d[i]);
2
- import{a as e,c as t,n,t as r}from"./index-BG177cPN.js";import{m as i,p as a}from"./global-CXHHMz9o.js";import{t as o}from"./RefreshIndicator-DGubF4vR.js";import{n as s,t as c}from"./Swimlane-DcENqtdp.js";import{n as l,t as u}from"./Funnel-pXYySwXQ.js";import{L as d,kt as ee}from"./VerseConsoleApp-DeuBEvAO.js";import{n as f,u as p}from"./format-DEAaVF6X.js";import{t as m}from"./Tag-D4k5E3u0.js";import{n as te,t as h}from"./budget-queries-DjrPRFwl.js";import{t as g}from"./Button-OjVJSrFq.js";import{a as ne}from"./icons-D4s-jlxX.js";import{p as _}from"./cloud-model-DoxBMDvx.js";import{n as v,r as y}from"./cloud-queries-CTGvO-k-.js";import{t as b}from"./cloud.module-DOP-N4Ch.js";import{t as re}from"./use-ticker-DIvAZ4Ey.js";import{a as x,r as S}from"./overnight-queries-CR0b_j-V.js";import{t as C}from"./nav-CmZcbPFJ.js";import{c as w,i as T}from"./surface-data-DshUC_TU.js";import{n as ie,s as ae,t as oe}from"./AutonomyOffState-CXhXpsim.js";import{n as se,t as ce}from"./actions-DE8NoWV_.js";import{a as le,i as E,n as D,r as O,t as k}from"./Surface-DWMtQe3Q.js";import{i as ue,n as de,r as fe,t as pe}from"./why-seat-model-D68ZA7G8.js";import{a as me,c as he,d as ge,f as A,i as _e,l as ve,n as j,o as M,r as N,s as P,t as F,u as ye}from"./live-model-CEf01wrW.js";var I=t(e(),1),L=n();function be({classes:e={}}){let t=a(y,{freshMs:15e3}),n=i(y);d(n,v);let r=t.data?.value??null;if(!r)return null;let o=_(r.tasks),s=`Claude Code cloud sessions Verse launched that have not delivered a PR yet. ${r.budget.sessionsToday} of ${r.budget.budget.maxSessionsPerDay} sessions used today.`;return(0,L.jsxs)(`li`,{className:`${e.lane??``} ${b.laneChip}`,"data-active":o>0||void 0,title:s,"aria-label":`Cloud: ${o} running`,children:[(0,L.jsx)(`span`,{className:e.name,children:`Cloud`}),(0,L.jsx)(`span`,{className:e.sep,"aria-hidden":`true`,children:` · `}),(0,L.jsxs)(`span`,{className:e.slots,children:[o,` running`]})]})}var R={stack:`_stack_j599h_5`,muted:`_muted_j599h_11`,link:`_link_j599h_18`,disclosure:`_disclosure_j599h_34`,num:`_num_j599h_39`,lanes:`_lanes_j599h_45`,lane:`_lane_j599h_45`,laneName:`_laneName_j599h_72`,laneSlots:`_laneSlots_j599h_77`,laneSep:`_laneSep_j599h_83`,laneStrip:`_laneStrip_j599h_88`,laneNotes:`_laneNotes_j599h_94`,laneNoteLanes:`_laneNoteLanes_j599h_107`,decision:`_decision_j599h_113`,decisionLead:`_decisionLead_j599h_119`,mode:`_mode_j599h_129`,decisionWhy:`_decisionWhy_j599h_142`,candidates:`_candidates_j599h_149`,exclusions:`_exclusions_j599h_150`,excluded:`_excluded_j599h_170`,excludedWhy:`_excludedWhy_j599h_175`,excludedWhen:`_excludedWhen_j599h_179`,overnight:`_overnight_j599h_184`,overnightLead:`_overnightLead_j599h_190`,facts:`_facts_j599h_196`,discarded:`_discarded_j599h_219`,discardTitle:`_discardTitle_j599h_234`,discardWhy:`_discardWhy_j599h_238`,tableWrap:`_tableWrap_j599h_243`,table:`_table_j599h_243`,repoName:`_repoName_j599h_276`,actionCell:`_actionCell_j599h_283`,stage:`_stage_j599h_287`,stageNote:`_stageNote_j599h_309`,green:`_green_j599h_314`,greenValue:`_greenValue_j599h_320`,holds:`_holds_j599h_325`,hold:`_hold_j599h_325`,repoCards:`_repoCards_j599h_347`,repoCard:`_repoCard_j599h_347`,repoCardHead:`_repoCardHead_j599h_365`,advanced:`_advanced_j599h_373`,chevron:`_chevron_j599h_399`,disclosureNote:`_disclosureNote_j599h_407`},z=36e5;function B(e,t,n){if(!e)return{kind:`loading`};let r=e.value;return r?r.state===`dark`&&!n?ae(r):n?{kind:`ready`}:{kind:`empty`,message:t}:{kind:`unknown`,reason:e.reason??`the live fleet view did not answer.`}}function xe({lane:e}){let t=_e(e);return(0,L.jsxs)(`li`,{className:R.lane,"data-off":e.slots===0||void 0,title:M(e)??void 0,children:[(0,L.jsx)(m,{engine:F[e.lane]}),(0,L.jsx)(`span`,{className:R.laneName,children:t.name}),(0,L.jsx)(`span`,{className:R.laneSep,"aria-hidden":`true`,children:` · `}),(0,L.jsx)(`span`,{className:R.laneSlots,children:t.slots})]})}function Se({live:e}){if(!e||e.lanes.length===0)return null;let t=me(e.lanes);return(0,L.jsxs)(`div`,{className:R.laneStrip,children:[(0,L.jsxs)(`ul`,{className:R.lanes,"aria-label":`Lanes: busy of slots`,children:[e.lanes.map(e=>(0,L.jsx)(xe,{lane:e},e.lane)),(0,L.jsx)(be,{classes:{lane:R.lane,name:R.laneName,sep:R.laneSep,slots:R.laneSlots}})]}),t.length>0?(0,L.jsx)(`ul`,{className:R.laneNotes,"aria-label":`Why lanes are limited`,children:t.map(e=>(0,L.jsxs)(`li`,{children:[e.all?null:(0,L.jsxs)(`span`,{className:R.laneNoteLanes,children:[e.lanes.map(e=>j[e]).join(`, `),`: `]}),f(e.reason)]},e.lanes.join(`,`)))}):null]})}function V({read:e,now:t,hours:n}){let r=e?.value??null,i=t-n*z,a=r?P(r.runs,i,t,{includeParked:!1}):[];return(0,L.jsx)(c,{title:`Live fleet`,description:`Lanes × slots, last ${n} h · bars coloured by phase or outcome · outlines are queued`,status:B(e,`Nothing ran in the last ${n} hours.`,a.length>0),lanes:a,from:i,to:t,now:t,toneOf:A})}function Ce({read:e}){let t=(e?.value??null)?.funnel??null,n=N(t),r=ge(t),i=t?`${new Date(t.from).toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})} – ${new Date(t.to).toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})}`:void 0;return(0,L.jsxs)(`div`,{className:R.stack,children:[(0,L.jsx)(u,{title:`Gate funnel`,description:i?`Proposals through G0–G7, ${i}`:`Proposals through the merge gates G0–G7`,status:B(e,`No proposal reached the gates in this window.`,n.length>0),stages:n}),(0,L.jsx)(l,{title:`Refusals by gate`,description:r.total?`${r.total} refusals · top reasons keep their colour`:`Why proposals stopped`,status:B(e,`Nothing was refused in this window.`,r.total>0),categories:r.categories,segments:r.segments,values:r.values,height:180})]})}function H(e,t){let n=e?.seatInfo.find(e=>e.seatId===t);return{label:n?.label??t,engine:n?.engine??null}}function U({decision:e,view:t,now:n}){let r=e.seatId?H(t,e.seatId):null;return(0,L.jsxs)(`div`,{className:R.decision,children:[(0,L.jsxs)(`p`,{className:R.decisionLead,children:[r?(0,L.jsxs)(L.Fragment,{children:[r.engine?(0,L.jsx)(m,{engine:r.engine}):null,(0,L.jsx)(`strong`,{children:r.label})]}):(0,L.jsx)(`strong`,{children:`No seat`}),(0,L.jsx)(`span`,{className:R.mode,children:e.mode})]}),(0,L.jsx)(`p`,{className:R.decisionWhy,children:pe(e)}),e.candidates.length>1?(0,L.jsxs)(`div`,{children:[(0,L.jsx)(E,{children:`Then`}),(0,L.jsx)(`ol`,{className:R.candidates,children:e.candidates.slice(+!!e.seatId).map(e=>(0,L.jsx)(`li`,{children:H(t,e).label},e))})]}):null,e.exclusions.length?(0,L.jsxs)(`div`,{children:[(0,L.jsx)(E,{children:`Held back`}),(0,L.jsx)(`ul`,{className:R.exclusions,"aria-label":`Held back seats`,children:e.exclusions.map(e=>(0,L.jsxs)(`li`,{children:[(0,L.jsx)(`span`,{className:R.excluded,children:H(t,e.seatId).label}),(0,L.jsx)(`span`,{className:R.excludedWhy,children:ue(e)}),(0,L.jsxs)(`span`,{className:R.excludedWhen,children:[`eligible again: `,de(fe(e),n)]})]},e.seatId))})]}):null]})}function we({read:e,preview:t,view:n,now:r}){let i=he(e?.value??null);return(0,L.jsx)(k,{title:`Why this seat`,caption:i?`Latest dispatch: ${i.run.title} (${p(i.run.phaseStartedAt??i.run.startedAt)})`:t?`The next medium autonomous task would go to…`:void 0,children:i?(0,L.jsx)(U,{decision:i.decision,view:n,now:r}):t?(0,L.jsx)(U,{decision:t,view:n,now:r}):(0,L.jsx)(D,{tone:`unknown`,children:`No routing decision yet. The router preview didn't answer.`})})}function Te({read:e,now:t}){let n=e?.value??null,r=n?ye(n.runs,t):{lanes:[],from:t-z,to:t+2*z,unknownRelease:0};return(0,L.jsx)(c,{title:`Parked`,description:`Waiting for a seat to free up — each bar ends when it should`,caveat:r.unknownRelease?`${r.unknownRelease} item${r.unknownRelease===1?` has`:`s have`} no known release time; ${r.unknownRelease===1?`it runs`:`they run`} to the right edge.`:void 0,status:B(e,`Nothing is parked.`,r.lanes.length>0),lanes:r.lanes,from:r.from,to:r.to,now:t,toneOf:A,formatTick:e=>new Date(e).toLocaleString(`en-US`,{weekday:`short`,hour:`numeric`})})}function Ee({read:e,onOpenAdvanced:t,dark:n=!1}){let r=e?.value??null,i=r?.run??null;return(0,L.jsx)(k,{title:`Overnight`,caption:r?r.armed?`Armed`:`Not armed`:void 0,actions:(0,L.jsx)(`button`,{type:`button`,className:R.link,onClick:t,children:`Arm or stop in Advanced`}),children:e?r?!r.armed&&!i?(0,L.jsx)(D,{children:n?`Nothing armed.`:`Nothing armed. The fleet runs on its normal schedule.`}):(0,L.jsxs)(`div`,{className:R.overnight,children:[i?.stopRule?(0,L.jsx)(`p`,{className:R.overnightLead,children:x(i.stopRule)}):null,(0,L.jsxs)(`dl`,{className:R.facts,children:[(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Started`}),(0,L.jsx)(`dd`,{children:i?.startedAt?p(i.startedAt):`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Iterations`}),(0,L.jsx)(`dd`,{children:i?.iterationsDone??`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Merged`}),(0,L.jsx)(`dd`,{children:i?i.merged.length:`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Discarded`}),(0,L.jsx)(`dd`,{children:i?i.discarded.length:`—`})]})]}),i?.activity?(0,L.jsxs)(`p`,{className:R.muted,children:[`Now: `,i.activity]}):null,i&&i.discarded.length?(0,L.jsx)(`ul`,{className:R.discarded,"aria-label":`Discarded work`,children:i.discarded.slice(0,3).map(e=>(0,L.jsxs)(`li`,{children:[(0,L.jsx)(`span`,{className:R.discardTitle,children:e.title}),(0,L.jsx)(`span`,{className:R.discardWhy,children:e.reason})]},e.id))}):null]}):(0,L.jsx)(D,{tone:`unknown`,children:e.reason??`The overnight lane did not answer.`}):(0,L.jsx)(`p`,{className:R.muted,"aria-busy":`true`,children:`Reading the overnight lane…`})})}var W={quarantine:`Quarantined`,"owner-hold":`On hold (you)`,"leader-pause":`Paused by Leader`,cooldown:`Cooling down`};function De(e,t){let n=e.until?Date.parse(e.until):NaN,r=Number.isFinite(n)?Math.max(0,n-t):null,i=r===null?`until resumed`:r<36e5?`${Math.ceil(r/6e4)}m left`:`${Math.round(r/36e5)}h left`;return`${W[e.kind]} · ${i}`}function G(e){return e.includes(`/`)?e.split(`/`)[1]:e}function K({row:e}){return e.stage===null?(0,L.jsx)(`span`,{className:R.stage,"data-stage":`none`,children:`Not in grant`}):(0,L.jsxs)(`span`,{className:R.stage,"data-stage":e.stage,children:[e.stage===`merge`?`Merge`:`Propose`,e.enforcement===`local`?(0,L.jsx)(`span`,{className:R.stageNote,children:` · local checks`}):null]})}function q({row:e,actions:t}){let n=t.busy||t.readOnly;return e.holds.length?(0,L.jsx)(g,{size:`sm`,variant:`subtle`,disabled:n,"aria-label":`Resume ${e.repo}`,onClick:()=>t.act(()=>w({action:`resume-repo`,repo:e.repo}),`Resume ${e.repo}`,{confirm:{title:`Resume ${G(e.repo)}?`,body:`Clears ${e.holds.map(e=>W[e.kind].toLowerCase()).join(` and `)}. New fleet work can start there on the next tick.`,confirmLabel:`Resume`}}),children:`Resume`}):e.stage===null?null:(0,L.jsx)(g,{size:`sm`,variant:`ghost`,disabled:n,"aria-label":`Pause ${e.repo}`,onClick:()=>t.act(()=>w({action:`pause-repo`,repo:e.repo,reason:`Paused by Mason from the Fleet surface`}),`Pause ${e.repo}`,{confirm:{title:`Pause ${G(e.repo)}?`,body:`No new fleet work starts there until you resume it. Runs already in flight finish and are watched as usual.`,confirmLabel:`Pause repo`,destructive:!0}}),children:`Pause`})}function J({row:e}){return(0,L.jsxs)(`span`,{className:R.green,children:[(0,L.jsx)(`span`,{className:R.greenValue,children:e.greenPct7d===null?`—`:`${Math.round(e.greenPct7d)}%`}),(0,L.jsx)(s,{points:e.greenTrend,width:64,height:18,ariaLabel:`${e.repo} post-merge green, 14 days`,describe:e=>`${Math.round(e)}%`})]})}function Y({row:e,now:t}){return e.holds.length?(0,L.jsx)(`span`,{className:R.holds,children:e.holds.map(e=>(0,L.jsx)(`span`,{className:R.hold,"data-kind":e.kind,title:e.reason,children:De(e,t)},e.kind))}):(0,L.jsx)(`span`,{className:R.muted,children:`—`})}function X(e){if(e===void 0)return null;if(e===null)return`Fleet mirrors: unknown — the enrollment registry could not be read.`;if(e.count===0)return`Fleet mirrors: none yet — the fleet clones a repo the first time it works on it.`;let t=e.repos.slice(0,6).join(`, `),n=e.repos.length>6?` and ${e.repos.length-6} more`:``;return`Fleet mirrors: ${e.count} working ${e.count===1?`copy`:`copies`}${t?` (${t}${n})`:``} — the fleet's own clones of the repos above.`}var Z=e=>e.mergesToday===null?`—`:`${e.mergesToday}${e.maxMergesPerDay===null?``:` / ${e.maxMergesPerDay}`}`;function Oe({read:e,actions:t,now:n,compact:r}){let i=e?.value??null,a=i?.repos??[];return(0,L.jsxs)(k,{title:`Repositories`,caption:i?`${a.length} enrolled · stage is what the grant and rollout allow right now`:void 0,children:[e?i?a.length===0?(0,L.jsx)(D,{children:`No repositories are enrolled.`}):r?(0,L.jsx)(`ul`,{className:R.repoCards,children:a.map(e=>(0,L.jsxs)(`li`,{className:R.repoCard,id:C(`repo-${e.repo}`),children:[(0,L.jsxs)(`div`,{className:R.repoCardHead,children:[(0,L.jsx)(`span`,{className:R.repoName,children:e.repo}),(0,L.jsx)(q,{row:e,actions:t})]}),(0,L.jsxs)(`dl`,{className:R.facts,children:[(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Stage`}),(0,L.jsx)(`dd`,{children:(0,L.jsx)(K,{row:e})})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Last merge`}),(0,L.jsx)(`dd`,{children:e.lastMergeAt?p(e.lastMergeAt):`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Today`}),(0,L.jsx)(`dd`,{children:Z(e)})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Green 7d`}),(0,L.jsx)(`dd`,{children:(0,L.jsx)(J,{row:e})})]})]}),(0,L.jsx)(Y,{row:e,now:n})]},e.repo))}):(0,L.jsx)(`div`,{className:R.tableWrap,children:(0,L.jsxs)(`table`,{className:R.table,children:[(0,L.jsx)(`caption`,{className:`visually-hidden`,children:`Enrolled repositories`}),(0,L.jsx)(`thead`,{children:(0,L.jsxs)(`tr`,{children:[(0,L.jsx)(`th`,{scope:`col`,children:`Repository`}),(0,L.jsx)(`th`,{scope:`col`,children:`Stage`}),(0,L.jsx)(`th`,{scope:`col`,children:`Last merge`}),(0,L.jsx)(`th`,{scope:`col`,className:R.num,children:`Today`}),(0,L.jsx)(`th`,{scope:`col`,children:`Post-merge green · 14d`}),(0,L.jsx)(`th`,{scope:`col`,className:R.num,children:`Open PRs`}),(0,L.jsx)(`th`,{scope:`col`,children:`Holds`}),(0,L.jsx)(`th`,{scope:`col`,children:(0,L.jsx)(`span`,{className:`visually-hidden`,children:`Action`})})]})}),(0,L.jsx)(`tbody`,{children:a.map(e=>(0,L.jsxs)(`tr`,{id:C(`repo-${e.repo}`),"data-held":e.holds.length>0||void 0,children:[(0,L.jsx)(`th`,{scope:`row`,className:R.repoName,children:e.repo}),(0,L.jsx)(`td`,{children:(0,L.jsx)(K,{row:e})}),(0,L.jsx)(`td`,{children:e.lastMergeAt?p(e.lastMergeAt):`—`}),(0,L.jsx)(`td`,{className:R.num,children:Z(e)}),(0,L.jsx)(`td`,{children:(0,L.jsx)(J,{row:e})}),(0,L.jsx)(`td`,{className:R.num,children:e.openFleetPrs??`—`}),(0,L.jsx)(`td`,{children:(0,L.jsx)(Y,{row:e,now:n})}),(0,L.jsx)(`td`,{className:R.actionCell,children:(0,L.jsx)(q,{row:e,actions:t})})]},e.repo))})]})}):(0,L.jsx)(D,{tone:`unknown`,children:e.reason??`The live fleet view did not answer.`}):(0,L.jsx)(`p`,{className:R.muted,"aria-busy":`true`,children:`Reading repositories…`}),i&&X(i.mirrors)?(0,L.jsx)(`p`,{className:R.muted,children:X(i.mirrors)}):null]})}var Q=5e3,$=3e4,ke=(0,I.lazy)(()=>r(()=>import(`./Advanced-CxzE6ekM.js`).then(e=>e.t).then(e=>({default:()=>(0,L.jsx)(e.FleetAdvanced,{embedded:!0})})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])));function Ae(){let{compact:e}=ee(),t=a(T),n=a(S),r=a(te,{freshMs:15e3}),s=a(h,{freshMs:15e3}),c=i(T),l=i(S),u=i(h);d(c,Q),d(()=>{l(),u()},$);let f=re(15e3),p=se(),[m,g]=(0,I.useState)(!1),_=(0,I.useId)(),v=t.data?.value??null,y=ie(),b=y!=null&&v!==null&&ve(v);function x(){g(!0),requestAnimationFrame(()=>document.getElementById(_)?.scrollIntoView?.({block:`start`,behavior:`smooth`}))}return(0,L.jsxs)(le,{title:`Fleet`,actions:t.status===`refreshing`?(0,L.jsx)(o,{}):null,lead:(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(ce,{actions:p}),(0,L.jsx)(Se,{live:v}),y?(0,L.jsx)(oe,{state:y,here:`fleet`}):null]}),children:[b?null:(0,L.jsx)(O,{span:12,children:(0,L.jsx)(V,{read:t.data,now:f,hours:e?6:12})}),b?null:(0,L.jsx)(O,{span:7,children:(0,L.jsx)(Ce,{read:t.data})}),(0,L.jsx)(O,{span:b?6:5,children:(0,L.jsx)(we,{read:t.data,preview:s.data??null,view:r.data??null,now:f})}),b?null:(0,L.jsx)(O,{span:7,children:(0,L.jsx)(Te,{read:t.data,now:f})}),(0,L.jsx)(O,{span:b?6:5,children:(0,L.jsx)(Ee,{read:n.data,onOpenAdvanced:x,dark:v?.state===`dark`})}),(0,L.jsx)(O,{span:12,children:(0,L.jsx)(Oe,{read:t.data,actions:p,now:f,compact:e})}),(0,L.jsx)(O,{span:12,children:(0,L.jsxs)(`div`,{className:R.advanced,children:[(0,L.jsxs)(`button`,{type:`button`,className:R.disclosure,"aria-expanded":m,"aria-controls":_,onClick:()=>g(e=>!e),children:[(0,L.jsx)(ne,{className:R.chevron,width:14,height:14,"aria-hidden":`true`}),`Advanced`,(0,L.jsx)(`span`,{className:R.disclosureNote,children:`daemon, overnight, local runtime, caps, scope, activity, safety, goals`})]}),(0,L.jsx)(`div`,{id:_,hidden:!m,children:m?(0,L.jsx)(I.Suspense,{fallback:(0,L.jsx)(`p`,{className:R.muted,"aria-busy":`true`,children:`Loading the advanced panels…`}),children:(0,L.jsx)(ke,{})}):null})]})}),p.dialogs]})}export{Q as FLEET_POLL_MS,$ as FLEET_SLOW_POLL_MS,Ae as FleetSection};
3
- //# sourceMappingURL=FleetSection-B7f-XBiX.js.map
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Advanced-cVYTAsfB.js","assets/Epistemic-fycQTBRO.js","assets/StatusBadge-CXG3iNL4.js","assets/ConfirmDialog-CLUhzaBj.js","assets/Segmented-Wt1ATod9.js","assets/workspace-model-D-SLfads.js","assets/Meter-b69LM0mU.js","assets/Select-By-V9lMc.js","assets/fleet-model-DOK8ZtEt.js","assets/fleet-queries-BeEAqD6y.js","assets/global-BlI2BYa1.css","assets/Epistemic-OaGnEJkn.css","assets/StatusBadge-BVi0IBb9.css","assets/Dialog-tQ8kFulD.css","assets/MutationTokenDialog-CrfJ0PdD.css","assets/ConfirmDialog-Dx15x0Ho.css","assets/RefreshIndicator-CVv22U_j.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.css","assets/Segmented-BnjHbKzH.css","assets/Meter-CYt9KpM0.css","assets/Select-DSu5ghId.css","assets/Advanced-Bywv_iYR.css"])))=>i.map(i=>d[i]);
2
+ import{a as e,c as t,n,t as r}from"./index-CyK31YRm.js";import{h as i,m as a}from"./global-y_exIyAP.js";import{t as o}from"./RefreshIndicator-SEFZlMB2.js";import{n as s,t as c}from"./Swimlane-LrslsGxw.js";import{n as l,t as u}from"./Funnel-B88_wpA4.js";import{L as d,kt as ee}from"./VerseConsoleApp-DXDv1aOi.js";import{n as f,u as p}from"./format-BmH2yWL6.js";import{t as m}from"./Tag-WSUIaMVy.js";import{n as te,t as h}from"./budget-queries-DFF-3ICg.js";import{t as g}from"./Button-DtE0rlWD.js";import{a as ne}from"./icons-CygCEFWs.js";import{n as re,s as _,t as ie}from"./AutonomyOffState-CpFYS3tQ.js";import{p as v}from"./cloud-model-CfRydq8N.js";import{n as y,r as b}from"./cloud-queries-DmptbjS8.js";import{t as x}from"./cloud.module-DOP-N4Ch.js";import{t as ae}from"./use-ticker-BoqFxRFG.js";import{a as oe,r as S}from"./overnight-queries-DJ4mZKSj.js";import{t as C}from"./nav-mimleI0R.js";import{i as w,l as T}from"./surface-data-C3UAQ4QX.js";import{n as se,t as ce}from"./actions-BZTidCXZ.js";import{a as le,i as E,n as D,r as O,t as k}from"./Surface-5bNA08tK.js";import{i as ue,n as de,r as fe,t as pe}from"./why-seat-model-Cau8qG6O.js";import{a as me,c as he,d as ge,f as A,i as _e,l as ve,n as j,o as M,r as N,s as P,t as F,u as ye}from"./live-model-D7hilYFk.js";var I=t(e(),1),L=n();function be({classes:e={}}){let t=a(b,{freshMs:15e3}),n=i(b);d(n,y);let r=t.data?.value??null;if(!r)return null;let o=v(r.tasks),s=`Claude Code cloud sessions Verse launched that have not delivered a PR yet. ${r.budget.sessionsToday} of ${r.budget.budget.maxSessionsPerDay} sessions used today.`;return(0,L.jsxs)(`li`,{className:`${e.lane??``} ${x.laneChip}`,"data-active":o>0||void 0,title:s,"aria-label":`Cloud: ${o} running`,children:[(0,L.jsx)(`span`,{className:e.name,children:`Cloud`}),(0,L.jsx)(`span`,{className:e.sep,"aria-hidden":`true`,children:` · `}),(0,L.jsxs)(`span`,{className:e.slots,children:[o,` running`]})]})}var R={stack:`_stack_j599h_5`,muted:`_muted_j599h_11`,link:`_link_j599h_18`,disclosure:`_disclosure_j599h_34`,num:`_num_j599h_39`,lanes:`_lanes_j599h_45`,lane:`_lane_j599h_45`,laneName:`_laneName_j599h_72`,laneSlots:`_laneSlots_j599h_77`,laneSep:`_laneSep_j599h_83`,laneStrip:`_laneStrip_j599h_88`,laneNotes:`_laneNotes_j599h_94`,laneNoteLanes:`_laneNoteLanes_j599h_107`,decision:`_decision_j599h_113`,decisionLead:`_decisionLead_j599h_119`,mode:`_mode_j599h_129`,decisionWhy:`_decisionWhy_j599h_142`,candidates:`_candidates_j599h_149`,exclusions:`_exclusions_j599h_150`,excluded:`_excluded_j599h_170`,excludedWhy:`_excludedWhy_j599h_175`,excludedWhen:`_excludedWhen_j599h_179`,overnight:`_overnight_j599h_184`,overnightLead:`_overnightLead_j599h_190`,facts:`_facts_j599h_196`,discarded:`_discarded_j599h_219`,discardTitle:`_discardTitle_j599h_234`,discardWhy:`_discardWhy_j599h_238`,tableWrap:`_tableWrap_j599h_243`,table:`_table_j599h_243`,repoName:`_repoName_j599h_276`,actionCell:`_actionCell_j599h_283`,stage:`_stage_j599h_287`,stageNote:`_stageNote_j599h_309`,green:`_green_j599h_314`,greenValue:`_greenValue_j599h_320`,holds:`_holds_j599h_325`,hold:`_hold_j599h_325`,repoCards:`_repoCards_j599h_347`,repoCard:`_repoCard_j599h_347`,repoCardHead:`_repoCardHead_j599h_365`,advanced:`_advanced_j599h_373`,chevron:`_chevron_j599h_399`,disclosureNote:`_disclosureNote_j599h_407`},z=36e5;function B(e,t,n){if(!e)return{kind:`loading`};let r=e.value;return r?r.state===`dark`&&!n?_(r):n?{kind:`ready`}:{kind:`empty`,message:t}:{kind:`unknown`,reason:e.reason??`the live fleet view did not answer.`}}function xe({lane:e}){let t=_e(e);return(0,L.jsxs)(`li`,{className:R.lane,"data-off":e.slots===0||void 0,title:M(e)??void 0,children:[(0,L.jsx)(m,{engine:F[e.lane]}),(0,L.jsx)(`span`,{className:R.laneName,children:t.name}),(0,L.jsx)(`span`,{className:R.laneSep,"aria-hidden":`true`,children:` · `}),(0,L.jsx)(`span`,{className:R.laneSlots,children:t.slots})]})}function Se({live:e}){if(!e||e.lanes.length===0)return null;let t=me(e.lanes);return(0,L.jsxs)(`div`,{className:R.laneStrip,children:[(0,L.jsxs)(`ul`,{className:R.lanes,"aria-label":`Lanes: busy of slots`,children:[e.lanes.map(e=>(0,L.jsx)(xe,{lane:e},e.lane)),(0,L.jsx)(be,{classes:{lane:R.lane,name:R.laneName,sep:R.laneSep,slots:R.laneSlots}})]}),t.length>0?(0,L.jsx)(`ul`,{className:R.laneNotes,"aria-label":`Why lanes are limited`,children:t.map(e=>(0,L.jsxs)(`li`,{children:[e.all?null:(0,L.jsxs)(`span`,{className:R.laneNoteLanes,children:[e.lanes.map(e=>j[e]).join(`, `),`: `]}),f(e.reason)]},e.lanes.join(`,`)))}):null]})}function V({read:e,now:t,hours:n}){let r=e?.value??null,i=t-n*z,a=r?P(r.runs,i,t,{includeParked:!1}):[];return(0,L.jsx)(c,{title:`Live fleet`,description:`Lanes × slots, last ${n} h · bars coloured by phase or outcome · outlines are queued`,status:B(e,`Nothing ran in the last ${n} hours.`,a.length>0),lanes:a,from:i,to:t,now:t,toneOf:A})}function Ce({read:e}){let t=(e?.value??null)?.funnel??null,n=N(t),r=ge(t),i=t?`${new Date(t.from).toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})} – ${new Date(t.to).toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})}`:void 0;return(0,L.jsxs)(`div`,{className:R.stack,children:[(0,L.jsx)(u,{title:`Gate funnel`,description:i?`Proposals through G0–G7, ${i}`:`Proposals through the merge gates G0–G7`,status:B(e,`No proposal reached the gates in this window.`,n.length>0),stages:n}),(0,L.jsx)(l,{title:`Refusals by gate`,description:r.total?`${r.total} refusals · top reasons keep their colour`:`Why proposals stopped`,status:B(e,`Nothing was refused in this window.`,r.total>0),categories:r.categories,segments:r.segments,values:r.values,height:180})]})}function H(e,t){let n=e?.seatInfo.find(e=>e.seatId===t);return{label:n?.label??t,engine:n?.engine??null}}function U({decision:e,view:t,now:n}){let r=e.seatId?H(t,e.seatId):null;return(0,L.jsxs)(`div`,{className:R.decision,children:[(0,L.jsxs)(`p`,{className:R.decisionLead,children:[r?(0,L.jsxs)(L.Fragment,{children:[r.engine?(0,L.jsx)(m,{engine:r.engine}):null,(0,L.jsx)(`strong`,{children:r.label})]}):(0,L.jsx)(`strong`,{children:`No seat`}),(0,L.jsx)(`span`,{className:R.mode,children:e.mode})]}),(0,L.jsx)(`p`,{className:R.decisionWhy,children:pe(e)}),e.candidates.length>1?(0,L.jsxs)(`div`,{children:[(0,L.jsx)(E,{children:`Then`}),(0,L.jsx)(`ol`,{className:R.candidates,children:e.candidates.slice(+!!e.seatId).map(e=>(0,L.jsx)(`li`,{children:H(t,e).label},e))})]}):null,e.exclusions.length?(0,L.jsxs)(`div`,{children:[(0,L.jsx)(E,{children:`Held back`}),(0,L.jsx)(`ul`,{className:R.exclusions,"aria-label":`Held back seats`,children:e.exclusions.map(e=>(0,L.jsxs)(`li`,{children:[(0,L.jsx)(`span`,{className:R.excluded,children:H(t,e.seatId).label}),(0,L.jsx)(`span`,{className:R.excludedWhy,children:ue(e)}),(0,L.jsxs)(`span`,{className:R.excludedWhen,children:[`eligible again: `,de(fe(e),n)]})]},e.seatId))})]}):null]})}function we({read:e,preview:t,view:n,now:r}){let i=he(e?.value??null);return(0,L.jsx)(k,{title:`Why this seat`,caption:i?`Latest dispatch: ${i.run.title} (${p(i.run.phaseStartedAt??i.run.startedAt)})`:t?`The next medium autonomous task would go to…`:void 0,children:i?(0,L.jsx)(U,{decision:i.decision,view:n,now:r}):t?(0,L.jsx)(U,{decision:t,view:n,now:r}):(0,L.jsx)(D,{tone:`unknown`,children:`No routing decision yet. The router preview didn't answer.`})})}function Te({read:e,now:t}){let n=e?.value??null,r=n?ye(n.runs,t):{lanes:[],from:t-z,to:t+2*z,unknownRelease:0};return(0,L.jsx)(c,{title:`Parked`,description:`Waiting for a seat to free up — each bar ends when it should`,caveat:r.unknownRelease?`${r.unknownRelease} item${r.unknownRelease===1?` has`:`s have`} no known release time; ${r.unknownRelease===1?`it runs`:`they run`} to the right edge.`:void 0,status:B(e,`Nothing is parked.`,r.lanes.length>0),lanes:r.lanes,from:r.from,to:r.to,now:t,toneOf:A,formatTick:e=>new Date(e).toLocaleString(`en-US`,{weekday:`short`,hour:`numeric`})})}function Ee({read:e,onOpenAdvanced:t,dark:n=!1}){let r=e?.value??null,i=r?.run??null;return(0,L.jsx)(k,{title:`Overnight`,caption:r?r.armed?`Armed`:`Not armed`:void 0,actions:(0,L.jsx)(`button`,{type:`button`,className:R.link,onClick:t,children:`Arm or stop in Advanced`}),children:e?r?!r.armed&&!i?(0,L.jsx)(D,{children:n?`Nothing armed.`:`Nothing armed. The fleet runs on its normal schedule.`}):(0,L.jsxs)(`div`,{className:R.overnight,children:[i?.stopRule?(0,L.jsx)(`p`,{className:R.overnightLead,children:oe(i.stopRule)}):null,(0,L.jsxs)(`dl`,{className:R.facts,children:[(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Started`}),(0,L.jsx)(`dd`,{children:i?.startedAt?p(i.startedAt):`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Iterations`}),(0,L.jsx)(`dd`,{children:i?.iterationsDone??`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Merged`}),(0,L.jsx)(`dd`,{children:i?i.merged.length:`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Discarded`}),(0,L.jsx)(`dd`,{children:i?i.discarded.length:`—`})]})]}),i?.activity?(0,L.jsxs)(`p`,{className:R.muted,children:[`Now: `,i.activity]}):null,i&&i.discarded.length?(0,L.jsx)(`ul`,{className:R.discarded,"aria-label":`Discarded work`,children:i.discarded.slice(0,3).map(e=>(0,L.jsxs)(`li`,{children:[(0,L.jsx)(`span`,{className:R.discardTitle,children:e.title}),(0,L.jsx)(`span`,{className:R.discardWhy,children:e.reason})]},e.id))}):null]}):(0,L.jsx)(D,{tone:`unknown`,children:e.reason??`The overnight lane did not answer.`}):(0,L.jsx)(`p`,{className:R.muted,"aria-busy":`true`,children:`Reading the overnight lane…`})})}var W={quarantine:`Quarantined`,"owner-hold":`On hold (you)`,"leader-pause":`Paused by Leader`,cooldown:`Cooling down`};function De(e,t){let n=e.until?Date.parse(e.until):NaN,r=Number.isFinite(n)?Math.max(0,n-t):null,i=r===null?`until resumed`:r<36e5?`${Math.ceil(r/6e4)}m left`:`${Math.round(r/36e5)}h left`;return`${W[e.kind]} · ${i}`}function G(e){return e.includes(`/`)?e.split(`/`)[1]:e}function K({row:e}){return e.stage===null?(0,L.jsx)(`span`,{className:R.stage,"data-stage":`none`,children:`Not in grant`}):(0,L.jsxs)(`span`,{className:R.stage,"data-stage":e.stage,children:[e.stage===`merge`?`Merge`:`Propose`,e.enforcement===`local`?(0,L.jsx)(`span`,{className:R.stageNote,children:` · local checks`}):null]})}function q({row:e,actions:t}){let n=t.busy||t.readOnly;return e.holds.length?(0,L.jsx)(g,{size:`sm`,variant:`subtle`,disabled:n,"aria-label":`Resume ${e.repo}`,onClick:()=>t.act(()=>T({action:`resume-repo`,repo:e.repo}),`Resume ${e.repo}`,{confirm:{title:`Resume ${G(e.repo)}?`,body:`Clears ${e.holds.map(e=>W[e.kind].toLowerCase()).join(` and `)}. New fleet work can start there on the next tick.`,confirmLabel:`Resume`}}),children:`Resume`}):e.stage===null?null:(0,L.jsx)(g,{size:`sm`,variant:`ghost`,disabled:n,"aria-label":`Pause ${e.repo}`,onClick:()=>t.act(()=>T({action:`pause-repo`,repo:e.repo,reason:`Paused by Mason from the Fleet surface`}),`Pause ${e.repo}`,{confirm:{title:`Pause ${G(e.repo)}?`,body:`No new fleet work starts there until you resume it. Runs already in flight finish and are watched as usual.`,confirmLabel:`Pause repo`,destructive:!0}}),children:`Pause`})}function J({row:e}){return(0,L.jsxs)(`span`,{className:R.green,children:[(0,L.jsx)(`span`,{className:R.greenValue,children:e.greenPct7d===null?`—`:`${Math.round(e.greenPct7d)}%`}),(0,L.jsx)(s,{points:e.greenTrend,width:64,height:18,ariaLabel:`${e.repo} post-merge green, 14 days`,describe:e=>`${Math.round(e)}%`})]})}function Y({row:e,now:t}){return e.holds.length?(0,L.jsx)(`span`,{className:R.holds,children:e.holds.map(e=>(0,L.jsx)(`span`,{className:R.hold,"data-kind":e.kind,title:e.reason,children:De(e,t)},e.kind))}):(0,L.jsx)(`span`,{className:R.muted,children:`—`})}function X(e){if(e===void 0)return null;if(e===null)return`Fleet mirrors: unknown — the enrollment registry could not be read.`;if(e.count===0)return`Fleet mirrors: none yet — the fleet clones a repo the first time it works on it.`;let t=e.repos.slice(0,6).join(`, `),n=e.repos.length>6?` and ${e.repos.length-6} more`:``;return`Fleet mirrors: ${e.count} working ${e.count===1?`copy`:`copies`}${t?` (${t}${n})`:``} — the fleet's own clones of the repos above.`}var Z=e=>e.mergesToday===null?`—`:`${e.mergesToday}${e.maxMergesPerDay===null?``:` / ${e.maxMergesPerDay}`}`;function Oe({read:e,actions:t,now:n,compact:r}){let i=e?.value??null,a=i?.repos??[];return(0,L.jsxs)(k,{title:`Repositories`,caption:i?`${a.length} enrolled · stage is what the grant and rollout allow right now`:void 0,children:[e?i?a.length===0?(0,L.jsx)(D,{children:`No repositories are enrolled.`}):r?(0,L.jsx)(`ul`,{className:R.repoCards,children:a.map(e=>(0,L.jsxs)(`li`,{className:R.repoCard,id:C(`repo-${e.repo}`),children:[(0,L.jsxs)(`div`,{className:R.repoCardHead,children:[(0,L.jsx)(`span`,{className:R.repoName,children:e.repo}),(0,L.jsx)(q,{row:e,actions:t})]}),(0,L.jsxs)(`dl`,{className:R.facts,children:[(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Stage`}),(0,L.jsx)(`dd`,{children:(0,L.jsx)(K,{row:e})})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Last merge`}),(0,L.jsx)(`dd`,{children:e.lastMergeAt?p(e.lastMergeAt):`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Today`}),(0,L.jsx)(`dd`,{children:Z(e)})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Green 7d`}),(0,L.jsx)(`dd`,{children:(0,L.jsx)(J,{row:e})})]})]}),(0,L.jsx)(Y,{row:e,now:n})]},e.repo))}):(0,L.jsx)(`div`,{className:R.tableWrap,children:(0,L.jsxs)(`table`,{className:R.table,children:[(0,L.jsx)(`caption`,{className:`visually-hidden`,children:`Enrolled repositories`}),(0,L.jsx)(`thead`,{children:(0,L.jsxs)(`tr`,{children:[(0,L.jsx)(`th`,{scope:`col`,children:`Repository`}),(0,L.jsx)(`th`,{scope:`col`,children:`Stage`}),(0,L.jsx)(`th`,{scope:`col`,children:`Last merge`}),(0,L.jsx)(`th`,{scope:`col`,className:R.num,children:`Today`}),(0,L.jsx)(`th`,{scope:`col`,children:`Post-merge green · 14d`}),(0,L.jsx)(`th`,{scope:`col`,className:R.num,children:`Open PRs`}),(0,L.jsx)(`th`,{scope:`col`,children:`Holds`}),(0,L.jsx)(`th`,{scope:`col`,children:(0,L.jsx)(`span`,{className:`visually-hidden`,children:`Action`})})]})}),(0,L.jsx)(`tbody`,{children:a.map(e=>(0,L.jsxs)(`tr`,{id:C(`repo-${e.repo}`),"data-held":e.holds.length>0||void 0,children:[(0,L.jsx)(`th`,{scope:`row`,className:R.repoName,children:e.repo}),(0,L.jsx)(`td`,{children:(0,L.jsx)(K,{row:e})}),(0,L.jsx)(`td`,{children:e.lastMergeAt?p(e.lastMergeAt):`—`}),(0,L.jsx)(`td`,{className:R.num,children:Z(e)}),(0,L.jsx)(`td`,{children:(0,L.jsx)(J,{row:e})}),(0,L.jsx)(`td`,{className:R.num,children:e.openFleetPrs??`—`}),(0,L.jsx)(`td`,{children:(0,L.jsx)(Y,{row:e,now:n})}),(0,L.jsx)(`td`,{className:R.actionCell,children:(0,L.jsx)(q,{row:e,actions:t})})]},e.repo))})]})}):(0,L.jsx)(D,{tone:`unknown`,children:e.reason??`The live fleet view did not answer.`}):(0,L.jsx)(`p`,{className:R.muted,"aria-busy":`true`,children:`Reading repositories…`}),i&&X(i.mirrors)?(0,L.jsx)(`p`,{className:R.muted,children:X(i.mirrors)}):null]})}var Q=5e3,$=3e4,ke=(0,I.lazy)(()=>r(()=>import(`./Advanced-cVYTAsfB.js`).then(e=>e.t).then(e=>({default:()=>(0,L.jsx)(e.FleetAdvanced,{embedded:!0})})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])));function Ae(){let{compact:e}=ee(),t=a(w),n=a(S),r=a(te,{freshMs:15e3}),s=a(h,{freshMs:15e3}),c=i(w),l=i(S),u=i(h);d(c,Q),d(()=>{l(),u()},$);let f=ae(15e3),p=se(),[m,g]=(0,I.useState)(!1),_=(0,I.useId)(),v=t.data?.value??null,y=re(),b=y!=null&&v!==null&&ve(v);function x(){g(!0),requestAnimationFrame(()=>document.getElementById(_)?.scrollIntoView?.({block:`start`,behavior:`smooth`}))}return(0,L.jsxs)(le,{title:`Fleet`,actions:t.status===`refreshing`?(0,L.jsx)(o,{}):null,lead:(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(ce,{actions:p}),(0,L.jsx)(Se,{live:v}),y?(0,L.jsx)(ie,{state:y,here:`fleet`}):null]}),children:[b?null:(0,L.jsx)(O,{span:12,children:(0,L.jsx)(V,{read:t.data,now:f,hours:e?6:12})}),b?null:(0,L.jsx)(O,{span:7,children:(0,L.jsx)(Ce,{read:t.data})}),(0,L.jsx)(O,{span:b?6:5,children:(0,L.jsx)(we,{read:t.data,preview:s.data??null,view:r.data??null,now:f})}),b?null:(0,L.jsx)(O,{span:7,children:(0,L.jsx)(Te,{read:t.data,now:f})}),(0,L.jsx)(O,{span:b?6:5,children:(0,L.jsx)(Ee,{read:n.data,onOpenAdvanced:x,dark:v?.state===`dark`})}),(0,L.jsx)(O,{span:12,children:(0,L.jsx)(Oe,{read:t.data,actions:p,now:f,compact:e})}),(0,L.jsx)(O,{span:12,children:(0,L.jsxs)(`div`,{className:R.advanced,children:[(0,L.jsxs)(`button`,{type:`button`,className:R.disclosure,"aria-expanded":m,"aria-controls":_,onClick:()=>g(e=>!e),children:[(0,L.jsx)(ne,{className:R.chevron,width:14,height:14,"aria-hidden":`true`}),`Advanced`,(0,L.jsx)(`span`,{className:R.disclosureNote,children:`daemon, overnight, local runtime, caps, scope, activity, safety, goals`})]}),(0,L.jsx)(`div`,{id:_,hidden:!m,children:m?(0,L.jsx)(I.Suspense,{fallback:(0,L.jsx)(`p`,{className:R.muted,"aria-busy":`true`,children:`Loading the advanced panels…`}),children:(0,L.jsx)(ke,{})}):null})]})}),p.dialogs]})}export{Q as FLEET_POLL_MS,$ as FLEET_SLOW_POLL_MS,Ae as FleetSection};
3
+ //# sourceMappingURL=FleetSection-BG8iGraG.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/cloud/CloudLaneChip.tsx","../../../../../../src/web-ui/routes/verse/fleet/FleetCards.tsx","../../../../../../src/web-ui/routes/verse/fleet/RepoTable.tsx","../../../../../../src/web-ui/routes/verse/sections/FleetSection.tsx"],"sourcesContent":["/**\n * routes/verse/cloud/CloudLaneChip.tsx — \"Cloud · N running\" at the end of\n * Fleet's lanes row (3.11 unit C3; mounted by fleet/FleetCards.tsx\n * LanesStrip). Styled by the lanes row's own classes, which it passes in,\n * so it reads as one more lane.\n *\n * N counts tasks queued, launching or running — sessions Verse started that\n * have not delivered a PR yet. A server without the cloud lane renders no\n * chip at all: the lanes row is not the place to say \"not in this build\".\n */\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { inFlightCount } from './cloud-model.js';\nimport { CLOUD_POLL_MS, cloudQuery } from './cloud-queries.js';\nimport styles from './cloud.module.css';\n\nexport interface CloudLaneChipClasses {\n lane?: string;\n name?: string;\n sep?: string;\n slots?: string;\n}\n\nexport function CloudLaneChip({ classes = {} }: { classes?: CloudLaneChipClasses }) {\n const read = useQuery(cloudQuery, { freshMs: 15_000 });\n const refetch = useRefetch(cloudQuery);\n usePollWhileVisible(refetch, CLOUD_POLL_MS);\n const overview = read.data?.value ?? null;\n if (!overview) return null;\n const running = inFlightCount(overview.tasks);\n const title = `Claude Code cloud sessions Verse launched that have not delivered a PR yet. ${overview.budget.sessionsToday} of ${overview.budget.budget.maxSessionsPerDay} sessions used today.`;\n return (\n <li className={`${classes.lane ?? ''} ${styles.laneChip}`} data-active={running > 0 || undefined} title={title} aria-label={`Cloud: ${running} running`}>\n <span className={classes.name}>Cloud</span>\n <span className={classes.sep} aria-hidden=\"true\">\n {' · '}\n </span>\n <span className={classes.slots}>{running} running</span>\n </li>\n );\n}\n","/**\n * routes/verse/fleet/FleetCards.tsx — the Fleet surface's cards (SPEC-310B §6,\n * SPEC-310C §5; unit C7): lanes, the live swimlane, the gate funnel with its\n * refusal reasons, \"why this seat\", the parked Gantt and Overnight.\n *\n * Every card takes an OptionalRead and draws the designed state for each way\n * a source can be missing (not landed, unrecognised, dark) — never empty axes.\n */\nimport type { FleetLaneState, FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { SeatDecision } from '../../../../core/routing/types.js';\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport { BarStack } from '../../../components/charts/BarStack.js';\nimport type { ChartStatus } from '../../../components/charts/ChartFrame.js';\nimport { Funnel } from '../../../components/charts/Funnel.js';\nimport { Swimlane } from '../../../components/charts/Swimlane.js';\nimport { EngineMarker } from '../../../components/primitives/Tag.js';\nimport { formatRelative } from '../autonomy/format.js';\nimport type { OptionalFleetRead } from '../autonomy/fleet-contract.js';\nimport type { OvernightStatus } from '../autonomy/overnight-contract.js';\nimport { describeStopRule } from '../autonomy/overnight-model.js';\nimport { CloudLaneChip } from '../cloud/CloudLaneChip.js';\nimport { Card, CardNote, MicroLabel } from '../command/Surface.js';\nimport type { OptionalRead } from '../command/surface-data.js';\nimport { fleetDarkStatus } from './dark-since.js';\nimport { LANE_ENGINE, LANE_LABEL, funnelStages, laneChipText, laneNotes, laneReason, laneRows, latestDecision, parkedGantt, refusalStack, runTone } from './live-model.js';\nimport { asSentence, decisionSummary, describeEligibleAgain, eligibleAgain, heldBackText } from './why-seat-model.js';\nimport styles from './fleet.module.css';\n\nconst HOUR = 3_600_000;\n\n/**\n * The shared \"is there a fleet to draw at all\" decision for every chart card.\n * Dark reads THE dark-since instant (`fleetDarkStatus`), as the viewer's local\n * day — the same day Command's verdict line names — and no day at all when\n * the server does not know one.\n */\nexport function fleetStatus(read: OptionalRead<FleetLiveSnapshotV1> | undefined, empty: string, hasData: boolean): ChartStatus {\n if (!read) return { kind: 'loading' };\n const live = read.value;\n if (!live) return { kind: 'unknown', reason: read.reason ?? 'the live fleet view did not answer.' };\n if (live.state === 'dark' && !hasData) return fleetDarkStatus(live);\n return hasData ? { kind: 'ready' } : { kind: 'empty', message: empty };\n}\n\n// ---------------------------------------------------------------------------\n// Lanes strip + live swimlane\n// ---------------------------------------------------------------------------\n\n/** \"Local · off\" — the chip is the lane and its slots; its why is one line below the strip (and its title). */\nfunction LaneChip({ lane }: { lane: FleetLaneState }) {\n const text = laneChipText(lane);\n return (\n <li className={styles.lane} data-off={lane.slots === 0 || undefined} title={laneReason(lane) ?? undefined}>\n <EngineMarker engine={LANE_ENGINE[lane.lane]} />\n <span className={styles.laneName}>{text.name}</span>\n <span className={styles.laneSep} aria-hidden=\"true\">\n {' · '}\n </span>\n <span className={styles.laneSlots}>{text.slots}</span>\n </li>\n );\n}\n\nexport function LanesStrip({ live }: { live: FleetLiveSnapshotV1 | null }) {\n if (!live || live.lanes.length === 0) return null;\n const notes = laneNotes(live.lanes);\n return (\n <div className={styles.laneStrip}>\n <ul className={styles.lanes} aria-label=\"Lanes: busy of slots\">\n {live.lanes.map((l) => (\n <LaneChip key={l.lane} lane={l} />\n ))}\n <CloudLaneChip classes={{ lane: styles.lane, name: styles.laneName, sep: styles.laneSep, slots: styles.laneSlots }} />\n </ul>\n {notes.length > 0 ? (\n <ul className={styles.laneNotes} aria-label=\"Why lanes are limited\">\n {notes.map((n) => (\n <li key={n.lanes.join(',')}>\n {n.all ? null : <span className={styles.laneNoteLanes}>{n.lanes.map((l) => LANE_LABEL[l]).join(', ')}: </span>}\n {asSentence(n.reason)}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\nexport function LiveSwimlane({ read, now, hours }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; now: number; hours: number }) {\n const live = read?.value ?? null;\n const from = now - hours * HOUR;\n const lanes = live ? laneRows(live.runs, from, now, { includeParked: false }) : [];\n return (\n <Swimlane\n title=\"Live fleet\"\n description={`Lanes × slots, last ${hours} h · bars coloured by phase or outcome · outlines are queued`}\n status={fleetStatus(read, `Nothing ran in the last ${hours} hours.`, lanes.length > 0)}\n lanes={lanes}\n from={from}\n to={now}\n now={now}\n toneOf={runTone}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Gate funnel + refusal reasons\n// ---------------------------------------------------------------------------\n\nexport function GateFunnelCards({ read }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined }) {\n const live = read?.value ?? null;\n const funnel = live?.funnel ?? null;\n const stages = funnelStages(funnel);\n const refusals = refusalStack(funnel);\n const window = funnel ? `${new Date(funnel.from).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })} – ${new Date(funnel.to).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}` : undefined;\n return (\n <div className={styles.stack}>\n <Funnel\n title=\"Gate funnel\"\n description={window ? `Proposals through G0–G7, ${window}` : 'Proposals through the merge gates G0–G7'}\n status={fleetStatus(read, 'No proposal reached the gates in this window.', stages.length > 0)}\n stages={stages}\n />\n <BarStack\n title=\"Refusals by gate\"\n description={refusals.total ? `${refusals.total} refusals · top reasons keep their colour` : 'Why proposals stopped'}\n status={fleetStatus(read, 'Nothing was refused in this window.', refusals.total > 0)}\n categories={refusals.categories}\n segments={refusals.segments}\n values={refusals.values}\n height={180}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Why this seat\n// ---------------------------------------------------------------------------\n\nfunction seatLabel(view: BudgetView | null, seatId: string): { label: string; engine: 'claude' | 'codex' | 'grok' | 'local' | null } {\n const info = view?.seatInfo.find((s) => s.seatId === seatId);\n return { label: info?.label ?? seatId, engine: info?.engine ?? null };\n}\n\nexport function DecisionView({ decision, view, now }: { decision: SeatDecision; view: BudgetView | null; now?: number }) {\n const chosen = decision.seatId ? seatLabel(view, decision.seatId) : null;\n return (\n <div className={styles.decision}>\n <p className={styles.decisionLead}>\n {chosen ? (\n <>\n {chosen.engine ? <EngineMarker engine={chosen.engine} /> : null}\n <strong>{chosen.label}</strong>\n </>\n ) : (\n <strong>No seat</strong>\n )}\n <span className={styles.mode}>{decision.mode}</span>\n </p>\n <p className={styles.decisionWhy}>{decisionSummary(decision)}</p>\n {decision.candidates.length > 1 ? (\n <div>\n <MicroLabel>Then</MicroLabel>\n <ol className={styles.candidates}>\n {decision.candidates.slice(decision.seatId ? 1 : 0).map((id) => (\n <li key={id}>{seatLabel(view, id).label}</li>\n ))}\n </ol>\n </div>\n ) : null}\n {decision.exclusions.length ? (\n <div>\n <MicroLabel>Held back</MicroLabel>\n <ul className={styles.exclusions} aria-label=\"Held back seats\">\n {decision.exclusions.map((x) => (\n <li key={x.seatId}>\n <span className={styles.excluded}>{seatLabel(view, x.seatId).label}</span>\n <span className={styles.excludedWhy}>{heldBackText(x)}</span>\n <span className={styles.excludedWhen}>eligible again: {describeEligibleAgain(eligibleAgain(x), now)}</span>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function WhySeatCard({ read, preview, view, now }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; preview: SeatDecision | null; view: BudgetView | null; now?: number }) {\n const latest = latestDecision(read?.value ?? null);\n return (\n <Card\n title=\"Why this seat\"\n caption={latest ? `Latest dispatch: ${latest.run.title} (${formatRelative(latest.run.phaseStartedAt ?? latest.run.startedAt)})` : preview ? 'The next medium autonomous task would go to…' : undefined}\n >\n {latest ? (\n <DecisionView decision={latest.decision} view={view} now={now} />\n ) : preview ? (\n <DecisionView decision={preview} view={view} now={now} />\n ) : (\n <CardNote tone=\"unknown\">No routing decision yet. The router preview didn't answer.</CardNote>\n )}\n </Card>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Parked Gantt\n// ---------------------------------------------------------------------------\n\nexport function ParkedCard({ read, now }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; now: number }) {\n const live = read?.value ?? null;\n const gantt = live ? parkedGantt(live.runs, now) : { lanes: [], from: now - HOUR, to: now + 2 * HOUR, unknownRelease: 0 };\n return (\n <Swimlane\n title=\"Parked\"\n description=\"Waiting for a seat to free up — each bar ends when it should\"\n caveat={gantt.unknownRelease ? `${gantt.unknownRelease} item${gantt.unknownRelease === 1 ? ' has' : 's have'} no known release time; ${gantt.unknownRelease === 1 ? 'it runs' : 'they run'} to the right edge.` : undefined}\n status={fleetStatus(read, 'Nothing is parked.', gantt.lanes.length > 0)}\n lanes={gantt.lanes}\n from={gantt.from}\n to={gantt.to}\n now={now}\n toneOf={runTone}\n formatTick={(ms) => new Date(ms).toLocaleString('en-US', { weekday: 'short', hour: 'numeric' })}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Overnight\n// ---------------------------------------------------------------------------\n\nexport function OvernightCard({ read, onOpenAdvanced, dark = false }: { read: OptionalFleetRead<OvernightStatus> | undefined; onOpenAdvanced: () => void; /** The fleet is dark: it has no \"normal schedule\" to run on. */ dark?: boolean }) {\n const status = read?.value ?? null;\n const run = status?.run ?? null;\n return (\n <Card\n title=\"Overnight\"\n caption={status ? (status.armed ? 'Armed' : 'Not armed') : undefined}\n actions={\n <button type=\"button\" className={styles.link} onClick={onOpenAdvanced}>\n Arm or stop in Advanced\n </button>\n }\n >\n {!read ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the overnight lane…</p>\n ) : !status ? (\n <CardNote tone=\"unknown\">{read.reason ?? 'The overnight lane did not answer.'}</CardNote>\n ) : !status.armed && !run ? (\n <CardNote>{dark ? 'Nothing armed.' : 'Nothing armed. The fleet runs on its normal schedule.'}</CardNote>\n ) : (\n <div className={styles.overnight}>\n {run?.stopRule ? <p className={styles.overnightLead}>{describeStopRule(run.stopRule)}</p> : null}\n <dl className={styles.facts}>\n <div>\n <dt>Started</dt>\n <dd>{run?.startedAt ? formatRelative(run.startedAt) : '—'}</dd>\n </div>\n <div>\n <dt>Iterations</dt>\n <dd>{run?.iterationsDone ?? '—'}</dd>\n </div>\n <div>\n <dt>Merged</dt>\n <dd>{run ? run.merged.length : '—'}</dd>\n </div>\n <div>\n <dt>Discarded</dt>\n <dd>{run ? run.discarded.length : '—'}</dd>\n </div>\n </dl>\n {run?.activity ? <p className={styles.muted}>Now: {run.activity}</p> : null}\n {run && run.discarded.length ? (\n <ul className={styles.discarded} aria-label=\"Discarded work\">\n {run.discarded.slice(0, 3).map((d) => (\n <li key={d.id}>\n <span className={styles.discardTitle}>{d.title}</span>\n <span className={styles.discardWhy}>{d.reason}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n )}\n </Card>\n );\n}\n","/**\n * routes/verse/fleet/RepoTable.tsx — one row per enrolled repo (SPEC-310C §5\n * Fleet \"Repo table: stage, last merge, green% sparkline, holds,\n * pause/resume\"; unit C7).\n *\n * Pause sets an owner-hold as Mason; Resume clears every active hold (or the\n * one a Needs-you item names). Both confirm first — a pause stops new work\n * in a repo, a resume can lift a quarantine early — then take the token.\n * At 375 px the table becomes one card per repo (a 7-column table does not\n * fit a phone, and a horizontal scroll hides the action).\n */\nimport type { FleetLiveSnapshotV1, FleetMirrorSummary, FleetRepoRow, RepoHold } from '../../../../core/fleet/fleet-types.js';\nimport { Sparkline } from '../../../components/charts/Sparkline.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { formatRelative } from '../autonomy/format.js';\nimport type { SurfaceActions } from '../command/actions.js';\nimport { anchorId } from '../command/nav.js';\nimport { Card, CardNote } from '../command/Surface.js';\nimport { postFleetLive, type OptionalRead } from '../command/surface-data.js';\nimport styles from './fleet.module.css';\n\nconst HOLD_WORD: Record<RepoHold['kind'], string> = {\n quarantine: 'Quarantined',\n 'owner-hold': 'On hold (you)',\n 'leader-pause': 'Paused by Leader',\n cooldown: 'Cooling down',\n};\n\nexport function holdText(hold: RepoHold, now: number): string {\n const until = hold.until ? Date.parse(hold.until) : NaN;\n const left = Number.isFinite(until) ? Math.max(0, until - now) : null;\n const tail = left === null ? 'until resumed' : left < 3_600_000 ? `${Math.ceil(left / 60_000)}m left` : `${Math.round(left / 3_600_000)}h left`;\n return `${HOLD_WORD[hold.kind]} · ${tail}`;\n}\n\nfunction shortRepo(repo: string): string {\n return repo.includes('/') ? repo.split('/')[1]! : repo;\n}\n\nfunction StageBadge({ row }: { row: FleetRepoRow }) {\n if (row.stage === null) return <span className={styles.stage} data-stage=\"none\">Not in grant</span>;\n return (\n <span className={styles.stage} data-stage={row.stage}>\n {row.stage === 'merge' ? 'Merge' : 'Propose'}\n {row.enforcement === 'local' ? <span className={styles.stageNote}> · local checks</span> : null}\n </span>\n );\n}\n\nfunction RepoAction({ row, actions }: { row: FleetRepoRow; actions: SurfaceActions }) {\n const disabled = actions.busy || actions.readOnly;\n if (row.holds.length) {\n return (\n <Button\n size=\"sm\"\n variant=\"subtle\"\n disabled={disabled}\n aria-label={`Resume ${row.repo}`}\n onClick={() =>\n actions.act(() => postFleetLive({ action: 'resume-repo', repo: row.repo }), `Resume ${row.repo}`, {\n confirm: {\n title: `Resume ${shortRepo(row.repo)}?`,\n body: `Clears ${row.holds.map((h) => HOLD_WORD[h.kind].toLowerCase()).join(' and ')}. New fleet work can start there on the next tick.`,\n confirmLabel: 'Resume',\n },\n })\n }\n >\n Resume\n </Button>\n );\n }\n if (row.stage === null) return null;\n return (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={disabled}\n aria-label={`Pause ${row.repo}`}\n onClick={() =>\n actions.act(() => postFleetLive({ action: 'pause-repo', repo: row.repo, reason: 'Paused by Mason from the Fleet surface' }), `Pause ${row.repo}`, {\n confirm: {\n title: `Pause ${shortRepo(row.repo)}?`,\n body: 'No new fleet work starts there until you resume it. Runs already in flight finish and are watched as usual.',\n confirmLabel: 'Pause repo',\n destructive: true,\n },\n })\n }\n >\n Pause\n </Button>\n );\n}\n\nfunction GreenCell({ row }: { row: FleetRepoRow }) {\n return (\n <span className={styles.green}>\n <span className={styles.greenValue}>{row.greenPct7d === null ? '—' : `${Math.round(row.greenPct7d)}%`}</span>\n <Sparkline points={row.greenTrend} width={64} height={18} ariaLabel={`${row.repo} post-merge green, 14 days`} describe={(v) => `${Math.round(v)}%`} />\n </span>\n );\n}\n\nfunction Holds({ row, now }: { row: FleetRepoRow; now: number }) {\n if (!row.holds.length) return <span className={styles.muted}>—</span>;\n return (\n <span className={styles.holds}>\n {row.holds.map((h) => (\n <span key={h.kind} className={styles.hold} data-kind={h.kind} title={h.reason}>\n {holdText(h, now)}\n </span>\n ))}\n </span>\n );\n}\n\n/**\n * The fleet's own mirror clones, apart from the repo rows. WHY separate: a\n * mirror is the fleet's working copy of a repo already listed above, so\n * counting it as a row double-counts the repo (and its pause would not pause\n * the real one). `undefined` = an older server that does not report mirrors\n * (say nothing); `null` = the enrollment registry could not be read (say so —\n * unknown is never \"none\").\n */\nexport function mirrorsText(mirrors: FleetMirrorSummary | null | undefined): string | null {\n if (mirrors === undefined) return null;\n if (mirrors === null) return 'Fleet mirrors: unknown — the enrollment registry could not be read.';\n if (mirrors.count === 0) return 'Fleet mirrors: none yet — the fleet clones a repo the first time it works on it.';\n const shown = mirrors.repos.slice(0, 6).join(', ');\n const more = mirrors.repos.length > 6 ? ` and ${mirrors.repos.length - 6} more` : '';\n return `Fleet mirrors: ${mirrors.count} working ${mirrors.count === 1 ? 'copy' : 'copies'}${shown ? ` (${shown}${more})` : ''} — the fleet's own clones of the repos above.`;\n}\n\nconst today = (row: FleetRepoRow) => (row.mergesToday === null ? '—' : `${row.mergesToday}${row.maxMergesPerDay !== null ? ` / ${row.maxMergesPerDay}` : ''}`);\n\nexport function RepoTable({ read, actions, now, compact }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; actions: SurfaceActions; now: number; compact: boolean }) {\n const live = read?.value ?? null;\n const rows = live?.repos ?? [];\n return (\n <Card title=\"Repositories\" caption={live ? `${rows.length} enrolled · stage is what the grant and rollout allow right now` : undefined}>\n {!read ? (\n <p className={styles.muted} aria-busy=\"true\">Reading repositories…</p>\n ) : !live ? (\n <CardNote tone=\"unknown\">{read.reason ?? 'The live fleet view did not answer.'}</CardNote>\n ) : rows.length === 0 ? (\n <CardNote>No repositories are enrolled.</CardNote>\n ) : compact ? (\n <ul className={styles.repoCards}>\n {rows.map((row) => (\n <li key={row.repo} className={styles.repoCard} id={anchorId(`repo-${row.repo}`)}>\n <div className={styles.repoCardHead}>\n <span className={styles.repoName}>{row.repo}</span>\n <RepoAction row={row} actions={actions} />\n </div>\n <dl className={styles.facts}>\n <div><dt>Stage</dt><dd><StageBadge row={row} /></dd></div>\n <div><dt>Last merge</dt><dd>{row.lastMergeAt ? formatRelative(row.lastMergeAt) : '—'}</dd></div>\n <div><dt>Today</dt><dd>{today(row)}</dd></div>\n <div><dt>Green 7d</dt><dd><GreenCell row={row} /></dd></div>\n </dl>\n <Holds row={row} now={now} />\n </li>\n ))}\n </ul>\n ) : (\n <div className={styles.tableWrap}>\n <table className={styles.table}>\n <caption className=\"visually-hidden\">Enrolled repositories</caption>\n <thead>\n <tr>\n <th scope=\"col\">Repository</th>\n <th scope=\"col\">Stage</th>\n <th scope=\"col\">Last merge</th>\n <th scope=\"col\" className={styles.num}>Today</th>\n <th scope=\"col\">Post-merge green · 14d</th>\n <th scope=\"col\" className={styles.num}>Open PRs</th>\n <th scope=\"col\">Holds</th>\n <th scope=\"col\"><span className=\"visually-hidden\">Action</span></th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.repo} id={anchorId(`repo-${row.repo}`)} data-held={row.holds.length > 0 || undefined}>\n <th scope=\"row\" className={styles.repoName}>{row.repo}</th>\n <td><StageBadge row={row} /></td>\n <td>{row.lastMergeAt ? formatRelative(row.lastMergeAt) : '—'}</td>\n <td className={styles.num}>{today(row)}</td>\n <td><GreenCell row={row} /></td>\n <td className={styles.num}>{row.openFleetPrs ?? '—'}</td>\n <td><Holds row={row} now={now} /></td>\n <td className={styles.actionCell}><RepoAction row={row} actions={actions} /></td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n {live && mirrorsText(live.mirrors) ? <p className={styles.muted}>{mirrorsText(live.mirrors)}</p> : null}\n </Card>\n );\n}\n","/**\n * routes/verse/sections/FleetSection.tsx — ⌘2 Fleet (SPEC-310B §6,\n * SPEC-310C §5; unit C7). What is running where, why that seat, what is\n * waiting, and per-repo control.\n *\n * Live swimlane by lane × phase (12)\n * Gate funnel + refusal reasons (7) | Why this seat (5)\n * Parked Gantt (7) | Overnight (5)\n * Repo table: stage, last merge, green% sparkline, holds, pause/resume (12)\n * ▸ Advanced — the eleven legacy Autonomy panels, fetched only when opened\n *\n * At 375 px: one column in that order; the repo table becomes cards.\n * The live view polls every 5 s while Fleet is the visible surface.\n *\n * Autonomy off: the shared AutonomyOffState sits under the lanes, and when\n * the fleet has nothing to draw (no runs, no gate traffic) the three chart\n * cards are left out instead of each repeating \"Fleet dark since …\".\n */\nimport { Suspense, lazy, useId, useState } from 'react';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { IconChevronRight } from '../../../components/primitives/icons.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { AutonomyOffState, useAutonomyOff } from '../autonomy/AutonomyOffState.js';\nimport { overnightQuery } from '../autonomy/overnight-queries.js';\nimport { useNow } from '../autonomy/use-ticker.js';\nimport { budgetPreviewQuery, budgetQuery } from '../budget/budget-queries.js';\nimport { ActionStatus, useSurfaceActions } from '../command/actions.js';\nimport { Cell, Surface } from '../command/Surface.js';\nimport { fleetLiveQuery } from '../command/surface-data.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { useViewport } from '../shell/viewport.js';\nimport { GateFunnelCards, LanesStrip, LiveSwimlane, OvernightCard, ParkedCard, WhySeatCard } from '../fleet/FleetCards.js';\nimport { RepoTable } from '../fleet/RepoTable.js';\nimport { nothingToDraw } from '../fleet/live-model.js';\nimport styles from '../fleet/fleet.module.css';\n\nexport const FLEET_POLL_MS = 5_000;\nexport const FLEET_SLOW_POLL_MS = 30_000;\n\n// The legacy cockpit is ~74 KB of panels: its own chunk, loaded on open.\nconst FleetAdvanced = lazy(() => import('../fleet/Advanced.js').then((m) => ({ default: () => <m.FleetAdvanced embedded /> })));\n\nexport function FleetSection() {\n const { compact } = useViewport();\n const fleet = useQuery(fleetLiveQuery);\n const overnight = useQuery(overnightQuery);\n const budget = useQuery(budgetQuery, { freshMs: 15_000 });\n const preview = useQuery(budgetPreviewQuery, { freshMs: 15_000 });\n const refetchFleet = useRefetch(fleetLiveQuery);\n const refetchOvernight = useRefetch(overnightQuery);\n const refetchPreview = useRefetch(budgetPreviewQuery);\n usePollWhileVisible(refetchFleet, FLEET_POLL_MS);\n usePollWhileVisible(() => {\n refetchOvernight();\n refetchPreview();\n }, FLEET_SLOW_POLL_MS);\n\n const now = useNow(15_000);\n const actions = useSurfaceActions();\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const advancedId = useId();\n const live = fleet.data?.value ?? null;\n const off = useAutonomyOff();\n // Collapse only what would be empty: a fleet stopped an hour ago still\n // draws its last runs.\n const collapse = off != null && live !== null && nothingToDraw(live);\n\n function openAdvanced(): void {\n setAdvancedOpen(true);\n requestAnimationFrame(() => document.getElementById(advancedId)?.scrollIntoView?.({ block: 'start', behavior: 'smooth' }));\n }\n\n return (\n <Surface\n title=\"Fleet\"\n actions={fleet.status === 'refreshing' ? <RefreshIndicator /> : null}\n lead={\n <>\n <ActionStatus actions={actions} />\n <LanesStrip live={live} />\n {off ? <AutonomyOffState state={off} here=\"fleet\" /> : null}\n </>\n }\n >\n {collapse ? null : (\n <Cell span={12}>\n <LiveSwimlane read={fleet.data} now={now} hours={compact ? 6 : 12} />\n </Cell>\n )}\n {collapse ? null : (\n <Cell span={7}>\n <GateFunnelCards read={fleet.data} />\n </Cell>\n )}\n <Cell span={collapse ? 6 : 5}>\n <WhySeatCard read={fleet.data} preview={preview.data ?? null} view={budget.data ?? null} now={now} />\n </Cell>\n {collapse ? null : (\n <Cell span={7}>\n <ParkedCard read={fleet.data} now={now} />\n </Cell>\n )}\n <Cell span={collapse ? 6 : 5}>\n <OvernightCard read={overnight.data} onOpenAdvanced={openAdvanced} dark={live?.state === 'dark'} />\n </Cell>\n <Cell span={12}>\n <RepoTable read={fleet.data} actions={actions} now={now} compact={compact} />\n </Cell>\n <Cell span={12}>\n <div className={styles.advanced}>\n <button\n type=\"button\"\n className={styles.disclosure}\n aria-expanded={advancedOpen}\n aria-controls={advancedId}\n onClick={() => setAdvancedOpen((o) => !o)}\n >\n <IconChevronRight className={styles.chevron} width={14} height={14} aria-hidden=\"true\" />\n Advanced\n <span className={styles.disclosureNote}>daemon, overnight, local runtime, caps, scope, activity, safety, goals</span>\n </button>\n <div id={advancedId} hidden={!advancedOpen}>\n {advancedOpen ? (\n <Suspense fallback={<p className={styles.muted} aria-busy=\"true\">Loading the advanced panels…</p>}>\n <FleetAdvanced />\n </Suspense>\n ) : null}\n </div>\n </div>\n </Cell>\n {actions.dialogs}\n </Surface>\n );\n}\n"],"file":"FleetSection-B7f-XBiX.js"}
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/cloud/CloudLaneChip.tsx","../../../../../../src/web-ui/routes/verse/fleet/FleetCards.tsx","../../../../../../src/web-ui/routes/verse/fleet/RepoTable.tsx","../../../../../../src/web-ui/routes/verse/sections/FleetSection.tsx"],"sourcesContent":["/**\n * routes/verse/cloud/CloudLaneChip.tsx — \"Cloud · N running\" at the end of\n * Fleet's lanes row (3.11 unit C3; mounted by fleet/FleetCards.tsx\n * LanesStrip). Styled by the lanes row's own classes, which it passes in,\n * so it reads as one more lane.\n *\n * N counts tasks queued, launching or running — sessions Verse started that\n * have not delivered a PR yet. A server without the cloud lane renders no\n * chip at all: the lanes row is not the place to say \"not in this build\".\n */\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { inFlightCount } from './cloud-model.js';\nimport { CLOUD_POLL_MS, cloudQuery } from './cloud-queries.js';\nimport styles from './cloud.module.css';\n\nexport interface CloudLaneChipClasses {\n lane?: string;\n name?: string;\n sep?: string;\n slots?: string;\n}\n\nexport function CloudLaneChip({ classes = {} }: { classes?: CloudLaneChipClasses }) {\n const read = useQuery(cloudQuery, { freshMs: 15_000 });\n const refetch = useRefetch(cloudQuery);\n usePollWhileVisible(refetch, CLOUD_POLL_MS);\n const overview = read.data?.value ?? null;\n if (!overview) return null;\n const running = inFlightCount(overview.tasks);\n const title = `Claude Code cloud sessions Verse launched that have not delivered a PR yet. ${overview.budget.sessionsToday} of ${overview.budget.budget.maxSessionsPerDay} sessions used today.`;\n return (\n <li className={`${classes.lane ?? ''} ${styles.laneChip}`} data-active={running > 0 || undefined} title={title} aria-label={`Cloud: ${running} running`}>\n <span className={classes.name}>Cloud</span>\n <span className={classes.sep} aria-hidden=\"true\">\n {' · '}\n </span>\n <span className={classes.slots}>{running} running</span>\n </li>\n );\n}\n","/**\n * routes/verse/fleet/FleetCards.tsx — the Fleet surface's cards (SPEC-310B §6,\n * SPEC-310C §5; unit C7): lanes, the live swimlane, the gate funnel with its\n * refusal reasons, \"why this seat\", the parked Gantt and Overnight.\n *\n * Every card takes an OptionalRead and draws the designed state for each way\n * a source can be missing (not landed, unrecognised, dark) — never empty axes.\n */\nimport type { FleetLaneState, FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { SeatDecision } from '../../../../core/routing/types.js';\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport { BarStack } from '../../../components/charts/BarStack.js';\nimport type { ChartStatus } from '../../../components/charts/ChartFrame.js';\nimport { Funnel } from '../../../components/charts/Funnel.js';\nimport { Swimlane } from '../../../components/charts/Swimlane.js';\nimport { EngineMarker } from '../../../components/primitives/Tag.js';\nimport { formatRelative } from '../autonomy/format.js';\nimport type { OptionalFleetRead } from '../autonomy/fleet-contract.js';\nimport type { OvernightStatus } from '../autonomy/overnight-contract.js';\nimport { describeStopRule } from '../autonomy/overnight-model.js';\nimport { CloudLaneChip } from '../cloud/CloudLaneChip.js';\nimport { Card, CardNote, MicroLabel } from '../command/Surface.js';\nimport type { OptionalRead } from '../command/surface-data.js';\nimport { fleetDarkStatus } from './dark-since.js';\nimport { LANE_ENGINE, LANE_LABEL, funnelStages, laneChipText, laneNotes, laneReason, laneRows, latestDecision, parkedGantt, refusalStack, runTone } from './live-model.js';\nimport { asSentence, decisionSummary, describeEligibleAgain, eligibleAgain, heldBackText } from './why-seat-model.js';\nimport styles from './fleet.module.css';\n\nconst HOUR = 3_600_000;\n\n/**\n * The shared \"is there a fleet to draw at all\" decision for every chart card.\n * Dark reads THE dark-since instant (`fleetDarkStatus`), as the viewer's local\n * day — the same day Command's verdict line names — and no day at all when\n * the server does not know one.\n */\nexport function fleetStatus(read: OptionalRead<FleetLiveSnapshotV1> | undefined, empty: string, hasData: boolean): ChartStatus {\n if (!read) return { kind: 'loading' };\n const live = read.value;\n if (!live) return { kind: 'unknown', reason: read.reason ?? 'the live fleet view did not answer.' };\n if (live.state === 'dark' && !hasData) return fleetDarkStatus(live);\n return hasData ? { kind: 'ready' } : { kind: 'empty', message: empty };\n}\n\n// ---------------------------------------------------------------------------\n// Lanes strip + live swimlane\n// ---------------------------------------------------------------------------\n\n/** \"Local · off\" — the chip is the lane and its slots; its why is one line below the strip (and its title). */\nfunction LaneChip({ lane }: { lane: FleetLaneState }) {\n const text = laneChipText(lane);\n return (\n <li className={styles.lane} data-off={lane.slots === 0 || undefined} title={laneReason(lane) ?? undefined}>\n <EngineMarker engine={LANE_ENGINE[lane.lane]} />\n <span className={styles.laneName}>{text.name}</span>\n <span className={styles.laneSep} aria-hidden=\"true\">\n {' · '}\n </span>\n <span className={styles.laneSlots}>{text.slots}</span>\n </li>\n );\n}\n\nexport function LanesStrip({ live }: { live: FleetLiveSnapshotV1 | null }) {\n if (!live || live.lanes.length === 0) return null;\n const notes = laneNotes(live.lanes);\n return (\n <div className={styles.laneStrip}>\n <ul className={styles.lanes} aria-label=\"Lanes: busy of slots\">\n {live.lanes.map((l) => (\n <LaneChip key={l.lane} lane={l} />\n ))}\n <CloudLaneChip classes={{ lane: styles.lane, name: styles.laneName, sep: styles.laneSep, slots: styles.laneSlots }} />\n </ul>\n {notes.length > 0 ? (\n <ul className={styles.laneNotes} aria-label=\"Why lanes are limited\">\n {notes.map((n) => (\n <li key={n.lanes.join(',')}>\n {n.all ? null : <span className={styles.laneNoteLanes}>{n.lanes.map((l) => LANE_LABEL[l]).join(', ')}: </span>}\n {asSentence(n.reason)}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\nexport function LiveSwimlane({ read, now, hours }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; now: number; hours: number }) {\n const live = read?.value ?? null;\n const from = now - hours * HOUR;\n const lanes = live ? laneRows(live.runs, from, now, { includeParked: false }) : [];\n return (\n <Swimlane\n title=\"Live fleet\"\n description={`Lanes × slots, last ${hours} h · bars coloured by phase or outcome · outlines are queued`}\n status={fleetStatus(read, `Nothing ran in the last ${hours} hours.`, lanes.length > 0)}\n lanes={lanes}\n from={from}\n to={now}\n now={now}\n toneOf={runTone}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Gate funnel + refusal reasons\n// ---------------------------------------------------------------------------\n\nexport function GateFunnelCards({ read }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined }) {\n const live = read?.value ?? null;\n const funnel = live?.funnel ?? null;\n const stages = funnelStages(funnel);\n const refusals = refusalStack(funnel);\n const window = funnel ? `${new Date(funnel.from).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })} – ${new Date(funnel.to).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}` : undefined;\n return (\n <div className={styles.stack}>\n <Funnel\n title=\"Gate funnel\"\n description={window ? `Proposals through G0–G7, ${window}` : 'Proposals through the merge gates G0–G7'}\n status={fleetStatus(read, 'No proposal reached the gates in this window.', stages.length > 0)}\n stages={stages}\n />\n <BarStack\n title=\"Refusals by gate\"\n description={refusals.total ? `${refusals.total} refusals · top reasons keep their colour` : 'Why proposals stopped'}\n status={fleetStatus(read, 'Nothing was refused in this window.', refusals.total > 0)}\n categories={refusals.categories}\n segments={refusals.segments}\n values={refusals.values}\n height={180}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Why this seat\n// ---------------------------------------------------------------------------\n\nfunction seatLabel(view: BudgetView | null, seatId: string): { label: string; engine: 'claude' | 'codex' | 'grok' | 'local' | null } {\n const info = view?.seatInfo.find((s) => s.seatId === seatId);\n return { label: info?.label ?? seatId, engine: info?.engine ?? null };\n}\n\nexport function DecisionView({ decision, view, now }: { decision: SeatDecision; view: BudgetView | null; now?: number }) {\n const chosen = decision.seatId ? seatLabel(view, decision.seatId) : null;\n return (\n <div className={styles.decision}>\n <p className={styles.decisionLead}>\n {chosen ? (\n <>\n {chosen.engine ? <EngineMarker engine={chosen.engine} /> : null}\n <strong>{chosen.label}</strong>\n </>\n ) : (\n <strong>No seat</strong>\n )}\n <span className={styles.mode}>{decision.mode}</span>\n </p>\n <p className={styles.decisionWhy}>{decisionSummary(decision)}</p>\n {decision.candidates.length > 1 ? (\n <div>\n <MicroLabel>Then</MicroLabel>\n <ol className={styles.candidates}>\n {decision.candidates.slice(decision.seatId ? 1 : 0).map((id) => (\n <li key={id}>{seatLabel(view, id).label}</li>\n ))}\n </ol>\n </div>\n ) : null}\n {decision.exclusions.length ? (\n <div>\n <MicroLabel>Held back</MicroLabel>\n <ul className={styles.exclusions} aria-label=\"Held back seats\">\n {decision.exclusions.map((x) => (\n <li key={x.seatId}>\n <span className={styles.excluded}>{seatLabel(view, x.seatId).label}</span>\n <span className={styles.excludedWhy}>{heldBackText(x)}</span>\n <span className={styles.excludedWhen}>eligible again: {describeEligibleAgain(eligibleAgain(x), now)}</span>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function WhySeatCard({ read, preview, view, now }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; preview: SeatDecision | null; view: BudgetView | null; now?: number }) {\n const latest = latestDecision(read?.value ?? null);\n return (\n <Card\n title=\"Why this seat\"\n caption={latest ? `Latest dispatch: ${latest.run.title} (${formatRelative(latest.run.phaseStartedAt ?? latest.run.startedAt)})` : preview ? 'The next medium autonomous task would go to…' : undefined}\n >\n {latest ? (\n <DecisionView decision={latest.decision} view={view} now={now} />\n ) : preview ? (\n <DecisionView decision={preview} view={view} now={now} />\n ) : (\n <CardNote tone=\"unknown\">No routing decision yet. The router preview didn't answer.</CardNote>\n )}\n </Card>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Parked Gantt\n// ---------------------------------------------------------------------------\n\nexport function ParkedCard({ read, now }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; now: number }) {\n const live = read?.value ?? null;\n const gantt = live ? parkedGantt(live.runs, now) : { lanes: [], from: now - HOUR, to: now + 2 * HOUR, unknownRelease: 0 };\n return (\n <Swimlane\n title=\"Parked\"\n description=\"Waiting for a seat to free up — each bar ends when it should\"\n caveat={gantt.unknownRelease ? `${gantt.unknownRelease} item${gantt.unknownRelease === 1 ? ' has' : 's have'} no known release time; ${gantt.unknownRelease === 1 ? 'it runs' : 'they run'} to the right edge.` : undefined}\n status={fleetStatus(read, 'Nothing is parked.', gantt.lanes.length > 0)}\n lanes={gantt.lanes}\n from={gantt.from}\n to={gantt.to}\n now={now}\n toneOf={runTone}\n formatTick={(ms) => new Date(ms).toLocaleString('en-US', { weekday: 'short', hour: 'numeric' })}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Overnight\n// ---------------------------------------------------------------------------\n\nexport function OvernightCard({ read, onOpenAdvanced, dark = false }: { read: OptionalFleetRead<OvernightStatus> | undefined; onOpenAdvanced: () => void; /** The fleet is dark: it has no \"normal schedule\" to run on. */ dark?: boolean }) {\n const status = read?.value ?? null;\n const run = status?.run ?? null;\n return (\n <Card\n title=\"Overnight\"\n caption={status ? (status.armed ? 'Armed' : 'Not armed') : undefined}\n actions={\n <button type=\"button\" className={styles.link} onClick={onOpenAdvanced}>\n Arm or stop in Advanced\n </button>\n }\n >\n {!read ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the overnight lane…</p>\n ) : !status ? (\n <CardNote tone=\"unknown\">{read.reason ?? 'The overnight lane did not answer.'}</CardNote>\n ) : !status.armed && !run ? (\n <CardNote>{dark ? 'Nothing armed.' : 'Nothing armed. The fleet runs on its normal schedule.'}</CardNote>\n ) : (\n <div className={styles.overnight}>\n {run?.stopRule ? <p className={styles.overnightLead}>{describeStopRule(run.stopRule)}</p> : null}\n <dl className={styles.facts}>\n <div>\n <dt>Started</dt>\n <dd>{run?.startedAt ? formatRelative(run.startedAt) : '—'}</dd>\n </div>\n <div>\n <dt>Iterations</dt>\n <dd>{run?.iterationsDone ?? '—'}</dd>\n </div>\n <div>\n <dt>Merged</dt>\n <dd>{run ? run.merged.length : '—'}</dd>\n </div>\n <div>\n <dt>Discarded</dt>\n <dd>{run ? run.discarded.length : '—'}</dd>\n </div>\n </dl>\n {run?.activity ? <p className={styles.muted}>Now: {run.activity}</p> : null}\n {run && run.discarded.length ? (\n <ul className={styles.discarded} aria-label=\"Discarded work\">\n {run.discarded.slice(0, 3).map((d) => (\n <li key={d.id}>\n <span className={styles.discardTitle}>{d.title}</span>\n <span className={styles.discardWhy}>{d.reason}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n )}\n </Card>\n );\n}\n","/**\n * routes/verse/fleet/RepoTable.tsx — one row per enrolled repo (SPEC-310C §5\n * Fleet \"Repo table: stage, last merge, green% sparkline, holds,\n * pause/resume\"; unit C7).\n *\n * Pause sets an owner-hold as Mason; Resume clears every active hold (or the\n * one a Needs-you item names). Both confirm first — a pause stops new work\n * in a repo, a resume can lift a quarantine early — then take the token.\n * At 375 px the table becomes one card per repo (a 7-column table does not\n * fit a phone, and a horizontal scroll hides the action).\n */\nimport type { FleetLiveSnapshotV1, FleetMirrorSummary, FleetRepoRow, RepoHold } from '../../../../core/fleet/fleet-types.js';\nimport { Sparkline } from '../../../components/charts/Sparkline.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { formatRelative } from '../autonomy/format.js';\nimport type { SurfaceActions } from '../command/actions.js';\nimport { anchorId } from '../command/nav.js';\nimport { Card, CardNote } from '../command/Surface.js';\nimport { postFleetLive, type OptionalRead } from '../command/surface-data.js';\nimport styles from './fleet.module.css';\n\nconst HOLD_WORD: Record<RepoHold['kind'], string> = {\n quarantine: 'Quarantined',\n 'owner-hold': 'On hold (you)',\n 'leader-pause': 'Paused by Leader',\n cooldown: 'Cooling down',\n};\n\nexport function holdText(hold: RepoHold, now: number): string {\n const until = hold.until ? Date.parse(hold.until) : NaN;\n const left = Number.isFinite(until) ? Math.max(0, until - now) : null;\n const tail = left === null ? 'until resumed' : left < 3_600_000 ? `${Math.ceil(left / 60_000)}m left` : `${Math.round(left / 3_600_000)}h left`;\n return `${HOLD_WORD[hold.kind]} · ${tail}`;\n}\n\nfunction shortRepo(repo: string): string {\n return repo.includes('/') ? repo.split('/')[1]! : repo;\n}\n\nfunction StageBadge({ row }: { row: FleetRepoRow }) {\n if (row.stage === null) return <span className={styles.stage} data-stage=\"none\">Not in grant</span>;\n return (\n <span className={styles.stage} data-stage={row.stage}>\n {row.stage === 'merge' ? 'Merge' : 'Propose'}\n {row.enforcement === 'local' ? <span className={styles.stageNote}> · local checks</span> : null}\n </span>\n );\n}\n\nfunction RepoAction({ row, actions }: { row: FleetRepoRow; actions: SurfaceActions }) {\n const disabled = actions.busy || actions.readOnly;\n if (row.holds.length) {\n return (\n <Button\n size=\"sm\"\n variant=\"subtle\"\n disabled={disabled}\n aria-label={`Resume ${row.repo}`}\n onClick={() =>\n actions.act(() => postFleetLive({ action: 'resume-repo', repo: row.repo }), `Resume ${row.repo}`, {\n confirm: {\n title: `Resume ${shortRepo(row.repo)}?`,\n body: `Clears ${row.holds.map((h) => HOLD_WORD[h.kind].toLowerCase()).join(' and ')}. New fleet work can start there on the next tick.`,\n confirmLabel: 'Resume',\n },\n })\n }\n >\n Resume\n </Button>\n );\n }\n if (row.stage === null) return null;\n return (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={disabled}\n aria-label={`Pause ${row.repo}`}\n onClick={() =>\n actions.act(() => postFleetLive({ action: 'pause-repo', repo: row.repo, reason: 'Paused by Mason from the Fleet surface' }), `Pause ${row.repo}`, {\n confirm: {\n title: `Pause ${shortRepo(row.repo)}?`,\n body: 'No new fleet work starts there until you resume it. Runs already in flight finish and are watched as usual.',\n confirmLabel: 'Pause repo',\n destructive: true,\n },\n })\n }\n >\n Pause\n </Button>\n );\n}\n\nfunction GreenCell({ row }: { row: FleetRepoRow }) {\n return (\n <span className={styles.green}>\n <span className={styles.greenValue}>{row.greenPct7d === null ? '—' : `${Math.round(row.greenPct7d)}%`}</span>\n <Sparkline points={row.greenTrend} width={64} height={18} ariaLabel={`${row.repo} post-merge green, 14 days`} describe={(v) => `${Math.round(v)}%`} />\n </span>\n );\n}\n\nfunction Holds({ row, now }: { row: FleetRepoRow; now: number }) {\n if (!row.holds.length) return <span className={styles.muted}>—</span>;\n return (\n <span className={styles.holds}>\n {row.holds.map((h) => (\n <span key={h.kind} className={styles.hold} data-kind={h.kind} title={h.reason}>\n {holdText(h, now)}\n </span>\n ))}\n </span>\n );\n}\n\n/**\n * The fleet's own mirror clones, apart from the repo rows. WHY separate: a\n * mirror is the fleet's working copy of a repo already listed above, so\n * counting it as a row double-counts the repo (and its pause would not pause\n * the real one). `undefined` = an older server that does not report mirrors\n * (say nothing); `null` = the enrollment registry could not be read (say so —\n * unknown is never \"none\").\n */\nexport function mirrorsText(mirrors: FleetMirrorSummary | null | undefined): string | null {\n if (mirrors === undefined) return null;\n if (mirrors === null) return 'Fleet mirrors: unknown — the enrollment registry could not be read.';\n if (mirrors.count === 0) return 'Fleet mirrors: none yet — the fleet clones a repo the first time it works on it.';\n const shown = mirrors.repos.slice(0, 6).join(', ');\n const more = mirrors.repos.length > 6 ? ` and ${mirrors.repos.length - 6} more` : '';\n return `Fleet mirrors: ${mirrors.count} working ${mirrors.count === 1 ? 'copy' : 'copies'}${shown ? ` (${shown}${more})` : ''} — the fleet's own clones of the repos above.`;\n}\n\nconst today = (row: FleetRepoRow) => (row.mergesToday === null ? '—' : `${row.mergesToday}${row.maxMergesPerDay !== null ? ` / ${row.maxMergesPerDay}` : ''}`);\n\nexport function RepoTable({ read, actions, now, compact }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; actions: SurfaceActions; now: number; compact: boolean }) {\n const live = read?.value ?? null;\n const rows = live?.repos ?? [];\n return (\n <Card title=\"Repositories\" caption={live ? `${rows.length} enrolled · stage is what the grant and rollout allow right now` : undefined}>\n {!read ? (\n <p className={styles.muted} aria-busy=\"true\">Reading repositories…</p>\n ) : !live ? (\n <CardNote tone=\"unknown\">{read.reason ?? 'The live fleet view did not answer.'}</CardNote>\n ) : rows.length === 0 ? (\n <CardNote>No repositories are enrolled.</CardNote>\n ) : compact ? (\n <ul className={styles.repoCards}>\n {rows.map((row) => (\n <li key={row.repo} className={styles.repoCard} id={anchorId(`repo-${row.repo}`)}>\n <div className={styles.repoCardHead}>\n <span className={styles.repoName}>{row.repo}</span>\n <RepoAction row={row} actions={actions} />\n </div>\n <dl className={styles.facts}>\n <div><dt>Stage</dt><dd><StageBadge row={row} /></dd></div>\n <div><dt>Last merge</dt><dd>{row.lastMergeAt ? formatRelative(row.lastMergeAt) : '—'}</dd></div>\n <div><dt>Today</dt><dd>{today(row)}</dd></div>\n <div><dt>Green 7d</dt><dd><GreenCell row={row} /></dd></div>\n </dl>\n <Holds row={row} now={now} />\n </li>\n ))}\n </ul>\n ) : (\n <div className={styles.tableWrap}>\n <table className={styles.table}>\n <caption className=\"visually-hidden\">Enrolled repositories</caption>\n <thead>\n <tr>\n <th scope=\"col\">Repository</th>\n <th scope=\"col\">Stage</th>\n <th scope=\"col\">Last merge</th>\n <th scope=\"col\" className={styles.num}>Today</th>\n <th scope=\"col\">Post-merge green · 14d</th>\n <th scope=\"col\" className={styles.num}>Open PRs</th>\n <th scope=\"col\">Holds</th>\n <th scope=\"col\"><span className=\"visually-hidden\">Action</span></th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.repo} id={anchorId(`repo-${row.repo}`)} data-held={row.holds.length > 0 || undefined}>\n <th scope=\"row\" className={styles.repoName}>{row.repo}</th>\n <td><StageBadge row={row} /></td>\n <td>{row.lastMergeAt ? formatRelative(row.lastMergeAt) : '—'}</td>\n <td className={styles.num}>{today(row)}</td>\n <td><GreenCell row={row} /></td>\n <td className={styles.num}>{row.openFleetPrs ?? '—'}</td>\n <td><Holds row={row} now={now} /></td>\n <td className={styles.actionCell}><RepoAction row={row} actions={actions} /></td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n {live && mirrorsText(live.mirrors) ? <p className={styles.muted}>{mirrorsText(live.mirrors)}</p> : null}\n </Card>\n );\n}\n","/**\n * routes/verse/sections/FleetSection.tsx — ⌘2 Fleet (SPEC-310B §6,\n * SPEC-310C §5; unit C7). What is running where, why that seat, what is\n * waiting, and per-repo control.\n *\n * Live swimlane by lane × phase (12)\n * Gate funnel + refusal reasons (7) | Why this seat (5)\n * Parked Gantt (7) | Overnight (5)\n * Repo table: stage, last merge, green% sparkline, holds, pause/resume (12)\n * ▸ Advanced — the eleven legacy Autonomy panels, fetched only when opened\n *\n * At 375 px: one column in that order; the repo table becomes cards.\n * The live view polls every 5 s while Fleet is the visible surface.\n *\n * Autonomy off: the shared AutonomyOffState sits under the lanes, and when\n * the fleet has nothing to draw (no runs, no gate traffic) the three chart\n * cards are left out instead of each repeating \"Fleet dark since …\".\n */\nimport { Suspense, lazy, useId, useState } from 'react';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { IconChevronRight } from '../../../components/primitives/icons.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { AutonomyOffState, useAutonomyOff } from '../autonomy/AutonomyOffState.js';\nimport { overnightQuery } from '../autonomy/overnight-queries.js';\nimport { useNow } from '../autonomy/use-ticker.js';\nimport { budgetPreviewQuery, budgetQuery } from '../budget/budget-queries.js';\nimport { ActionStatus, useSurfaceActions } from '../command/actions.js';\nimport { Cell, Surface } from '../command/Surface.js';\nimport { fleetLiveQuery } from '../command/surface-data.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { useViewport } from '../shell/viewport.js';\nimport { GateFunnelCards, LanesStrip, LiveSwimlane, OvernightCard, ParkedCard, WhySeatCard } from '../fleet/FleetCards.js';\nimport { RepoTable } from '../fleet/RepoTable.js';\nimport { nothingToDraw } from '../fleet/live-model.js';\nimport styles from '../fleet/fleet.module.css';\n\nexport const FLEET_POLL_MS = 5_000;\nexport const FLEET_SLOW_POLL_MS = 30_000;\n\n// The legacy cockpit is ~74 KB of panels: its own chunk, loaded on open.\nconst FleetAdvanced = lazy(() => import('../fleet/Advanced.js').then((m) => ({ default: () => <m.FleetAdvanced embedded /> })));\n\nexport function FleetSection() {\n const { compact } = useViewport();\n const fleet = useQuery(fleetLiveQuery);\n const overnight = useQuery(overnightQuery);\n const budget = useQuery(budgetQuery, { freshMs: 15_000 });\n const preview = useQuery(budgetPreviewQuery, { freshMs: 15_000 });\n const refetchFleet = useRefetch(fleetLiveQuery);\n const refetchOvernight = useRefetch(overnightQuery);\n const refetchPreview = useRefetch(budgetPreviewQuery);\n usePollWhileVisible(refetchFleet, FLEET_POLL_MS);\n usePollWhileVisible(() => {\n refetchOvernight();\n refetchPreview();\n }, FLEET_SLOW_POLL_MS);\n\n const now = useNow(15_000);\n const actions = useSurfaceActions();\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const advancedId = useId();\n const live = fleet.data?.value ?? null;\n const off = useAutonomyOff();\n // Collapse only what would be empty: a fleet stopped an hour ago still\n // draws its last runs.\n const collapse = off != null && live !== null && nothingToDraw(live);\n\n function openAdvanced(): void {\n setAdvancedOpen(true);\n requestAnimationFrame(() => document.getElementById(advancedId)?.scrollIntoView?.({ block: 'start', behavior: 'smooth' }));\n }\n\n return (\n <Surface\n title=\"Fleet\"\n actions={fleet.status === 'refreshing' ? <RefreshIndicator /> : null}\n lead={\n <>\n <ActionStatus actions={actions} />\n <LanesStrip live={live} />\n {off ? <AutonomyOffState state={off} here=\"fleet\" /> : null}\n </>\n }\n >\n {collapse ? null : (\n <Cell span={12}>\n <LiveSwimlane read={fleet.data} now={now} hours={compact ? 6 : 12} />\n </Cell>\n )}\n {collapse ? null : (\n <Cell span={7}>\n <GateFunnelCards read={fleet.data} />\n </Cell>\n )}\n <Cell span={collapse ? 6 : 5}>\n <WhySeatCard read={fleet.data} preview={preview.data ?? null} view={budget.data ?? null} now={now} />\n </Cell>\n {collapse ? null : (\n <Cell span={7}>\n <ParkedCard read={fleet.data} now={now} />\n </Cell>\n )}\n <Cell span={collapse ? 6 : 5}>\n <OvernightCard read={overnight.data} onOpenAdvanced={openAdvanced} dark={live?.state === 'dark'} />\n </Cell>\n <Cell span={12}>\n <RepoTable read={fleet.data} actions={actions} now={now} compact={compact} />\n </Cell>\n <Cell span={12}>\n <div className={styles.advanced}>\n <button\n type=\"button\"\n className={styles.disclosure}\n aria-expanded={advancedOpen}\n aria-controls={advancedId}\n onClick={() => setAdvancedOpen((o) => !o)}\n >\n <IconChevronRight className={styles.chevron} width={14} height={14} aria-hidden=\"true\" />\n Advanced\n <span className={styles.disclosureNote}>daemon, overnight, local runtime, caps, scope, activity, safety, goals</span>\n </button>\n <div id={advancedId} hidden={!advancedOpen}>\n {advancedOpen ? (\n <Suspense fallback={<p className={styles.muted} aria-busy=\"true\">Loading the advanced panels…</p>}>\n <FleetAdvanced />\n </Suspense>\n ) : null}\n </div>\n </div>\n </Cell>\n {actions.dialogs}\n </Surface>\n );\n}\n"],"file":"FleetSection-BG8iGraG.js"}
@@ -1,2 +1,2 @@
1
- import{a as e,c as t,n}from"./index-BG177cPN.js";import{D as r,F as i,I as a,L as o,M as s,N as c,a as l,c as u,f as d,l as f,m as ee,n as p,o as m,r as te,s as h,t as ne,u as g,v as _}from"./ChartFrame-B_w2Siqg.js";import{c as v,p as y}from"./colors-BZ3a9wFf.js";import{r as b,t as x}from"./format-DKrNjdwD.js";var S=t(e(),1),C=n(),w=14,T=26,re=8,E=24,D=2;function O({title:e,description:t,caveat:n,status:s,categories:_,segments:v,values:O,normalize:k=!1,height:A=200,width:j,formatValue:M,ariaLabel:ie}){let N=M??x,P=(0,S.useRef)(null),F=g(P,j),I=f(),[L,R]=(0,S.useState)(null),ae=(0,S.useId)(),oe=y((0,S.useId)()),z=v.map(e=>e.color),B=_.map((e,t)=>{let n=O[t]??v.map(()=>null);return{label:e,values:n,stack:i(n)}}),se=B.some(e=>!e.stack.unknown),V=Math.max(0,...B.map(e=>e.stack.total)),ce=B.some(e=>e.stack.incomplete),le=s??(B.length===0||se&&V===0&&!ce?{kind:`empty`}:se?{kind:`ready`}:{kind:`unknown`}),ue=B.flatMap(e=>e.values.filter(e=>e!==null&&Number.isFinite(e))),H=k?{ticks:[0,.25,.5,.75,1],labels:[0,.25,.5,.75,1].map(e=>b(e))}:ee(0,V,{count:4,integer:d(ue),format:M}),U=H.ticks,de=U[U.length-1],W=o(H.labels,28,60,I),G=Math.max(40,F-W-re),K=A-w-T,q=B.length?G/B.length:G,J=Math.max(2,Math.min(E,q*.66)),Y=r(0,de,w+K,w),X=e=>W+q*e+(q-J)/2,fe=a(B.length,Math.max(2,Math.floor(G/(64*I)))),Z=e=>`${e.stack.incomplete&&!e.stack.unknown?`≥ `:``}${e.stack.unknown?`—`:N(e.stack.total)}`;function pe(e){if(B.length===0)return;let t=L??B.length-1,n=e.key===`ArrowLeft`?t-1:e.key===`ArrowRight`?t+1:e.key===`Home`?0:e.key===`End`?B.length-1:null;n!==null&&(e.preventDefault(),R(Math.max(0,Math.min(B.length-1,n))))}let Q=B.reduce((e,t)=>!t.stack.unknown&&(!e||t.stack.total>e.stack.total)?t:e,null),me=ie??`${e}: ${B.length} columns of ${v.map(e=>e.label).join(`, `)}.`+(Q?` Highest: ${Q.label} with ${Z(Q)}.`:``),he=[{key:`label`,label:`Category`,render:e=>e.label},...v.map((e,t)=>({key:e.id,label:e.label,numeric:!0,render:e=>e.values[t]===null||e.values[t]===void 0?`—`:N(e.values[t])})),{key:`__total`,label:`Total`,numeric:!0,render:Z}],$=L===null?void 0:B[L];return(0,C.jsx)(ne,{title:e,description:t,caveat:n,status:le,table:(0,C.jsx)(u,{caption:e,columns:he,rows:B,rowKey:(e,t)=>`${t}:${e.label}`}),footer:(0,C.jsx)(p,{items:[...v.map((e,t)=>({label:e.label,color:z[t]})),...B.some(e=>e.stack.unknown)?[{label:`no data`,kind:`hatch`}]:[]]}),children:(0,C.jsxs)(`div`,{ref:P,className:`${h.plotWrap} ${h.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the left and right arrow keys to read each column.`,"aria-describedby":ae,onFocus:()=>R(e=>e??(B.length?B.length-1:null)),onBlur:()=>R(null),onKeyDown:pe,children:[(0,C.jsxs)(`svg`,{className:h.svg,width:F,height:A,viewBox:`0 0 ${F} ${A}`,role:`img`,"aria-label":me,children:[(0,C.jsx)(`defs`,{children:(0,C.jsx)(l,{id:oe})}),U.map((e,t)=>(0,C.jsxs)(`g`,{children:[(0,C.jsx)(`line`,{className:h.grid,x1:W,x2:W+G,y1:Y(e),y2:Y(e)}),(0,C.jsx)(`text`,{className:h.tick,x:W-6,y:Y(e),dy:`0.32em`,textAnchor:`end`,children:H.labels[t]})]},e)),B.map((e,t)=>{let n=X(t),r=k&&e.stack.total||1;if(e.stack.unknown)return(0,C.jsx)(`rect`,{"data-unknown":`true`,className:h.unknownMark,fill:`url(#${oe})`,x:n+.5,y:w+K-12.5,width:Math.max(1,J-1),height:12,rx:2},t);let i=e.stack.segments[e.stack.segments.length-1];return(0,C.jsxs)(`g`,{"data-column":t,opacity:L!==null&&L!==t?.55:1,children:[e.stack.segments.map(e=>{let t=Y(e.y1/r),a=Y(e.y0/r),o=e===i,s=Math.max(0,a-t-(o?0:D)),l=o?t:t+D;return o?(0,C.jsx)(`path`,{d:c(n,l,J,s),fill:z[e.index],"data-segment":v[e.index].id},e.index):(0,C.jsx)(`rect`,{x:n,y:l,width:J,height:s,fill:z[e.index],"data-segment":v[e.index].id},e.index)}),e.stack.incomplete?(0,C.jsx)(`rect`,{"data-incomplete":`true`,className:h.noData,x:n,y:Y(e.stack.total/r)-8,width:J,height:6,rx:2}):null]},t)}),(0,C.jsx)(`line`,{className:h.axis,x1:W,x2:W+G,y1:w+K,y2:w+K}),fe.map(e=>(0,C.jsx)(`text`,{className:h.tick,x:X(e)+J/2,y:A-8,textAnchor:`middle`,children:B[e].label},e)),B.map((e,t)=>(0,C.jsx)(`rect`,{className:h.hit,x:W+q*t,y:w,width:q,height:K,onPointerEnter:()=>R(t),onPointerLeave:()=>R(e=>e===t?null:e)},`hit${t}`))]}),(0,C.jsx)(`span`,{id:ae,className:h.srOnly,"aria-live":`polite`,children:$?`${$.label}: ${v.map((e,t)=>`${e.label} ${$.values[t]===null?`no data`:N($.values[t])}`).join(`, `)}; total ${Z($)}`:``}),$&&L!==null?(0,C.jsx)(te,{left:m(X(L)+J/2,F),top:$.stack.unknown?w+K-12:Y(k?1:$.stack.total),title:$.label,rows:[...v.map((e,t)=>({key:e.id,label:e.label,value:$.values[t]===null||$.values[t]===void 0?null:N($.values[t]),color:z[t]})),{key:`__t`,label:`Total`,value:$.stack.unknown?null:Z($)}]}):null]})})}var k=20,A=480;function j(e,t){return t===0?``:e.ofPrevious===null?`— of previous`:`${b(e.ofPrevious,+(e.ofPrevious<.1&&e.ofPrevious>0))} of previous`}function M({title:e,description:t,caveat:n,status:r,stages:i,width:a,color:o=v,formatValue:c=x,ariaLabel:l}){let d=(0,S.useRef)(null),f=g(d,a),ee=_(i.map(e=>e.value)),p=i.map((e,t)=>({...ee[t],stage:e})),m=i[0]?.value??null,te=r??(i.length===0||m===null?i.length===0?{kind:`empty`}:{kind:`unknown`,reason:`the first stage (${i[0].label}) is unknown`}:m===0?{kind:`empty`,message:`No ${i[0].label.toLowerCase()} in this window.`}:{kind:`ready`}),y=Math.max(0,...i.map(e=>e.value!==null&&Number.isFinite(e.value)?e.value:0)),w=f<A,T=w?0:Math.min(170,Math.round(f*.28)),re=w?150:180,E=Math.max(40,f-T-re),D=w?42:34,O=p.length*D+4,M=l??`${e}: `+p.map((e,t)=>`${e.stage.label} ${e.value===null?`unknown`:c(e.value)}${t>0?` (${j(e,t)})`:``}`).join(`, `)+`.`;return(0,C.jsx)(ne,{title:e,description:t,caveat:n,status:te,table:(0,C.jsx)(u,{caption:e,columns:[{key:`stage`,label:`Stage`,render:e=>e.stage.label},{key:`value`,label:`Count`,numeric:!0,render:e=>e.value===null?`—`:c(e.value)},{key:`prev`,label:`Of previous`,numeric:!0,render:e=>e.ofPrevious===null?`—`:b(e.ofPrevious,1)},{key:`first`,label:`Of first`,numeric:!0,render:e=>e.ofFirst===null?`—`:b(e.ofFirst,1)}],rows:p,rowKey:e=>e.stage.id}),children:(0,C.jsx)(`div`,{ref:d,className:h.plotWrap,children:(0,C.jsx)(`svg`,{className:h.svg,width:f,height:O,viewBox:`0 0 ${f} ${O}`,role:`img`,"aria-label":M,children:p.map((e,t)=>{let n=t*D+(w?18:7),r=e.value===null||!(e.value>0)||y<=0?0:Math.max(3,e.value/y*E),i=n+k/2;return(0,C.jsxs)(`g`,{"data-stage":e.stage.id,children:[(0,C.jsx)(`text`,{className:h.label,x:w?0:T-10,y:w?n-5:i,dy:w?void 0:`0.32em`,textAnchor:w?`start`:`end`,children:e.stage.label}),(0,C.jsx)(`rect`,{"data-role":`track`,className:h.trackEmpty,x:T,y:n,width:E,height:k,rx:4}),e.value===null?(0,C.jsx)(`rect`,{"data-unknown":`true`,className:h.noData,x:T,y:n,width:Math.min(E,48),height:k,rx:4}):r>0?(0,C.jsx)(`path`,{"data-role":`bar`,d:s(T,n,r,k),fill:o}):null,(0,C.jsxs)(`text`,{className:h.labelStrong,x:T+E+10,y:i,dy:`0.32em`,children:[e.value===null?`unknown`:c(e.value),t>0?(0,C.jsx)(`tspan`,{className:h.tick,dx:8,children:j(e,t)}):null]})]},e.stage.id)})})})})}export{O as n,M as t};
2
- //# sourceMappingURL=Funnel-pXYySwXQ.js.map
1
+ import{a as e,c as t,n}from"./index-CyK31YRm.js";import{D as r,F as i,I as a,L as o,M as s,N as c,a as l,c as u,f as d,l as f,m as ee,n as p,o as m,r as te,s as h,t as ne,u as g,v as _}from"./ChartFrame-DK_BDXCt.js";import{c as v,p as y}from"./colors-BZ3a9wFf.js";import{r as b,t as x}from"./format-DKrNjdwD.js";var S=t(e(),1),C=n(),w=14,T=26,re=8,E=24,D=2;function O({title:e,description:t,caveat:n,status:s,categories:_,segments:v,values:O,normalize:k=!1,height:A=200,width:j,formatValue:M,ariaLabel:ie}){let N=M??x,P=(0,S.useRef)(null),F=g(P,j),I=f(),[L,R]=(0,S.useState)(null),ae=(0,S.useId)(),oe=y((0,S.useId)()),z=v.map(e=>e.color),B=_.map((e,t)=>{let n=O[t]??v.map(()=>null);return{label:e,values:n,stack:i(n)}}),se=B.some(e=>!e.stack.unknown),V=Math.max(0,...B.map(e=>e.stack.total)),ce=B.some(e=>e.stack.incomplete),le=s??(B.length===0||se&&V===0&&!ce?{kind:`empty`}:se?{kind:`ready`}:{kind:`unknown`}),ue=B.flatMap(e=>e.values.filter(e=>e!==null&&Number.isFinite(e))),H=k?{ticks:[0,.25,.5,.75,1],labels:[0,.25,.5,.75,1].map(e=>b(e))}:ee(0,V,{count:4,integer:d(ue),format:M}),U=H.ticks,de=U[U.length-1],W=o(H.labels,28,60,I),G=Math.max(40,F-W-re),K=A-w-T,q=B.length?G/B.length:G,J=Math.max(2,Math.min(E,q*.66)),Y=r(0,de,w+K,w),X=e=>W+q*e+(q-J)/2,fe=a(B.length,Math.max(2,Math.floor(G/(64*I)))),Z=e=>`${e.stack.incomplete&&!e.stack.unknown?`≥ `:``}${e.stack.unknown?`—`:N(e.stack.total)}`;function pe(e){if(B.length===0)return;let t=L??B.length-1,n=e.key===`ArrowLeft`?t-1:e.key===`ArrowRight`?t+1:e.key===`Home`?0:e.key===`End`?B.length-1:null;n!==null&&(e.preventDefault(),R(Math.max(0,Math.min(B.length-1,n))))}let Q=B.reduce((e,t)=>!t.stack.unknown&&(!e||t.stack.total>e.stack.total)?t:e,null),me=ie??`${e}: ${B.length} columns of ${v.map(e=>e.label).join(`, `)}.`+(Q?` Highest: ${Q.label} with ${Z(Q)}.`:``),he=[{key:`label`,label:`Category`,render:e=>e.label},...v.map((e,t)=>({key:e.id,label:e.label,numeric:!0,render:e=>e.values[t]===null||e.values[t]===void 0?`—`:N(e.values[t])})),{key:`__total`,label:`Total`,numeric:!0,render:Z}],$=L===null?void 0:B[L];return(0,C.jsx)(ne,{title:e,description:t,caveat:n,status:le,table:(0,C.jsx)(u,{caption:e,columns:he,rows:B,rowKey:(e,t)=>`${t}:${e.label}`}),footer:(0,C.jsx)(p,{items:[...v.map((e,t)=>({label:e.label,color:z[t]})),...B.some(e=>e.stack.unknown)?[{label:`no data`,kind:`hatch`}]:[]]}),children:(0,C.jsxs)(`div`,{ref:P,className:`${h.plotWrap} ${h.focusable}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the left and right arrow keys to read each column.`,"aria-describedby":ae,onFocus:()=>R(e=>e??(B.length?B.length-1:null)),onBlur:()=>R(null),onKeyDown:pe,children:[(0,C.jsxs)(`svg`,{className:h.svg,width:F,height:A,viewBox:`0 0 ${F} ${A}`,role:`img`,"aria-label":me,children:[(0,C.jsx)(`defs`,{children:(0,C.jsx)(l,{id:oe})}),U.map((e,t)=>(0,C.jsxs)(`g`,{children:[(0,C.jsx)(`line`,{className:h.grid,x1:W,x2:W+G,y1:Y(e),y2:Y(e)}),(0,C.jsx)(`text`,{className:h.tick,x:W-6,y:Y(e),dy:`0.32em`,textAnchor:`end`,children:H.labels[t]})]},e)),B.map((e,t)=>{let n=X(t),r=k&&e.stack.total||1;if(e.stack.unknown)return(0,C.jsx)(`rect`,{"data-unknown":`true`,className:h.unknownMark,fill:`url(#${oe})`,x:n+.5,y:w+K-12.5,width:Math.max(1,J-1),height:12,rx:2},t);let i=e.stack.segments[e.stack.segments.length-1];return(0,C.jsxs)(`g`,{"data-column":t,opacity:L!==null&&L!==t?.55:1,children:[e.stack.segments.map(e=>{let t=Y(e.y1/r),a=Y(e.y0/r),o=e===i,s=Math.max(0,a-t-(o?0:D)),l=o?t:t+D;return o?(0,C.jsx)(`path`,{d:c(n,l,J,s),fill:z[e.index],"data-segment":v[e.index].id},e.index):(0,C.jsx)(`rect`,{x:n,y:l,width:J,height:s,fill:z[e.index],"data-segment":v[e.index].id},e.index)}),e.stack.incomplete?(0,C.jsx)(`rect`,{"data-incomplete":`true`,className:h.noData,x:n,y:Y(e.stack.total/r)-8,width:J,height:6,rx:2}):null]},t)}),(0,C.jsx)(`line`,{className:h.axis,x1:W,x2:W+G,y1:w+K,y2:w+K}),fe.map(e=>(0,C.jsx)(`text`,{className:h.tick,x:X(e)+J/2,y:A-8,textAnchor:`middle`,children:B[e].label},e)),B.map((e,t)=>(0,C.jsx)(`rect`,{className:h.hit,x:W+q*t,y:w,width:q,height:K,onPointerEnter:()=>R(t),onPointerLeave:()=>R(e=>e===t?null:e)},`hit${t}`))]}),(0,C.jsx)(`span`,{id:ae,className:h.srOnly,"aria-live":`polite`,children:$?`${$.label}: ${v.map((e,t)=>`${e.label} ${$.values[t]===null?`no data`:N($.values[t])}`).join(`, `)}; total ${Z($)}`:``}),$&&L!==null?(0,C.jsx)(te,{left:m(X(L)+J/2,F),top:$.stack.unknown?w+K-12:Y(k?1:$.stack.total),title:$.label,rows:[...v.map((e,t)=>({key:e.id,label:e.label,value:$.values[t]===null||$.values[t]===void 0?null:N($.values[t]),color:z[t]})),{key:`__t`,label:`Total`,value:$.stack.unknown?null:Z($)}]}):null]})})}var k=20,A=480;function j(e,t){return t===0?``:e.ofPrevious===null?`— of previous`:`${b(e.ofPrevious,+(e.ofPrevious<.1&&e.ofPrevious>0))} of previous`}function M({title:e,description:t,caveat:n,status:r,stages:i,width:a,color:o=v,formatValue:c=x,ariaLabel:l}){let d=(0,S.useRef)(null),f=g(d,a),ee=_(i.map(e=>e.value)),p=i.map((e,t)=>({...ee[t],stage:e})),m=i[0]?.value??null,te=r??(i.length===0||m===null?i.length===0?{kind:`empty`}:{kind:`unknown`,reason:`the first stage (${i[0].label}) is unknown`}:m===0?{kind:`empty`,message:`No ${i[0].label.toLowerCase()} in this window.`}:{kind:`ready`}),y=Math.max(0,...i.map(e=>e.value!==null&&Number.isFinite(e.value)?e.value:0)),w=f<A,T=w?0:Math.min(170,Math.round(f*.28)),re=w?150:180,E=Math.max(40,f-T-re),D=w?42:34,O=p.length*D+4,M=l??`${e}: `+p.map((e,t)=>`${e.stage.label} ${e.value===null?`unknown`:c(e.value)}${t>0?` (${j(e,t)})`:``}`).join(`, `)+`.`;return(0,C.jsx)(ne,{title:e,description:t,caveat:n,status:te,table:(0,C.jsx)(u,{caption:e,columns:[{key:`stage`,label:`Stage`,render:e=>e.stage.label},{key:`value`,label:`Count`,numeric:!0,render:e=>e.value===null?`—`:c(e.value)},{key:`prev`,label:`Of previous`,numeric:!0,render:e=>e.ofPrevious===null?`—`:b(e.ofPrevious,1)},{key:`first`,label:`Of first`,numeric:!0,render:e=>e.ofFirst===null?`—`:b(e.ofFirst,1)}],rows:p,rowKey:e=>e.stage.id}),children:(0,C.jsx)(`div`,{ref:d,className:h.plotWrap,children:(0,C.jsx)(`svg`,{className:h.svg,width:f,height:O,viewBox:`0 0 ${f} ${O}`,role:`img`,"aria-label":M,children:p.map((e,t)=>{let n=t*D+(w?18:7),r=e.value===null||!(e.value>0)||y<=0?0:Math.max(3,e.value/y*E),i=n+k/2;return(0,C.jsxs)(`g`,{"data-stage":e.stage.id,children:[(0,C.jsx)(`text`,{className:h.label,x:w?0:T-10,y:w?n-5:i,dy:w?void 0:`0.32em`,textAnchor:w?`start`:`end`,children:e.stage.label}),(0,C.jsx)(`rect`,{"data-role":`track`,className:h.trackEmpty,x:T,y:n,width:E,height:k,rx:4}),e.value===null?(0,C.jsx)(`rect`,{"data-unknown":`true`,className:h.noData,x:T,y:n,width:Math.min(E,48),height:k,rx:4}):r>0?(0,C.jsx)(`path`,{"data-role":`bar`,d:s(T,n,r,k),fill:o}):null,(0,C.jsxs)(`text`,{className:h.labelStrong,x:T+E+10,y:i,dy:`0.32em`,children:[e.value===null?`unknown`:c(e.value),t>0?(0,C.jsx)(`tspan`,{className:h.tick,dx:8,children:j(e,t)}):null]})]},e.stage.id)})})})})}export{O as n,M as t};
2
+ //# sourceMappingURL=Funnel-B88_wpA4.js.map