@ashlr/hub 3.11.3 → 3.11.5

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 (556) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +44 -18
  3. package/dist/authority-surface.json +72 -57
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/authority.d.ts +39 -0
  6. package/dist/cli/authority.js +222 -55
  7. package/dist/cli/authority.js.map +1 -1
  8. package/dist/cli/help.js +1 -1
  9. package/dist/cli/help.js.map +1 -1
  10. package/dist/cli/verse.d.ts +3 -0
  11. package/dist/cli/verse.js +10 -0
  12. package/dist/cli/verse.js.map +1 -1
  13. package/dist/core/authority/types.d.ts +2 -2
  14. package/dist/core/cloud/cloud-api.js +1 -1
  15. package/dist/core/cloud/cloud-api.js.map +1 -1
  16. package/dist/core/cloud/delivery-contract.d.ts +1 -1
  17. package/dist/core/cloud/delivery-contract.js +25 -15
  18. package/dist/core/cloud/delivery-contract.js.map +1 -1
  19. package/dist/core/cloud/store.js +6 -0
  20. package/dist/core/cloud/store.js.map +1 -1
  21. package/dist/core/cloud/tracker.d.ts +2 -0
  22. package/dist/core/cloud/tracker.js +140 -37
  23. package/dist/core/cloud/tracker.js.map +1 -1
  24. package/dist/core/cloud/types.d.ts +9 -1
  25. package/dist/core/cloud/types.js.map +1 -1
  26. package/dist/core/comms/dispatch.d.ts +5 -0
  27. package/dist/core/comms/dispatch.js +12 -1
  28. package/dist/core/comms/dispatch.js.map +1 -1
  29. package/dist/core/comms/requests.d.ts +27 -1
  30. package/dist/core/comms/requests.js +50 -1
  31. package/dist/core/comms/requests.js.map +1 -1
  32. package/dist/core/daemon/loop.d.ts +14 -0
  33. package/dist/core/daemon/loop.js +35 -0
  34. package/dist/core/daemon/loop.js.map +1 -1
  35. package/dist/core/fabric/claude-usage.js +23 -1
  36. package/dist/core/fabric/claude-usage.js.map +1 -1
  37. package/dist/core/fleet/dispatch-router.d.ts +7 -0
  38. package/dist/core/fleet/dispatch-router.js +4 -1
  39. package/dist/core/fleet/dispatch-router.js.map +1 -1
  40. package/dist/core/fleet/tick-hooks-live.d.ts +5 -1
  41. package/dist/core/fleet/tick-hooks-live.js +10 -1
  42. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  43. package/dist/core/local-runtime/llama/config.d.ts +14 -0
  44. package/dist/core/local-runtime/llama/config.js +20 -2
  45. package/dist/core/local-runtime/llama/config.js.map +1 -1
  46. package/dist/core/local-runtime/llama/process.d.ts +19 -0
  47. package/dist/core/local-runtime/llama/process.js +67 -17
  48. package/dist/core/local-runtime/llama/process.js.map +1 -1
  49. package/dist/core/local-runtime/llama/supervisor.js +14 -3
  50. package/dist/core/local-runtime/llama/supervisor.js.map +1 -1
  51. package/dist/core/observability/rollup.d.ts +12 -0
  52. package/dist/core/observability/rollup.js +37 -2
  53. package/dist/core/observability/rollup.js.map +1 -1
  54. package/dist/core/observability/usage-source.js +49 -1
  55. package/dist/core/observability/usage-source.js.map +1 -1
  56. package/dist/core/resources/connection-monitor.js +47 -4
  57. package/dist/core/resources/connection-monitor.js.map +1 -1
  58. package/dist/core/resources/engineering-mission-store.d.ts +1 -1
  59. package/dist/core/routing/headroom.js +7 -2
  60. package/dist/core/routing/headroom.js.map +1 -1
  61. package/dist/core/routing/router.d.ts +48 -0
  62. package/dist/core/routing/router.js +129 -13
  63. package/dist/core/routing/router.js.map +1 -1
  64. package/dist/core/run/best-of-n.d.ts +7 -0
  65. package/dist/core/run/best-of-n.js +3 -0
  66. package/dist/core/run/best-of-n.js.map +1 -1
  67. package/dist/core/run/harness-dispatch.d.ts +147 -0
  68. package/dist/core/run/harness-dispatch.js +234 -0
  69. package/dist/core/run/harness-dispatch.js.map +1 -0
  70. package/dist/core/run/orchestrator.js +3 -0
  71. package/dist/core/run/orchestrator.js.map +1 -1
  72. package/dist/core/run/provider-client.d.ts +8 -0
  73. package/dist/core/run/provider-client.js +4 -0
  74. package/dist/core/run/provider-client.js.map +1 -1
  75. package/dist/core/run/sandboxed-engine.d.ts +8 -0
  76. package/dist/core/run/sandboxed-engine.js +60 -7
  77. package/dist/core/run/sandboxed-engine.js.map +1 -1
  78. package/dist/core/types.d.ts +14 -0
  79. package/dist/core/types.js.map +1 -1
  80. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  81. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +181 -5
  82. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +180 -4
  83. package/dist/core/universe/firm-demo.d.ts +1 -1
  84. package/dist/core/universe/firm-graph.d.ts +2 -2
  85. package/dist/core/util/scrub.js +16 -3
  86. package/dist/core/util/scrub.js.map +1 -1
  87. package/dist/core/verse/accounts.d.ts +9 -1
  88. package/dist/core/verse/accounts.js +52 -11
  89. package/dist/core/verse/accounts.js.map +1 -1
  90. package/dist/core/verse/apps-api.d.ts +12 -0
  91. package/dist/core/verse/apps-api.js +22 -4
  92. package/dist/core/verse/apps-api.js.map +1 -1
  93. package/dist/core/verse/apps.js +22 -12
  94. package/dist/core/verse/apps.js.map +1 -1
  95. package/dist/core/verse/local-models.js +3 -7
  96. package/dist/core/verse/local-models.js.map +1 -1
  97. package/dist/core/verse/model-display-name.d.ts +34 -0
  98. package/dist/core/verse/model-display-name.js +125 -0
  99. package/dist/core/verse/model-display-name.js.map +1 -0
  100. package/dist/core/verse/seats.d.ts +11 -2
  101. package/dist/core/verse/seats.js +42 -18
  102. package/dist/core/verse/seats.js.map +1 -1
  103. package/dist/core/verse/transient-events.d.ts +21 -0
  104. package/dist/core/verse/transient-events.js +12 -0
  105. package/dist/core/verse/transient-events.js.map +1 -0
  106. package/dist/core/verse/types.d.ts +6 -13
  107. package/dist/core/verse/types.js +5 -36
  108. package/dist/core/verse/types.js.map +1 -1
  109. package/dist/core/web/public/next/assets/ActionMenu-DffwPklw.js +2 -0
  110. package/dist/core/web/public/next/assets/{ActionMenu-FxXeRbPx.js.map → ActionMenu-DffwPklw.js.map} +1 -1
  111. package/dist/core/web/public/next/assets/Advanced-CxzE6ekM.js +2 -0
  112. package/dist/core/web/public/next/assets/Advanced-CxzE6ekM.js.map +1 -0
  113. package/dist/core/web/public/next/assets/App-DFlp-vdv.js +7 -0
  114. package/dist/core/web/public/next/assets/App-DFlp-vdv.js.map +1 -0
  115. package/dist/core/web/public/next/assets/AppsSection-Ct2O605-.js +2 -0
  116. package/dist/core/web/public/next/assets/AppsSection-Ct2O605-.js.map +1 -0
  117. package/dist/core/web/public/next/assets/AreaTrend-o-GLl2Is.js +2 -0
  118. package/dist/core/web/public/next/assets/{AreaTrend-CDxrQU4b.js.map → AreaTrend-o-GLl2Is.js.map} +1 -1
  119. package/dist/core/web/public/next/assets/AutonomyOffState-CXhXpsim.js +2 -0
  120. package/dist/core/web/public/next/assets/AutonomyOffState-CXhXpsim.js.map +1 -0
  121. package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +1 -0
  122. package/dist/core/web/public/next/assets/AutonomySection-BTg7yVa1.js +2 -0
  123. package/dist/core/web/public/next/assets/{AutonomySection-DuQkHGD_.js.map → AutonomySection-BTg7yVa1.js.map} +1 -1
  124. package/dist/core/web/public/next/assets/BranchBar-BjPFtGsj.js +2 -0
  125. package/dist/core/web/public/next/assets/{BranchBar-CLsvOcyK.js.map → BranchBar-BjPFtGsj.js.map} +1 -1
  126. package/dist/core/web/public/next/assets/BudgetControl-ng6swoZp.js +2 -0
  127. package/dist/core/web/public/next/assets/{BudgetControl-TL3FeZ1D.js.map → BudgetControl-ng6swoZp.js.map} +1 -1
  128. package/dist/core/web/public/next/assets/{Button-HHXgoXGr.js → Button-OjVJSrFq.js} +2 -2
  129. package/dist/core/web/public/next/assets/{Button-HHXgoXGr.js.map → Button-OjVJSrFq.js.map} +1 -1
  130. package/dist/core/web/public/next/assets/CapacityStrip-Bx4c3dxD.js +2 -0
  131. package/dist/core/web/public/next/assets/{CapacityStrip-qReu0RaF.js.map → CapacityStrip-Bx4c3dxD.js.map} +1 -1
  132. package/dist/core/web/public/next/assets/{useChartWidth-BW6SwYIK.css → ChartFrame-BVuBe6RP.css} +1 -1
  133. package/dist/core/web/public/next/assets/ChartFrame-B_w2Siqg.js +2 -0
  134. package/dist/core/web/public/next/assets/ChartFrame-B_w2Siqg.js.map +1 -0
  135. package/dist/core/web/public/next/assets/ChatSection-Bisj9R6E.js +3 -0
  136. package/dist/core/web/public/next/assets/ChatSection-Bisj9R6E.js.map +1 -0
  137. package/dist/core/web/public/next/assets/CloudBudgetForm-5Gf4iAok.js +2 -0
  138. package/dist/core/web/public/next/assets/CloudBudgetForm-5Gf4iAok.js.map +1 -0
  139. package/dist/core/web/public/next/assets/CommandPalette-iTpk6I8r.js +2 -0
  140. package/dist/core/web/public/next/assets/CommandPalette-iTpk6I8r.js.map +1 -0
  141. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +1 -0
  142. package/dist/core/web/public/next/assets/CommandSection-D8ZihzvE.js +2 -0
  143. package/dist/core/web/public/next/assets/CommandSection-D8ZihzvE.js.map +1 -0
  144. package/dist/core/web/public/next/assets/ConfirmDialog-_S9iE-cJ.js +2 -0
  145. package/dist/core/web/public/next/assets/{ConfirmDialog-DLrLKM0c.js.map → ConfirmDialog-_S9iE-cJ.js.map} +1 -1
  146. package/dist/core/web/public/next/assets/DeleteChatDialog-KUYUygiA.js +2 -0
  147. package/dist/core/web/public/next/assets/DeleteChatDialog-KUYUygiA.js.map +1 -0
  148. package/dist/core/web/public/next/assets/Dialog-BuIaG6HF.js +2 -0
  149. package/dist/core/web/public/next/assets/{Dialog-BS9Dxi3G.js.map → Dialog-BuIaG6HF.js.map} +1 -1
  150. package/dist/core/web/public/next/assets/DiffPane-De4IQt82.js +2 -0
  151. package/dist/core/web/public/next/assets/{DiffPane-TOmUf3b2.js.map → DiffPane-De4IQt82.js.map} +1 -1
  152. package/dist/core/web/public/next/assets/DiffViewer-B75t6Ile.js +2 -0
  153. package/dist/core/web/public/next/assets/{DiffViewer-BpH56302.js.map → DiffViewer-B75t6Ile.js.map} +1 -1
  154. package/dist/core/web/public/next/assets/DockHost-BPqyhtCP.js +2 -0
  155. package/dist/core/web/public/next/assets/DockHost-BPqyhtCP.js.map +1 -0
  156. package/dist/core/web/public/next/assets/{EmptyState-BqR5YAmf.js → EmptyState-DXkT4vhW.js} +2 -2
  157. package/dist/core/web/public/next/assets/{EmptyState-BqR5YAmf.js.map → EmptyState-DXkT4vhW.js.map} +1 -1
  158. package/dist/core/web/public/next/assets/{Epistemic-dhvDTwAZ.js → Epistemic-CfqFe_aP.js} +2 -2
  159. package/dist/core/web/public/next/assets/{Epistemic-dhvDTwAZ.js.map → Epistemic-CfqFe_aP.js.map} +1 -1
  160. package/dist/core/web/public/next/assets/FleetSection-B7f-XBiX.js +3 -0
  161. package/dist/core/web/public/next/assets/FleetSection-B7f-XBiX.js.map +1 -0
  162. package/dist/core/web/public/next/assets/Funnel-pXYySwXQ.js +2 -0
  163. package/dist/core/web/public/next/assets/{Funnel-D2u7Wlzc.js.map → Funnel-pXYySwXQ.js.map} +1 -1
  164. package/dist/core/web/public/next/assets/GearTray-gj6lT7ba.js +2 -0
  165. package/dist/core/web/public/next/assets/{GearTray-Cb2npoxM.js.map → GearTray-gj6lT7ba.js.map} +1 -1
  166. package/dist/core/web/public/next/assets/GrowthSection-D8e9m9Wy.js +2 -0
  167. package/dist/core/web/public/next/assets/{GrowthSection-C5aDPs8B.js.map → GrowthSection-D8e9m9Wy.js.map} +1 -1
  168. package/dist/core/web/public/next/assets/HandoffDialog-VfKxKhxF.js +2 -0
  169. package/dist/core/web/public/next/assets/{HandoffDialog-BF3AYg-X.js.map → HandoffDialog-VfKxKhxF.js.map} +1 -1
  170. package/dist/core/web/public/next/assets/Input-u1YR_Ogl.js +2 -0
  171. package/dist/core/web/public/next/assets/{Input-B5dmGLZx.js.map → Input-u1YR_Ogl.js.map} +1 -1
  172. package/dist/core/web/public/next/assets/LeaderCard-BDELBrnx.js +2 -0
  173. package/dist/core/web/public/next/assets/LeaderCard-BDELBrnx.js.map +1 -0
  174. package/dist/core/web/public/next/assets/MatrixHeatmap-NKLF2srR.js +2 -0
  175. package/dist/core/web/public/next/assets/{MatrixHeatmap-BgEUs2Eu.js.map → MatrixHeatmap-NKLF2srR.js.map} +1 -1
  176. package/dist/core/web/public/next/assets/McpSection-D1tDvlRa.js +2 -0
  177. package/dist/core/web/public/next/assets/{McpSection-DZkiOuoq.js.map → McpSection-D1tDvlRa.js.map} +1 -1
  178. package/dist/core/web/public/next/assets/MessageMarkdown-DlfLEJxu.js +3 -0
  179. package/dist/core/web/public/next/assets/{MessageMarkdown-BauY8ZTY.js.map → MessageMarkdown-DlfLEJxu.js.map} +1 -1
  180. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DLBNLfsn.js → MessageMarkdownRenderer-BYZzI115.js} +4 -4
  181. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DLBNLfsn.js.map → MessageMarkdownRenderer-BYZzI115.js.map} +1 -1
  182. package/dist/core/web/public/next/assets/{Meter-DNeocJnD.js → Meter-BSVhU43Q.js} +2 -2
  183. package/dist/core/web/public/next/assets/{Meter-DNeocJnD.js.map → Meter-BSVhU43Q.js.map} +1 -1
  184. package/dist/core/web/public/next/assets/MindSection-lqV2e_Sq.js +2 -0
  185. package/dist/core/web/public/next/assets/MindSection-lqV2e_Sq.js.map +1 -0
  186. package/dist/core/web/public/next/assets/MutationTokenDialog-CLGP72g6.js +2 -0
  187. package/dist/core/web/public/next/assets/{MutationTokenDialog-mxrw0Yvy.js.map → MutationTokenDialog-CLGP72g6.js.map} +1 -1
  188. package/dist/core/web/public/next/assets/NeedsYouDrawer-D992XTOn.js +2 -0
  189. package/dist/core/web/public/next/assets/{NeedsYouDrawer-CO-Balfp.js.map → NeedsYouDrawer-D992XTOn.js.map} +1 -1
  190. package/dist/core/web/public/next/assets/NeedsYouList-eBOlJr0b.js +2 -0
  191. package/dist/core/web/public/next/assets/{NeedsYouList-CzDZbzRD.js.map → NeedsYouList-eBOlJr0b.js.map} +1 -1
  192. package/dist/core/web/public/next/assets/NewChatDialog-DoYTH26M.js +3 -0
  193. package/dist/core/web/public/next/assets/NewChatDialog-DoYTH26M.js.map +1 -0
  194. package/dist/core/web/public/next/assets/OnboardingFlow-D3yfITK1.js +2 -0
  195. package/dist/core/web/public/next/assets/OnboardingFlow-D3yfITK1.js.map +1 -0
  196. package/dist/core/web/public/next/assets/OnboardingFlow-HUNQGQuU.css +1 -0
  197. package/dist/core/web/public/next/assets/OnboardingGate-DrDEVBqw.js +3 -0
  198. package/dist/core/web/public/next/assets/OnboardingGate-DrDEVBqw.js.map +1 -0
  199. package/dist/core/web/public/next/assets/PreviewPane-ULN673zm.js +2 -0
  200. package/dist/core/web/public/next/assets/{PreviewPane-BS-CleCd.js.map → PreviewPane-ULN673zm.js.map} +1 -1
  201. package/dist/core/web/public/next/assets/{ProviderLogo-C5mBg8i0.js → ProviderLogo-8WaUjTlN.js} +2 -2
  202. package/dist/core/web/public/next/assets/{ProviderLogo-C5mBg8i0.js.map → ProviderLogo-8WaUjTlN.js.map} +1 -1
  203. package/dist/core/web/public/next/assets/RailStatus-Ckw9nvYU.js +2 -0
  204. package/dist/core/web/public/next/assets/{RailStatus-cPRyOmrk.js.map → RailStatus-Ckw9nvYU.js.map} +1 -1
  205. package/dist/core/web/public/next/assets/{RefreshIndicator-CMwSCiz5.js → RefreshIndicator-DGubF4vR.js} +2 -2
  206. package/dist/core/web/public/next/assets/{RefreshIndicator-CMwSCiz5.js.map → RefreshIndicator-DGubF4vR.js.map} +1 -1
  207. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BFi1opsC.js → ResourcePoolConsoleApp-BahEaY4d.js} +4 -4
  208. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BFi1opsC.js.map → ResourcePoolConsoleApp-BahEaY4d.js.map} +1 -1
  209. package/dist/core/web/public/next/assets/ResourcesChrome-C2ZrA7la.js +3 -0
  210. package/dist/core/web/public/next/assets/ResourcesChrome-C2ZrA7la.js.map +1 -0
  211. package/dist/core/web/public/next/assets/ResourcesDrawer-BC93fzwQ.js +2 -0
  212. package/dist/core/web/public/next/assets/ResourcesDrawer-BC93fzwQ.js.map +1 -0
  213. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +1 -0
  214. package/dist/core/web/public/next/assets/RouteErrorBoundary-BvhHNpE_.js +2 -0
  215. package/dist/core/web/public/next/assets/{RouteErrorBoundary-DYtwc2ja.js.map → RouteErrorBoundary-BvhHNpE_.js.map} +1 -1
  216. package/dist/core/web/public/next/assets/RunInCloudAction-Dywfnw0C.js +2 -0
  217. package/dist/core/web/public/next/assets/{RunInCloudAction-BEGEEM8O.js.map → RunInCloudAction-Dywfnw0C.js.map} +1 -1
  218. package/dist/core/web/public/next/assets/SeatSelector-CH7hTgwy.js +3 -0
  219. package/dist/core/web/public/next/assets/{SeatSelector-CYHRR7Wp.js.map → SeatSelector-CH7hTgwy.js.map} +1 -1
  220. package/dist/core/web/public/next/assets/Segmented-Wynbg0F5.js +2 -0
  221. package/dist/core/web/public/next/assets/{Segmented-BE53BenI.js.map → Segmented-Wynbg0F5.js.map} +1 -1
  222. package/dist/core/web/public/next/assets/Select-DMyLCkId.js +2 -0
  223. package/dist/core/web/public/next/assets/{Select-BwSGkHCS.js.map → Select-DMyLCkId.js.map} +1 -1
  224. package/dist/core/web/public/next/assets/SessionGate-8RtQFWeZ.js +2 -0
  225. package/dist/core/web/public/next/assets/{SessionGate-e0dFJm9d.js.map → SessionGate-8RtQFWeZ.js.map} +1 -1
  226. package/dist/core/web/public/next/assets/SessionInsightChip-zBJbKv2L.js +2 -0
  227. package/dist/core/web/public/next/assets/{SessionInsightChip-CxlSyueJ.js.map → SessionInsightChip-zBJbKv2L.js.map} +1 -1
  228. package/dist/core/web/public/next/assets/SessionSearch-DfJIcxxM.js +2 -0
  229. package/dist/core/web/public/next/assets/{SessionSearch-_yp7S2TP.js.map → SessionSearch-DfJIcxxM.js.map} +1 -1
  230. package/dist/core/web/public/next/assets/SettingsSection-Da9RYyH5.js +2 -0
  231. package/dist/core/web/public/next/assets/SettingsSection-Da9RYyH5.js.map +1 -0
  232. package/dist/core/web/public/next/assets/Sheet-DhXyIDmq.js +2 -0
  233. package/dist/core/web/public/next/assets/{Sheet-DVP2Mgy6.js.map → Sheet-DhXyIDmq.js.map} +1 -1
  234. package/dist/core/web/public/next/assets/ShortcutsOverlay-Bi5f-wUw.js +2 -0
  235. package/dist/core/web/public/next/assets/{ShortcutsOverlay-BcIcoClX.js.map → ShortcutsOverlay-Bi5f-wUw.js.map} +1 -1
  236. package/dist/core/web/public/next/assets/Sidebar-BuO3sViG.js +3 -0
  237. package/dist/core/web/public/next/assets/Sidebar-BuO3sViG.js.map +1 -0
  238. package/dist/core/web/public/next/assets/Slider-Bd9YFWEV.js +2 -0
  239. package/dist/core/web/public/next/assets/{Slider-BypUWjpH.js.map → Slider-Bd9YFWEV.js.map} +1 -1
  240. package/dist/core/web/public/next/assets/StatTile-DScTd3c-.js +2 -0
  241. package/dist/core/web/public/next/assets/StatTile-DScTd3c-.js.map +1 -0
  242. package/dist/core/web/public/next/assets/{StatusBadge-HCZp416_.js → StatusBadge-DQ1UtQAJ.js} +2 -2
  243. package/dist/core/web/public/next/assets/{StatusBadge-HCZp416_.js.map → StatusBadge-DQ1UtQAJ.js.map} +1 -1
  244. package/dist/core/web/public/next/assets/StepBand-BB3IJxhr.js +2 -0
  245. package/dist/core/web/public/next/assets/{StepBand-Duz1PUes.js.map → StepBand-BB3IJxhr.js.map} +1 -1
  246. package/dist/core/web/public/next/assets/Surface-DWMtQe3Q.js +2 -0
  247. package/dist/core/web/public/next/assets/Surface-DWMtQe3Q.js.map +1 -0
  248. package/dist/core/web/public/next/assets/Surface-e1z6GdZt.css +1 -0
  249. package/dist/core/web/public/next/assets/Swimlane-DcENqtdp.js +2 -0
  250. package/dist/core/web/public/next/assets/{Swimlane-DGcIcnNA.js.map → Swimlane-DcENqtdp.js.map} +1 -1
  251. package/dist/core/web/public/next/assets/{Switch-iveI-8NY.js → Switch-CenChEYf.js} +2 -2
  252. package/dist/core/web/public/next/assets/{Switch-iveI-8NY.js.map → Switch-CenChEYf.js.map} +1 -1
  253. package/dist/core/web/public/next/assets/{Tag-DH15CUJp.js → Tag-D4k5E3u0.js} +2 -2
  254. package/dist/core/web/public/next/assets/{Tag-DH15CUJp.js.map → Tag-D4k5E3u0.js.map} +1 -1
  255. package/dist/core/web/public/next/assets/TerminalPane-DCQTukcE.js +7 -0
  256. package/dist/core/web/public/next/assets/TerminalPane-DCQTukcE.js.map +1 -0
  257. package/dist/core/web/public/next/assets/UniverseConsoleApp-DsuWT0pi.js +2 -0
  258. package/dist/core/web/public/next/assets/{UniverseConsoleApp-C8yQ0AaR.js.map → UniverseConsoleApp-DsuWT0pi.js.map} +1 -1
  259. package/dist/core/web/public/next/assets/{UniverseView-_nPURPqe.js → UniverseView-DyI5ApsA.js} +3 -3
  260. package/dist/core/web/public/next/assets/{UniverseView-_nPURPqe.js.map → UniverseView-DyI5ApsA.js.map} +1 -1
  261. package/dist/core/web/public/next/assets/UsageSection-Imr28nwK.js +3 -0
  262. package/dist/core/web/public/next/assets/UsageSection-Imr28nwK.js.map +1 -0
  263. package/dist/core/web/public/next/assets/VerseConsoleApp-DeuBEvAO.js +3 -0
  264. package/dist/core/web/public/next/assets/VerseConsoleApp-DeuBEvAO.js.map +1 -0
  265. package/dist/core/web/public/next/assets/Workspace-CpxBO98E.js +10 -0
  266. package/dist/core/web/public/next/assets/Workspace-CpxBO98E.js.map +1 -0
  267. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +1 -0
  268. package/dist/core/web/public/next/assets/actions-DE8NoWV_.js +2 -0
  269. package/dist/core/web/public/next/assets/actions-DE8NoWV_.js.map +1 -0
  270. package/dist/core/web/public/next/assets/apps-model-CFGCUu9p.js +2 -0
  271. package/dist/core/web/public/next/assets/apps-model-CFGCUu9p.js.map +1 -0
  272. package/dist/core/web/public/next/assets/authority-model-CmnfJzmM.js +2 -0
  273. package/dist/core/web/public/next/assets/authority-model-CmnfJzmM.js.map +1 -0
  274. package/dist/core/web/public/next/assets/binding-left-DZpq5sLf.js +2 -0
  275. package/dist/core/web/public/next/assets/binding-left-DZpq5sLf.js.map +1 -0
  276. package/dist/core/web/public/next/assets/{budget-queries-V3wcJVK_.js → budget-queries-DjrPRFwl.js} +2 -2
  277. package/dist/core/web/public/next/assets/{budget-queries-V3wcJVK_.js.map → budget-queries-DjrPRFwl.js.map} +1 -1
  278. package/dist/core/web/public/next/assets/capacity-strip-model-C7cdQnuK.js +2 -0
  279. package/dist/core/web/public/next/assets/capacity-strip-model-C7cdQnuK.js.map +1 -0
  280. package/dist/core/web/public/next/assets/charts-DUD_jprE.js +2 -0
  281. package/dist/core/web/public/next/assets/charts-DUD_jprE.js.map +1 -0
  282. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +1 -0
  283. package/dist/core/web/public/next/assets/clipboard-DkZdqlxf.js +2 -0
  284. package/dist/core/web/public/next/assets/clipboard-DkZdqlxf.js.map +1 -0
  285. package/dist/core/web/public/next/assets/cloud-D-HXms6q.css +1 -0
  286. package/dist/core/web/public/next/assets/cloud-model-DoxBMDvx.js +2 -0
  287. package/dist/core/web/public/next/assets/cloud-model-DoxBMDvx.js.map +1 -0
  288. package/dist/core/web/public/next/assets/cloud-queries-CTGvO-k-.js +2 -0
  289. package/dist/core/web/public/next/assets/cloud-queries-CTGvO-k-.js.map +1 -0
  290. package/dist/core/web/public/next/assets/cloud.module-DOP-N4Ch.js +2 -0
  291. package/dist/core/web/public/next/assets/cloud.module-DOP-N4Ch.js.map +1 -0
  292. package/dist/core/web/public/next/assets/command-catalog-CmrHNFzh.js +2 -0
  293. package/dist/core/web/public/next/assets/command-catalog-CmrHNFzh.js.map +1 -0
  294. package/dist/core/web/public/next/assets/context-model-2Owp2jYF.js +3 -0
  295. package/dist/core/web/public/next/assets/context-model-2Owp2jYF.js.map +1 -0
  296. package/dist/core/web/public/next/assets/context-model-9xywbXxX.js +2 -0
  297. package/dist/core/web/public/next/assets/context-model-9xywbXxX.js.map +1 -0
  298. package/dist/core/web/public/next/assets/{context-queries-CrPcHWTz.js → context-queries-wvcRnV-I.js} +2 -2
  299. package/dist/core/web/public/next/assets/{context-queries-CrPcHWTz.js.map → context-queries-wvcRnV-I.js.map} +1 -1
  300. package/dist/core/web/public/next/assets/{control-queries-CmgBgKV7.js → control-queries-DB6Kh7UN.js} +2 -2
  301. package/dist/core/web/public/next/assets/{control-queries-CmgBgKV7.js.map → control-queries-DB6Kh7UN.js.map} +1 -1
  302. package/dist/core/web/public/next/assets/copy-setup-CJQhFl-4.js +2 -0
  303. package/dist/core/web/public/next/assets/copy-setup-CJQhFl-4.js.map +1 -0
  304. package/dist/core/web/public/next/assets/dock-icons-BBUGl4tE.js +2 -0
  305. package/dist/core/web/public/next/assets/{dock-icons-CUh8dOxJ.js.map → dock-icons-BBUGl4tE.js.map} +1 -1
  306. package/dist/core/web/public/next/assets/fleet-model-BRfRWkZl.js +2 -0
  307. package/dist/core/web/public/next/assets/fleet-model-BRfRWkZl.js.map +1 -0
  308. package/dist/core/web/public/next/assets/fleet-queries-tU6UEXN2.js +2 -0
  309. package/dist/core/web/public/next/assets/fleet-queries-tU6UEXN2.js.map +1 -0
  310. package/dist/core/web/public/next/assets/{focus-trap-HtcoXeEq.js → focus-trap-BGOceFvj.js} +2 -2
  311. package/dist/core/web/public/next/assets/{focus-trap-HtcoXeEq.js.map → focus-trap-BGOceFvj.js.map} +1 -1
  312. package/dist/core/web/public/next/assets/format-DEAaVF6X.js +2 -0
  313. package/dist/core/web/public/next/assets/format-DEAaVF6X.js.map +1 -0
  314. package/dist/core/web/public/next/assets/{git-model-bk_RXh3y.js → git-model-53iRLInY.js} +2 -2
  315. package/dist/core/web/public/next/assets/{git-model-bk_RXh3y.js.map → git-model-53iRLInY.js.map} +1 -1
  316. package/dist/core/web/public/next/assets/global-CXHHMz9o.js +2 -0
  317. package/dist/core/web/public/next/assets/{global-oEl9Qj8u.js.map → global-CXHHMz9o.js.map} +1 -1
  318. package/dist/core/web/public/next/assets/{guarded-runners-LHLXmXIk.js → guarded-runners-B8zFVBVZ.js} +2 -2
  319. package/dist/core/web/public/next/assets/{guarded-runners-LHLXmXIk.js.map → guarded-runners-B8zFVBVZ.js.map} +1 -1
  320. package/dist/core/web/public/next/assets/icons-D4s-jlxX.js +2 -0
  321. package/dist/core/web/public/next/assets/icons-D4s-jlxX.js.map +1 -0
  322. package/dist/core/web/public/next/assets/{index-BVxOlseC.js → index-BG177cPN.js} +3 -3
  323. package/dist/core/web/public/next/assets/{index-BVxOlseC.js.map → index-BG177cPN.js.map} +1 -1
  324. package/dist/core/web/public/next/assets/live-model-CEf01wrW.js +2 -0
  325. package/dist/core/web/public/next/assets/live-model-CEf01wrW.js.map +1 -0
  326. package/dist/core/web/public/next/assets/local-model-C9xNi9fN.js +2 -0
  327. package/dist/core/web/public/next/assets/local-model-C9xNi9fN.js.map +1 -0
  328. package/dist/core/web/public/next/assets/mind.module-D_xk6HIQ.js +2 -0
  329. package/dist/core/web/public/next/assets/{mind.module-gTGAuJt1.js.map → mind.module-D_xk6HIQ.js.map} +1 -1
  330. package/dist/core/web/public/next/assets/mutations-CbTSofVH.js +2 -0
  331. package/dist/core/web/public/next/assets/{mutations-C5S7okTW.js.map → mutations-CbTSofVH.js.map} +1 -1
  332. package/dist/core/web/public/next/assets/nav-CmZcbPFJ.js +2 -0
  333. package/dist/core/web/public/next/assets/{nav-NVtnuG7A.js.map → nav-CmZcbPFJ.js.map} +1 -1
  334. package/dist/core/web/public/next/assets/{overnight-queries-DGm3qL1b.js → overnight-queries-CR0b_j-V.js} +2 -2
  335. package/dist/core/web/public/next/assets/{overnight-queries-DGm3qL1b.js.map → overnight-queries-CR0b_j-V.js.map} +1 -1
  336. package/dist/core/web/public/next/assets/primitives-DNI-uJBd.js +1 -0
  337. package/dist/core/web/public/next/assets/{queries-CYisSAAB.js → queries-rvRsAGW2.js} +2 -2
  338. package/dist/core/web/public/next/assets/{queries-CYisSAAB.js.map → queries-rvRsAGW2.js.map} +1 -1
  339. package/dist/core/web/public/next/assets/reasoning-pref-DMPQkujg.js +2 -0
  340. package/dist/core/web/public/next/assets/{reasoning-pref-BUcFF_5G.js.map → reasoning-pref-DMPQkujg.js.map} +1 -1
  341. package/dist/core/web/public/next/assets/{reveal-anchor-D-tV8xau.js → reveal-anchor-BKk2wZZZ.js} +2 -2
  342. package/dist/core/web/public/next/assets/{reveal-anchor-D-tV8xau.js.map → reveal-anchor-BKk2wZZZ.js.map} +1 -1
  343. package/dist/core/web/public/next/assets/seat-subscription-CLn2ReSZ.js +2 -0
  344. package/dist/core/web/public/next/assets/{seat-subscription-B-f9ViU2.js.map → seat-subscription-CLn2ReSZ.js.map} +1 -1
  345. package/dist/core/web/public/next/assets/{sidebar-model-DQ-FyBHW.js → sidebar-model-CjQLvdag.js} +2 -2
  346. package/dist/core/web/public/next/assets/{sidebar-model-DQ-FyBHW.js.map → sidebar-model-CjQLvdag.js.map} +1 -1
  347. package/dist/core/web/public/next/assets/slots-DRxNosZg.js +3 -0
  348. package/dist/core/web/public/next/assets/{slots-BhP8b8tf.js.map → slots-DRxNosZg.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/surface-data-DshUC_TU.js +2 -0
  350. package/dist/core/web/public/next/assets/surface-data-DshUC_TU.js.map +1 -0
  351. package/dist/core/web/public/next/assets/surface-prefetch-DO8r4ttQ.js +2 -0
  352. package/dist/core/web/public/next/assets/surface-prefetch-DO8r4ttQ.js.map +1 -0
  353. package/dist/core/web/public/next/assets/{tasks-model-BKDNqmmt.js → tasks-model-BKPFZAmZ.js} +2 -2
  354. package/dist/core/web/public/next/assets/{tasks-model-BKDNqmmt.js.map → tasks-model-BKPFZAmZ.js.map} +1 -1
  355. package/dist/core/web/public/next/assets/{terminal-icons-D2xe-aM1.js → terminal-icons-DoeQkP3y.js} +2 -2
  356. package/dist/core/web/public/next/assets/{terminal-icons-D2xe-aM1.js.map → terminal-icons-DoeQkP3y.js.map} +1 -1
  357. package/dist/core/web/public/next/assets/transient-events-nTLhMBND.js +2 -0
  358. package/dist/core/web/public/next/assets/transient-events-nTLhMBND.js.map +1 -0
  359. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +1 -1
  360. package/dist/core/web/public/next/assets/{usage-queries-BZuAANlI.js → usage-queries-MnUeYzwp.js} +2 -2
  361. package/dist/core/web/public/next/assets/{usage-queries-BZuAANlI.js.map → usage-queries-MnUeYzwp.js.map} +1 -1
  362. package/dist/core/web/public/next/assets/{use-guarded-action-Cf4MeNBa.js → use-guarded-action-P12MfNwU.js} +2 -2
  363. package/dist/core/web/public/next/assets/{use-guarded-action-Cf4MeNBa.js.map → use-guarded-action-P12MfNwU.js.map} +1 -1
  364. package/dist/core/web/public/next/assets/{use-ticker-D9yi49my.js → use-ticker-DIvAZ4Ey.js} +2 -2
  365. package/dist/core/web/public/next/assets/{use-ticker-D9yi49my.js.map → use-ticker-DIvAZ4Ey.js.map} +1 -1
  366. package/dist/core/web/public/next/assets/{use-token-gate-DqrSXdX6.js → use-token-gate-DfEja7Wr.js} +2 -2
  367. package/dist/core/web/public/next/assets/{use-token-gate-DqrSXdX6.js.map → use-token-gate-DfEja7Wr.js.map} +1 -1
  368. package/dist/core/web/public/next/assets/useOnboarding-CkOHadqC.js +2 -0
  369. package/dist/core/web/public/next/assets/useOnboarding-CkOHadqC.js.map +1 -0
  370. package/dist/core/web/public/next/assets/useSeatsRefresh-BDlbDlIU.js +2 -0
  371. package/dist/core/web/public/next/assets/useSeatsRefresh-BDlbDlIU.js.map +1 -0
  372. package/dist/core/web/public/next/assets/useVerseTranscript-BGtA55k2.js +2 -0
  373. package/dist/core/web/public/next/assets/{useVerseTranscript-CDYrrWOO.js.map → useVerseTranscript-BGtA55k2.js.map} +1 -1
  374. package/dist/core/web/public/next/assets/verse-icons-wOet9JZy.js +2 -0
  375. package/dist/core/web/public/next/assets/verse-icons-wOet9JZy.js.map +1 -0
  376. package/dist/core/web/public/next/assets/verse-model-CSzzdyu2.js +2 -0
  377. package/dist/core/web/public/next/assets/verse-model-CSzzdyu2.js.map +1 -0
  378. package/dist/core/web/public/next/assets/verse-store-DNVRuiJL.js +2 -0
  379. package/dist/core/web/public/next/assets/verse-store-DNVRuiJL.js.map +1 -0
  380. package/dist/core/web/public/next/assets/warmup-CecO_Nk0.js +3 -0
  381. package/dist/core/web/public/next/assets/{warmup-HG5vYbsN.js.map → warmup-CecO_Nk0.js.map} +1 -1
  382. package/dist/core/web/public/next/assets/why-seat-model-D68ZA7G8.js +2 -0
  383. package/dist/core/web/public/next/assets/why-seat-model-D68ZA7G8.js.map +1 -0
  384. package/dist/core/web/public/next/assets/{workspace-model-CbhdPhei.js → workspace-model-BdIVybKr.js} +2 -2
  385. package/dist/core/web/public/next/assets/{workspace-model-CbhdPhei.js.map → workspace-model-BdIVybKr.js.map} +1 -1
  386. package/dist/core/web/public/next/index.html +1 -1
  387. package/dist/release-dependency-inventory.json +1 -1
  388. package/docs/README.md +2 -1
  389. package/package.json +1 -1
  390. package/dist/core/web/public/next/assets/ActionMenu-FxXeRbPx.js +0 -2
  391. package/dist/core/web/public/next/assets/Advanced-D_eS4472.js +0 -2
  392. package/dist/core/web/public/next/assets/Advanced-D_eS4472.js.map +0 -1
  393. package/dist/core/web/public/next/assets/App-Cj4zKbG3.js +0 -7
  394. package/dist/core/web/public/next/assets/App-Cj4zKbG3.js.map +0 -1
  395. package/dist/core/web/public/next/assets/AppsSection-Ddu_RCQE.js +0 -2
  396. package/dist/core/web/public/next/assets/AppsSection-Ddu_RCQE.js.map +0 -1
  397. package/dist/core/web/public/next/assets/AreaTrend-CDxrQU4b.js +0 -2
  398. package/dist/core/web/public/next/assets/AutonomySection-DuQkHGD_.js +0 -2
  399. package/dist/core/web/public/next/assets/BranchBar-CLsvOcyK.js +0 -2
  400. package/dist/core/web/public/next/assets/BudgetControl-TL3FeZ1D.js +0 -2
  401. package/dist/core/web/public/next/assets/BurnDown-sFXkUGdB.js +0 -2
  402. package/dist/core/web/public/next/assets/BurnDown-sFXkUGdB.js.map +0 -1
  403. package/dist/core/web/public/next/assets/CapacityStrip-qReu0RaF.js +0 -2
  404. package/dist/core/web/public/next/assets/ChatSection-DZuZfTaC.js +0 -3
  405. package/dist/core/web/public/next/assets/ChatSection-DZuZfTaC.js.map +0 -1
  406. package/dist/core/web/public/next/assets/CloudBudgetForm-DJbiT1wi.js +0 -2
  407. package/dist/core/web/public/next/assets/CloudBudgetForm-DJbiT1wi.js.map +0 -1
  408. package/dist/core/web/public/next/assets/CommandPalette-zYLFZRnj.js +0 -2
  409. package/dist/core/web/public/next/assets/CommandPalette-zYLFZRnj.js.map +0 -1
  410. package/dist/core/web/public/next/assets/CommandSection-rIeMK5Ch.js +0 -2
  411. package/dist/core/web/public/next/assets/CommandSection-rIeMK5Ch.js.map +0 -1
  412. package/dist/core/web/public/next/assets/ConfirmDialog-DLrLKM0c.js +0 -2
  413. package/dist/core/web/public/next/assets/Dialog-BS9Dxi3G.js +0 -2
  414. package/dist/core/web/public/next/assets/DiffPane-TOmUf3b2.js +0 -2
  415. package/dist/core/web/public/next/assets/DiffViewer-BpH56302.js +0 -2
  416. package/dist/core/web/public/next/assets/DockHost-DzkzR-HD.js +0 -2
  417. package/dist/core/web/public/next/assets/DockHost-DzkzR-HD.js.map +0 -1
  418. package/dist/core/web/public/next/assets/FleetSection-ViAb549H.js +0 -3
  419. package/dist/core/web/public/next/assets/FleetSection-ViAb549H.js.map +0 -1
  420. package/dist/core/web/public/next/assets/Funnel-D2u7Wlzc.js +0 -2
  421. package/dist/core/web/public/next/assets/GearTray-Cb2npoxM.js +0 -2
  422. package/dist/core/web/public/next/assets/GrowthSection-C5aDPs8B.js +0 -2
  423. package/dist/core/web/public/next/assets/HandoffDialog-BF3AYg-X.js +0 -2
  424. package/dist/core/web/public/next/assets/Input-B5dmGLZx.js +0 -2
  425. package/dist/core/web/public/next/assets/LeaderCard-DZrmjDbI.js +0 -2
  426. package/dist/core/web/public/next/assets/LeaderCard-DZrmjDbI.js.map +0 -1
  427. package/dist/core/web/public/next/assets/MatrixHeatmap-BgEUs2Eu.js +0 -2
  428. package/dist/core/web/public/next/assets/McpSection-DZkiOuoq.js +0 -2
  429. package/dist/core/web/public/next/assets/MessageMarkdown-BauY8ZTY.js +0 -3
  430. package/dist/core/web/public/next/assets/MindSection-BvJXFjyX.js +0 -2
  431. package/dist/core/web/public/next/assets/MindSection-BvJXFjyX.js.map +0 -1
  432. package/dist/core/web/public/next/assets/MutationTokenDialog-mxrw0Yvy.js +0 -2
  433. package/dist/core/web/public/next/assets/NeedsYouDrawer-CO-Balfp.js +0 -2
  434. package/dist/core/web/public/next/assets/NeedsYouList-CzDZbzRD.js +0 -2
  435. package/dist/core/web/public/next/assets/NewChatDialog-B8eJjlFf.js +0 -3
  436. package/dist/core/web/public/next/assets/NewChatDialog-B8eJjlFf.js.map +0 -1
  437. package/dist/core/web/public/next/assets/OnboardingFlow-Cij6KWat.js +0 -2
  438. package/dist/core/web/public/next/assets/OnboardingFlow-Cij6KWat.js.map +0 -1
  439. package/dist/core/web/public/next/assets/OnboardingFlow-DSpPj8UE.css +0 -1
  440. package/dist/core/web/public/next/assets/PreviewPane-BS-CleCd.js +0 -2
  441. package/dist/core/web/public/next/assets/RailStatus-cPRyOmrk.js +0 -2
  442. package/dist/core/web/public/next/assets/ResourcesChrome-BJCauW_t.js +0 -3
  443. package/dist/core/web/public/next/assets/ResourcesChrome-BJCauW_t.js.map +0 -1
  444. package/dist/core/web/public/next/assets/ResourcesDrawer-BDecg6nO.js +0 -2
  445. package/dist/core/web/public/next/assets/ResourcesDrawer-BDecg6nO.js.map +0 -1
  446. package/dist/core/web/public/next/assets/ResourcesDrawer-CSKIO_wZ.css +0 -1
  447. package/dist/core/web/public/next/assets/RouteErrorBoundary-DYtwc2ja.js +0 -2
  448. package/dist/core/web/public/next/assets/RunInCloudAction-BEGEEM8O.js +0 -2
  449. package/dist/core/web/public/next/assets/SeatSelector-CYHRR7Wp.js +0 -3
  450. package/dist/core/web/public/next/assets/Segmented-BE53BenI.js +0 -2
  451. package/dist/core/web/public/next/assets/Select-BwSGkHCS.js +0 -2
  452. package/dist/core/web/public/next/assets/SessionGate-e0dFJm9d.js +0 -2
  453. package/dist/core/web/public/next/assets/SessionInsightChip-CxlSyueJ.js +0 -2
  454. package/dist/core/web/public/next/assets/SessionSearch-_yp7S2TP.js +0 -2
  455. package/dist/core/web/public/next/assets/SettingsSection-wGnpWeGW.js +0 -2
  456. package/dist/core/web/public/next/assets/SettingsSection-wGnpWeGW.js.map +0 -1
  457. package/dist/core/web/public/next/assets/Sheet-DVP2Mgy6.js +0 -2
  458. package/dist/core/web/public/next/assets/ShortcutsOverlay-BcIcoClX.js +0 -2
  459. package/dist/core/web/public/next/assets/Sidebar-DjQOqPbm.js +0 -3
  460. package/dist/core/web/public/next/assets/Sidebar-DjQOqPbm.js.map +0 -1
  461. package/dist/core/web/public/next/assets/Slider-BypUWjpH.js +0 -2
  462. package/dist/core/web/public/next/assets/StepBand-Duz1PUes.js +0 -2
  463. package/dist/core/web/public/next/assets/Surface-B75lVfzm.js +0 -2
  464. package/dist/core/web/public/next/assets/Surface-B75lVfzm.js.map +0 -1
  465. package/dist/core/web/public/next/assets/Surface-DMca0gAe.css +0 -1
  466. package/dist/core/web/public/next/assets/Swimlane-DGcIcnNA.js +0 -2
  467. package/dist/core/web/public/next/assets/TerminalPane-MQT-veKZ.js +0 -7
  468. package/dist/core/web/public/next/assets/TerminalPane-MQT-veKZ.js.map +0 -1
  469. package/dist/core/web/public/next/assets/UniverseConsoleApp-C8yQ0AaR.js +0 -2
  470. package/dist/core/web/public/next/assets/UsageSection-CqxRGJ40.js +0 -2
  471. package/dist/core/web/public/next/assets/UsageSection-CqxRGJ40.js.map +0 -1
  472. package/dist/core/web/public/next/assets/VerseConsoleApp-DTjDpGCd.js +0 -3
  473. package/dist/core/web/public/next/assets/VerseConsoleApp-DTjDpGCd.js.map +0 -1
  474. package/dist/core/web/public/next/assets/Workspace-DfcFGzME.js +0 -10
  475. package/dist/core/web/public/next/assets/Workspace-DfcFGzME.js.map +0 -1
  476. package/dist/core/web/public/next/assets/actions-Ddfg2iLl.css +0 -1
  477. package/dist/core/web/public/next/assets/actions-tWevL9HV.js +0 -2
  478. package/dist/core/web/public/next/assets/actions-tWevL9HV.js.map +0 -1
  479. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js +0 -2
  480. package/dist/core/web/public/next/assets/apps-model-CDFvmsQV.js.map +0 -1
  481. package/dist/core/web/public/next/assets/capacity-strip-model-BDbmQ3e3.js +0 -2
  482. package/dist/core/web/public/next/assets/capacity-strip-model-BDbmQ3e3.js.map +0 -1
  483. package/dist/core/web/public/next/assets/charts-CfAjuKMv.js +0 -2
  484. package/dist/core/web/public/next/assets/charts-CfAjuKMv.js.map +0 -1
  485. package/dist/core/web/public/next/assets/charts-uSX6xVYN.css +0 -1
  486. package/dist/core/web/public/next/assets/cloud-C1KPNRHC.css +0 -1
  487. package/dist/core/web/public/next/assets/cloud-queries-Br_r0UAz.js +0 -2
  488. package/dist/core/web/public/next/assets/cloud-queries-Br_r0UAz.js.map +0 -1
  489. package/dist/core/web/public/next/assets/cloud.module-ascz58c3.js +0 -2
  490. package/dist/core/web/public/next/assets/cloud.module-ascz58c3.js.map +0 -1
  491. package/dist/core/web/public/next/assets/command-bus-xYZoK9nQ.js +0 -2
  492. package/dist/core/web/public/next/assets/command-bus-xYZoK9nQ.js.map +0 -1
  493. package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js +0 -2
  494. package/dist/core/web/public/next/assets/command-catalog-Bb_PxC5w.js.map +0 -1
  495. package/dist/core/web/public/next/assets/composer-keys-su0g1h9o.js +0 -2
  496. package/dist/core/web/public/next/assets/composer-keys-su0g1h9o.js.map +0 -1
  497. package/dist/core/web/public/next/assets/context-model-BC-HOmPo.js +0 -2
  498. package/dist/core/web/public/next/assets/context-model-BC-HOmPo.js.map +0 -1
  499. package/dist/core/web/public/next/assets/context-model-CIBmSugV.js +0 -2
  500. package/dist/core/web/public/next/assets/context-model-CIBmSugV.js.map +0 -1
  501. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js +0 -2
  502. package/dist/core/web/public/next/assets/dark-since-DOMvtB_G.js.map +0 -1
  503. package/dist/core/web/public/next/assets/dock-icons-CUh8dOxJ.js +0 -2
  504. package/dist/core/web/public/next/assets/dock-store-B2vlxqPu.js +0 -2
  505. package/dist/core/web/public/next/assets/dock-store-B2vlxqPu.js.map +0 -1
  506. package/dist/core/web/public/next/assets/fleet-model-7i-FbzKI.js +0 -2
  507. package/dist/core/web/public/next/assets/fleet-model-7i-FbzKI.js.map +0 -1
  508. package/dist/core/web/public/next/assets/fleet-queries-DzGoqq8X.js +0 -2
  509. package/dist/core/web/public/next/assets/fleet-queries-DzGoqq8X.js.map +0 -1
  510. package/dist/core/web/public/next/assets/format-BkWdOQDL.js +0 -2
  511. package/dist/core/web/public/next/assets/format-BkWdOQDL.js.map +0 -1
  512. package/dist/core/web/public/next/assets/global-oEl9Qj8u.js +0 -2
  513. package/dist/core/web/public/next/assets/guarded-action-OzqcPjmh.js +0 -3
  514. package/dist/core/web/public/next/assets/guarded-action-OzqcPjmh.js.map +0 -1
  515. package/dist/core/web/public/next/assets/icon-base-DvM1eI5V.js +0 -2
  516. package/dist/core/web/public/next/assets/icon-base-DvM1eI5V.js.map +0 -1
  517. package/dist/core/web/public/next/assets/icons-DEQa2rTx.js +0 -2
  518. package/dist/core/web/public/next/assets/icons-DEQa2rTx.js.map +0 -1
  519. package/dist/core/web/public/next/assets/live-model-bmsJgnYD.js +0 -2
  520. package/dist/core/web/public/next/assets/live-model-bmsJgnYD.js.map +0 -1
  521. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js +0 -2
  522. package/dist/core/web/public/next/assets/local-model-DFyjKX0b.js.map +0 -1
  523. package/dist/core/web/public/next/assets/mind.module-gTGAuJt1.js +0 -2
  524. package/dist/core/web/public/next/assets/mutations-C5S7okTW.js +0 -2
  525. package/dist/core/web/public/next/assets/nav-NVtnuG7A.js +0 -2
  526. package/dist/core/web/public/next/assets/preloaded-Cwf9rsnZ.js +0 -2
  527. package/dist/core/web/public/next/assets/preloaded-Cwf9rsnZ.js.map +0 -1
  528. package/dist/core/web/public/next/assets/primitives-DyCKYSBG.js +0 -1
  529. package/dist/core/web/public/next/assets/reasoning-pref-BUcFF_5G.js +0 -2
  530. package/dist/core/web/public/next/assets/seat-subscription-B-f9ViU2.js +0 -2
  531. package/dist/core/web/public/next/assets/section-visibility-Yctxu-if.js +0 -2
  532. package/dist/core/web/public/next/assets/section-visibility-Yctxu-if.js.map +0 -1
  533. package/dist/core/web/public/next/assets/slots-BhP8b8tf.js +0 -3
  534. package/dist/core/web/public/next/assets/surface-data-DTI7LjvH.js +0 -2
  535. package/dist/core/web/public/next/assets/surface-data-DTI7LjvH.js.map +0 -1
  536. package/dist/core/web/public/next/assets/surface-prefetch-CdUEBFrl.js +0 -2
  537. package/dist/core/web/public/next/assets/surface-prefetch-CdUEBFrl.js.map +0 -1
  538. package/dist/core/web/public/next/assets/useChartWidth-owwodNVz.js +0 -2
  539. package/dist/core/web/public/next/assets/useChartWidth-owwodNVz.js.map +0 -1
  540. package/dist/core/web/public/next/assets/useSeatsRefresh-DgFy-Ph4.js +0 -2
  541. package/dist/core/web/public/next/assets/useSeatsRefresh-DgFy-Ph4.js.map +0 -1
  542. package/dist/core/web/public/next/assets/useVerseTranscript-CDYrrWOO.js +0 -2
  543. package/dist/core/web/public/next/assets/verse-icons-F9VwX07_.js +0 -2
  544. package/dist/core/web/public/next/assets/verse-icons-F9VwX07_.js.map +0 -1
  545. package/dist/core/web/public/next/assets/verse-model-DyCwZF-M.js +0 -2
  546. package/dist/core/web/public/next/assets/verse-model-DyCwZF-M.js.map +0 -1
  547. package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js +0 -3
  548. package/dist/core/web/public/next/assets/verse-store-b_Lek_c5.js.map +0 -1
  549. package/dist/core/web/public/next/assets/verse-ui-store-62DxpVHS.js +0 -3
  550. package/dist/core/web/public/next/assets/verse-ui-store-62DxpVHS.js.map +0 -1
  551. package/dist/core/web/public/next/assets/viewport-nTubFCwf.js +0 -2
  552. package/dist/core/web/public/next/assets/viewport-nTubFCwf.js.map +0 -1
  553. package/dist/core/web/public/next/assets/warmup-HG5vYbsN.js +0 -3
  554. package/dist/core/web/public/next/assets/workbench-types-DzN-5trg.js +0 -2
  555. package/dist/core/web/public/next/assets/workbench-types-DzN-5trg.js.map +0 -1
  556. /package/dist/core/web/public/next/assets/{BurnDown-BuLMsJMx.css → StatTile-BuLMsJMx.css} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"NeedsYouDrawer-CO-Balfp.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/approvals/approvals.module.css","../../../../../../src/web-ui/routes/verse/approvals/ApprovalDetail.tsx","../../../../../../src/web-ui/routes/verse/shell/needs-you-actions.ts","../../../../../../src/web-ui/routes/verse/shell/NeedsYouDrawer.tsx"],"sourcesContent":["/**\n * routes/verse/approvals/approvals.module.css — list + detail styling for the\n * Approvals surface. Same language as the cockpit: hairlines, no cards, tight\n * radii, Space Grotesk on identifiers and numerals, colour reserved for risk\n * and for the two irreversible buttons.\n */\n\n.layout { display: grid; grid-template-columns: minmax(320px, 420px) minmax(0, 1fr); min-height: 0; height: 100%; }\n.listPane { display: flex; flex-direction: column; min-height: 0; border-right: 1px solid var(--border-subtle); background: var(--bg-surface); }\n.detailPane { display: flex; flex-direction: column; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; background: var(--bg-canvas); }\n\n.filters { flex-shrink: 0; display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--border-subtle); }\n.filterField { display: flex; flex-direction: column; gap: var(--space-1); flex: 1; min-width: 120px; }\n.filterLabel { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); }\n.filters input {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n}\n\n/* The Select primitive renders its own <label>; restyle it to the uppercase\n micro-label the sibling text filters use so the row still reads as one\n group. Descendant element selector, so it stays module-scoped. */\n/* Layout comes from the primitive's own .field; this only matches the\n sibling text filters' flex behaviour. */\n.filterSelect { flex: 1; min-width: 120px; }\n.filterSelect > label {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-regular, 400);\n color: var(--text-tertiary);\n}\n\n/* WebKit paints its own clear affordance inside type=search, which is a\n default browser control (§7). Sidebar.module.css already resets it. */\n.filters input[type='search']::-webkit-search-cancel-button { appearance: none; }\n\n\n.count { flex-shrink: 0; display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); font-size: var(--text-xs-size); color: var(--text-tertiary); border-bottom: 1px solid var(--border-subtle); }\n\n.rows { flex: 1; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; }\n.row {\n display: grid;\n grid-template-columns: 2px minmax(0, 1fr);\n column-gap: var(--space-3);\n width: 100%;\n padding: var(--space-3) var(--space-4);\n border: 0;\n border-bottom: 1px solid var(--border-subtle);\n background: transparent;\n text-align: left;\n color: var(--text-primary);\n cursor: pointer;\n}\n.row:hover { background: var(--bg-hover); }\n.rowActive { background: var(--bg-selected); }\n/* Inset, because .rows scrolls (`overflow-y: auto`) and a full-width row's\n outward ring is clipped at the left and right edges. The global ring is\n silenced so only one paints. */\n.row:focus-visible { outline: 2px solid var(--border-focus); outline-offset: -2px; box-shadow: none; }\n.riskRule { grid-row: 1 / span 2; border-radius: var(--radius-full); background: var(--border-strong); }\n.riskRule[data-risk=\"high\"] { background: var(--status-danger-solid); }\n.riskRule[data-risk=\"medium\"] { background: var(--status-warning-solid); }\n.riskRule[data-risk=\"low\"] { background: var(--status-success-solid); }\n.rowTitle { font-size: var(--text-sm-size); line-height: var(--text-sm-line); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.rowMeta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-1) var(--space-3); margin-top: 2px; font-size: var(--text-xs-size); color: var(--text-tertiary); }\n/* --text-tertiary is a direct declaration on a CHILD, so the parent's\n :hover/[aria-current] colour change does not reach it — only the ground\n under it moves. Measured on --bg-selected it is 3.95:1 in light and 4.40:1\n in dark, both under the 4.5:1 floor in DESIGN-V2 §6; --text-secondary is\n 6.32:1 on the worst of them. design/tokens-contrast.test.ts now pins the\n token pair so the gap cannot reopen. */\n.row:hover .rowMeta,\n.rowActive .rowMeta { color: var(--text-secondary); }\n.rowMetaMono { font-family: var(--font-mono); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 14ch; }\n.rowAge { font-family: var(--font-display); }\n.riskWord { font-family: var(--font-display); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; font-size: var(--text-2xs-size, 11px); }\n.riskWord[data-risk=\"high\"] { color: var(--status-danger-fg); }\n.riskWord[data-risk=\"medium\"] { color: var(--status-warning-fg); }\n.riskWord[data-risk=\"low\"] { color: var(--status-success-fg); }\n\n/* --- detail ------------------------------------------------------------- */\n.detail { padding: var(--space-5) var(--space-6) var(--space-16); max-width: 1040px; }\n.detailHead { padding-bottom: var(--space-4); border-bottom: 1px solid var(--border-subtle); }\n.eyebrow { margin: 0 0 var(--space-1); font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); }\n/* Two lines at most, wrapped at word boundaries — a run title is a goal\n sentence and used to be cut mid-word. The full text rides in `title`. */\n.detailTitle {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-xl-size);\n line-height: var(--text-xl-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display, -0.02em);\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n overflow: hidden;\n overflow-wrap: break-word;\n}\n.project { font-weight: var(--font-weight-medium); color: var(--text-secondary); }\n.runFacts { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-1) var(--space-2); margin-top: var(--space-2); font-size: var(--text-sm-size); line-height: var(--text-sm-line); color: var(--text-secondary); }\n.runFacts code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.diffStats { font-family: var(--font-display); font-variant-numeric: tabular-nums; color: var(--text-primary); }\n.runSource[title] { text-decoration: underline dotted; text-underline-offset: 3px; cursor: help; }\n.hint { margin: var(--space-1) 0 0; font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-tertiary); max-width: 64ch; }\n.detailMeta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-3); margin-top: var(--space-2); font-size: var(--text-xs-size); color: var(--text-tertiary); }\n.detailMeta code { font-family: var(--font-mono); }\n.summary { margin-top: var(--space-3); font-size: var(--text-base-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 72ch; }\n\n.block { padding-block: var(--space-5); border-bottom: 1px solid var(--border-subtle); }\n.blockTitle {\n font-family: var(--font-display);\n font-size: var(--text-xs-size);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-semibold);\n color: var(--text-tertiary);\n margin-bottom: var(--space-3);\n}\n.defs { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: var(--space-2) var(--space-4); margin: 0; font-size: var(--text-sm-size); line-height: var(--text-sm-line); }\n.defs dt { color: var(--text-tertiary); }\n.defs dd { margin: 0; color: var(--text-primary); min-width: 0; overflow-wrap: anywhere; }\n.defs dd code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.muted { color: var(--text-tertiary); }\n.failedChecks { margin: var(--space-1) 0 0; font-family: var(--font-mono); font-size: var(--text-xs-size); color: var(--status-danger-fg); }\n\n.actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: var(--space-2); padding-top: var(--space-5); }\n.actionNote { flex: 1; min-width: 240px; font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); }\n.reject,\n.approve {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-4);\n border-radius: var(--radius-sm);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n}\n.reject { border: 1px solid var(--border-default); background: var(--bg-surface); color: var(--text-primary); }\n.reject:hover:not(:disabled) { border-color: var(--status-danger-solid); color: var(--status-danger-fg); }\n.approve { border: 1px solid var(--accent-500); background: var(--accent-500); color: var(--accent-contrast); }\n.approve:hover:not(:disabled) { background: var(--accent-600); border-color: var(--accent-600); }\n.reject:disabled,\n.approve:disabled { border-color: var(--border-default); background: var(--bg-surface); color: var(--text-disabled); cursor: not-allowed; }\n\n.decided { padding-top: var(--space-5); font-size: var(--text-sm-size); color: var(--text-secondary); }\n\n.empty { padding: var(--space-8) var(--space-6); font-size: var(--text-sm-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 62ch; }\n.emptyStrong { color: var(--text-primary); font-weight: var(--font-weight-medium); }\n.error { margin: var(--space-4); padding: var(--space-3); border: 1px solid var(--status-danger-solid); border-radius: var(--radius-sm); background: var(--status-danger-bg); color: var(--status-danger-fg); font-size: var(--text-sm-size); line-height: var(--text-sm-line); }\n.skeletons { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-4); }\n\n@media (max-width: 900px) {\n .layout { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(160px, 38%) minmax(0, 1fr); }\n .listPane { border-right: 0; border-bottom: 1px solid var(--border-subtle); }\n .detail { padding: var(--space-4) var(--space-4) var(--space-12); }\n}\n","/**\n * routes/verse/approvals/ApprovalDetail.tsx — everything a human needs before\n * deciding, and an approve path that cannot fire on one click.\n *\n * Reuses the inbox review machinery verbatim (`DiffViewer` + `diff-parser.ts`\n * + `highlight.ts`, and `ConfirmDialog`) rather than growing a second diff\n * renderer, per docs/VERSE-CONTRACT-V2.md.\n *\n * Two rules enforced here:\n * - **Judge evidence is epistemic.** A `judge-parse-failure` /\n * `judge-network-failure` is an infra failure, never a considered verdict,\n * and a degraded decisions-ledger read renders \"unknown\" via <Epistemic/>\n * instead of letting an empty array read as \"never judged\".\n * - **Nothing signed is ever printed.** Provenance shows WHETHER a proposal\n * carries a producer attestation, never the HMAC itself — the same rule\n * that keeps launcher commands and tokens off every Verse payload.\n */\nimport { useState } from 'react';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Epistemic } from '../../../components/primitives/Epistemic.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport type { DecisionEntry, JudgeDecisionReasonCode } from '../../../data/api-types.js';\nimport { hasMutationHold } from '../../../data/auth-store.js';\nimport { DispatchDisabledError } from '../../../data/client.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { approveProposal, rejectProposal } from '../../../data/mutations.js';\nimport { proposalDetailQuery } from '../../../data/queries.js';\nimport { ConfirmDialog } from '../../inbox/ConfirmDialog.js';\nimport { DiffViewer } from '../../inbox/DiffViewer.js';\n// Shell helpers, not autonomy/'s: 3.10 moves the Autonomy panels under Fleet\n// (C7), and the drawer that hosts this view must not break when they move.\nimport { describeActionError as describeControlError } from '../shell/guarded-action.js';\n// A pure text helper (no panel code): ISO instants → local time, \".;\" → \";\".\nimport { tidyProse } from '../autonomy/format.js';\nimport {\n describeApproveConsequence,\n describeDiffStats,\n engineOf,\n formatDiffStats,\n kindLabel,\n localStamp,\n longAgo,\n parseRunSummary,\n reachesRemote,\n readableTitle,\n repoName,\n} from './approvals-model.js';\nimport styles from './approvals.module.css';\n\nconst JUDGE_REASON_DISPLAY: Record<JudgeDecisionReasonCode, { label: string; tone: Tone }> = {\n 'judge-ship-would-merge': { label: 'Ship (would merge)', tone: 'success' },\n 'judge-ship-review-required': { label: 'Ship (review required)', tone: 'success' },\n 'judge-review': { label: 'Review', tone: 'warning' },\n 'judge-noise': { label: 'Noise', tone: 'neutral' },\n 'judge-harmful': { label: 'Harmful', tone: 'danger' },\n 'judge-verdict-unrecognized': { label: 'Unrecognized verdict', tone: 'unknown' },\n 'judge-parse-failure': { label: 'Judge parse failure — not a review', tone: 'unknown' },\n 'judge-network-failure': { label: 'Judge network failure — not a review', tone: 'unknown' },\n};\n\nfunction latestJudged(decisions: DecisionEntry[]): DecisionEntry | null {\n const judged = decisions.filter((d) => d.action === 'judged' && d.judgeReasonCode);\n if (judged.length === 0) return null;\n return judged.reduce((a, b) => (Date.parse(b.ts) > Date.parse(a.ts) ? b : a));\n}\n\ntype PendingAction = 'approve' | 'reject' | null;\n\nexport interface ApprovalDetailProps {\n id: string;\n dispatchEnabled: boolean;\n onDispatchDisabled: () => void;\n onDecided: () => void;\n}\n\nexport function ApprovalDetail({ id, dispatchEnabled, onDispatchDisabled, onDecided }: ApprovalDetailProps) {\n const query = useQuery(proposalDetailQuery(id));\n const [pendingAction, setPendingAction] = useState<PendingAction>(null);\n const [tokenPrompt, setTokenPrompt] = useState(false);\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [busy, setBusy] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n\n // Confirmation FIRST, then the token (SPEC-310C §1; the same order as the\n // Needs-you drawer's A / R keys — shell/guarded-action.tsx). An operator who\n // pressed Approve by mistake backs out at a prompt that says what is about\n // to happen, not at one asking for a secret.\n function requestAction(action: 'approve' | 'reject') {\n setActionError(null);\n setPendingAction(action);\n setConfirmOpen(true);\n }\n\n function closeTokenPrompt() {\n setTokenPrompt(false);\n // Live read — MutationTokenDialog closes synchronously after setToken().\n if (hasMutationHold()) {\n setConfirmOpen(true);\n void execute();\n } else {\n setPendingAction(null);\n }\n }\n\n function confirmAction() {\n if (!pendingAction) return;\n if (!hasMutationHold()) {\n setConfirmOpen(false);\n setTokenPrompt(true);\n return;\n }\n void execute();\n }\n\n async function execute() {\n if (!pendingAction) return;\n setBusy(true);\n setActionError(null);\n try {\n if (pendingAction === 'approve') await approveProposal(id);\n else await rejectProposal(id);\n setConfirmOpen(false);\n setPendingAction(null);\n onDecided();\n } catch (err) {\n if (err instanceof DispatchDisabledError) {\n setConfirmOpen(false);\n setPendingAction(null);\n onDispatchDisabled();\n } else {\n setActionError(describeControlError(err));\n }\n } finally {\n setBusy(false);\n }\n }\n\n if (query.status === 'loading') {\n return (\n <div className={styles.detail}>\n <SkeletonLine width=\"55%\" />\n <SkeletonLine width=\"30%\" />\n <SkeletonLine width=\"88%\" />\n </div>\n );\n }\n\n if (query.status === 'error' || !query.data) {\n return (\n <p className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Could not load this proposal.'}\n </p>\n );\n }\n\n const p = query.data;\n const evidence = p.decisionEvidence;\n const judged = latestJudged(evidence?.decisions ?? []);\n const judgeDisplay = judged?.judgeReasonCode ? JUDGE_REASON_DISPLAY[judged.judgeReasonCode] : null;\n const canDecide = p.status === 'pending' && dispatchEnabled;\n const engine = engineOf(p);\n const consequence = describeApproveConsequence(p.kind, p.repo);\n const title = readableTitle(p.title);\n const project = repoName(p.repo);\n const facts = parseRunSummary(p.summary);\n // The run facts are shown as stats; only what the summary says beyond them stays a sentence.\n const summaryText = facts ? facts.rest : p.summary ? tidyProse(p.summary) : null;\n\n return (\n <div className={styles.detail}>\n <header className={styles.detailHead}>\n <p className={styles.eyebrow}>\n {kindLabel(p.kind)}\n {title.eyebrow ? ` \\u00b7 ${title.eyebrow}` : ''}\n </p>\n {/* Two lines at most; the whole title (as the server sent it) is the tooltip. */}\n <h3 className={styles.detailTitle} title={p.title}>{title.text}</h3>\n <div className={styles.detailMeta}>\n <StatusBadge status={p.status} />\n {project ? (\n <span className={styles.project} title={p.repo ?? undefined}>{project}</span>\n ) : (\n <span>no repository</span>\n )}\n <span>{p.riskClass ? `${p.riskClass} risk` : 'risk unstated'}</span>\n {engine ? <code title=\"The model that produced this change\">{engine}</code> : null}\n <span title={localStamp(p.createdAt)}>created {longAgo(p.createdAt)}</span>\n {p.decidedAt ? <span title={localStamp(p.decidedAt)}>decided {longAgo(p.decidedAt)}</span> : null}\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n </div>\n {facts ? (\n <p className={styles.runFacts}>\n {/* aria-label on a plain span is ignored (a generic role cannot be\n named), so the glyphs are hidden and the sentence is real,\n visually-hidden text — NeedsYouRunFacts' pattern. */}\n <span className={styles.diffStats} aria-hidden=\"true\">\n {formatDiffStats(facts)}\n </span>\n <span className=\"visually-hidden\">{describeDiffStats(facts)}</span>\n <span aria-hidden=\"true\">·</span>\n <span className={styles.runSource} title={facts.sourceHint ?? undefined}>\n {facts.partial ? 'Partial \\u00b7 ' : ''}{facts.sourceLabel}\n </span>\n {engine === null ? (\n <>\n <span aria-hidden=\"true\">·</span>\n <code title=\"The model that produced this change\">{facts.model}</code>\n </>\n ) : null}\n </p>\n ) : null}\n {summaryText ? <p className={styles.summary}>{summaryText}</p> : null}\n </header>\n\n <section className={styles.block} aria-label=\"Evidence\">\n <h4 className={styles.blockTitle}>Evidence</h4>\n <dl className={styles.defs}>\n <dt>Judge verdict</dt>\n <dd>\n <Epistemic quality={evidence?.sourceQuality} label=\"judge verdict\">\n {judgeDisplay && judged?.judgeReasonCode ? (\n <StatusBadge status={judged.judgeReasonCode} tone={judgeDisplay.tone}>\n {judgeDisplay.label}\n </StatusBadge>\n ) : (\n <span className={styles.muted}>not yet judged</span>\n )}\n </Epistemic>\n </dd>\n\n <dt>Verification</dt>\n <dd>\n {p.verifyResult ? (\n <>\n <StatusBadge status={p.verifyResult.passed ? 'success' : 'failed'}>\n {p.verifyResult.passed ? 'passed' : 'failed'}\n </StatusBadge>\n {p.verifyResult.ran && p.verifyResult.ran.length > 0 ? (\n <span className={styles.muted}> · ran {p.verifyResult.ran.map((r) => r.kind).join(', ')}</span>\n ) : null}\n {!p.verifyResult.passed && p.verifyResult.failureCategory && p.verifyResult.failureCategory !== 'code' ? (\n <span className={styles.muted}> · {p.verifyResult.failureCategory} failure — the verifier itself, not the diff</span>\n ) : null}\n {p.verifyResult.failed && p.verifyResult.failed.length > 0 ? (\n <p className={styles.failedChecks}>failed: {p.verifyResult.failed.join(', ')}</p>\n ) : null}\n </>\n ) : (\n <span className={styles.muted}>not verified</span>\n )}\n </dd>\n\n {p.decisionReason ? (\n <>\n <dt>Decision reason</dt>\n <dd>{tidyProse(p.decisionReason)}</dd>\n </>\n ) : null}\n\n {p.evidenceOutcome ? (\n <>\n <dt>Gates</dt>\n <dd className={styles.muted}>\n {p.evidenceOutcome.gateCount ?? 0} gate{p.evidenceOutcome.gateCount === 1 ? '' : 's'}\n {p.evidenceOutcome.policyAction ? ` · policy ${p.evidenceOutcome.policyAction}` : ''}\n {p.evidenceOutcome.trustBasis ? ` · trust ${p.evidenceOutcome.trustBasis}` : ''}\n </dd>\n </>\n ) : null}\n\n {p.result ? (\n <>\n <dt>Result</dt>\n <dd>{tidyProse(p.result)}</dd>\n </>\n ) : null}\n </dl>\n </section>\n\n <section className={styles.block} aria-label=\"Provenance\">\n <h4 className={styles.blockTitle}>Provenance</h4>\n <dl className={styles.defs}>\n <dt>Produced by</dt>\n <dd>{engine ? <code>{engine}</code> : <span className={styles.muted}>unknown engine</span>}</dd>\n <dt>Origin</dt>\n <dd>{p.origin}</dd>\n {facts ? (\n <>\n <dt>How it was made</dt>\n <dd>\n <span title={facts.sourceHint ?? undefined}>{facts.sourceLabel}</span>\n {facts.sourceHint ? <p className={styles.hint}>{facts.sourceHint}</p> : null}\n </dd>\n </>\n ) : null}\n {p.repo ? (\n <>\n <dt>Repository</dt>\n <dd><code>{p.repo}</code></dd>\n </>\n ) : null}\n {p.workItemId ? (\n <>\n <dt>Work item</dt>\n <dd>\n <code>{p.workItemId}</code>\n </dd>\n </>\n ) : null}\n {p.runId ? (\n <>\n <dt>Run</dt>\n <dd>\n <code>{p.runId}</code>\n </dd>\n </>\n ) : null}\n <dt>Attestation</dt>\n <dd className={styles.muted}>\n {/* The signature itself is never rendered — only whether one exists. */}\n {p.producerProvenanceSig\n ? `signed by the sandboxed producer (v${p.producerProvenanceVersion ?? 2})`\n : p.provenanceSig\n ? 'legacy signature present'\n : 'unsigned — earns no positive routing credit'}\n {p.diffHash ? ' · diff hashed at signing time' : ''}\n </dd>\n </dl>\n </section>\n\n <section className={styles.block} aria-label=\"Diff\">\n <h4 className={styles.blockTitle}>Diff</h4>\n <DiffViewer diff={p.diff} proposalKind={p.kind} />\n </section>\n\n {p.status === 'pending' ? (\n <footer className={styles.actions}>\n <p className={styles.actionNote}>\n {dispatchEnabled ? consequence : 'Read-only session — approve and reject are unavailable without dispatch.'}\n </p>\n {actionError && !confirmOpen ? (\n <p className={styles.error} role=\"alert\">\n {actionError}\n </p>\n ) : null}\n <button type=\"button\" className={styles.reject} disabled={!canDecide || busy} onClick={() => requestAction('reject')}>\n Reject\n </button>\n <button type=\"button\" className={styles.approve} disabled={!canDecide || busy} onClick={() => requestAction('approve')}>\n Approve…\n </button>\n </footer>\n ) : (\n <footer className={styles.decided}>\n This proposal is already <strong>{p.status}</strong> — no further action is available.\n </footer>\n )}\n\n <MutationTokenDialog\n open={tokenPrompt}\n onClose={closeTokenPrompt}\n reason={\n pendingAction === 'approve'\n ? 'Approving a proposal writes to a real repository and requires the dispatch token.'\n : 'Rejecting a proposal requires the dispatch token.'\n }\n tokenHelp=\"the mutation token ashlr verse printed\"\n />\n\n <ConfirmDialog\n open={confirmOpen}\n onClose={() => {\n setConfirmOpen(false);\n setPendingAction(null);\n setActionError(null);\n }}\n title={\n pendingAction === 'approve'\n ? `Approve this ${p.kind} against ${project ?? 'the repository'}?`\n : 'Reject this proposal?'\n }\n body={\n pendingAction === 'approve' ? (\n <>\n <strong>{title.text}</strong>\n <br />\n {kindLabel(p.kind)} · <strong>{project ?? 'unknown repository'}</strong>\n {p.repo ? (\n <>\n <br />\n {/* The exact checkout the write lands in — the one place the full path belongs. */}\n <code>{p.repo}</code>\n </>\n ) : null}\n <br />\n <br />\n {consequence}\n {reachesRemote(p.kind) ? (\n <>\n <br />\n <br />\n This one leaves your machine.\n </>\n ) : null}\n </>\n ) : (\n <>\n This rejects <strong>{title.text}</strong> and discards it. It stays in history as rejected and is never\n applied.\n </>\n )\n }\n confirmLabel={pendingAction === 'approve' ? `Approve and ${reachesRemote(p.kind) ? 'open the pull request' : 'apply'}` : 'Reject'}\n // Approve is the irreversible one — a `pr` pushes a branch and opens a\n // real PR other people can see, a `patch` writes to disk now. Reject\n // only discards a proposal that stays in history. Putting the danger\n // styling on Reject trained the reflex that the red button is the safe\n // one; VERSE-CONTRACT-V2 calls Approve destructive explicitly.\n destructive={pendingAction === 'approve'}\n busy={busy}\n error={actionError}\n onConfirm={confirmAction}\n />\n </div>\n );\n}\n","/**\n * routes/verse/shell/needs-you-actions.ts — doing what a Needs-you item asks\n * (unit C1). One path for a drawer key (A / R / V / E), a drawer button and\n * the palette:\n *\n * 1. the action's route must be a same-origin `/api/` route\n * (isSafeApiRoute — checked again here, not only at the server's\n * producer boundary, because this is where the mutation token is sent);\n * 2. approve / reject / veto always confirm (the item's own copy, else a\n * generic one); other kinds only when the item carries copy;\n * 3. then the token, then the POST (guarded-action.tsx owns 2–3's order);\n * 4. on success the item is hidden at once (optimistic) and activity is\n * re-polled; it stays hidden until a poll no longer lists it, or 60 s.\n *\n * An action with no route (it needs Touch ID or a terminal) opens the item's\n * target instead — that is where the flow lives.\n */\nimport { useSyncExternalStore } from 'react';\nimport { isSafeApiRoute, type NeedsYouAction, type NeedsYouItem } from '../../../../core/verse/workbench-types.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate, invalidatePrefix } from '../../../data/cache.js';\nimport { ApiError, apiPost } from '../../../data/client.js';\nimport { requestGuarded } from './guarded-action.js';\nimport { ALWAYS_CONFIRM, confirmCopy, readableItemTitle } from './needs-you-model.js';\nimport { refreshActivity } from './useActivity.js';\n\n/** How long an acted-on item stays hidden while the server catches up. */\nexport const RESOLVED_HIDE_MS = 60_000;\n\nlet resolved = new Map<string, number>();\nconst listeners = new Set<() => void>();\n\nfunction emit(): void {\n for (const l of [...listeners]) l();\n}\n\nexport function markResolved(id: string, at: number = Date.now()): void {\n resolved = new Map(resolved).set(id, at);\n emit();\n}\n\n/** Drop marks the server has caught up with (the id is gone) or that are too old. */\nexport function pruneResolved(liveIds: ReadonlySet<string>, now: number = Date.now()): void {\n let changed = false;\n const next = new Map(resolved);\n for (const [id, at] of next) {\n if (!liveIds.has(id) || now - at > RESOLVED_HIDE_MS) {\n next.delete(id);\n changed = true;\n }\n }\n if (changed) {\n resolved = next;\n emit();\n }\n}\n\nexport function useResolvedIds(): ReadonlyMap<string, number> {\n return useSyncExternalStore(\n (l) => {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n () => resolved,\n () => resolved,\n );\n}\n\nexport function resetResolvedForTest(): void {\n resolved = new Map();\n emit();\n}\n\nexport interface ActionContext {\n /** Open the item's target (for an action with no route). */\n openTarget: (item: NeedsYouItem) => void;\n toast: (message: string, tone?: 'neutral' | 'success' | 'danger') => void;\n}\n\nfunction afterSuccess(item: NeedsYouItem): void {\n markResolved(item.id);\n if (item.source === 'approvals') {\n // The approvals list, the inbox badge and the proposal detail all read\n // these keys (data/mutations.ts approveProposal does the same).\n invalidate('inbox');\n invalidate('dashboard-snapshot');\n invalidatePrefix('inbox-list:');\n if (item.target.kind === 'approval') invalidate(`proposal-detail-${item.target.proposalId}`);\n }\n void refreshActivity();\n}\n\n/** Run `action` on `item` through confirm → token → POST. */\nexport function runNeedsYouAction(item: NeedsYouItem, action: NeedsYouAction, ctx: ActionContext): void {\n const request = action.request;\n if (!request) {\n ctx.openTarget(item);\n return;\n }\n if (!isSafeApiRoute(request.path)) {\n ctx.toast('That action points outside this app and was not sent.', 'danger');\n return;\n }\n const copy = confirmCopy(item, action);\n // The operator-facing title (\"fix the flaky snapshot test\"), not the raw\n // producer string (\"PR: fix the flaky snapshot test\") — same text the row shows.\n const title = readableItemTitle(item).text;\n const run = async () => {\n const token = getMutationToken();\n if (!token) throw new ApiError('Mutation token was rejected.', 401, request.path);\n await apiPost<unknown>(request.path, request.body, token);\n touchMutationHold();\n };\n const mustConfirm = ALWAYS_CONFIRM.has(action.kind) || copy !== null;\n requestGuarded({\n title: copy?.title ?? action.label,\n body: copy?.body ?? title,\n confirmLabel: copy?.confirmLabel ?? action.label,\n destructive: action.destructive,\n token: true,\n tokenReason: `${action.label} changes state on this machine and requires the dispatch token.`,\n skipConfirm: !mustConfirm,\n run,\n onDone: () => {\n afterSuccess(item);\n ctx.toast(`${action.label}: ${title}`, 'success');\n },\n onError: mustConfirm ? undefined : (message) => ctx.toast(message, 'danger'),\n });\n}\n","/**\n * routes/verse/shell/NeedsYouDrawer.tsx — ⌘J, the one inbox for everything\n * waiting on the operator (unit C1; SPEC-310C §1 \"Needs-you drawer\").\n *\n * splits All · Approvals · Fleet · Chats · Accounts (H / L)\n * list J / K move · ↩ open · A approve · R reject · V veto · E done\n * detail an approval reuses ApprovalDetail (diff, evidence, provenance);\n * anything else shows its argument, its deadline and its actions\n *\n * Every A / R / V goes through confirmation and then the mutation token\n * (needs-you-actions.ts → guarded-action.tsx) — keyboard triage is fast, but\n * never one keystroke from a real pull request.\n *\n * \"All clear\" is a claim, so it is only made for a split whose every producer\n * answered (needs-you-model splitCoverage). Otherwise the empty state names\n * who is not reporting — an empty list from a silent source is not good news.\n *\n * A right-hand sheet on a desktop window; a full-screen sheet below 480px.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button, IconButton } from '../../../components/primitives/Button.js';\nimport { useFocusTrap } from '../../../components/primitives/focus-trap.js';\nimport { IconExternalLink, IconX } from '../../../components/primitives/icons.js';\nimport { SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport { useToast } from '../../../components/primitives/Toast.js';\nimport type { VerseSeat } from '../../../data/api-types.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport {\n NEEDS_YOU_ACTION_KEYS,\n type NeedsYouActionKind,\n type NeedsYouItem,\n} from '../../../../core/verse/workbench-types.js';\nimport { ApprovalDetail } from '../approvals/ApprovalDetail.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { ReturnKeyIcon } from '../verse-icons.js';\nimport { verseBootstrapQuery } from '../verse-queries.js';\nimport {\n closeVerseOverlay,\n NEEDS_YOU_SPLITS,\n openVerseSession,\n sectionEntry,\n setVerseNeedsYouSplit,\n setVerseSection,\n type NeedsYouSplit,\n} from '../verse-ui-store.js';\nimport { matchCommand } from './command-catalog.js';\nimport { isGuardOpen } from './guarded-action.js';\nimport { markResolved, pruneResolved, runNeedsYouAction, useResolvedIds } from './needs-you-actions.js';\nimport {\n actionOf,\n describeSilence,\n itemsForSplit,\n needsYouRowView,\n runModelDisplayName,\n seatDisplayName,\n SPLIT_LABEL,\n splitCounts,\n splitCoverage,\n until,\n} from './needs-you-model.js';\nimport { NeedsYouList, NeedsYouRunFacts } from './NeedsYouList.js';\nimport { refreshActivity, useActivity } from './useActivity.js';\nimport { useViewport } from './viewport.js';\nimport styles from './NeedsYouDrawer.module.css';\n\n/** A section anchor for the surface an item points into (the shell reveals it: shell/reveal-anchor.ts). */\nexport { VERSE_ANCHOR_EVENT } from '../verse-ui-store.js';\n\nconst DRAWER_ACTION: Readonly<Record<string, NeedsYouActionKind>> = {\n 'drawer.approve': 'approve',\n 'drawer.reject': 'reject',\n 'drawer.veto': 'veto',\n 'drawer.done': 'done',\n};\n\nfunction isTextTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n return target.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(target.tagName);\n}\n\nexport function NeedsYouDrawer() {\n const ui = useVerseUi();\n const activity = useActivity();\n const toast = useToast();\n const bootstrap = useQuery(verseBootstrapQuery);\n const { compact } = useViewport();\n const resolved = useResolvedIds();\n const titleId = useId();\n const panelRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const detailRef = useRef<HTMLDivElement>(null);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [detailId, setDetailId] = useState<string | null>(null);\n const [dispatchDenied, setDispatchDenied] = useState(false);\n const [now, setNow] = useState(() => Date.now());\n\n // Countdowns (\"closes in 24m\") tick while the drawer is open; nothing else re-renders.\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), 15_000);\n return () => clearInterval(id);\n }, []);\n\n const data = activity.data;\n const liveItems = data?.needsYou;\n useEffect(() => {\n if (liveItems) pruneResolved(new Set(liveItems.map((i) => i.id)));\n }, [liveItems]);\n\n const all = useMemo(() => (liveItems ?? []).filter((i) => !resolved.has(i.id)), [liveItems, resolved]);\n const split = ui.needsYouSplit;\n const items = useMemo(() => itemsForSplit(all, split), [all, split]);\n const counts = useMemo(() => splitCounts(all), [all]);\n const coverage = splitCoverage(data?.sources ?? null, split);\n const dispatchEnabled = (bootstrap.data?.dispatchEnabled ?? true) && !dispatchDenied;\n\n // Open on the item the palette / a notification asked for.\n const focusId = ui.needsYouFocus;\n useEffect(() => {\n if (!focusId) return;\n const item = all.find((i) => i.id === focusId);\n if (!item) return;\n setSelectedId(item.id);\n setDetailId(item.id);\n }, [focusId, all]);\n\n // Keep the selection on a real row as items come and go.\n useEffect(() => {\n if (items.length === 0) {\n if (selectedId !== null) setSelectedId(null);\n return;\n }\n if (!selectedId || !items.some((i) => i.id === selectedId)) setSelectedId(items[0]!.id);\n }, [items, selectedId]);\n\n const detailItem = detailId ? all.find((i) => i.id === detailId) ?? null : null;\n useEffect(() => {\n // The item was resolved (here or elsewhere) while open: back to the list.\n if (detailId && !detailItem) setDetailId(null);\n }, [detailId, detailItem]);\n\n const closeDetail = useCallback(() => setDetailId(null), []);\n\n const trapClose = useCallback(() => {\n // Esc in a dialog opened FROM the drawer (a confirmation, the token\n // prompt) belongs to that dialog: every trap hears Escape, and this one\n // registered first.\n if (isGuardOpen() || document.querySelector('[aria-modal=\"true\"]:not([data-verse-overlay])')) return;\n if (detailId) closeDetail();\n else closeVerseOverlay();\n }, [detailId, closeDetail]);\n useFocusTrap({ open: true, containerRef: panelRef, onClose: trapClose, initialFocusRef: listRef });\n\n // Focus follows the view: into the detail when it opens, back to the list\n // when it closes (not on first mount — the focus trap places that).\n const detailWasOpen = useRef(false);\n useEffect(() => {\n if (detailId) {\n detailWasOpen.current = true;\n detailRef.current?.focus({ preventScroll: true });\n } else if (detailWasOpen.current) {\n detailWasOpen.current = false;\n listRef.current?.focus({ preventScroll: true });\n }\n }, [detailId]);\n\n // The list usually arrives AFTER the drawer opened (the first poll): the\n // trap focused the placeholder, which is then removed and focus falls to\n // <body>. Hand it to the list — unless the operator has moved it anywhere\n // real (a dialog opened from the drawer lives outside this panel).\n const hasItems = items.length > 0;\n useEffect(() => {\n if (!hasItems || detailId) return;\n const active = document.activeElement;\n if (active === null || active === document.body || active === panelRef.current) listRef.current?.focus({ preventScroll: true });\n }, [hasItems, detailId]);\n\n const openTarget = useCallback((item: NeedsYouItem) => {\n const target = item.target;\n switch (target.kind) {\n case 'approval':\n setSelectedId(item.id);\n setDetailId(item.id);\n return;\n case 'session':\n closeVerseOverlay();\n openVerseSession(target.sessionId);\n return;\n case 'section':\n closeVerseOverlay();\n setVerseSection(target.section, target.anchor);\n return;\n case 'seat':\n closeVerseOverlay();\n setVerseSection('apps', `seat:${target.seatId}`);\n return;\n case 'url':\n // https only (isNeedsYouItem), a new browsing context with no opener.\n window.open(target.url, '_blank', 'noopener,noreferrer');\n return;\n default:\n return;\n }\n }, []);\n\n const act = useCallback((item: NeedsYouItem, kind: NeedsYouActionKind) => {\n const action = actionOf(item, kind);\n if (!action) {\n toast.show(`Nothing to ${kind} on this item.`, 'neutral');\n return;\n }\n if (!dispatchEnabled && action.request) {\n toast.show('This server was started without dispatch — run `ashlr verse` to act.', 'neutral');\n return;\n }\n runNeedsYouAction(item, action, { openTarget, toast: toast.show });\n }, [dispatchEnabled, openTarget, toast]);\n\n function move(delta: 1 | -1) {\n if (items.length === 0) return;\n const at = Math.max(0, items.findIndex((i) => i.id === selectedId));\n const next = items[(at + delta + items.length) % items.length]!;\n setSelectedId(next.id);\n if (detailId) setDetailId(next.id);\n }\n\n function stepSplit(delta: 1 | -1) {\n const at = NEEDS_YOU_SPLITS.indexOf(split);\n const next = NEEDS_YOU_SPLITS[(at + delta + NEEDS_YOU_SPLITS.length) % NEEDS_YOU_SPLITS.length]!;\n setVerseNeedsYouSplit(next);\n setDetailId(null);\n }\n\n function onKeyDown(event: ReactKeyboardEvent<HTMLDivElement>) {\n if (event.defaultPrevented || isTextTarget(event.target)) return;\n // React bubbles through portals: a key typed in a dialog ApprovalDetail\n // opened (rendered outside this panel's DOM) is not a triage key.\n if (!(event.target instanceof Node) || !panelRef.current?.contains(event.target)) return;\n const command = matchCommand(event.nativeEvent, ['drawer']);\n if (!command) return;\n // A button inside the detail answers Enter itself; the drawer's Enter is\n // for the list.\n if (command.id === 'drawer.open' && event.target instanceof HTMLButtonElement) return;\n event.preventDefault();\n event.stopPropagation();\n const current = items.find((i) => i.id === (detailId ?? selectedId)) ?? null;\n switch (command.id) {\n case 'drawer.next':\n move(1);\n return;\n case 'drawer.prev':\n move(-1);\n return;\n case 'drawer.split-next':\n stepSplit(1);\n return;\n case 'drawer.split-prev':\n stepSplit(-1);\n return;\n case 'drawer.open':\n if (current) setDetailId(current.id);\n return;\n default: {\n const kind = DRAWER_ACTION[command.id];\n if (kind && current) act(current, kind);\n }\n }\n }\n\n const loading = !data && (activity.status === 'loading' || activity.status === 'idle');\n const unavailable = !data && activity.status === 'unavailable';\n\n return createPortal(\n <div className={styles.backdrop} onMouseDown={(e) => e.target === e.currentTarget && closeVerseOverlay()}>\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n className={styles.panel}\n data-presentation={compact ? 'full' : 'side'}\n data-verse-overlay=\"needs-you\"\n data-scope=\"drawer\"\n tabIndex={-1}\n onKeyDown={onKeyDown}\n >\n <header className={styles.head}>\n <h2 id={titleId} className={styles.title}>\n Needs you\n {data ? <span className={styles.titleCount}>{counts.all}</span> : null}\n </h2>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconX />} aria-label=\"Close Needs you\" onClick={closeVerseOverlay} />\n </header>\n\n <div\n role=\"tablist\"\n aria-label=\"Splits\"\n className={styles.splits}\n onKeyDown={(e) => {\n if (e.key !== 'ArrowRight' && e.key !== 'ArrowLeft') return;\n e.preventDefault();\n stepSplit(e.key === 'ArrowRight' ? 1 : -1);\n }}\n >\n {NEEDS_YOU_SPLITS.map((s: NeedsYouSplit) => (\n <button\n key={s}\n type=\"button\"\n role=\"tab\"\n aria-selected={s === split}\n tabIndex={s === split ? 0 : -1}\n className={styles.split}\n onClick={() => {\n setVerseNeedsYouSplit(s);\n setDetailId(null);\n }}\n >\n {SPLIT_LABEL[s]}\n <span className={styles.splitCount} aria-label={`${counts[s]} items`}>{counts[s]}</span>\n </button>\n ))}\n </div>\n\n <div className={styles.body}>\n {detailItem ? (\n <div ref={detailRef} className={styles.detail} tabIndex={-1} aria-label=\"Item detail\">\n <button type=\"button\" className={styles.back} onClick={closeDetail}>\n ‹ All {SPLIT_LABEL[split].toLowerCase()}\n </button>\n {detailItem.target.kind === 'approval' ? (\n <div className={styles.approval}>\n <ApprovalDetail\n key={detailItem.target.proposalId}\n id={detailItem.target.proposalId}\n dispatchEnabled={dispatchEnabled}\n onDispatchDisabled={() => setDispatchDenied(true)}\n onDecided={() => {\n markResolved(detailItem.id);\n void refreshActivity();\n closeDetail();\n }}\n />\n </div>\n ) : (\n <ItemDetail item={detailItem} now={now} seats={bootstrap.data?.seats ?? NO_SEATS} onAct={act} onOpenTarget={openTarget} dispatchEnabled={dispatchEnabled} />\n )}\n </div>\n ) : loading ? (\n <div className={styles.loading} role=\"status\" aria-label=\"Loading\">\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : unavailable ? (\n <div className={styles.empty}>\n <p className={styles.emptyTitle}>Needs you isn't available on this server</p>\n <p className={styles.emptyBody}>This build does not report activity yet, so nothing here can be vouched for. Approvals still work from the inbox.</p>\n </div>\n ) : items.length === 0 ? (\n <EmptySplit coverageText={describeSilence(coverage)} vouched={coverage.vouched} autonomyLabel={data?.autonomy?.label ?? null} split={split} />\n ) : (\n <NeedsYouList\n ref={listRef}\n items={items}\n selectedId={selectedId}\n onSelect={setSelectedId}\n // A click (or a tap — a phone has no J / K) opens the item;\n // the keyboard moves the selection without opening.\n onOpen={(id) => {\n setSelectedId(id);\n setDetailId(id);\n }}\n now={now}\n label={`${SPLIT_LABEL[split]} needing you`}\n />\n )}\n {/* The list holds the initial focus; with no list, the panel does. */}\n {items.length === 0 && !detailItem ? <div ref={listRef} tabIndex={-1} className={styles.focusSink} aria-hidden=\"true\" /> : null}\n </div>\n\n {!compact ? (\n <footer className={styles.foot} aria-hidden=\"true\">\n <span><kbd className={styles.key}>J</kbd><kbd className={styles.key}>K</kbd> move</span>\n <span><kbd className={styles.key}><ReturnKeyIcon /></kbd> open</span>\n <span><kbd className={styles.key}>A</kbd> approve</span>\n <span><kbd className={styles.key}>R</kbd> reject</span>\n <span><kbd className={styles.key}>V</kbd> veto</span>\n <span><kbd className={styles.key}>E</kbd> done</span>\n <span><kbd className={styles.key}>H</kbd><kbd className={styles.key}>L</kbd> splits</span>\n </footer>\n ) : null}\n {!coverage.vouched && items.length > 0 ? (\n <p className={styles.caveat} role=\"note\">{describeSilence(coverage)} — this list may be incomplete.</p>\n ) : null}\n </div>\n </div>,\n document.body,\n );\n}\n\nfunction EmptySplit({ vouched, coverageText, autonomyLabel, split }: { vouched: boolean; coverageText: string; autonomyLabel: string | null; split: NeedsYouSplit }) {\n if (vouched) {\n return (\n <div className={styles.empty} data-state=\"clear\">\n <span className={styles.clearMark} aria-hidden=\"true\" />\n <p className={styles.emptyTitle}>All clear</p>\n <p className={styles.emptyBody}>{autonomyLabel ? `Fleet: ${autonomyLabel}.` : 'Nothing is waiting on you.'}</p>\n </div>\n );\n }\n return (\n <div className={styles.empty} data-state=\"unknown\">\n <p className={styles.emptyTitle}>Nothing to show{split === 'all' ? '' : ` in ${SPLIT_LABEL[split]}`} — but it isn't an all-clear</p>\n <p className={styles.emptyBody}>{coverageText}.</p>\n </div>\n );\n}\n\nconst TARGET_LABEL = (item: NeedsYouItem): string | null => {\n switch (item.target.kind) {\n case 'session':\n return 'Open chat';\n case 'section':\n return `Open ${sectionEntry(item.target.section).label}`;\n case 'seat':\n return 'Open Apps & Accounts';\n case 'url':\n return 'Open on GitHub';\n default:\n return null;\n }\n};\n\nconst NO_SEATS: readonly VerseSeat[] = [];\n\nfunction ItemDetail({\n item,\n now,\n seats,\n onAct,\n onOpenTarget,\n dispatchEnabled,\n}: {\n item: NeedsYouItem;\n now: number;\n /** The roster (bootstrap), for naming the item's seat and its run's model. */\n seats: readonly VerseSeat[];\n onAct: (item: NeedsYouItem, kind: NeedsYouActionKind) => void;\n onOpenTarget: (item: NeedsYouItem) => void;\n dispatchEnabled: boolean;\n}) {\n const targetLabel = TARGET_LABEL(item);\n // The same readable text as the row (needs-you-model needsYouRowView), with room for the whole title.\n const view = needsYouRowView(item, now);\n // \"Claude Max\" and \"Fable 5.1\", never `claude-a` / `claude:claude-fable-5-1`\n // — the ids ride in tooltips (monospace only when the id is all we have).\n const seat = item.subject.seatId ? seatDisplayName(seats, item.subject.seatId) : null;\n const model = view.run ? runModelDisplayName(seats, view.run.model, item.subject.seatId) : null;\n return (\n <article className={styles.item}>\n <header className={styles.itemHead}>\n {view.kindLabel ? <p className={styles.rowKind}>{view.kindLabel}</p> : null}\n <h3 className={styles.itemTitle} title={view.fullTitle}>{view.title}</h3>\n {view.run ? <NeedsYouRunFacts run={view.run} /> : null}\n </header>\n {view.detail ? <p className={styles.itemDetail}>{view.detail}</p> : null}\n <dl className={styles.defs}>\n {view.repo ? (<><dt>Repo</dt><dd className={styles.repo} title={view.repoFull}>{view.repo}</dd></>) : null}\n {item.subject.pr ? (<><dt>Pull request</dt><dd>#{item.subject.pr}</dd></>) : null}\n {seat ? (<><dt>Seat</dt><dd className={seat.raw ? undefined : styles.mono} title={seat.raw}>{seat.text}</dd></>) : null}\n {model ? (<><dt>Model</dt><dd className={model.raw ? undefined : styles.mono} title={model.raw}>{model.text}</dd></>) : null}\n <dt>Raised</dt>\n <dd title={view.ageStamp}>{view.age}</dd>\n {item.expiresAt ? (<><dt>Closes</dt><dd className={styles.deadline}>{until(item.expiresAt, now)}</dd></>) : null}\n </dl>\n <div className={styles.itemActions}>\n {targetLabel ? (\n <Button variant=\"subtle\" size=\"sm\" onClick={() => onOpenTarget(item)} trailingIcon={item.target.kind === 'url' ? <IconExternalLink /> : undefined}>\n {targetLabel}\n </Button>\n ) : null}\n {item.actions.map((action) => {\n const key = NEEDS_YOU_ACTION_KEYS[action.kind];\n const needsDispatch = action.request !== null;\n return (\n <Button\n key={action.kind}\n size=\"sm\"\n variant={action.destructive ? 'danger' : action.kind === 'approve' ? 'primary' : 'subtle'}\n disabled={needsDispatch && !dispatchEnabled}\n onClick={() => onAct(item, action.kind)}\n aria-keyshortcuts={key}\n >\n {action.label}\n {key ? <kbd className={styles.inlineKey} aria-hidden=\"true\">{key}</kbd> : null}\n </Button>\n );\n })}\n </div>\n {!dispatchEnabled ? <p className={styles.caveat}>Read-only session — actions need `ashlr verse`.</p> : null}\n </article>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"NeedsYouDrawer-D992XTOn.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/approvals/approvals.module.css","../../../../../../src/web-ui/routes/verse/approvals/ApprovalDetail.tsx","../../../../../../src/web-ui/routes/verse/shell/needs-you-actions.ts","../../../../../../src/web-ui/routes/verse/shell/NeedsYouDrawer.tsx"],"sourcesContent":["/**\n * routes/verse/approvals/approvals.module.css — list + detail styling for the\n * Approvals surface. Same language as the cockpit: hairlines, no cards, tight\n * radii, Space Grotesk on identifiers and numerals, colour reserved for risk\n * and for the two irreversible buttons.\n */\n\n.layout { display: grid; grid-template-columns: minmax(320px, 420px) minmax(0, 1fr); min-height: 0; height: 100%; }\n.listPane { display: flex; flex-direction: column; min-height: 0; border-right: 1px solid var(--border-subtle); background: var(--bg-surface); }\n.detailPane { display: flex; flex-direction: column; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; background: var(--bg-canvas); }\n\n.filters { flex-shrink: 0; display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--border-subtle); }\n.filterField { display: flex; flex-direction: column; gap: var(--space-1); flex: 1; min-width: 120px; }\n.filterLabel { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); }\n.filters input {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n}\n\n/* The Select primitive renders its own <label>; restyle it to the uppercase\n micro-label the sibling text filters use so the row still reads as one\n group. Descendant element selector, so it stays module-scoped. */\n/* Layout comes from the primitive's own .field; this only matches the\n sibling text filters' flex behaviour. */\n.filterSelect { flex: 1; min-width: 120px; }\n.filterSelect > label {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-regular, 400);\n color: var(--text-tertiary);\n}\n\n/* WebKit paints its own clear affordance inside type=search, which is a\n default browser control (§7). Sidebar.module.css already resets it. */\n.filters input[type='search']::-webkit-search-cancel-button { appearance: none; }\n\n\n.count { flex-shrink: 0; display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); font-size: var(--text-xs-size); color: var(--text-tertiary); border-bottom: 1px solid var(--border-subtle); }\n\n.rows { flex: 1; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; }\n.row {\n display: grid;\n grid-template-columns: 2px minmax(0, 1fr);\n column-gap: var(--space-3);\n width: 100%;\n padding: var(--space-3) var(--space-4);\n border: 0;\n border-bottom: 1px solid var(--border-subtle);\n background: transparent;\n text-align: left;\n color: var(--text-primary);\n cursor: pointer;\n}\n.row:hover { background: var(--bg-hover); }\n.rowActive { background: var(--bg-selected); }\n/* Inset, because .rows scrolls (`overflow-y: auto`) and a full-width row's\n outward ring is clipped at the left and right edges. The global ring is\n silenced so only one paints. */\n.row:focus-visible { outline: 2px solid var(--border-focus); outline-offset: -2px; box-shadow: none; }\n.riskRule { grid-row: 1 / span 2; border-radius: var(--radius-full); background: var(--border-strong); }\n.riskRule[data-risk=\"high\"] { background: var(--status-danger-solid); }\n.riskRule[data-risk=\"medium\"] { background: var(--status-warning-solid); }\n.riskRule[data-risk=\"low\"] { background: var(--status-success-solid); }\n.rowTitle { font-size: var(--text-sm-size); line-height: var(--text-sm-line); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.rowMeta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-1) var(--space-3); margin-top: 2px; font-size: var(--text-xs-size); color: var(--text-tertiary); }\n/* --text-tertiary is a direct declaration on a CHILD, so the parent's\n :hover/[aria-current] colour change does not reach it — only the ground\n under it moves. Measured on --bg-selected it is 3.95:1 in light and 4.40:1\n in dark, both under the 4.5:1 floor in DESIGN-V2 §6; --text-secondary is\n 6.32:1 on the worst of them. design/tokens-contrast.test.ts now pins the\n token pair so the gap cannot reopen. */\n.row:hover .rowMeta,\n.rowActive .rowMeta { color: var(--text-secondary); }\n.rowMetaMono { font-family: var(--font-mono); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 14ch; }\n.rowAge { font-family: var(--font-display); }\n.riskWord { font-family: var(--font-display); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; font-size: var(--text-2xs-size, 11px); }\n.riskWord[data-risk=\"high\"] { color: var(--status-danger-fg); }\n.riskWord[data-risk=\"medium\"] { color: var(--status-warning-fg); }\n.riskWord[data-risk=\"low\"] { color: var(--status-success-fg); }\n\n/* --- detail ------------------------------------------------------------- */\n.detail { padding: var(--space-5) var(--space-6) var(--space-16); max-width: 1040px; }\n.detailHead { padding-bottom: var(--space-4); border-bottom: 1px solid var(--border-subtle); }\n.eyebrow { margin: 0 0 var(--space-1); font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); }\n/* Two lines at most, wrapped at word boundaries — a run title is a goal\n sentence and used to be cut mid-word. The full text rides in `title`. */\n.detailTitle {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-xl-size);\n line-height: var(--text-xl-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display, -0.02em);\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n overflow: hidden;\n overflow-wrap: break-word;\n}\n.project { font-weight: var(--font-weight-medium); color: var(--text-secondary); }\n.runFacts { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-1) var(--space-2); margin-top: var(--space-2); font-size: var(--text-sm-size); line-height: var(--text-sm-line); color: var(--text-secondary); }\n.runFacts code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.diffStats { font-family: var(--font-display); font-variant-numeric: tabular-nums; color: var(--text-primary); }\n.runSource[title] { text-decoration: underline dotted; text-underline-offset: 3px; cursor: help; }\n.hint { margin: var(--space-1) 0 0; font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-tertiary); max-width: 64ch; }\n.detailMeta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-3); margin-top: var(--space-2); font-size: var(--text-xs-size); color: var(--text-tertiary); }\n.detailMeta code { font-family: var(--font-mono); }\n.summary { margin-top: var(--space-3); font-size: var(--text-base-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 72ch; }\n\n.block { padding-block: var(--space-5); border-bottom: 1px solid var(--border-subtle); }\n.blockTitle {\n font-family: var(--font-display);\n font-size: var(--text-xs-size);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-semibold);\n color: var(--text-tertiary);\n margin-bottom: var(--space-3);\n}\n.defs { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: var(--space-2) var(--space-4); margin: 0; font-size: var(--text-sm-size); line-height: var(--text-sm-line); }\n.defs dt { color: var(--text-tertiary); }\n.defs dd { margin: 0; color: var(--text-primary); min-width: 0; overflow-wrap: anywhere; }\n.defs dd code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.muted { color: var(--text-tertiary); }\n.failedChecks { margin: var(--space-1) 0 0; font-family: var(--font-mono); font-size: var(--text-xs-size); color: var(--status-danger-fg); }\n\n.actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: var(--space-2); padding-top: var(--space-5); }\n.actionNote { flex: 1; min-width: 240px; font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); }\n.reject,\n.approve {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-4);\n border-radius: var(--radius-sm);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n}\n.reject { border: 1px solid var(--border-default); background: var(--bg-surface); color: var(--text-primary); }\n.reject:hover:not(:disabled) { border-color: var(--status-danger-solid); color: var(--status-danger-fg); }\n.approve { border: 1px solid var(--accent-500); background: var(--accent-500); color: var(--accent-contrast); }\n.approve:hover:not(:disabled) { background: var(--accent-600); border-color: var(--accent-600); }\n.reject:disabled,\n.approve:disabled { border-color: var(--border-default); background: var(--bg-surface); color: var(--text-disabled); cursor: not-allowed; }\n\n.decided { padding-top: var(--space-5); font-size: var(--text-sm-size); color: var(--text-secondary); }\n\n.empty { padding: var(--space-8) var(--space-6); font-size: var(--text-sm-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 62ch; }\n.emptyStrong { color: var(--text-primary); font-weight: var(--font-weight-medium); }\n.error { margin: var(--space-4); padding: var(--space-3); border: 1px solid var(--status-danger-solid); border-radius: var(--radius-sm); background: var(--status-danger-bg); color: var(--status-danger-fg); font-size: var(--text-sm-size); line-height: var(--text-sm-line); }\n.skeletons { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-4); }\n\n@media (max-width: 900px) {\n .layout { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(160px, 38%) minmax(0, 1fr); }\n .listPane { border-right: 0; border-bottom: 1px solid var(--border-subtle); }\n .detail { padding: var(--space-4) var(--space-4) var(--space-12); }\n}\n","/**\n * routes/verse/approvals/ApprovalDetail.tsx — everything a human needs before\n * deciding, and an approve path that cannot fire on one click.\n *\n * Reuses the inbox review machinery verbatim (`DiffViewer` + `diff-parser.ts`\n * + `highlight.ts`, and `ConfirmDialog`) rather than growing a second diff\n * renderer, per docs/VERSE-CONTRACT-V2.md.\n *\n * Two rules enforced here:\n * - **Judge evidence is epistemic.** A `judge-parse-failure` /\n * `judge-network-failure` is an infra failure, never a considered verdict,\n * and a degraded decisions-ledger read renders \"unknown\" via <Epistemic/>\n * instead of letting an empty array read as \"never judged\".\n * - **Nothing signed is ever printed.** Provenance shows WHETHER a proposal\n * carries a producer attestation, never the HMAC itself — the same rule\n * that keeps launcher commands and tokens off every Verse payload.\n */\nimport { useState } from 'react';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Epistemic } from '../../../components/primitives/Epistemic.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport type { DecisionEntry, JudgeDecisionReasonCode } from '../../../data/api-types.js';\nimport { hasMutationHold } from '../../../data/auth-store.js';\nimport { DispatchDisabledError } from '../../../data/client.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { approveProposal, rejectProposal } from '../../../data/mutations.js';\nimport { proposalDetailQuery } from '../../../data/queries.js';\nimport { ConfirmDialog } from '../../inbox/ConfirmDialog.js';\nimport { DiffViewer } from '../../inbox/DiffViewer.js';\n// Shell helpers, not autonomy/'s: 3.10 moves the Autonomy panels under Fleet\n// (C7), and the drawer that hosts this view must not break when they move.\nimport { describeActionError as describeControlError } from '../shell/guarded-action.js';\n// A pure text helper (no panel code): ISO instants → local time, \".;\" → \";\".\nimport { tidyProse } from '../autonomy/format.js';\nimport {\n describeApproveConsequence,\n describeDiffStats,\n engineOf,\n formatDiffStats,\n kindLabel,\n localStamp,\n longAgo,\n parseRunSummary,\n reachesRemote,\n readableTitle,\n repoName,\n} from './approvals-model.js';\nimport styles from './approvals.module.css';\n\nconst JUDGE_REASON_DISPLAY: Record<JudgeDecisionReasonCode, { label: string; tone: Tone }> = {\n 'judge-ship-would-merge': { label: 'Ship (would merge)', tone: 'success' },\n 'judge-ship-review-required': { label: 'Ship (review required)', tone: 'success' },\n 'judge-review': { label: 'Review', tone: 'warning' },\n 'judge-noise': { label: 'Noise', tone: 'neutral' },\n 'judge-harmful': { label: 'Harmful', tone: 'danger' },\n 'judge-verdict-unrecognized': { label: 'Unrecognized verdict', tone: 'unknown' },\n 'judge-parse-failure': { label: 'Judge parse failure — not a review', tone: 'unknown' },\n 'judge-network-failure': { label: 'Judge network failure — not a review', tone: 'unknown' },\n};\n\nfunction latestJudged(decisions: DecisionEntry[]): DecisionEntry | null {\n const judged = decisions.filter((d) => d.action === 'judged' && d.judgeReasonCode);\n if (judged.length === 0) return null;\n return judged.reduce((a, b) => (Date.parse(b.ts) > Date.parse(a.ts) ? b : a));\n}\n\ntype PendingAction = 'approve' | 'reject' | null;\n\nexport interface ApprovalDetailProps {\n id: string;\n dispatchEnabled: boolean;\n onDispatchDisabled: () => void;\n onDecided: () => void;\n}\n\nexport function ApprovalDetail({ id, dispatchEnabled, onDispatchDisabled, onDecided }: ApprovalDetailProps) {\n const query = useQuery(proposalDetailQuery(id));\n const [pendingAction, setPendingAction] = useState<PendingAction>(null);\n const [tokenPrompt, setTokenPrompt] = useState(false);\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [busy, setBusy] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n\n // Confirmation FIRST, then the token (SPEC-310C §1; the same order as the\n // Needs-you drawer's A / R keys — shell/guarded-action.tsx). An operator who\n // pressed Approve by mistake backs out at a prompt that says what is about\n // to happen, not at one asking for a secret.\n function requestAction(action: 'approve' | 'reject') {\n setActionError(null);\n setPendingAction(action);\n setConfirmOpen(true);\n }\n\n function closeTokenPrompt() {\n setTokenPrompt(false);\n // Live read — MutationTokenDialog closes synchronously after setToken().\n if (hasMutationHold()) {\n setConfirmOpen(true);\n void execute();\n } else {\n setPendingAction(null);\n }\n }\n\n function confirmAction() {\n if (!pendingAction) return;\n if (!hasMutationHold()) {\n setConfirmOpen(false);\n setTokenPrompt(true);\n return;\n }\n void execute();\n }\n\n async function execute() {\n if (!pendingAction) return;\n setBusy(true);\n setActionError(null);\n try {\n if (pendingAction === 'approve') await approveProposal(id);\n else await rejectProposal(id);\n setConfirmOpen(false);\n setPendingAction(null);\n onDecided();\n } catch (err) {\n if (err instanceof DispatchDisabledError) {\n setConfirmOpen(false);\n setPendingAction(null);\n onDispatchDisabled();\n } else {\n setActionError(describeControlError(err));\n }\n } finally {\n setBusy(false);\n }\n }\n\n if (query.status === 'loading') {\n return (\n <div className={styles.detail}>\n <SkeletonLine width=\"55%\" />\n <SkeletonLine width=\"30%\" />\n <SkeletonLine width=\"88%\" />\n </div>\n );\n }\n\n if (query.status === 'error' || !query.data) {\n return (\n <p className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Could not load this proposal.'}\n </p>\n );\n }\n\n const p = query.data;\n const evidence = p.decisionEvidence;\n const judged = latestJudged(evidence?.decisions ?? []);\n const judgeDisplay = judged?.judgeReasonCode ? JUDGE_REASON_DISPLAY[judged.judgeReasonCode] : null;\n const canDecide = p.status === 'pending' && dispatchEnabled;\n const engine = engineOf(p);\n const consequence = describeApproveConsequence(p.kind, p.repo);\n const title = readableTitle(p.title);\n const project = repoName(p.repo);\n const facts = parseRunSummary(p.summary);\n // The run facts are shown as stats; only what the summary says beyond them stays a sentence.\n const summaryText = facts ? facts.rest : p.summary ? tidyProse(p.summary) : null;\n\n return (\n <div className={styles.detail}>\n <header className={styles.detailHead}>\n <p className={styles.eyebrow}>\n {kindLabel(p.kind)}\n {title.eyebrow ? ` \\u00b7 ${title.eyebrow}` : ''}\n </p>\n {/* Two lines at most; the whole title (as the server sent it) is the tooltip. */}\n <h3 className={styles.detailTitle} title={p.title}>{title.text}</h3>\n <div className={styles.detailMeta}>\n <StatusBadge status={p.status} />\n {project ? (\n <span className={styles.project} title={p.repo ?? undefined}>{project}</span>\n ) : (\n <span>no repository</span>\n )}\n <span>{p.riskClass ? `${p.riskClass} risk` : 'risk unstated'}</span>\n {engine ? <code title=\"The model that produced this change\">{engine}</code> : null}\n <span title={localStamp(p.createdAt)}>created {longAgo(p.createdAt)}</span>\n {p.decidedAt ? <span title={localStamp(p.decidedAt)}>decided {longAgo(p.decidedAt)}</span> : null}\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n </div>\n {facts ? (\n <p className={styles.runFacts}>\n {/* aria-label on a plain span is ignored (a generic role cannot be\n named), so the glyphs are hidden and the sentence is real,\n visually-hidden text — NeedsYouRunFacts' pattern. */}\n <span className={styles.diffStats} aria-hidden=\"true\">\n {formatDiffStats(facts)}\n </span>\n <span className=\"visually-hidden\">{describeDiffStats(facts)}</span>\n <span aria-hidden=\"true\">·</span>\n <span className={styles.runSource} title={facts.sourceHint ?? undefined}>\n {facts.partial ? 'Partial \\u00b7 ' : ''}{facts.sourceLabel}\n </span>\n {engine === null ? (\n <>\n <span aria-hidden=\"true\">·</span>\n <code title=\"The model that produced this change\">{facts.model}</code>\n </>\n ) : null}\n </p>\n ) : null}\n {summaryText ? <p className={styles.summary}>{summaryText}</p> : null}\n </header>\n\n <section className={styles.block} aria-label=\"Evidence\">\n <h4 className={styles.blockTitle}>Evidence</h4>\n <dl className={styles.defs}>\n <dt>Judge verdict</dt>\n <dd>\n <Epistemic quality={evidence?.sourceQuality} label=\"judge verdict\">\n {judgeDisplay && judged?.judgeReasonCode ? (\n <StatusBadge status={judged.judgeReasonCode} tone={judgeDisplay.tone}>\n {judgeDisplay.label}\n </StatusBadge>\n ) : (\n <span className={styles.muted}>not yet judged</span>\n )}\n </Epistemic>\n </dd>\n\n <dt>Verification</dt>\n <dd>\n {p.verifyResult ? (\n <>\n <StatusBadge status={p.verifyResult.passed ? 'success' : 'failed'}>\n {p.verifyResult.passed ? 'passed' : 'failed'}\n </StatusBadge>\n {p.verifyResult.ran && p.verifyResult.ran.length > 0 ? (\n <span className={styles.muted}> · ran {p.verifyResult.ran.map((r) => r.kind).join(', ')}</span>\n ) : null}\n {!p.verifyResult.passed && p.verifyResult.failureCategory && p.verifyResult.failureCategory !== 'code' ? (\n <span className={styles.muted}> · {p.verifyResult.failureCategory} failure — the verifier itself, not the diff</span>\n ) : null}\n {p.verifyResult.failed && p.verifyResult.failed.length > 0 ? (\n <p className={styles.failedChecks}>failed: {p.verifyResult.failed.join(', ')}</p>\n ) : null}\n </>\n ) : (\n <span className={styles.muted}>not verified</span>\n )}\n </dd>\n\n {p.decisionReason ? (\n <>\n <dt>Decision reason</dt>\n <dd>{tidyProse(p.decisionReason)}</dd>\n </>\n ) : null}\n\n {p.evidenceOutcome ? (\n <>\n <dt>Gates</dt>\n <dd className={styles.muted}>\n {p.evidenceOutcome.gateCount ?? 0} gate{p.evidenceOutcome.gateCount === 1 ? '' : 's'}\n {p.evidenceOutcome.policyAction ? ` · policy ${p.evidenceOutcome.policyAction}` : ''}\n {p.evidenceOutcome.trustBasis ? ` · trust ${p.evidenceOutcome.trustBasis}` : ''}\n </dd>\n </>\n ) : null}\n\n {p.result ? (\n <>\n <dt>Result</dt>\n <dd>{tidyProse(p.result)}</dd>\n </>\n ) : null}\n </dl>\n </section>\n\n <section className={styles.block} aria-label=\"Provenance\">\n <h4 className={styles.blockTitle}>Provenance</h4>\n <dl className={styles.defs}>\n <dt>Produced by</dt>\n <dd>{engine ? <code>{engine}</code> : <span className={styles.muted}>unknown engine</span>}</dd>\n <dt>Origin</dt>\n <dd>{p.origin}</dd>\n {facts ? (\n <>\n <dt>How it was made</dt>\n <dd>\n <span title={facts.sourceHint ?? undefined}>{facts.sourceLabel}</span>\n {facts.sourceHint ? <p className={styles.hint}>{facts.sourceHint}</p> : null}\n </dd>\n </>\n ) : null}\n {p.repo ? (\n <>\n <dt>Repository</dt>\n <dd><code>{p.repo}</code></dd>\n </>\n ) : null}\n {p.workItemId ? (\n <>\n <dt>Work item</dt>\n <dd>\n <code>{p.workItemId}</code>\n </dd>\n </>\n ) : null}\n {p.runId ? (\n <>\n <dt>Run</dt>\n <dd>\n <code>{p.runId}</code>\n </dd>\n </>\n ) : null}\n <dt>Attestation</dt>\n <dd className={styles.muted}>\n {/* The signature itself is never rendered — only whether one exists. */}\n {p.producerProvenanceSig\n ? `signed by the sandboxed producer (v${p.producerProvenanceVersion ?? 2})`\n : p.provenanceSig\n ? 'legacy signature present'\n : 'unsigned — earns no positive routing credit'}\n {p.diffHash ? ' · diff hashed at signing time' : ''}\n </dd>\n </dl>\n </section>\n\n <section className={styles.block} aria-label=\"Diff\">\n <h4 className={styles.blockTitle}>Diff</h4>\n <DiffViewer diff={p.diff} proposalKind={p.kind} />\n </section>\n\n {p.status === 'pending' ? (\n <footer className={styles.actions}>\n <p className={styles.actionNote}>\n {dispatchEnabled ? consequence : 'Read-only session — approve and reject are unavailable without dispatch.'}\n </p>\n {actionError && !confirmOpen ? (\n <p className={styles.error} role=\"alert\">\n {actionError}\n </p>\n ) : null}\n <button type=\"button\" className={styles.reject} disabled={!canDecide || busy} onClick={() => requestAction('reject')}>\n Reject\n </button>\n <button type=\"button\" className={styles.approve} disabled={!canDecide || busy} onClick={() => requestAction('approve')}>\n Approve…\n </button>\n </footer>\n ) : (\n <footer className={styles.decided}>\n This proposal is already <strong>{p.status}</strong> — no further action is available.\n </footer>\n )}\n\n <MutationTokenDialog\n open={tokenPrompt}\n onClose={closeTokenPrompt}\n reason={\n pendingAction === 'approve'\n ? 'Approving a proposal writes to a real repository and requires the dispatch token.'\n : 'Rejecting a proposal requires the dispatch token.'\n }\n tokenHelp=\"the mutation token ashlr verse printed\"\n />\n\n <ConfirmDialog\n open={confirmOpen}\n onClose={() => {\n setConfirmOpen(false);\n setPendingAction(null);\n setActionError(null);\n }}\n title={\n pendingAction === 'approve'\n ? `Approve this ${p.kind} against ${project ?? 'the repository'}?`\n : 'Reject this proposal?'\n }\n body={\n pendingAction === 'approve' ? (\n <>\n <strong>{title.text}</strong>\n <br />\n {kindLabel(p.kind)} · <strong>{project ?? 'unknown repository'}</strong>\n {p.repo ? (\n <>\n <br />\n {/* The exact checkout the write lands in — the one place the full path belongs. */}\n <code>{p.repo}</code>\n </>\n ) : null}\n <br />\n <br />\n {consequence}\n {reachesRemote(p.kind) ? (\n <>\n <br />\n <br />\n This one leaves your machine.\n </>\n ) : null}\n </>\n ) : (\n <>\n This rejects <strong>{title.text}</strong> and discards it. It stays in history as rejected and is never\n applied.\n </>\n )\n }\n confirmLabel={pendingAction === 'approve' ? `Approve and ${reachesRemote(p.kind) ? 'open the pull request' : 'apply'}` : 'Reject'}\n // Approve is the irreversible one — a `pr` pushes a branch and opens a\n // real PR other people can see, a `patch` writes to disk now. Reject\n // only discards a proposal that stays in history. Putting the danger\n // styling on Reject trained the reflex that the red button is the safe\n // one; VERSE-CONTRACT-V2 calls Approve destructive explicitly.\n destructive={pendingAction === 'approve'}\n busy={busy}\n error={actionError}\n onConfirm={confirmAction}\n />\n </div>\n );\n}\n","/**\n * routes/verse/shell/needs-you-actions.ts — doing what a Needs-you item asks\n * (unit C1). One path for a drawer key (A / R / V / E), a drawer button and\n * the palette:\n *\n * 1. the action's route must be a same-origin `/api/` route\n * (isSafeApiRoute — checked again here, not only at the server's\n * producer boundary, because this is where the mutation token is sent);\n * 2. approve / reject / veto always confirm (the item's own copy, else a\n * generic one); other kinds only when the item carries copy;\n * 3. then the token, then the POST (guarded-action.tsx owns 2–3's order);\n * 4. on success the item is hidden at once (optimistic) and activity is\n * re-polled; it stays hidden until a poll no longer lists it, or 60 s.\n *\n * An action with no route (it needs Touch ID or a terminal) opens the item's\n * target instead — that is where the flow lives.\n */\nimport { useSyncExternalStore } from 'react';\nimport { isSafeApiRoute, type NeedsYouAction, type NeedsYouItem } from '../../../../core/verse/workbench-types.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate, invalidatePrefix } from '../../../data/cache.js';\nimport { ApiError, apiPost } from '../../../data/client.js';\nimport { requestGuarded } from './guarded-action.js';\nimport { ALWAYS_CONFIRM, confirmCopy, readableItemTitle } from './needs-you-model.js';\nimport { refreshActivity } from './useActivity.js';\n\n/** How long an acted-on item stays hidden while the server catches up. */\nexport const RESOLVED_HIDE_MS = 60_000;\n\nlet resolved = new Map<string, number>();\nconst listeners = new Set<() => void>();\n\nfunction emit(): void {\n for (const l of [...listeners]) l();\n}\n\nexport function markResolved(id: string, at: number = Date.now()): void {\n resolved = new Map(resolved).set(id, at);\n emit();\n}\n\n/** Drop marks the server has caught up with (the id is gone) or that are too old. */\nexport function pruneResolved(liveIds: ReadonlySet<string>, now: number = Date.now()): void {\n let changed = false;\n const next = new Map(resolved);\n for (const [id, at] of next) {\n if (!liveIds.has(id) || now - at > RESOLVED_HIDE_MS) {\n next.delete(id);\n changed = true;\n }\n }\n if (changed) {\n resolved = next;\n emit();\n }\n}\n\nexport function useResolvedIds(): ReadonlyMap<string, number> {\n return useSyncExternalStore(\n (l) => {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n () => resolved,\n () => resolved,\n );\n}\n\nexport function resetResolvedForTest(): void {\n resolved = new Map();\n emit();\n}\n\nexport interface ActionContext {\n /** Open the item's target (for an action with no route). */\n openTarget: (item: NeedsYouItem) => void;\n toast: (message: string, tone?: 'neutral' | 'success' | 'danger') => void;\n}\n\nfunction afterSuccess(item: NeedsYouItem): void {\n markResolved(item.id);\n if (item.source === 'approvals') {\n // The approvals list, the inbox badge and the proposal detail all read\n // these keys (data/mutations.ts approveProposal does the same).\n invalidate('inbox');\n invalidate('dashboard-snapshot');\n invalidatePrefix('inbox-list:');\n if (item.target.kind === 'approval') invalidate(`proposal-detail-${item.target.proposalId}`);\n }\n void refreshActivity();\n}\n\n/** Run `action` on `item` through confirm → token → POST. */\nexport function runNeedsYouAction(item: NeedsYouItem, action: NeedsYouAction, ctx: ActionContext): void {\n const request = action.request;\n if (!request) {\n ctx.openTarget(item);\n return;\n }\n if (!isSafeApiRoute(request.path)) {\n ctx.toast('That action points outside this app and was not sent.', 'danger');\n return;\n }\n const copy = confirmCopy(item, action);\n // The operator-facing title (\"fix the flaky snapshot test\"), not the raw\n // producer string (\"PR: fix the flaky snapshot test\") — same text the row shows.\n const title = readableItemTitle(item).text;\n const run = async () => {\n const token = getMutationToken();\n if (!token) throw new ApiError('Mutation token was rejected.', 401, request.path);\n await apiPost<unknown>(request.path, request.body, token);\n touchMutationHold();\n };\n const mustConfirm = ALWAYS_CONFIRM.has(action.kind) || copy !== null;\n requestGuarded({\n title: copy?.title ?? action.label,\n body: copy?.body ?? title,\n confirmLabel: copy?.confirmLabel ?? action.label,\n destructive: action.destructive,\n token: true,\n tokenReason: `${action.label} changes state on this machine and requires the dispatch token.`,\n skipConfirm: !mustConfirm,\n run,\n onDone: () => {\n afterSuccess(item);\n ctx.toast(`${action.label}: ${title}`, 'success');\n },\n onError: mustConfirm ? undefined : (message) => ctx.toast(message, 'danger'),\n });\n}\n","/**\n * routes/verse/shell/NeedsYouDrawer.tsx — ⌘J, the one inbox for everything\n * waiting on the operator (unit C1; SPEC-310C §1 \"Needs-you drawer\").\n *\n * splits All · Approvals · Fleet · Chats · Accounts (H / L)\n * list J / K move · ↩ open · A approve · R reject · V veto · E done\n * detail an approval reuses ApprovalDetail (diff, evidence, provenance);\n * anything else shows its argument, its deadline and its actions\n *\n * Every A / R / V goes through confirmation and then the mutation token\n * (needs-you-actions.ts → guarded-action.tsx) — keyboard triage is fast, but\n * never one keystroke from a real pull request.\n *\n * \"All clear\" is a claim, so it is only made for a split whose every producer\n * answered (needs-you-model splitCoverage). Otherwise the empty state names\n * who is not reporting — an empty list from a silent source is not good news.\n *\n * A right-hand sheet on a desktop window; a full-screen sheet below 480px.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button, IconButton } from '../../../components/primitives/Button.js';\nimport { useFocusTrap } from '../../../components/primitives/focus-trap.js';\nimport { IconExternalLink, IconX } from '../../../components/primitives/icons.js';\nimport { SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport { useToast } from '../../../components/primitives/Toast.js';\nimport type { VerseSeat } from '../../../data/api-types.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport {\n NEEDS_YOU_ACTION_KEYS,\n type NeedsYouActionKind,\n type NeedsYouItem,\n} from '../../../../core/verse/workbench-types.js';\nimport { ApprovalDetail } from '../approvals/ApprovalDetail.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { ReturnKeyIcon } from '../verse-icons.js';\nimport { verseBootstrapQuery } from '../verse-queries.js';\nimport {\n closeVerseOverlay,\n NEEDS_YOU_SPLITS,\n openVerseSession,\n sectionEntry,\n setVerseNeedsYouSplit,\n setVerseSection,\n type NeedsYouSplit,\n} from '../verse-ui-store.js';\nimport { matchCommand } from './command-catalog.js';\nimport { isGuardOpen } from './guarded-action.js';\nimport { markResolved, pruneResolved, runNeedsYouAction, useResolvedIds } from './needs-you-actions.js';\nimport {\n actionOf,\n describeSilence,\n itemsForSplit,\n needsYouRowView,\n runModelDisplayName,\n seatDisplayName,\n SPLIT_LABEL,\n splitCounts,\n splitCoverage,\n until,\n} from './needs-you-model.js';\nimport { NeedsYouList, NeedsYouRunFacts } from './NeedsYouList.js';\nimport { refreshActivity, useActivity } from './useActivity.js';\nimport { useViewport } from './viewport.js';\nimport styles from './NeedsYouDrawer.module.css';\n\n/** A section anchor for the surface an item points into (the shell reveals it: shell/reveal-anchor.ts). */\nexport { VERSE_ANCHOR_EVENT } from '../verse-ui-store.js';\n\nconst DRAWER_ACTION: Readonly<Record<string, NeedsYouActionKind>> = {\n 'drawer.approve': 'approve',\n 'drawer.reject': 'reject',\n 'drawer.veto': 'veto',\n 'drawer.done': 'done',\n};\n\nfunction isTextTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n return target.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(target.tagName);\n}\n\nexport function NeedsYouDrawer() {\n const ui = useVerseUi();\n const activity = useActivity();\n const toast = useToast();\n const bootstrap = useQuery(verseBootstrapQuery);\n const { compact } = useViewport();\n const resolved = useResolvedIds();\n const titleId = useId();\n const panelRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const detailRef = useRef<HTMLDivElement>(null);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [detailId, setDetailId] = useState<string | null>(null);\n const [dispatchDenied, setDispatchDenied] = useState(false);\n const [now, setNow] = useState(() => Date.now());\n\n // Countdowns (\"closes in 24m\") tick while the drawer is open; nothing else re-renders.\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), 15_000);\n return () => clearInterval(id);\n }, []);\n\n const data = activity.data;\n const liveItems = data?.needsYou;\n useEffect(() => {\n if (liveItems) pruneResolved(new Set(liveItems.map((i) => i.id)));\n }, [liveItems]);\n\n const all = useMemo(() => (liveItems ?? []).filter((i) => !resolved.has(i.id)), [liveItems, resolved]);\n const split = ui.needsYouSplit;\n const items = useMemo(() => itemsForSplit(all, split), [all, split]);\n const counts = useMemo(() => splitCounts(all), [all]);\n const coverage = splitCoverage(data?.sources ?? null, split);\n const dispatchEnabled = (bootstrap.data?.dispatchEnabled ?? true) && !dispatchDenied;\n\n // Open on the item the palette / a notification asked for.\n const focusId = ui.needsYouFocus;\n useEffect(() => {\n if (!focusId) return;\n const item = all.find((i) => i.id === focusId);\n if (!item) return;\n setSelectedId(item.id);\n setDetailId(item.id);\n }, [focusId, all]);\n\n // Keep the selection on a real row as items come and go.\n useEffect(() => {\n if (items.length === 0) {\n if (selectedId !== null) setSelectedId(null);\n return;\n }\n if (!selectedId || !items.some((i) => i.id === selectedId)) setSelectedId(items[0]!.id);\n }, [items, selectedId]);\n\n const detailItem = detailId ? all.find((i) => i.id === detailId) ?? null : null;\n useEffect(() => {\n // The item was resolved (here or elsewhere) while open: back to the list.\n if (detailId && !detailItem) setDetailId(null);\n }, [detailId, detailItem]);\n\n const closeDetail = useCallback(() => setDetailId(null), []);\n\n const trapClose = useCallback(() => {\n // Esc in a dialog opened FROM the drawer (a confirmation, the token\n // prompt) belongs to that dialog: every trap hears Escape, and this one\n // registered first.\n if (isGuardOpen() || document.querySelector('[aria-modal=\"true\"]:not([data-verse-overlay])')) return;\n if (detailId) closeDetail();\n else closeVerseOverlay();\n }, [detailId, closeDetail]);\n useFocusTrap({ open: true, containerRef: panelRef, onClose: trapClose, initialFocusRef: listRef });\n\n // Focus follows the view: into the detail when it opens, back to the list\n // when it closes (not on first mount — the focus trap places that).\n const detailWasOpen = useRef(false);\n useEffect(() => {\n if (detailId) {\n detailWasOpen.current = true;\n detailRef.current?.focus({ preventScroll: true });\n } else if (detailWasOpen.current) {\n detailWasOpen.current = false;\n listRef.current?.focus({ preventScroll: true });\n }\n }, [detailId]);\n\n // The list usually arrives AFTER the drawer opened (the first poll): the\n // trap focused the placeholder, which is then removed and focus falls to\n // <body>. Hand it to the list — unless the operator has moved it anywhere\n // real (a dialog opened from the drawer lives outside this panel).\n const hasItems = items.length > 0;\n useEffect(() => {\n if (!hasItems || detailId) return;\n const active = document.activeElement;\n if (active === null || active === document.body || active === panelRef.current) listRef.current?.focus({ preventScroll: true });\n }, [hasItems, detailId]);\n\n const openTarget = useCallback((item: NeedsYouItem) => {\n const target = item.target;\n switch (target.kind) {\n case 'approval':\n setSelectedId(item.id);\n setDetailId(item.id);\n return;\n case 'session':\n closeVerseOverlay();\n openVerseSession(target.sessionId);\n return;\n case 'section':\n closeVerseOverlay();\n setVerseSection(target.section, target.anchor);\n return;\n case 'seat':\n closeVerseOverlay();\n setVerseSection('apps', `seat:${target.seatId}`);\n return;\n case 'url':\n // https only (isNeedsYouItem), a new browsing context with no opener.\n window.open(target.url, '_blank', 'noopener,noreferrer');\n return;\n default:\n return;\n }\n }, []);\n\n const act = useCallback((item: NeedsYouItem, kind: NeedsYouActionKind) => {\n const action = actionOf(item, kind);\n if (!action) {\n toast.show(`Nothing to ${kind} on this item.`, 'neutral');\n return;\n }\n if (!dispatchEnabled && action.request) {\n toast.show('This server was started without dispatch — run `ashlr verse` to act.', 'neutral');\n return;\n }\n runNeedsYouAction(item, action, { openTarget, toast: toast.show });\n }, [dispatchEnabled, openTarget, toast]);\n\n function move(delta: 1 | -1) {\n if (items.length === 0) return;\n const at = Math.max(0, items.findIndex((i) => i.id === selectedId));\n const next = items[(at + delta + items.length) % items.length]!;\n setSelectedId(next.id);\n if (detailId) setDetailId(next.id);\n }\n\n function stepSplit(delta: 1 | -1) {\n const at = NEEDS_YOU_SPLITS.indexOf(split);\n const next = NEEDS_YOU_SPLITS[(at + delta + NEEDS_YOU_SPLITS.length) % NEEDS_YOU_SPLITS.length]!;\n setVerseNeedsYouSplit(next);\n setDetailId(null);\n }\n\n function onKeyDown(event: ReactKeyboardEvent<HTMLDivElement>) {\n if (event.defaultPrevented || isTextTarget(event.target)) return;\n // React bubbles through portals: a key typed in a dialog ApprovalDetail\n // opened (rendered outside this panel's DOM) is not a triage key.\n if (!(event.target instanceof Node) || !panelRef.current?.contains(event.target)) return;\n const command = matchCommand(event.nativeEvent, ['drawer']);\n if (!command) return;\n // A button inside the detail answers Enter itself; the drawer's Enter is\n // for the list.\n if (command.id === 'drawer.open' && event.target instanceof HTMLButtonElement) return;\n event.preventDefault();\n event.stopPropagation();\n const current = items.find((i) => i.id === (detailId ?? selectedId)) ?? null;\n switch (command.id) {\n case 'drawer.next':\n move(1);\n return;\n case 'drawer.prev':\n move(-1);\n return;\n case 'drawer.split-next':\n stepSplit(1);\n return;\n case 'drawer.split-prev':\n stepSplit(-1);\n return;\n case 'drawer.open':\n if (current) setDetailId(current.id);\n return;\n default: {\n const kind = DRAWER_ACTION[command.id];\n if (kind && current) act(current, kind);\n }\n }\n }\n\n const loading = !data && (activity.status === 'loading' || activity.status === 'idle');\n const unavailable = !data && activity.status === 'unavailable';\n\n return createPortal(\n <div className={styles.backdrop} onMouseDown={(e) => e.target === e.currentTarget && closeVerseOverlay()}>\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n className={styles.panel}\n data-presentation={compact ? 'full' : 'side'}\n data-verse-overlay=\"needs-you\"\n data-scope=\"drawer\"\n tabIndex={-1}\n onKeyDown={onKeyDown}\n >\n <header className={styles.head}>\n <h2 id={titleId} className={styles.title}>\n Needs you\n {data ? <span className={styles.titleCount}>{counts.all}</span> : null}\n </h2>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconX />} aria-label=\"Close Needs you\" onClick={closeVerseOverlay} />\n </header>\n\n <div\n role=\"tablist\"\n aria-label=\"Splits\"\n className={styles.splits}\n onKeyDown={(e) => {\n if (e.key !== 'ArrowRight' && e.key !== 'ArrowLeft') return;\n e.preventDefault();\n stepSplit(e.key === 'ArrowRight' ? 1 : -1);\n }}\n >\n {NEEDS_YOU_SPLITS.map((s: NeedsYouSplit) => (\n <button\n key={s}\n type=\"button\"\n role=\"tab\"\n aria-selected={s === split}\n tabIndex={s === split ? 0 : -1}\n className={styles.split}\n onClick={() => {\n setVerseNeedsYouSplit(s);\n setDetailId(null);\n }}\n >\n {SPLIT_LABEL[s]}\n <span className={styles.splitCount} aria-label={`${counts[s]} items`}>{counts[s]}</span>\n </button>\n ))}\n </div>\n\n <div className={styles.body}>\n {detailItem ? (\n <div ref={detailRef} className={styles.detail} tabIndex={-1} aria-label=\"Item detail\">\n <button type=\"button\" className={styles.back} onClick={closeDetail}>\n ‹ All {SPLIT_LABEL[split].toLowerCase()}\n </button>\n {detailItem.target.kind === 'approval' ? (\n <div className={styles.approval}>\n <ApprovalDetail\n key={detailItem.target.proposalId}\n id={detailItem.target.proposalId}\n dispatchEnabled={dispatchEnabled}\n onDispatchDisabled={() => setDispatchDenied(true)}\n onDecided={() => {\n markResolved(detailItem.id);\n void refreshActivity();\n closeDetail();\n }}\n />\n </div>\n ) : (\n <ItemDetail item={detailItem} now={now} seats={bootstrap.data?.seats ?? NO_SEATS} onAct={act} onOpenTarget={openTarget} dispatchEnabled={dispatchEnabled} />\n )}\n </div>\n ) : loading ? (\n <div className={styles.loading} role=\"status\" aria-label=\"Loading\">\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : unavailable ? (\n <div className={styles.empty}>\n <p className={styles.emptyTitle}>Needs you isn't available on this server</p>\n <p className={styles.emptyBody}>This build does not report activity yet, so nothing here can be vouched for. Approvals still work from the inbox.</p>\n </div>\n ) : items.length === 0 ? (\n <EmptySplit coverageText={describeSilence(coverage)} vouched={coverage.vouched} autonomyLabel={data?.autonomy?.label ?? null} split={split} />\n ) : (\n <NeedsYouList\n ref={listRef}\n items={items}\n selectedId={selectedId}\n onSelect={setSelectedId}\n // A click (or a tap — a phone has no J / K) opens the item;\n // the keyboard moves the selection without opening.\n onOpen={(id) => {\n setSelectedId(id);\n setDetailId(id);\n }}\n now={now}\n label={`${SPLIT_LABEL[split]} needing you`}\n />\n )}\n {/* The list holds the initial focus; with no list, the panel does. */}\n {items.length === 0 && !detailItem ? <div ref={listRef} tabIndex={-1} className={styles.focusSink} aria-hidden=\"true\" /> : null}\n </div>\n\n {!compact ? (\n <footer className={styles.foot} aria-hidden=\"true\">\n <span><kbd className={styles.key}>J</kbd><kbd className={styles.key}>K</kbd> move</span>\n <span><kbd className={styles.key}><ReturnKeyIcon /></kbd> open</span>\n <span><kbd className={styles.key}>A</kbd> approve</span>\n <span><kbd className={styles.key}>R</kbd> reject</span>\n <span><kbd className={styles.key}>V</kbd> veto</span>\n <span><kbd className={styles.key}>E</kbd> done</span>\n <span><kbd className={styles.key}>H</kbd><kbd className={styles.key}>L</kbd> splits</span>\n </footer>\n ) : null}\n {!coverage.vouched && items.length > 0 ? (\n <p className={styles.caveat} role=\"note\">{describeSilence(coverage)} — this list may be incomplete.</p>\n ) : null}\n </div>\n </div>,\n document.body,\n );\n}\n\nfunction EmptySplit({ vouched, coverageText, autonomyLabel, split }: { vouched: boolean; coverageText: string; autonomyLabel: string | null; split: NeedsYouSplit }) {\n if (vouched) {\n return (\n <div className={styles.empty} data-state=\"clear\">\n <span className={styles.clearMark} aria-hidden=\"true\" />\n <p className={styles.emptyTitle}>All clear</p>\n <p className={styles.emptyBody}>{autonomyLabel ? `Fleet: ${autonomyLabel}.` : 'Nothing is waiting on you.'}</p>\n </div>\n );\n }\n return (\n <div className={styles.empty} data-state=\"unknown\">\n <p className={styles.emptyTitle}>Nothing to show{split === 'all' ? '' : ` in ${SPLIT_LABEL[split]}`} — but it isn't an all-clear</p>\n <p className={styles.emptyBody}>{coverageText}.</p>\n </div>\n );\n}\n\nconst TARGET_LABEL = (item: NeedsYouItem): string | null => {\n switch (item.target.kind) {\n case 'session':\n return 'Open chat';\n case 'section':\n return `Open ${sectionEntry(item.target.section).label}`;\n case 'seat':\n return 'Open Apps & Accounts';\n case 'url':\n return 'Open on GitHub';\n default:\n return null;\n }\n};\n\nconst NO_SEATS: readonly VerseSeat[] = [];\n\nfunction ItemDetail({\n item,\n now,\n seats,\n onAct,\n onOpenTarget,\n dispatchEnabled,\n}: {\n item: NeedsYouItem;\n now: number;\n /** The roster (bootstrap), for naming the item's seat and its run's model. */\n seats: readonly VerseSeat[];\n onAct: (item: NeedsYouItem, kind: NeedsYouActionKind) => void;\n onOpenTarget: (item: NeedsYouItem) => void;\n dispatchEnabled: boolean;\n}) {\n const targetLabel = TARGET_LABEL(item);\n // The same readable text as the row (needs-you-model needsYouRowView), with room for the whole title.\n const view = needsYouRowView(item, now);\n // \"Claude Max\" and \"Fable 5.1\", never `claude-a` / `claude:claude-fable-5-1`\n // — the ids ride in tooltips (monospace only when the id is all we have).\n const seat = item.subject.seatId ? seatDisplayName(seats, item.subject.seatId) : null;\n const model = view.run ? runModelDisplayName(seats, view.run.model, item.subject.seatId) : null;\n return (\n <article className={styles.item}>\n <header className={styles.itemHead}>\n {view.kindLabel ? <p className={styles.rowKind}>{view.kindLabel}</p> : null}\n <h3 className={styles.itemTitle} title={view.fullTitle}>{view.title}</h3>\n {view.run ? <NeedsYouRunFacts run={view.run} /> : null}\n </header>\n {view.detail ? <p className={styles.itemDetail}>{view.detail}</p> : null}\n <dl className={styles.defs}>\n {view.repo ? (<><dt>Repo</dt><dd className={styles.repo} title={view.repoFull}>{view.repo}</dd></>) : null}\n {item.subject.pr ? (<><dt>Pull request</dt><dd>#{item.subject.pr}</dd></>) : null}\n {seat ? (<><dt>Seat</dt><dd className={seat.raw ? undefined : styles.mono} title={seat.raw}>{seat.text}</dd></>) : null}\n {model ? (<><dt>Model</dt><dd className={model.raw ? undefined : styles.mono} title={model.raw}>{model.text}</dd></>) : null}\n <dt>Raised</dt>\n <dd title={view.ageStamp}>{view.age}</dd>\n {item.expiresAt ? (<><dt>Closes</dt><dd className={styles.deadline}>{until(item.expiresAt, now)}</dd></>) : null}\n </dl>\n <div className={styles.itemActions}>\n {targetLabel ? (\n <Button variant=\"subtle\" size=\"sm\" onClick={() => onOpenTarget(item)} trailingIcon={item.target.kind === 'url' ? <IconExternalLink /> : undefined}>\n {targetLabel}\n </Button>\n ) : null}\n {item.actions.map((action) => {\n const key = NEEDS_YOU_ACTION_KEYS[action.kind];\n const needsDispatch = action.request !== null;\n return (\n <Button\n key={action.kind}\n size=\"sm\"\n variant={action.destructive ? 'danger' : action.kind === 'approve' ? 'primary' : 'subtle'}\n disabled={needsDispatch && !dispatchEnabled}\n onClick={() => onAct(item, action.kind)}\n aria-keyshortcuts={key}\n >\n {action.label}\n {key ? <kbd className={styles.inlineKey} aria-hidden=\"true\">{key}</kbd> : null}\n </Button>\n );\n })}\n </div>\n {!dispatchEnabled ? <p className={styles.caveat}>Read-only session — actions need `ashlr verse`.</p> : null}\n </article>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as e,c as t,n}from"./index-BG177cPN.js";import{Ut as r,Wt as i}from"./VerseConsoleApp-DeuBEvAO.js";import{h as a,n as o,p as s,v as c}from"./verse-model-CSzzdyu2.js";var l=t(e(),1);function u(e,t){let n=p(t)??`the target repository`;switch(e){case`pr`:return`Pushes a branch to ${n}'s remote and opens a real pull request. Other people can see it immediately, and this dialog cannot undo it.`;case`patch`:return`Writes the diff to ${n} on disk now. Nothing is pushed, but the working tree changes.`;default:return`Applies this ${String(e)} proposal to ${n} now.`}}function d(e){return e===`pr`}function f(e){return e.engineModel?e.engineModel:e.engineTier?e.engineTier:null}function p(e){if(typeof e!=`string`)return null;let t=e.trim().replace(/\/+$/,``);if(t.length===0)return null;let n=t.slice(t.lastIndexOf(`/`)+1);return n.length>0?n:t}var m={patch:`Patch`,pr:`Pull request`,deploy:`Deploy`,note:`Note`,"desktop-action":`Desktop action`,"browser-action":`Browser action`};function h(e){return m[e]??String(e)}function g(e){return e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1)}function _(e){let t=e.toLowerCase();return Object.prototype.hasOwnProperty.call(o,t)?o[t]:g(t)}function v(e){let t=e;return(t.match(/"/g)??[]).length%2==1&&(t+=`"`),(t.match(/\u201c/g)??[]).length>(t.match(/\u201d/g)??[]).length&&(t+=`”`),t}function y(e){let t=e.replace(/(?:\u2026|\.\.\.)$/,``),n=t.lastIndexOf(` `);return`${(n>0?t.slice(0,n):t).replace(/[\s,;:\-\u2013\u2014]+$/,``)}\u2026`}function b(e){let t=typeof e==`string`?e.trim():``,n=/^(\[partial\]\s*)?(claude|codex|grok|local|ollama|gemini|api[\w-]*) run:\s*(.*)$/is.exec(t),r=n?`${n[1]?`Partial `:``}${_(n[2])} run`:null,i=n?n[3]:t,a=/[\p{L}\p{N}](?:\u2026|\.\.\.)$/u.test(i),o=n!==null&&i.length>=80&&!/[.!?)"'\u201d\u2026]$/.test(i),s=a||o;return s&&(i=y(i)),i=v(i),{eyebrow:r,text:i.length>0?i:t,truncated:s}}var x=/^(Partial )?(.+?) (\S+) run produced (\d+) file\(s\) \(\+(\d+)\/-(\d+)\)\.?\s*([\s\S]*)$/,S=`TITRR — Test, Iterate, Test, Refine, Repeat: after its change the run re-ran the repository’s tests and repaired the change until they passed or it ran out of attempts.`;function C(e){if(/\bTITRR\b/.test(e)){let t=e.replace(/\bTITRR\b\s*/,``).trim();return{label:`Test-and-repair loop${t===`api-model`?` (API model)`:t===`api-model required-diff`?` (API model, retried for a missing diff)`:t===`api-model failed producer`?` (API model, producer failed)`:t.length>0?` (${t})`:``}`,hint:S}}return/^best-of-n/i.test(e)?{label:e,hint:`Several models attempted this change in parallel; a judge compared them.`}:e===`api-model`?{label:`API model run`,hint:null}:e===`Sandboxed`?{label:`Sandboxed run`,hint:`Produced in an isolated sandbox checkout; nothing touched your working tree.`}:{label:e,hint:null}}function w(e){if(typeof e!=`string`)return null;let t=x.exec(e.trim());if(!t)return null;let{label:n,hint:r}=C(t[2]),i=t[7].trim();return{partial:t[1]!==void 0,source:t[2],sourceLabel:n,sourceHint:r,model:t[3],files:Number(t[4]),insertions:Number(t[5]),deletions:Number(t[6]),rest:i.length>0?i:null}}function T(e){let t=e=>e.toLocaleString(`en-US`);return`${t(e.files)} ${e.files===1?`file`:`files`} \u00b7 +${t(e.insertions)} \u2212${t(e.deletions)}`}function E(e){let t=e=>e.toLocaleString(`en-US`);return`${t(e.files)} ${e.files===1?`file`:`files`} changed, ${t(e.insertions)} ${e.insertions===1?`line`:`lines`} added, ${t(e.deletions)} removed`}function D(e,t=Date.now()){if(typeof e!=`string`)return`at an unknown time`;let n=Date.parse(e);if(!Number.isFinite(n))return`at an unknown time`;let r=Math.max(0,Math.round((t-n)/1e3));if(r<45)return`just now`;let i=new Intl.RelativeTimeFormat(`en`,{numeric:`auto`}),a=Math.round(r/60);if(a<60)return i.format(-a,`minute`);let o=Math.round(a/60);if(o<24)return i.format(-o,`hour`);let s=Math.round(o/24);return s<=60?i.format(-s,`day`):`on ${new Date(n).toLocaleDateString(`en-US`,{month:`short`,day:`numeric`,year:`numeric`})}`}function O(e){if(typeof e!=`string`)return;let t=Date.parse(e);if(Number.isFinite(t))return new Date(t).toLocaleString([],{weekday:`short`,month:`short`,day:`numeric`,year:`numeric`,hour:`numeric`,minute:`2-digit`})}var k={all:`All`,approvals:`Approvals`,fleet:`Fleet`,chats:`Chats`,accounts:`Accounts`},A={all:[`approvals`,`authority`,`fleet`,`leader`,`chats`,`accounts`],approvals:[`approvals`,`fleet`,`leader`],fleet:[`authority`,`fleet`,`leader`],chats:[`chats`],accounts:[`accounts`]},j={approvals:`the approvals inbox`,authority:`the autonomy grant`,fleet:`the fleet`,leader:`the Leader`,chats:`chats`,accounts:`account health`};function M(e,t){return t===`all`?[...e]:e.filter(e=>i[e.kind]===t)}function N(e){let t={all:e.length,approvals:0,fleet:0,chats:0,accounts:0};for(let n of e)t[i[n.kind]]+=1;return t}function P(e,t){let n=[];for(let r of A[t]){let t=e?.[r]??`unavailable`;t!==`ok`&&n.push({source:r,name:j[r],state:t})}return{vouched:n.length===0,silent:n}}function F(e){let t=e.silent.map(e=>e.state===`error`?`${e.name} failed to answer`:`${e.name} isn't reporting in this build`);return t.length===0?``:t.length===1?I(t[0]):I(`${t.slice(0,-1).join(`, `)} and ${t[t.length-1]}`)}function I(e){return e.charAt(0).toUpperCase()+e.slice(1)}var L=new Set([`approve`,`reject`,`veto`]);function R(e,t){return e.actions.find(e=>e.kind===t)??null}var z={approve:{title:`Approve this?`,confirmLabel:`Approve`},reject:{title:`Reject this?`,confirmLabel:`Reject`},veto:{title:`Veto this action?`,confirmLabel:`Veto`}};function B(e,t){if(t.confirm)return t.confirm;if(t.kind===`approve`||t.kind===`reject`||t.kind===`veto`){let n=z[t.kind];return{title:n.title,body:H(e).text,confirmLabel:n.confirmLabel}}return null}var V=/^(PR|[a-z][a-z-]*):\s+([\s\S]+)$/;function H(e){let t=null,n=e.title;if(e.kind===`approval`){let r=V.exec(e.title.trim());r&&(t=r[1]===`PR`?`pr`:r[1],n=r[2])}let r=b(n),i=[t===null?null:h(t),r.eyebrow].filter(e=>e!==null);return{kindLabel:i.length>0?i.join(` · `):null,text:r.text}}function U(e,t=Date.now()){let n=H(e),r=w(e.detail),i=p(e.subject.repo);return{kindLabel:n.kindLabel,title:n.text,fullTitle:e.title,run:r?{stats:T(r),statsSpoken:E(r),source:r.sourceLabel,sourceHint:r.sourceHint,partial:r.partial,model:r.model}:null,detail:r?r.rest:e.detail,repo:i,repoFull:i!==null&&e.subject.repo!==null&&e.subject.repo!==i?e.subject.repo:void 0,age:D(e.since,t),ageStamp:O(e.since)}}function W(e,t=Date.now()){let n=Date.parse(e);if(!Number.isFinite(n))return`—`;let r=Math.round((n-t)/1e3);if(r<=0)return`expired`;if(r<90)return`in ${r}s`;let i=Math.round(r/60);if(i<90)return`in ${i}m`;let a=Math.round(i/60);return a<48?`in ${a}h`:`in ${Math.round(a/24)}d`}function G(e,t){let n=c(e,t)?.label;return n&&n!==t?{text:n,raw:t}:{text:t,raw:void 0}}function K(e,t,n){let r=t.indexOf(`:`),i=r>0?t.slice(0,r):``,o=s(i)?i:null,c=o?t.slice(r+1):t,l=[...n?[n]:[],...e.filter(e=>e.id!==n&&(o===null||e.engine===o)).map(e=>e.id)];for(let n of l){let r=a(e,{seatId:n,model:c})?.label;if(r&&r!==t)return{text:r,raw:t}}return{text:t,raw:void 0}}var q={backdrop:`_backdrop_r8c4w_4`,fade:`_fade_r8c4w_1`,panel:`_panel_r8c4w_14`,slide:`_slide_r8c4w_1`,rise:`_rise_r8c4w_1`,head:`_head_r8c4w_33`,title:`_title_r8c4w_43`,titleCount:`_titleCount_r8c4w_54`,splits:`_splits_r8c4w_62`,split:`_split_r8c4w_62`,splitCount:`_splitCount_r8c4w_86`,body:`_body_r8c4w_98`,rows:`_rows_r8c4w_106`,row:`_row_r8c4w_106`,rule:`_rule_r8c4w_125`,rowMain:`_rowMain_r8c4w_133`,rowKind:`_rowKind_r8c4w_138`,rowTitle:`_rowTitle_r8c4w_151`,runFacts:`_runFacts_r8c4w_164`,diffStats:`_diffStats_r8c4w_173`,runSource:`_runSource_r8c4w_174`,repo:`_repo_r8c4w_176`,rowMeta:`_rowMeta_r8c4w_178`,severity:`_severity_r8c4w_187`,mono:`_mono_r8c4w_196`,deadline:`_deadline_r8c4w_197`,rowKeys:`_rowKeys_r8c4w_199`,key:`_key_r8c4w_201`,inlineKey:`_inlineKey_r8c4w_202`,loading:`_loading_r8c4w_218`,empty:`_empty_r8c4w_220`,emptyTitle:`_emptyTitle_r8c4w_228`,emptyBody:`_emptyBody_r8c4w_235`,clearMark:`_clearMark_r8c4w_243`,focusSink:`_focusSink_r8c4w_263`,detail:`_detail_r8c4w_265`,back:`_back_r8c4w_4`,approval:`_approval_r8c4w_279`,item:`_item_r8c4w_281`,itemHead:`_itemHead_r8c4w_282`,itemTitle:`_itemTitle_r8c4w_284`,itemDetail:`_itemDetail_r8c4w_292`,defs:`_defs_r8c4w_299`,itemActions:`_itemActions_r8c4w_310`,foot:`_foot_r8c4w_312`,caveat:`_caveat_r8c4w_324`},J=n();function Y({run:e}){return(0,J.jsxs)(`span`,{className:q.runFacts,children:[(0,J.jsx)(`span`,{className:q.diffStats,"aria-hidden":`true`,children:e.stats}),(0,J.jsx)(`span`,{className:`visually-hidden`,children:e.statsSpoken}),(0,J.jsx)(`span`,{"aria-hidden":`true`,children:`·`}),(0,J.jsxs)(`span`,{className:q.runSource,title:e.sourceHint??void 0,children:[e.partial?`Partial · `:``,e.source]})]})}var X={high:`Urgent`,warn:`Soon`,info:`When you can`},Z={approvals:`Approval`,authority:`Autonomy`,fleet:`Fleet`,leader:`Leader`,chats:`Chat`,accounts:`Account`},Q=(0,l.forwardRef)(function({items:e,selectedId:t,onSelect:n,onOpen:i,now:a,label:o},s){let c=`verse-needs-you-list`,u=(0,l.useRef)(null);return(0,l.useEffect)(()=>{t&&[...u.current?.querySelectorAll(`[data-item-id]`)??[]].find(e=>e.dataset.itemId===t)?.scrollIntoView?.({block:`nearest`})},[t]),(0,J.jsx)(`div`,{ref:e=>{u.current=e,typeof s==`function`?s(e):s&&(s.current=e)},id:c,role:`listbox`,"aria-label":o,tabIndex:0,"aria-activedescendant":t?`${c}-${e.findIndex(e=>e.id===t)}`:void 0,className:q.rows,children:e.map((e,o)=>{let s=e.actions.map(e=>r[e.kind]).filter(e=>e!==void 0),l=U(e,a);return(0,J.jsxs)(`div`,{id:`${c}-${o}`,"data-item-id":e.id,role:`option`,"aria-selected":e.id===t,className:q.row,"data-severity":e.severity,onClick:()=>i(e.id),onMouseMove:()=>e.id!==t&&n(e.id),children:[(0,J.jsx)(`span`,{className:q.rule,"aria-hidden":`true`}),(0,J.jsxs)(`span`,{className:q.rowMain,children:[l.kindLabel?(0,J.jsx)(`span`,{className:q.rowKind,children:l.kindLabel}):null,(0,J.jsx)(`span`,{className:q.rowTitle,title:l.fullTitle,children:l.title}),l.run?(0,J.jsx)(Y,{run:l.run}):null,(0,J.jsxs)(`span`,{className:q.rowMeta,children:[(0,J.jsx)(`span`,{className:q.severity,"data-severity":e.severity,children:X[e.severity]}),(0,J.jsx)(`span`,{children:Z[e.source]}),l.repo?(0,J.jsx)(`span`,{className:q.repo,title:l.repoFull,children:l.repo}):null,e.subject.pr?(0,J.jsxs)(`span`,{children:[`#`,e.subject.pr]}):null,(0,J.jsx)(`span`,{title:l.ageStamp,children:l.age}),e.expiresAt?(0,J.jsxs)(`span`,{className:q.deadline,children:[`closes `,W(e.expiresAt,a)]}):null]})]}),e.id===t&&s.length>0?(0,J.jsx)(`span`,{className:q.rowKeys,"aria-hidden":`true`,children:s.map(e=>(0,J.jsx)(`kbd`,{className:q.key,children:e},e))}):null]},e.id)})})});export{D as C,p as D,b as E,O as S,d as T,u as _,k as a,T as b,F as c,H as d,K as f,W as g,P as h,L as i,M as l,N as m,Y as n,R as o,G as p,q as r,B as s,Q as t,U as u,E as v,w,h as x,f as y};
2
+ //# sourceMappingURL=NeedsYouList-eBOlJr0b.js.map