@ashlr/hub 3.13.0 → 3.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/dist/authority-surface.json +204 -124
  3. package/dist/build-identity.json +2 -2
  4. package/dist/cli/authority.js +112 -18
  5. package/dist/cli/authority.js.map +1 -1
  6. package/dist/cli/comms.d.ts +33 -19
  7. package/dist/cli/comms.js +128 -151
  8. package/dist/cli/comms.js.map +1 -1
  9. package/dist/cli/completions.js +1 -1
  10. package/dist/cli/completions.js.map +1 -1
  11. package/dist/cli/daemon.js +29 -0
  12. package/dist/cli/daemon.js.map +1 -1
  13. package/dist/cli/director.d.ts +8 -12
  14. package/dist/cli/director.js +17 -52
  15. package/dist/cli/director.js.map +1 -1
  16. package/dist/cli/fleet.js +4 -1
  17. package/dist/cli/fleet.js.map +1 -1
  18. package/dist/cli/help.js +1 -0
  19. package/dist/cli/help.js.map +1 -1
  20. package/dist/cli/leader.d.ts +27 -3
  21. package/dist/cli/leader.js +253 -4
  22. package/dist/cli/leader.js.map +1 -1
  23. package/dist/core/authority/server-enforcement.d.ts +110 -0
  24. package/dist/core/authority/server-enforcement.js +260 -0
  25. package/dist/core/authority/server-enforcement.js.map +1 -0
  26. package/dist/core/authority/standing-grant.d.ts +24 -4
  27. package/dist/core/authority/standing-grant.js +19 -3
  28. package/dist/core/authority/standing-grant.js.map +1 -1
  29. package/dist/core/cloud/timeline.js +13 -7
  30. package/dist/core/cloud/timeline.js.map +1 -1
  31. package/dist/core/comms/change-digest.d.ts +130 -0
  32. package/dist/core/comms/change-digest.js +451 -0
  33. package/dist/core/comms/change-digest.js.map +1 -0
  34. package/dist/core/comms/director-prompt.d.ts +4 -5
  35. package/dist/core/comms/director-prompt.js +4 -71
  36. package/dist/core/comms/director-prompt.js.map +1 -1
  37. package/dist/core/comms/director.d.ts +24 -61
  38. package/dist/core/comms/director.js +29 -382
  39. package/dist/core/comms/director.js.map +1 -1
  40. package/dist/core/comms/dispatch.d.ts +37 -12
  41. package/dist/core/comms/dispatch.js +244 -177
  42. package/dist/core/comms/dispatch.js.map +1 -1
  43. package/dist/core/comms/elon-dialogue.d.ts +23 -15
  44. package/dist/core/comms/elon-dialogue.js +36 -307
  45. package/dist/core/comms/elon-dialogue.js.map +1 -1
  46. package/dist/core/comms/fleet-pulse.js +4 -7
  47. package/dist/core/comms/fleet-pulse.js.map +1 -1
  48. package/dist/core/comms/handlers.d.ts +10 -6
  49. package/dist/core/comms/handlers.js +14 -48
  50. package/dist/core/comms/handlers.js.map +1 -1
  51. package/dist/core/comms/migrations.d.ts +47 -0
  52. package/dist/core/comms/migrations.js +125 -0
  53. package/dist/core/comms/migrations.js.map +1 -0
  54. package/dist/core/comms/requests.d.ts +32 -5
  55. package/dist/core/comms/requests.js +101 -5
  56. package/dist/core/comms/requests.js.map +1 -1
  57. package/dist/core/comms/telegram-channel.d.ts +104 -0
  58. package/dist/core/comms/telegram-channel.js +622 -0
  59. package/dist/core/comms/telegram-channel.js.map +1 -0
  60. package/dist/core/comms/telegram-thread-map.d.ts +56 -0
  61. package/dist/core/comms/telegram-thread-map.js +144 -0
  62. package/dist/core/comms/telegram-thread-map.js.map +1 -0
  63. package/dist/core/daemon/capacity-publisher.d.ts +8 -1
  64. package/dist/core/daemon/capacity-publisher.js +40 -2
  65. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  66. package/dist/core/daemon/loop.js +18 -4
  67. package/dist/core/daemon/loop.js.map +1 -1
  68. package/dist/core/daemon/tick-deadline.d.ts +44 -0
  69. package/dist/core/daemon/tick-deadline.js +83 -0
  70. package/dist/core/daemon/tick-deadline.js.map +1 -0
  71. package/dist/core/daemon/tick-hooks.d.ts +7 -0
  72. package/dist/core/daemon/tick-hooks.js.map +1 -1
  73. package/dist/core/daemon/tick-progress.d.ts +39 -0
  74. package/dist/core/daemon/tick-progress.js +194 -0
  75. package/dist/core/daemon/tick-progress.js.map +1 -0
  76. package/dist/core/dashboard.js +3 -1
  77. package/dist/core/dashboard.js.map +1 -1
  78. package/dist/core/fleet/fleet-merge-state.d.ts +6 -0
  79. package/dist/core/fleet/fleet-merge-state.js.map +1 -1
  80. package/dist/core/fleet/host-merge.d.ts +9 -0
  81. package/dist/core/fleet/host-merge.js +13 -2
  82. package/dist/core/fleet/host-merge.js.map +1 -1
  83. package/dist/core/fleet/merge-gates.d.ts +13 -0
  84. package/dist/core/fleet/merge-gates.js +14 -0
  85. package/dist/core/fleet/merge-gates.js.map +1 -1
  86. package/dist/core/fleet/mirrors.d.ts +162 -6
  87. package/dist/core/fleet/mirrors.js +1051 -49
  88. package/dist/core/fleet/mirrors.js.map +1 -1
  89. package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
  90. package/dist/core/fleet/standing-merge-pass.js +72 -1
  91. package/dist/core/fleet/standing-merge-pass.js.map +1 -1
  92. package/dist/core/fleet/status.d.ts +17 -0
  93. package/dist/core/fleet/status.js +22 -0
  94. package/dist/core/fleet/status.js.map +1 -1
  95. package/dist/core/fleet/tick-hooks-live.d.ts +1 -1
  96. package/dist/core/fleet/tick-hooks-live.js +13 -3
  97. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  98. package/dist/core/git.d.ts +17 -0
  99. package/dist/core/git.js +124 -25
  100. package/dist/core/git.js.map +1 -1
  101. package/dist/core/goals/open-goals.d.ts +47 -0
  102. package/dist/core/goals/open-goals.js +33 -0
  103. package/dist/core/goals/open-goals.js.map +1 -0
  104. package/dist/core/inbox/merge.d.ts +5 -0
  105. package/dist/core/inbox/merge.js +58 -2
  106. package/dist/core/inbox/merge.js.map +1 -1
  107. package/dist/core/integrations/locus.d.ts +28 -0
  108. package/dist/core/integrations/locus.js +155 -30
  109. package/dist/core/integrations/locus.js.map +1 -1
  110. package/dist/core/integrations/telegram-format.d.ts +40 -0
  111. package/dist/core/integrations/telegram-format.js +123 -0
  112. package/dist/core/integrations/telegram-format.js.map +1 -0
  113. package/dist/core/integrations/telegram.d.ts +60 -4
  114. package/dist/core/integrations/telegram.js +161 -28
  115. package/dist/core/integrations/telegram.js.map +1 -1
  116. package/dist/core/mcp-registry.d.ts +12 -0
  117. package/dist/core/mcp-registry.js +70 -0
  118. package/dist/core/mcp-registry.js.map +1 -1
  119. package/dist/core/observability/rollup.d.ts +12 -10
  120. package/dist/core/observability/rollup.js +44 -17
  121. package/dist/core/observability/rollup.js.map +1 -1
  122. package/dist/core/resources/connection-monitor.d.ts +9 -0
  123. package/dist/core/resources/connection-monitor.js +19 -9
  124. package/dist/core/resources/connection-monitor.js.map +1 -1
  125. package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
  126. package/dist/core/resources/quota-refresh-lease.js +34 -1
  127. package/dist/core/resources/quota-refresh-lease.js.map +1 -1
  128. package/dist/core/routing/budget-api.d.ts +7 -1
  129. package/dist/core/routing/budget-api.js +56 -2
  130. package/dist/core/routing/budget-api.js.map +1 -1
  131. package/dist/core/routing/readiness-types.d.ts +82 -0
  132. package/dist/core/routing/readiness-types.js +23 -0
  133. package/dist/core/routing/readiness-types.js.map +1 -0
  134. package/dist/core/routing/readiness.d.ts +103 -0
  135. package/dist/core/routing/readiness.js +480 -0
  136. package/dist/core/routing/readiness.js.map +1 -0
  137. package/dist/core/sandbox/confine.js +22 -1
  138. package/dist/core/sandbox/confine.js.map +1 -1
  139. package/dist/core/sandbox/policy.d.ts +23 -0
  140. package/dist/core/sandbox/policy.js +100 -0
  141. package/dist/core/sandbox/policy.js.map +1 -1
  142. package/dist/core/types.d.ts +13 -0
  143. package/dist/core/types.js.map +1 -1
  144. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  145. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
  146. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
  147. package/dist/core/usage/frontier-usage.d.ts +20 -2
  148. package/dist/core/usage/frontier-usage.js +75 -17
  149. package/dist/core/usage/frontier-usage.js.map +1 -1
  150. package/dist/core/verse/accounts.d.ts +45 -0
  151. package/dist/core/verse/accounts.js +246 -17
  152. package/dist/core/verse/accounts.js.map +1 -1
  153. package/dist/core/verse/apps-api.js +23 -11
  154. package/dist/core/verse/apps-api.js.map +1 -1
  155. package/dist/core/verse/apps.d.ts +11 -9
  156. package/dist/core/verse/apps.js +2 -2
  157. package/dist/core/verse/apps.js.map +1 -1
  158. package/dist/core/verse/authority-api.d.ts +8 -2
  159. package/dist/core/verse/authority-api.js +40 -5
  160. package/dist/core/verse/authority-api.js.map +1 -1
  161. package/dist/core/verse/autonomy-ladder.d.ts +172 -0
  162. package/dist/core/verse/autonomy-ladder.js +251 -0
  163. package/dist/core/verse/autonomy-ladder.js.map +1 -0
  164. package/dist/core/verse/context-fit.js +7 -5
  165. package/dist/core/verse/context-fit.js.map +1 -1
  166. package/dist/core/verse/control-api.d.ts +23 -1
  167. package/dist/core/verse/control-api.js +117 -10
  168. package/dist/core/verse/control-api.js.map +1 -1
  169. package/dist/core/verse/fleet-live-api.js +13 -5
  170. package/dist/core/verse/fleet-live-api.js.map +1 -1
  171. package/dist/core/verse/folder-io.d.ts +50 -0
  172. package/dist/core/verse/folder-io.js +142 -0
  173. package/dist/core/verse/folder-io.js.map +1 -0
  174. package/dist/core/verse/git-api.js +5 -4
  175. package/dist/core/verse/git-api.js.map +1 -1
  176. package/dist/core/verse/git-ops.d.ts +10 -1
  177. package/dist/core/verse/git-ops.js +18 -2
  178. package/dist/core/verse/git-ops.js.map +1 -1
  179. package/dist/core/verse/github-api.d.ts +1 -1
  180. package/dist/core/verse/github-api.js +5 -4
  181. package/dist/core/verse/github-api.js.map +1 -1
  182. package/dist/core/verse/github-repo.js +118 -14
  183. package/dist/core/verse/github-repo.js.map +1 -1
  184. package/dist/core/verse/leader-api.d.ts +5 -4
  185. package/dist/core/verse/leader-api.js +237 -10
  186. package/dist/core/verse/leader-api.js.map +1 -1
  187. package/dist/core/verse/local-models.d.ts +10 -0
  188. package/dist/core/verse/local-models.js +10 -1
  189. package/dist/core/verse/local-models.js.map +1 -1
  190. package/dist/core/verse/login-path.d.ts +73 -0
  191. package/dist/core/verse/login-path.js +123 -14
  192. package/dist/core/verse/login-path.js.map +1 -1
  193. package/dist/core/verse/mcp-control-api.js +4 -4
  194. package/dist/core/verse/mcp-control-api.js.map +1 -1
  195. package/dist/core/verse/mcp-scope.d.ts +22 -0
  196. package/dist/core/verse/mcp-scope.js +41 -1
  197. package/dist/core/verse/mcp-scope.js.map +1 -1
  198. package/dist/core/verse/mcp-seat-view.d.ts +10 -0
  199. package/dist/core/verse/mcp-seat-view.js +30 -4
  200. package/dist/core/verse/mcp-seat-view.js.map +1 -1
  201. package/dist/core/verse/overnight-api.js +20 -2
  202. package/dist/core/verse/overnight-api.js.map +1 -1
  203. package/dist/core/verse/path-guard.d.ts +24 -0
  204. package/dist/core/verse/path-guard.js +91 -22
  205. package/dist/core/verse/path-guard.js.map +1 -1
  206. package/dist/core/verse/preview-api.js +22 -0
  207. package/dist/core/verse/preview-api.js.map +1 -1
  208. package/dist/core/verse/projects.d.ts +21 -0
  209. package/dist/core/verse/projects.js +82 -0
  210. package/dist/core/verse/projects.js.map +1 -1
  211. package/dist/core/verse/session-controls-api.js +5 -3
  212. package/dist/core/verse/session-controls-api.js.map +1 -1
  213. package/dist/core/verse/session-handoff.d.ts +26 -0
  214. package/dist/core/verse/session-handoff.js +90 -12
  215. package/dist/core/verse/session-handoff.js.map +1 -1
  216. package/dist/core/verse/terminal-api.js +7 -4
  217. package/dist/core/verse/terminal-api.js.map +1 -1
  218. package/dist/core/verse/terminal.js +9 -5
  219. package/dist/core/verse/terminal.js.map +1 -1
  220. package/dist/core/verse/verse-api.js +81 -27
  221. package/dist/core/verse/verse-api.js.map +1 -1
  222. package/dist/core/verse/workspaces.d.ts +51 -0
  223. package/dist/core/verse/workspaces.js +177 -47
  224. package/dist/core/verse/workspaces.js.map +1 -1
  225. package/dist/core/vision/leader-apply.d.ts +40 -0
  226. package/dist/core/vision/leader-apply.js +101 -30
  227. package/dist/core/vision/leader-apply.js.map +1 -1
  228. package/dist/core/vision/leader-cadence.d.ts +114 -0
  229. package/dist/core/vision/leader-cadence.js +127 -0
  230. package/dist/core/vision/leader-cadence.js.map +1 -0
  231. package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
  232. package/dist/core/vision/leader-goal-evidence.js +36 -0
  233. package/dist/core/vision/leader-goal-evidence.js.map +1 -0
  234. package/dist/core/vision/leader-health.d.ts +53 -0
  235. package/dist/core/vision/leader-health.js +92 -0
  236. package/dist/core/vision/leader-health.js.map +1 -0
  237. package/dist/core/vision/leader-operator.d.ts +176 -0
  238. package/dist/core/vision/leader-operator.js +355 -0
  239. package/dist/core/vision/leader-operator.js.map +1 -0
  240. package/dist/core/vision/leader-run-chain.d.ts +41 -0
  241. package/dist/core/vision/leader-run-chain.js +54 -0
  242. package/dist/core/vision/leader-run-chain.js.map +1 -0
  243. package/dist/core/vision/leader-seat-plan.d.ts +68 -0
  244. package/dist/core/vision/leader-seat-plan.js +93 -0
  245. package/dist/core/vision/leader-seat-plan.js.map +1 -0
  246. package/dist/core/vision/leader-seat.d.ts +71 -5
  247. package/dist/core/vision/leader-seat.js +235 -33
  248. package/dist/core/vision/leader-seat.js.map +1 -1
  249. package/dist/core/vision/leader-thread-types.d.ts +104 -0
  250. package/dist/core/vision/leader-thread-types.js +9 -0
  251. package/dist/core/vision/leader-thread-types.js.map +1 -0
  252. package/dist/core/vision/leader-thread.d.ts +138 -0
  253. package/dist/core/vision/leader-thread.js +926 -0
  254. package/dist/core/vision/leader-thread.js.map +1 -0
  255. package/dist/core/vision/leader-types.d.ts +75 -1
  256. package/dist/core/vision/leader.d.ts +88 -18
  257. package/dist/core/vision/leader.js +269 -69
  258. package/dist/core/vision/leader.js.map +1 -1
  259. package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js → ActionMenu-CIiX2X8w.js} +2 -2
  260. package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
  261. package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
  262. package/dist/core/web/public/next/assets/{Advanced-cVYTAsfB.js.map → Advanced-DHsysoIL.js.map} +1 -1
  263. package/dist/core/web/public/next/assets/{App-IsaWDsdF.js → App-CMeAocmW.js} +5 -5
  264. package/dist/core/web/public/next/assets/{App-IsaWDsdF.js.map → App-CMeAocmW.js.map} +1 -1
  265. package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
  266. package/dist/core/web/public/next/assets/{AppsSection-DDqeSrty.js.map → AppsSection-DISYnMnc.js.map} +1 -1
  267. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
  268. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
  269. package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js → AutonomyOffState-CEPSZToP.js} +3 -3
  270. package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js.map → AutonomyOffState-CEPSZToP.js.map} +1 -1
  271. package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
  272. package/dist/core/web/public/next/assets/{AutonomySection-Dwn8UtOy.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
  273. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
  274. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
  275. package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js → BranchBar-BxhdiIpx.js} +2 -2
  276. package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
  277. package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js → BudgetControl-C-0KhjRS.js} +2 -2
  278. package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js.map → BudgetControl-C-0KhjRS.js.map} +1 -1
  279. package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js → Button-D90dzI_o.js} +2 -2
  280. package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js.map → Button-D90dzI_o.js.map} +1 -1
  281. package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js → CapacityStrip-qKDBC65C.js} +2 -2
  282. package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
  283. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
  284. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
  285. package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
  286. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
  287. package/dist/core/web/public/next/assets/{ChatSection-C9myY4ei.js.map → ChatSection-DlT4QU6a.js.map} +1 -1
  288. package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
  289. package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
  290. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
  291. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
  292. package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
  293. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
  294. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
  295. package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
  296. package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
  297. package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js → DeleteChatDialog-BCfP12GH.js} +2 -2
  298. package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
  299. package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js → Dialog-D3msQlCj.js} +2 -2
  300. package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js.map → Dialog-D3msQlCj.js.map} +1 -1
  301. package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js → DiffPane-Ix6hvXlY.js} +2 -2
  302. package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
  303. package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js → DiffViewer-C4WKsCIe.js} +2 -2
  304. package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
  305. package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
  306. package/dist/core/web/public/next/assets/{DockHost-BcEq2qaS.js.map → DockHost-aWP7liri.js.map} +1 -1
  307. package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js → EmptyState-D2IRy3Cg.js} +2 -2
  308. package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
  309. package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js → Epistemic-DMr18muX.js} +2 -2
  310. package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js.map → Epistemic-DMr18muX.js.map} +1 -1
  311. package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js → EvidenceTimeline-DXmmz6Fi.js} +2 -2
  312. package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js.map → EvidenceTimeline-DXmmz6Fi.js.map} +1 -1
  313. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
  314. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
  315. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
  316. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
  317. package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js → GearTray-Dt-ee32-.js} +2 -2
  318. package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js.map → GearTray-Dt-ee32-.js.map} +1 -1
  319. package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
  320. package/dist/core/web/public/next/assets/{GrowthSection-BvZezOsX.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
  321. package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js → HandoffDialog-CLJQLe7M.js} +2 -2
  322. package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
  323. package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js → Input-D_KRJA9V.js} +2 -2
  324. package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js.map → Input-D_KRJA9V.js.map} +1 -1
  325. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
  326. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
  327. package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
  328. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
  329. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
  330. package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
  331. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
  332. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
  333. package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
  334. package/dist/core/web/public/next/assets/{McpSection-nuXer4K-.js.map → McpSection-DGbRcyv8.js.map} +1 -1
  335. package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js → MessageMarkdown-DFvk06qG.js} +3 -3
  336. package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
  337. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
  338. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
  339. package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js → Meter-CMj-VafN.js} +2 -2
  340. package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js.map → Meter-CMj-VafN.js.map} +1 -1
  341. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
  342. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
  343. package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
  344. package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
  345. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
  346. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
  347. package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js → NeedsYouList-CCsijdWt.js} +2 -2
  348. package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
  350. package/dist/core/web/public/next/assets/{NewChatDialog-BqFTWgHU.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
  351. package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js → OnboardingFlow-Cy9BA9eR.js} +3 -3
  352. package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js.map → OnboardingFlow-Cy9BA9eR.js.map} +1 -1
  353. package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
  354. package/dist/core/web/public/next/assets/{OnboardingGate-BZafM1Vf.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
  355. package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
  356. package/dist/core/web/public/next/assets/{PreviewPane-zT3gK9TD.js.map → PreviewPane-COid5A0f.js.map} +1 -1
  357. package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js → ProviderLogo-Cq-CYIwT.js} +2 -2
  358. package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
  359. package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js → RailStatus-Co5UB6We.js} +2 -2
  360. package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js.map → RailStatus-Co5UB6We.js.map} +1 -1
  361. package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js → RefreshIndicator-DO9ibnSq.js} +2 -2
  362. package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
  363. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
  364. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CAxPQ4sZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
  365. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
  366. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
  367. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
  368. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
  369. package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
  370. package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
  371. package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
  372. package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
  373. package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
  374. package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js → SeatSelector-J5R3zDkB.js} +3 -3
  375. package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
  376. package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js → Segmented-CGh_-tBb.js} +2 -2
  377. package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js.map → Segmented-CGh_-tBb.js.map} +1 -1
  378. package/dist/core/web/public/next/assets/{Select-By-V9lMc.js → Select-CWnmUzs3.js} +2 -2
  379. package/dist/core/web/public/next/assets/{Select-By-V9lMc.js.map → Select-CWnmUzs3.js.map} +1 -1
  380. package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js → SessionGate-sp4KsnUo.js} +2 -2
  381. package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
  382. package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js → SessionInsightChip-DLFAzdbi.js} +2 -2
  383. package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
  384. package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js → SessionSearch-DbFjwR1h.js} +2 -2
  385. package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
  386. package/dist/core/web/public/next/assets/{SettingsSection-Bf74l0Gj.js → SettingsSection-Ch23msJ5.js} +2 -2
  387. package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
  388. package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js → SetupChecklist-Bd76MBAR.js} +2 -2
  389. package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js.map → SetupChecklist-Bd76MBAR.js.map} +1 -1
  390. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
  391. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
  392. package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js → Sheet-BZ2AG4Eo.js} +2 -2
  393. package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
  394. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
  395. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
  396. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
  397. package/dist/core/web/public/next/assets/{Sidebar-C9YtBYVZ.js.map → Sidebar-DN--cPYN.js.map} +1 -1
  398. package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js → Slider-KVoJLDD6.js} +2 -2
  399. package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js.map → Slider-KVoJLDD6.js.map} +1 -1
  400. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
  401. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
  402. package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
  403. package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js → StatusBadge-CXsYqmdU.js} +2 -2
  404. package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
  405. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
  406. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
  407. package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js → Surface-BfDmQcKe.js} +2 -2
  408. package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js.map → Surface-BfDmQcKe.js.map} +1 -1
  409. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
  410. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
  411. package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
  412. package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js → Switch-9NtO_6Lj.js} +2 -2
  413. package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js.map → Switch-9NtO_6Lj.js.map} +1 -1
  414. package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js → Tag-DscCRFcN.js} +2 -2
  415. package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js.map → Tag-DscCRFcN.js.map} +1 -1
  416. package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js → TerminalPane-B668-DJW.js} +5 -5
  417. package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js.map → TerminalPane-B668-DJW.js.map} +1 -1
  418. package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
  419. package/dist/core/web/public/next/assets/{UniverseConsoleApp-BpphLqoz.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
  420. package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js → UniverseView-DG70zH0W.js} +4 -4
  421. package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js.map → UniverseView-DG70zH0W.js.map} +1 -1
  422. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
  423. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
  424. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
  425. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
  426. package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
  427. package/dist/core/web/public/next/assets/{Workspace-RXy0pqp6.js.map → Workspace-D1nP9BhD.js.map} +1 -1
  428. package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
  429. package/dist/core/web/public/next/assets/{actions-BZTidCXZ.js.map → actions-CY-PjpGc.js.map} +1 -1
  430. package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
  431. package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js → apps-model-Du02KhAf.js} +2 -2
  432. package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js.map → apps-model-Du02KhAf.js.map} +1 -1
  433. package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js → authority-model-79SeuKlJ.js} +2 -2
  434. package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js.map → authority-model-79SeuKlJ.js.map} +1 -1
  435. package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
  436. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
  437. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
  438. package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
  439. package/dist/core/web/public/next/assets/{budget-queries-DFF-3ICg.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
  440. package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
  441. package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
  442. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
  443. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
  444. package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
  445. package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js → cloud-model-BDivRMqv.js} +2 -2
  446. package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js.map → cloud-model-BDivRMqv.js.map} +1 -1
  447. package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js → cloud-queries-BPQQ5_pJ.js} +2 -2
  448. package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
  449. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
  450. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
  451. package/dist/core/web/public/next/assets/{command-catalog-ffCAijVY.js → command-catalog-BIntSa9l.js} +2 -2
  452. package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
  453. package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js → context-model-Br8t9jgG.js} +2 -2
  454. package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js.map → context-model-Br8t9jgG.js.map} +1 -1
  455. package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js → context-model-CokrgEUq.js} +3 -3
  456. package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js.map → context-model-CokrgEUq.js.map} +1 -1
  457. package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
  458. package/dist/core/web/public/next/assets/{context-queries-_9bFWb9v.js.map → context-queries-eL3caKVG.js.map} +1 -1
  459. package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js → control-queries-B9K-wmcB.js} +2 -2
  460. package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js.map → control-queries-B9K-wmcB.js.map} +1 -1
  461. package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js → copy-setup-XMgCC5f8.js} +2 -2
  462. package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js.map → copy-setup-XMgCC5f8.js.map} +1 -1
  463. package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js → dock-icons-BJ6ZqB2t.js} +2 -2
  464. package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
  465. package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js → fleet-model-BvDR3gjp.js} +2 -2
  466. package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
  467. package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js → fleet-queries-W2UFVMZJ.js} +2 -2
  468. package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
  469. package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js → focus-trap-CtI1SlMX.js} +2 -2
  470. package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
  471. package/dist/core/web/public/next/assets/{format-BmH2yWL6.js → format-CH4g_sl1.js} +2 -2
  472. package/dist/core/web/public/next/assets/{format-BmH2yWL6.js.map → format-CH4g_sl1.js.map} +1 -1
  473. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
  474. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
  475. package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js → git-model-Dnkd1TnK.js} +2 -2
  476. package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js.map → git-model-Dnkd1TnK.js.map} +1 -1
  477. package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
  478. package/dist/core/web/public/next/assets/{global-y_exIyAP.js.map → global-CMNW_dqn.js.map} +1 -1
  479. package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
  480. package/dist/core/web/public/next/assets/{guarded-runners-Cd4POBtI.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
  481. package/dist/core/web/public/next/assets/{icons-CygCEFWs.js → icons-D1sYbCTQ.js} +2 -2
  482. package/dist/core/web/public/next/assets/{icons-CygCEFWs.js.map → icons-D1sYbCTQ.js.map} +1 -1
  483. package/dist/core/web/public/next/assets/{index-CyK31YRm.js → index-DZ-UQ7v8.js} +3 -3
  484. package/dist/core/web/public/next/assets/{index-CyK31YRm.js.map → index-DZ-UQ7v8.js.map} +1 -1
  485. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
  486. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
  487. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
  488. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
  489. package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js → live-model-D_32RAOR.js} +2 -2
  490. package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js.map → live-model-D_32RAOR.js.map} +1 -1
  491. package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js → mind.module-7hA92hRg.js} +2 -2
  492. package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js.map → mind.module-7hA92hRg.js.map} +1 -1
  493. package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
  494. package/dist/core/web/public/next/assets/{mutations-CWlxEMEm.js.map → mutations-DQPbFdRJ.js.map} +1 -1
  495. package/dist/core/web/public/next/assets/{nav-mimleI0R.js → nav-0dOYe2rJ.js} +2 -2
  496. package/dist/core/web/public/next/assets/{nav-mimleI0R.js.map → nav-0dOYe2rJ.js.map} +1 -1
  497. package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js → overnight-queries-C4wOnFtE.js} +2 -2
  498. package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
  499. package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
  500. package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js → queries-BTXWdZzU.js} +2 -2
  501. package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js.map → queries-BTXWdZzU.js.map} +1 -1
  502. package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js → reasoning-pref-Ca6lN6x_.js} +2 -2
  503. package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
  504. package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js → reveal-anchor-DfNLgK_I.js} +2 -2
  505. package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
  506. package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
  507. package/dist/core/web/public/next/assets/{seat-subscription-BhUUz7VL.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
  508. package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js → sidebar-model-CLCdqwkR.js} +2 -2
  509. package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
  510. package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js → slots-C-qBeu-8.js} +3 -3
  511. package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js.map → slots-C-qBeu-8.js.map} +1 -1
  512. package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js → surface-data-Dj71tdD-.js} +2 -2
  513. package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js.map → surface-data-Dj71tdD-.js.map} +1 -1
  514. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
  515. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
  516. package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js → tasks-model-O8yR5YXp.js} +2 -2
  517. package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
  518. package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js → terminal-icons-CoRZq9iO.js} +2 -2
  519. package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
  520. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
  521. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
  522. package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js → usage-queries-AdjEyEtn.js} +2 -2
  523. package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
  524. package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js → use-guarded-action-CuuMHeDX.js} +2 -2
  525. package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
  526. package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js → use-ticker-BBcp02SZ.js} +2 -2
  527. package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
  528. package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js → use-token-gate-CbXVYQYI.js} +2 -2
  529. package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
  530. package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js → useOnboarding-C_Fpe_sH.js} +2 -2
  531. package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
  532. package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
  533. package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
  534. package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js → useVerseTranscript-DgbigUlV.js} +2 -2
  535. package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
  536. package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js → verse-icons-S56hIiXS.js} +2 -2
  537. package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js.map → verse-icons-S56hIiXS.js.map} +1 -1
  538. package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
  539. package/dist/core/web/public/next/assets/{verse-model-JTuvRBVK.js.map → verse-model-DAVevkNe.js.map} +1 -1
  540. package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js → warmup-B_RAtNZ_.js} +3 -3
  541. package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js.map → warmup-B_RAtNZ_.js.map} +1 -1
  542. package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js → why-seat-model-M_r0wX3b.js} +2 -2
  543. package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js.map → why-seat-model-M_r0wX3b.js.map} +1 -1
  544. package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js → workspace-model-dji5-Al3.js} +2 -2
  545. package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js.map → workspace-model-dji5-Al3.js.map} +1 -1
  546. package/dist/core/web/public/next/index.html +1 -1
  547. package/dist/core/web/read-projection-worker.js +2 -1
  548. package/dist/core/web/read-projection-worker.js.map +1 -1
  549. package/dist/core/web/read-projections.d.ts +3 -0
  550. package/dist/core/web/read-projections.js +2 -2
  551. package/dist/core/web/read-projections.js.map +1 -1
  552. package/dist/core/web/visibility.js +3 -4
  553. package/dist/core/web/visibility.js.map +1 -1
  554. package/dist/release-dependency-inventory.json +1 -1
  555. package/package.json +3 -2
  556. package/dist/core/web/public/next/assets/Advanced-cVYTAsfB.js +0 -2
  557. package/dist/core/web/public/next/assets/AppsSection-DDqeSrty.js +0 -2
  558. package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js +0 -2
  559. package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js.map +0 -1
  560. package/dist/core/web/public/next/assets/AutonomySection-Dwn8UtOy.js +0 -2
  561. package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
  562. package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js +0 -2
  563. package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js.map +0 -1
  564. package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js +0 -3
  565. package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js +0 -2
  566. package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js.map +0 -1
  567. package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js +0 -3
  568. package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js.map +0 -1
  569. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
  570. package/dist/core/web/public/next/assets/DockHost-BcEq2qaS.js +0 -2
  571. package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js +0 -3
  572. package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js.map +0 -1
  573. package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js +0 -2
  574. package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js.map +0 -1
  575. package/dist/core/web/public/next/assets/GrowthSection-BvZezOsX.js +0 -2
  576. package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js +0 -2
  577. package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js.map +0 -1
  578. package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js +0 -2
  579. package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js.map +0 -1
  580. package/dist/core/web/public/next/assets/McpSection-nuXer4K-.js +0 -2
  581. package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js +0 -2
  582. package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js.map +0 -1
  583. package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js +0 -3
  584. package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js.map +0 -1
  585. package/dist/core/web/public/next/assets/NewChatDialog-BqFTWgHU.js +0 -3
  586. package/dist/core/web/public/next/assets/OnboardingGate-BZafM1Vf.js +0 -3
  587. package/dist/core/web/public/next/assets/PreviewPane-zT3gK9TD.js +0 -2
  588. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CAxPQ4sZ.js +0 -7
  589. package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js +0 -3
  590. package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js.map +0 -1
  591. package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js +0 -2
  592. package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js.map +0 -1
  593. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
  594. package/dist/core/web/public/next/assets/SettingsSection-Bf74l0Gj.js.map +0 -1
  595. package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js +0 -3
  596. package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
  597. package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js +0 -2
  598. package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js.map +0 -1
  599. package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js +0 -2
  600. package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js.map +0 -1
  601. package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js +0 -2
  602. package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js.map +0 -1
  603. package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
  604. package/dist/core/web/public/next/assets/UniverseConsoleApp-BpphLqoz.js +0 -2
  605. package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js +0 -3
  606. package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js.map +0 -1
  607. package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js +0 -3
  608. package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js.map +0 -1
  609. package/dist/core/web/public/next/assets/Workspace-RXy0pqp6.js +0 -10
  610. package/dist/core/web/public/next/assets/actions-BZTidCXZ.js +0 -2
  611. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
  612. package/dist/core/web/public/next/assets/budget-queries-DFF-3ICg.js +0 -2
  613. package/dist/core/web/public/next/assets/charts-CzxWrZn7.js +0 -2
  614. package/dist/core/web/public/next/assets/charts-CzxWrZn7.js.map +0 -1
  615. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
  616. package/dist/core/web/public/next/assets/command-catalog-ffCAijVY.js.map +0 -1
  617. package/dist/core/web/public/next/assets/context-queries-_9bFWb9v.js +0 -2
  618. package/dist/core/web/public/next/assets/global-y_exIyAP.js +0 -2
  619. package/dist/core/web/public/next/assets/guarded-runners-Cd4POBtI.js +0 -2
  620. package/dist/core/web/public/next/assets/mutations-CWlxEMEm.js +0 -2
  621. package/dist/core/web/public/next/assets/primitives-DMijqcu0.js +0 -1
  622. package/dist/core/web/public/next/assets/seat-subscription-BhUUz7VL.js +0 -2
  623. package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js +0 -2
  624. package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js.map +0 -1
  625. package/dist/core/web/public/next/assets/verse-model-JTuvRBVK.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"DockHost-BcEq2qaS.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/context/ChatUsage.module.css","../../../../../../src/web-ui/routes/verse/context/ChatUsage.tsx","../../../../../../src/web-ui/routes/verse/context/MemoryPanel.tsx","../../../../../../src/web-ui/routes/verse/SessionRoots.module.css","../../../../../../src/web-ui/routes/verse/SessionRoots.tsx","../../../../../../src/web-ui/routes/verse/dock/panes.module.css","../../../../../../src/web-ui/routes/verse/dock/ContextPane.tsx","../../../../../../src/web-ui/routes/verse/dock/Dock.module.css","../../../../../../src/web-ui/routes/verse/dock/Dock.tsx","../../../../../../src/web-ui/routes/verse/dock/TasksPane.tsx","../../../../../../src/web-ui/routes/verse/dock/DockHost.tsx"],"sourcesContent":["/**\n * context/ChatUsage.module.css — the figure grid for one chat's usage and\n * context efficiency (moved with ChatUsage from ResourcesPanel in 3.10).\n */\n.usage { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-2) var(--space-4); margin: 0; }\n.usage > div { display: flex; flex-direction: column; gap: 1px; min-width: 0; }\n.usage dt {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n.usage dd {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n font-variant-numeric: tabular-nums;\n color: var(--text-primary);\n}\n.usage + .muted { margin-top: var(--space-2); }\n.usage + .muted + .muted { margin-top: var(--space-1); }\n.subTitle {\n margin: var(--space-3) 0 var(--space-2);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-regular);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n.muted { color: var(--text-tertiary); font-size: var(--text-xs-size); line-height: var(--text-xs-line); }\n/* Idle past the prompt-cache lifetime. A status, in words, on the warning\n hairline — the colour repeats the sentence, it never replaces it. */\n.idleWarn {\n margin-top: var(--space-2);\n padding-left: var(--space-2);\n border-left: 2px solid var(--status-warning-solid);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--status-warning-fg);\n}\n","/**\n * routes/verse/context/ChatUsage.tsx — the open chat's usage and context\n * efficiency (moved out of ResourcesPanel in 3.10, unit C2).\n *\n * The resources column is gone: accounts and seat capacity moved to Apps &\n * Accounts (C6), and what was about THIS CHAT moved into the dock's Context\n * pane. This block came with it unchanged — every figure is still derived\n * from the session record and its own event log, with no request and no\n * spend, and every number the CLI did not report still reads \"—\" or \"≤\".\n */\nimport type { VerseEvent, VerseSeat, VerseSession } from '../../../data/api-types.js';\nimport { MEMORY_BLOCK_MAX_BYTES } from './context-model.js';\nimport {\n CONTEXT_MODE_LABEL,\n idleCacheWarning,\n reportedCacheHitRatio,\n sessionContext,\n turnContextStats,\n} from '../usage/context-model.js';\nimport { formatContextWindow, formatElapsed, windowSourceText } from '../verse-model.js';\nimport { formatWholePercent } from '../autonomy/format.js';\nimport { formatTokens, lastTurnActivityAt } from '../verse-readouts.js';\nimport styles from './ChatUsage.module.css';\n\n/**\n * The open chat's usage and context efficiency. Every figure is derived from\n * the session record and its own event log — no request, no spend.\n */\nexport function ChatUsage({\n session,\n seats,\n events,\n now,\n}: {\n session: VerseSession;\n seats: readonly VerseSeat[];\n events: readonly VerseEvent[] | undefined;\n now: number;\n}) {\n const usage = session.usage;\n const ctx = sessionContext(session, seats);\n const stats = turnContextStats(events ?? []);\n const promptTokens = usage.inputTokens + usage.cacheReadTokens + usage.cacheCreationTokens;\n const hit = reportedCacheHitRatio(usage);\n // The record's count is the durable one (a long log may be truncated); the\n // log's own count stands in only when the record predates the field.\n const compactions = session.compactionCount ?? stats.compactions;\n const idle = idleCacheWarning(session, ctx.tokens, now, lastTurnActivityAt(events ?? []));\n const bound = ctx.exact ? '' : '≤';\n const statBound = stats.exact ? '' : '≤';\n\n return (\n <>\n <dl className={styles.usage}>\n <div><dt>Input</dt><dd>{formatTokens(usage.inputTokens)}</dd></div>\n <div><dt>Output</dt><dd>{formatTokens(usage.outputTokens)}</dd></div>\n <div><dt>Cache read</dt><dd>{formatTokens(usage.cacheReadTokens)}</dd></div>\n <div><dt>Cache write</dt><dd>{formatTokens(usage.cacheCreationTokens)}</dd></div>\n <div><dt>Turns</dt><dd>{session.turnCount}</dd></div>\n <div>\n <dt>Context</dt>\n <dd title={ctx.exact ? undefined : 'An upper bound: the CLI reported only the turn total, which sums every call.'}>\n {bound}{formatTokens(ctx.tokens)}{ctx.window === null ? '' : ` / ${formatContextWindow(ctx.window)}`}\n </dd>\n </div>\n </dl>\n\n <h4 className={styles.subTitle}>Efficiency</h4>\n <dl className={styles.usage} aria-label=\"Context efficiency\">\n <div>\n <dt>Cache hit</dt>\n <dd title=\"Share of prompt tokens served from the provider's cache: cache read ÷ (input + cache read + cache write).\">\n {/* Whole percent, \"<1%\" for a sliver — never \"0%\" beside real cache reads. */}\n {hit !== null ? formatWholePercent(hit) : promptTokens > 0 ? 'none reported' : '—'}\n </dd>\n </div>\n <div><dt>Compactions</dt><dd>{compactions}</dd></div>\n <div>\n <dt>Avg context / turn</dt>\n <dd>{stats.average === null ? '—' : `${statBound}${formatTokens(stats.average)}`}</dd>\n </div>\n <div>\n <dt>Peak context</dt>\n <dd>{stats.peak === null ? '—' : `${statBound}${formatTokens(stats.peak)}`}</dd>\n </div>\n <div><dt>Mode</dt><dd>{CONTEXT_MODE_LABEL[ctx.mode]}</dd></div>\n <div>\n <dt>Compacts at</dt>\n <dd>{ctx.autoCompactAt === null ? '—' : `≈${formatTokens(ctx.autoCompactAt)}`}</dd>\n </div>\n </dl>\n <p className={styles.muted}>\n {ctx.source !== null\n ? `Window ${windowSourceText(ctx.source, session.engine)}.`\n : ctx.window !== null\n ? 'Window as stored when this chat was created; how it was known was not recorded.'\n : 'Window unknown for this chat.'}\n {stats.turns > 0 && !stats.exact ? ' Figures marked ≤ are upper bounds: the CLI reported only turn totals.' : ''}\n </p>\n {/* Pinned per chat at creation, like its roots: the memory panel below\n edits the PROJECT's file, not what this conversation was offered.\n On a paid seat memory is not free — its block rides in the system\n prompt of every turn — so the sentence says what it adds rather than\n leaving the operator to assume it costs nothing. */}\n <p className={styles.muted}>\n {session.memoryEnabled !== true\n ? 'This chat started without shared project memory.'\n : session.engine === 'local'\n ? 'Shared project memory was given to this chat’s agent when it started.'\n : `Shared project memory was given to this chat’s agent when it started: a block of up to ${MEMORY_BLOCK_MAX_BYTES / 1024} KB in its system prompt, re-sent every turn (cached after the first), plus the agent’s own reads and updates of MEMORY.md — a little of this seat’s usage.`}\n </p>\n {idle === null ? null : (\n <p role=\"status\" className={styles.idleWarn}>\n {idle.local\n ? `Idle for ${formatElapsed(idle.idleMs)}: the local model has likely dropped this chat from its cache, so the next turn re-processes ~${formatTokens(idle.tokens)} tokens before it replies — time, not spend.`\n : `Idle for ${formatElapsed(idle.idleMs)}, past the ~1 h prompt-cache lifetime: the next turn likely re-reads ~${formatTokens(idle.tokens)} tokens uncached, at full price.`}\n </p>\n )}\n </>\n );\n}\n","/**\n * routes/verse/context/MemoryPanel.tsx — shared project memory, as a section\n * of the resources panel.\n *\n * Every seat on a project — Claude, Codex, Grok, local, any account — is\n * pointed at ONE Verse-owned `MEMORY.md` for that project\n * (`~/.ashlr/verse/memory/<project>-<hash>/`). The agents keep it current;\n * this panel is where the operator sees what they wrote, corrects it, clears\n * it, or turns it off for the project.\n *\n * Three facts are stated rather than implied, because each one changes what\n * the operator should do:\n *\n * - SCOPE. The file is per PROJECT, shared across seats and accounts — not\n * per chat. Clearing it clears it for every chat on the project.\n * - WHO CAN WRITE. Claude, Codex and local seats are given the directory;\n * Grok's CLI can reach only its cwd, so a Grok seat gets the text and\n * cannot edit the file.\n * - WHEN IT APPLIES. A chat snapshots the memory block into its instructions\n * when it is CREATED (so the prompt prefix — and the provider's prompt\n * cache — stays byte-identical every turn). Chats already open see an edit\n * when they next read the file; the on/off switch affects new chats only.\n *\n * Saving is guarded against the one race this surface has: an agent can\n * write the file while the operator is editing it. The current file is\n * re-read before every save, and a change since editing began is shown as a\n * conflict instead of being silently overwritten.\n *\n * And against the one LOSSY read it has: every API response is sanitized, so\n * the text shown can have `~` for the home folder and `[REDACTED]` over\n * secret-shaped values that are still in the file (`contentSanitized`). Saving\n * that text back would write the placeholders over the real values — the\n * server refuses it (409 VERSE_MEMORY_REDACTED), and the editor says so first\n * and keeps Save off while any placeholder remains.\n *\n * The panel itself spends nothing (memory is a file on this machine), but\n * USING memory does on paid seats — the block rides in every new chat's\n * system prompt — and the panel says so (MEMORY_SPEND_NOTE).\n */\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { VERSE_MEMORY_MAX_BYTES } from '../../../../core/verse/types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { Switch } from '../../../components/primitives/Switch.js';\nimport { ApiError } from '../../../data/client.js';\nimport { useQuery, useRefresh } from '../../../data/hooks.js';\nimport { projectName } from '../verse-model.js';\nimport {\n formatBytes,\n jsonBodyBytes,\n MEMORY_BODY_MAX_BYTES,\n MEMORY_SPEND_NOTE,\n REDACTION_MARKER,\n redactionMarkers,\n relativePhrase,\n secretLike,\n utf8Bytes,\n} from './context-model.js';\nimport {\n fetchProjectMemory,\n updatePreferences,\n versePreferencesQuery,\n verseProjectMemoryQuery,\n writeProjectMemory,\n type VerseProjectMemoryView,\n} from './context-queries.js';\nimport { describeContextError, useTokenGate } from './use-token-gate.js';\nimport styles from './context.module.css';\n\nexport interface MemoryPanelProps {\n /** The project whose memory to show — the open chat's primary folder. Null when no chat is open. */\n projectPath: string | null;\n /**\n * Bump to re-read the file — e.g. the open chat's `turnCount`, since agents\n * write memory during turns. Optional; the panel also has a Refresh button.\n */\n refreshKey?: number | string;\n}\n\nexport function MemoryPanel({ projectPath, refreshKey }: MemoryPanelProps) {\n const headingId = useId();\n if (!projectPath) {\n return (\n <section className={styles.memory} aria-labelledby={headingId}>\n <h3 id={headingId} className={styles.memoryHead}>Project memory</h3>\n <p className={styles.hint}>Open a chat to see the memory its project shares across seats.</p>\n </section>\n );\n }\n // Keyed by path: switching projects discards any half-finished edit of the\n // previous project's file instead of letting it be saved onto the new one.\n return <MemoryPanelBody key={projectPath} projectPath={projectPath} refreshKey={refreshKey} />;\n}\n\ntype Mode = 'view' | 'edit' | 'confirm-clear';\ntype Busy = 'saving' | 'clearing' | 'toggling' | null;\n\nconst SAVE_REASON = 'Saving writes MEMORY.md for this project. Every seat on it reads this file.';\nconst CLEAR_REASON = 'Clearing empties MEMORY.md for every chat on this project.';\nconst TOGGLE_REASON = 'This changes whether new chats on this project are given shared memory.';\nconst GLOBAL_REASON = 'This changes whether new chats on ANY project are given shared memory.';\n\nfunction MemoryPanelBody({ projectPath, refreshKey }: { projectPath: string; refreshKey?: number | string }) {\n const headingId = useId();\n const editorId = useId();\n const counterId = useId();\n const def = useMemo(() => verseProjectMemoryQuery(projectPath), [projectPath]);\n const memory = useQuery(def);\n const refresh = useRefresh(def);\n const prefs = useQuery(versePreferencesQuery);\n const gate = useTokenGate();\n const name = projectName(projectPath);\n\n const [mode, setMode] = useState<Mode>('view');\n const [draft, setDraft] = useState('');\n /** The file as it was when editing began — what a save must still find on disk. */\n const [base, setBase] = useState('');\n /** Whether the text editing began from was sanitized — a placeholder in it stands for a real value on disk. */\n const [baseSanitized, setBaseSanitized] = useState(false);\n const [conflict, setConflict] = useState<VerseProjectMemoryView | null>(null);\n const [busy, setBusy] = useState<Busy>(null);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const editorRef = useRef<HTMLTextAreaElement>(null);\n\n // A finished turn may have changed the file; re-read on the caller's signal\n // (never on first render — useQuery already read it).\n const firstKey = useRef(refreshKey);\n useEffect(() => {\n if (refreshKey === firstKey.current) return;\n firstKey.current = refreshKey;\n refresh();\n }, [refreshKey, refresh]);\n\n // Entering the editor lands the caret at the END: the common edit is adding\n // a line, and a caret at offset 0 would prepend it above the heading.\n useEffect(() => {\n const editor = editorRef.current;\n if (mode !== 'edit' || !editor) return;\n editor.focus();\n editor.setSelectionRange(editor.value.length, editor.value.length);\n }, [mode]);\n\n // The record a write just returned, shown until the re-read it triggered\n // lands — otherwise \"Saved.\" would sit over the OLD text for a round trip.\n const [lastWritten, setLastWritten] = useState<VerseProjectMemoryView | null>(null);\n useEffect(() => {\n if (lastWritten !== null && memory.status === 'success') setLastWritten(null);\n }, [lastWritten, memory.status]);\n const data = lastWritten !== null && memory.status !== 'success' ? lastWritten : memory.data;\n const unsupported = memory.error instanceof ApiError && memory.error.status === 404;\n const globalOff = prefs.data ? !prefs.data.memory.enabled : false;\n const draftBytes = useMemo(() => utf8Bytes(draft), [draft]);\n const overCap = draftBytes > VERSE_MEMORY_MAX_BYTES;\n // Under the memory cap is not enough: the request that carries it must fit\n // POST /memory's body cap once JSON-escaped. That route's cap is sized for\n // a full 64 KB file (MEMORY_BODY_MAX_BYTES, the server's own figure) — the\n // 64 KB default every other POST uses would block saves the server accepts.\n // In practice this only trips on text that escapes to more than 2 bytes a\n // character (control characters), which the server would refuse too.\n const requestBytes = useMemo(() => jsonBodyBytes({ projectPath, content: draft }), [projectPath, draft]);\n const overBody = !overCap && requestBytes > MEMORY_BODY_MAX_BYTES;\n const secret = mode === 'edit' ? secretLike(draft) : null;\n // Only a sanitized base makes a placeholder dangerous: in an unsanitized\n // file a literal \"[REDACTED]\" is just text the file already had.\n const placeholders = mode === 'edit' && baseSanitized ? redactionMarkers(draft) : 0;\n\n function startEdit(from: string, sanitized: boolean) {\n setDraft(from);\n setBase(from);\n setBaseSanitized(sanitized);\n setConflict(null);\n setError(null);\n setNotice(null);\n setMode('edit');\n }\n\n async function save(overwrite = false) {\n if (busy) return;\n setBusy('saving');\n setError(null);\n try {\n // Re-read first: an agent may have written the file since editing began.\n const latest = await fetchProjectMemory(projectPath);\n if (!overwrite && latest.content !== base) {\n setConflict(latest);\n return;\n }\n const saved = await gate.run(SAVE_REASON, () => writeProjectMemory(projectPath, draft));\n if (saved === null) return;\n setLastWritten(saved);\n setConflict(null);\n setMode('view');\n setNotice(saved.content.length === 0 ? 'Saved — MEMORY.md is now empty.' : 'Saved.');\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setBusy(null);\n }\n }\n\n async function clear() {\n if (busy) return;\n setBusy('clearing');\n setError(null);\n try {\n const saved = await gate.run(CLEAR_REASON, () => writeProjectMemory(projectPath, ''));\n if (saved === null) return;\n setLastWritten(saved);\n setMode('view');\n setNotice('Cleared. Agents start MEMORY.md afresh on their next write.');\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setBusy(null);\n }\n }\n\n async function setProjectEnabled(next: boolean) {\n if (busy) return;\n setBusy('toggling');\n setError(null);\n setNotice(null);\n try {\n const result = await gate.run(TOGGLE_REASON, () => updatePreferences({ projectPath, memoryEnabled: next }));\n if (result !== null) {\n setNotice(next\n ? `New chats on ${name} will get shared memory. Chats already open keep what they started with.`\n : `New chats on ${name} will start without shared memory. The file is kept.`);\n }\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setBusy(null);\n }\n }\n\n async function setGlobalEnabled(next: boolean) {\n if (busy) return;\n setBusy('toggling');\n setError(null);\n setNotice(null);\n try {\n await gate.run(GLOBAL_REASON, () => updatePreferences({ memoryEnabled: next }));\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setBusy(null);\n }\n }\n\n const state = data ? (globalOff ? 'off everywhere' : data.enabled ? 'on' : 'off') : null;\n\n return (\n <section className={styles.memory} aria-labelledby={headingId} data-project={projectPath}>\n <h3 id={headingId} className={styles.memoryHead}>\n <span>Project memory</span>\n {state ? <span className={styles.memoryState}>{state}</span> : null}\n {unsupported ? null : (\n <button type=\"button\" className={styles.memoryHeadAction} onClick={refresh}\n aria-label=\"Refresh project memory\">Refresh</button>\n )}\n </h3>\n\n <p className={styles.hint}>\n One <code>MEMORY.md</code> shared by every chat on <strong title={projectPath}>{name}</strong>, whichever seat runs it. Agents keep it\n current — decisions and why, conventions, gotchas, plan status.\n </p>\n\n {unsupported ? (\n <p className={styles.hint}>This server has no project memory yet — update Ashlr and restart <code>ashlr verse</code>.</p>\n ) : memory.status === 'loading' || (memory.status === 'idle' && !data) ? (\n <div aria-busy=\"true\"><SkeletonLine width=\"80%\" /><SkeletonLine width=\"60%\" /><SkeletonLine width=\"70%\" /></div>\n ) : !data ? (\n <div className={styles.searchError} role=\"alert\">\n <span>Could not read this project’s memory: {describeContextError(memory.error)}</span>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`} onClick={refresh}>Retry</button>\n </div>\n ) : (\n <>\n {/* ---- on / off ---- */}\n {globalOff ? (\n <div className={styles.field}>\n <p className={styles.hint}>Shared memory is off for every project, so new chats start without it.</p>\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`} disabled={busy !== null}\n onClick={() => void setGlobalEnabled(true)}>Turn memory on</button>\n </div>\n </div>\n ) : (\n <Switch checked={data.enabled} disabled={busy !== null || !prefs.data}\n onChange={(next) => void setProjectEnabled(next)}\n label={`Give new chats on ${name} this memory`} />\n )}\n\n {/* ---- the file ---- */}\n {mode === 'edit' ? (\n <div className={styles.field}>\n <label className={styles.label} htmlFor={editorId}>Edit MEMORY.md</label>\n <textarea id={editorId} ref={editorRef} className={styles.textarea} value={draft} rows={12} spellCheck={false}\n aria-describedby={counterId} aria-invalid={overCap || overBody ? true : undefined}\n onChange={(event) => setDraft(event.target.value)} />\n <p id={counterId} className={`${styles.hint} ${styles.counter} ${overCap || overBody ? styles.counterOver : ''}`}>\n {formatBytes(draftBytes)} of {formatBytes(VERSE_MEMORY_MAX_BYTES)}\n {overCap ? ' — over the limit; trim it to save.' : ''}\n {overBody ? ` — ${formatBytes(requestBytes)} once line breaks and quotes are encoded for sending, over the ${formatBytes(MEMORY_BODY_MAX_BYTES)} request limit; trim it to save.` : ''}\n </p>\n {secret ? (\n <p className={styles.warn} role=\"alert\">\n This looks like it contains {secret}. MEMORY.md is sent to every seat’s model — remove it before saving.\n </p>\n ) : null}\n {placeholders > 0 ? (\n <p className={styles.warn} role=\"alert\">\n {placeholders === 1 ? 'One' : placeholders} <code>{REDACTION_MARKER}</code> placeholder{placeholders === 1 ? ' stands' : 's stand'} in\n for secret-looking text that is still in MEMORY.md. Saving {placeholders === 1 ? 'it' : 'them'} would replace the real\n value{placeholders === 1 ? '' : 's'}, so Save stays off until {placeholders === 1 ? 'it is' : 'they are'} gone. Deleting a\n placeholder drops that value from the file; to keep it, edit MEMORY.md directly under <code>~/.ashlr/verse/memory</code>.\n </p>\n ) : baseSanitized ? (\n <p className={styles.hint}>\n This copy was sanitized for the browser, so a home-folder path appears as <code>~</code>. Saving writes the text as\n shown; <code>~</code> names the same folder for every reader.\n </p>\n ) : null}\n {conflict ? (\n <div className={styles.warn} role=\"alert\">\n <p className={styles.hint}>\n An agent changed MEMORY.md while you were editing\n {relativePhrase(conflict.updatedAt) ? ` (${relativePhrase(conflict.updatedAt)})` : ''}.\n </p>\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`} disabled={busy !== null || placeholders > 0}\n onClick={() => void save(true)}>Overwrite with mine</button>\n <button type=\"button\" className={`${styles.cancel} ${styles.small}`} disabled={busy !== null}\n onClick={() => startEdit(conflict.content, conflict.contentSanitized === true)}>Start over from theirs</button>\n </div>\n </div>\n ) : null}\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.primary} ${styles.small}`}\n disabled={busy !== null || overCap || overBody || draft === base || conflict !== null || placeholders > 0}\n onClick={() => void save(false)}>{busy === 'saving' ? 'Saving…' : 'Save'}</button>\n <button type=\"button\" className={`${styles.cancel} ${styles.small}`} disabled={busy === 'saving'}\n onClick={() => { setMode('view'); setConflict(null); setError(null); }}>Cancel</button>\n </div>\n </div>\n ) : data.content.length === 0 ? (\n <div className={styles.field}>\n <p className={styles.hint}>\n MEMORY.md is empty. Agents add to it as they work, or write the first entries yourself.\n </p>\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`} onClick={() => startEdit('', false)}>Write it</button>\n </div>\n </div>\n ) : (\n <div className={styles.field}>\n <pre className={styles.memoryBody} tabIndex={0} aria-label={`MEMORY.md for ${name}`}>{data.content}</pre>\n <p className={`${styles.hint} ${styles.memoryMeta}`}>\n <span>{formatBytes(data.bytes)}</span>\n {relativePhrase(data.updatedAt) ? <span>updated {relativePhrase(data.updatedAt)}</span> : null}\n </p>\n {data.contentSanitized ? (\n <p className={styles.hint}>\n Shown sanitized for the browser: a home-folder path appears as <code>~</code> and secret-looking text as{' '}\n <code>{REDACTION_MARKER}</code>.{redactionMarkers(data.content) > 0 ? ' The real values are still in the file.' : ''}\n </p>\n ) : null}\n {mode === 'confirm-clear' ? (\n <div className={styles.warn} role=\"alert\">\n <p className={styles.hint}>Clear MEMORY.md for {name}? Every chat on this project loses what it says. Other files in the folder stay.</p>\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.secondary} ${styles.small} ${styles.danger}`} disabled={busy !== null}\n onClick={() => void clear()}>{busy === 'clearing' ? 'Clearing…' : 'Clear it'}</button>\n <button type=\"button\" className={`${styles.cancel} ${styles.small}`} onClick={() => setMode('view')}>Keep</button>\n </div>\n </div>\n ) : (\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`}\n onClick={() => startEdit(data.content, data.contentSanitized === true)}>Edit</button>\n <button type=\"button\" className={`${styles.cancel} ${styles.small}`}\n onClick={() => { setNotice(null); setMode('confirm-clear'); }}>Clear…</button>\n </div>\n )}\n </div>\n )}\n\n {data.files.length > 0 ? (\n <div className={styles.field}>\n <span className={styles.label}>Also in this folder</span>\n <ul className={styles.memoryFiles}>\n {data.files.map((file) => <li key={file}><code>{file}</code></li>)}\n </ul>\n </div>\n ) : null}\n\n {notice ? <p className={styles.hint} role=\"status\">{notice}</p> : null}\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n\n <details>\n <summary className={styles.hint}>How project memory works</summary>\n <div className={styles.field}>\n <p className={styles.hint}>\n Claude, Codex and local seats can read and edit the file. Grok’s CLI can reach only its working folder, so a\n Grok seat is given the text and can only read it.\n </p>\n <p className={styles.hint}>\n A chat copies the memory into its instructions when it starts, so every turn re-sends the same prefix and the\n provider’s prompt cache keeps working. Chats already open see your edits when they next read the file; the\n switch above applies to new chats.\n </p>\n <p className={styles.hint}>\n It lives on this machine under <code>~/.ashlr/verse/memory</code>, readable only by you. It is sent to every\n seat’s model, so never put secrets in it.\n </p>\n <p className={styles.hint}>{MEMORY_SPEND_NOTE}</p>\n {globalOff ? null : (\n <p className={styles.hint}>\n Memory is on for every project unless switched off per project.{' '}\n <button type=\"button\" className={styles.link} disabled={busy !== null}\n onClick={() => void setGlobalEnabled(false)}>Turn it off for every project</button>\n </p>\n )}\n </div>\n </details>\n </>\n )}\n\n <MutationTokenDialog open={gate.dialog.open} reason={gate.dialog.reason} tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\" onClose={gate.dialog.onClose} onUnlocked={gate.dialog.onUnlocked} />\n </section>\n );\n}\n","/**\n * SessionRoots.module.css — one row per folder this chat can reach.\n *\n * Tone is carried by a left border AND by words (the badge and the caveat\n * line), never by colour alone — DESIGN-V2 §6.\n */\n\n.roots { padding: var(--space-4) var(--space-4) 0; }\n\n.title {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n margin: 0 0 var(--space-2);\n font-size: var(--text-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--text-muted);\n}\n\n.count {\n padding: 0 var(--space-1);\n border-radius: var(--radius-sm);\n background: var(--surface-raised);\n font-variant-numeric: tabular-nums;\n letter-spacing: 0;\n}\n\n.workspace {\n margin: 0 0 var(--space-2);\n font-size: var(--text-xs);\n color: var(--text-muted);\n}\n\n.list {\n margin: 0;\n padding: 0;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n}\n\n.root {\n padding: var(--space-2);\n border-radius: var(--radius-sm);\n border-left: 3px solid var(--border-subtle);\n background: var(--surface-raised);\n}\n\n.root[data-tone='primary'] { border-left-color: var(--accent); }\n.root[data-tone='extra'] { border-left-color: var(--border-strong, var(--border-subtle)); }\n.root[data-tone='unreachable'] { border-left-color: var(--warning, #b7791f); }\n.root[data-tone='missing'] { border-left-color: var(--danger, #c53030); }\n\n.rootHead {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.name {\n font-size: var(--text-sm);\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.badge {\n flex: none;\n font-size: var(--text-2xs, 0.6875rem);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--text-muted);\n}\n\n/* The full path, shown rather than hovered. `direction: rtl` with the text\n isolated flips only WHICH END the ellipsis eats — the head, so the tail\n that actually disambiguates two same-named checkouts survives. The bdi\n isolation keeps the path itself rendering left-to-right. */\n.path {\n margin: var(--space-1) 0 0;\n direction: rtl;\n text-align: left;\n unicode-bidi: plaintext;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n font-size: var(--text-xs);\n color: var(--text-muted);\n}\n\n.git,\n.remote,\n.caveat {\n margin: var(--space-1) 0 0;\n font-size: var(--text-xs);\n color: var(--text-muted);\n}\n\n.git { font-variant-numeric: tabular-nums; }\n\n.remote {\n font-family: var(--font-mono);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.caveat { color: var(--text-strong, var(--text-default)); }\n\n.note,\n.error {\n margin: var(--space-2) 0 0;\n font-size: var(--text-xs);\n line-height: 1.45;\n color: var(--text-muted);\n}\n\n.error { color: var(--danger, #c53030); }\n","/**\n * routes/verse/SessionRoots.tsx — the folders THIS chat can reach, each with\n * its own git identity.\n *\n * WHY PER-ROOT IDENTITY IS THE POINT. A turn that edits two repositories\n * produces two diffs. Without a branch and a dirty count per root, the\n * transcript cannot attribute them, and \"3 files changed\" silently spans two\n * repositories on two different branches. So every root gets its own line:\n * branch, how many entries are dirty, and how far it has drifted from its\n * upstream.\n *\n * WHAT IT REFUSES TO IMPLY:\n * - A root the engine cannot reach (a Grok seat takes no additional-directory\n * flag) is LISTED and marked, never hidden — the operator chose it.\n * - A root that is not enrolled is marked as refused BY THE AUTONOMOUS LANE,\n * not as unusable here. This chat can edit it; the fleet cannot.\n * - A root with no repo says so, rather than leaving a gap that would read as\n * \"clean, on the default branch\".\n *\n * The read itself lives in chat/use-session-roots.ts (3.10): shared by every\n * consumer of a chat's roots, and refreshed each time a turn finishes,\n * because a branch is stale the moment a turn commits.\n */\nimport type { VerseSession, VerseSessionRootsResponse } from '../../data/api-types.js';\nimport { abbreviateHome } from './chat/path-display.js';\nimport { rootCaveat, rootGitLine, rootTone } from './workspace-model.js';\nimport styles from './SessionRoots.module.css';\n\nexport interface SessionRootsProps {\n session: VerseSession | null;\n /**\n * 3.10: the roots read, from the chat's shared `useSessionRoots` (one\n * request feeds the header breadcrumb, the dock panes and this list). It is\n * refreshed there whenever the chat's turnCount moves.\n */\n data: VerseSessionRootsResponse | null;\n error?: string | null;\n}\n\nexport function SessionRoots({ session, data, error = null }: SessionRootsProps) {\n if (!session) return null;\n\n // A single-folder chat is the overwhelmingly common case and already says\n // which folder it is everywhere else. Showing a one-row \"Folders\" list for\n // it would be noise, so this surfaces only when there is something to\n // attribute between.\n if (data !== null && data.roots.length <= 1 && data.workspaceId === null) return null;\n\n return (\n <section className={styles.roots} aria-labelledby=\"verse-res-roots\">\n <h3 id=\"verse-res-roots\" className={styles.title}>\n Folders\n {data ? <span className={styles.count}>{data.roots.length}</span> : null}\n </h3>\n\n {data?.workspaceName ? (\n <p className={styles.workspace}>\n Workspace <strong>{data.workspaceName}</strong>\n </p>\n ) : null}\n\n {error ? <p role=\"alert\" className={styles.error}>{error}</p> : null}\n\n <ul className={styles.list}>\n {(data?.roots ?? []).map((root) => {\n const git = rootGitLine(root);\n const caveat = rootCaveat(root);\n return (\n <li key={root.path} className={styles.root} data-tone={rootTone(root)}>\n <div className={styles.rootHead}>\n <span className={styles.name}>{root.name}</span>\n <span className={styles.badge}>{root.primary ? 'primary' : 'added'}</span>\n </div>\n {/* The path was a hover `title` on the folder name. This card is\n the one place in the app that exists to ATTRIBUTE a diff to a\n repository, and two checkouts of the same repo share a name —\n so the thing that tells them apart cannot be the one fact you\n have to hover to read. It is shown, directory-first, with the\n head clipping so the tail that disambiguates stays visible;\n `~`-abbreviated (3.10.1), the absolute path in the tooltip. */}\n <p className={styles.path} title={root.path}>{abbreviateHome(root.path)}</p>\n <p className={styles.git}>{git ?? 'not a git repo'}</p>\n {root.git?.remote ? <p className={styles.remote}>{root.git.remote}</p> : null}\n {caveat ? <p className={styles.caveat}>{caveat}</p> : null}\n </li>\n );\n })}\n </ul>\n\n {(data?.notes ?? []).map((note) => (\n <p key={note} className={styles.note}>{note}</p>\n ))}\n </section>\n );\n}\n","/**\n * dock/panes.module.css — the dock's own panes (Tasks, Context). Section\n * grammar matches the rest of the chat surface: micro-label headings, 16px\n * padding, hairline separators. Tokens only (style-scan-310).\n */\n.pane {\n display: flex;\n flex-direction: column;\n min-height: 0;\n padding-bottom: var(--space-6);\n}\n\n.section { padding: var(--space-4) var(--card-pad, var(--space-4)) 0; }\n.section + .section {\n margin-top: var(--space-4);\n padding-top: var(--space-4);\n border-top: 1px solid var(--border-subtle);\n}\n.sectionTitle {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n margin: 0 0 var(--space-3);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n.count {\n font-variant-numeric: tabular-nums;\n text-transform: none;\n letter-spacing: 0;\n color: var(--text-secondary);\n}\n.muted {\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n.muted + .action,\n.action + .muted { margin-top: var(--space-2); }\n/* The next step under an empty line (\"No tool calls…\" → what to do). */\n.hint {\n margin: var(--space-1) 0 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n/* A line that comes and goes with the turn keeps its row, so the sections\n below it do not jump every time a turn starts or ends. */\n.reserve { min-height: var(--text-xs-line); }\n\n.action {\n display: inline-flex;\n align-items: center;\n min-height: var(--control-h-sm);\n margin-top: var(--space-2);\n padding: 0 var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-surface);\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n cursor: pointer;\n}\n.action:hover:not(:disabled) { background: var(--bg-hover); border-color: var(--border-strong); }\n.action:disabled { color: var(--text-disabled); cursor: not-allowed; }\n.action:focus-visible,\n.link:focus-visible,\n.task:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.link {\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--text-link);\n font: inherit;\n font-size: var(--text-sm-size);\n cursor: pointer;\n}\n.link:hover { text-decoration: underline; }\n\n/* ---- tasks ---------------------------------------------------------------- */\n.taskList {\n display: flex;\n flex-direction: column;\n margin: 0 calc(-1 * var(--space-2));\n padding: 0;\n list-style: none;\n}\n.task {\n display: grid;\n grid-template-columns: minmax(12px, auto) auto minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--space-2);\n width: 100%;\n min-height: var(--density-row-sm);\n padding: 0 var(--space-2);\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n text-align: left;\n cursor: pointer;\n}\n.task:hover { background: var(--bg-hover); }\n.taskMark {\n justify-self: center;\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n.taskMark[data-status='running'] {\n background: var(--status-running-solid);\n animation: pane-pulse var(--duration-pulse) ease-in-out infinite;\n}\n.taskMark[data-status='failed'] { border-radius: 1px; background: var(--status-danger-solid); }\n.taskName {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 18ch;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n.taskDetail {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n.task:hover .taskDetail { color: var(--text-secondary); }\n.taskTime {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-variant-numeric: tabular-nums;\n color: var(--text-tertiary);\n white-space: nowrap;\n}\n.task[data-status='failed'] .taskTime { color: var(--status-danger-fg); }\n\n/* Engine identity: a 2px tick + monogram (SPEC-310C §6), never a logo. */\n.engineTick {\n justify-self: center;\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-secondary);\n}\n.engineTick::before {\n content: '';\n width: 2px;\n height: 10px;\n border-radius: 1px;\n background: var(--text-tertiary);\n}\n.engineTick[data-engine='claude']::before { background: var(--engine-claude); }\n.engineTick[data-engine='codex']::before { background: var(--engine-codex); }\n.engineTick[data-engine='grok']::before { background: var(--engine-grok); }\n.engineTick[data-engine='local']::before { background: var(--engine-local); }\n\n@keyframes pane-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.35; }\n}\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .taskMark { animation: none; }\n}\n:root[data-motion='reduce'] .taskMark { animation: none; }\n","/**\n * routes/verse/dock/ContextPane.tsx — everything about THIS chat's context,\n * in the dock (SPEC-310C §3 \"Context\", unit C2).\n *\n * It is the old resources column minus the accounts: seat meters, the local\n * runtime and the running list moved to Apps & Accounts (C6) and the Tasks\n * pane, because they were never about the chat you were reading. What stays:\n *\n * This chat usage, context efficiency, the idle-cache warning (ChatUsage)\n * Folders each root with its branch and dirty count (SessionRoots)\n * Handoff \"Continue in a fresh chat…\" — the same dialog the notice offers\n * Memory the project's shared MEMORY.md (MemoryPanel)\n * → Accounts & capacity\n *\n * Every figure is read from the session record, its event log and the\n * shared roots read — the pane itself makes no request except MemoryPanel's\n * own, and spends nothing.\n */\nimport { useEffect, useState } from 'react';\nimport type { VerseEvent, VerseSeat, VerseSession, VerseSessionRootsResponse } from '../../../data/api-types.js';\nimport { ChatUsage } from '../context/ChatUsage.js';\nimport { MemoryPanel } from '../context/MemoryPanel.js';\nimport { SessionRoots } from '../SessionRoots.js';\nimport styles from './panes.module.css';\n\n/** The idle-cache warning only has to notice an hour passing. */\nconst IDLE_TICK_MS = 30_000;\n\nexport interface ContextPaneProps {\n session: VerseSession | null;\n seats: readonly VerseSeat[];\n events: readonly VerseEvent[];\n roots: VerseSessionRootsResponse | null;\n rootsError: string | null;\n /** Opens the handoff dialog; absent → the action is not offered here. */\n onHandoff?: () => void;\n /** Why handoff is unavailable right now (a turn is running, dispatch is off); null = available. */\n handoffDisabledReason?: string | null;\n onOpenAccounts: () => void;\n /** False while this pane is a background tab: its clock stops. */\n visible: boolean;\n}\n\nfunction useSlowNow(active: boolean): number {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (!active) return undefined;\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), IDLE_TICK_MS);\n return () => clearInterval(id);\n }, [active]);\n return now;\n}\n\nexport function ContextPane({ session, seats, events, roots, rootsError, onHandoff, handoffDisabledReason = null, onOpenAccounts, visible }: ContextPaneProps) {\n const now = useSlowNow(visible && session !== null);\n return (\n <div className={styles.pane} aria-label=\"Context\">\n <section className={styles.section} aria-labelledby=\"dock-context-chat\">\n <h3 id=\"dock-context-chat\" className={styles.sectionTitle}>This chat</h3>\n {session\n ? <ChatUsage session={session} seats={seats} events={events} now={now} />\n : <p className={styles.muted}>Open a chat to see its usage and context.</p>}\n </section>\n\n {session ? (\n <div className={styles.section}>\n <SessionRoots session={session} data={roots} error={rootsError} />\n </div>\n ) : null}\n\n {session && onHandoff ? (\n <section className={styles.section} aria-labelledby=\"dock-context-handoff\">\n <h3 id=\"dock-context-handoff\" className={styles.sectionTitle}>Handoff</h3>\n <p className={styles.muted}>\n Verse drafts a note from this chat&apos;s log — free — and opens a fresh chat with it in the message box. Nothing is sent until you press Send.\n </p>\n <button type=\"button\" className={styles.action} onClick={onHandoff} disabled={handoffDisabledReason !== null}\n title={handoffDisabledReason ?? undefined}>\n Continue in a fresh chat…\n </button>\n {/* Always mounted: the reason comes and goes with every turn, and\n an unmounting line would shift Memory below it each time. */}\n <p className={`${styles.muted} ${styles.reserve}`}>{handoffDisabledReason ?? ''}</p>\n </section>\n ) : null}\n\n <div className={styles.section}>\n <MemoryPanel projectPath={session?.projectPath ?? null} refreshKey={session?.turnCount ?? 0} />\n </div>\n\n <div className={styles.section}>\n <button type=\"button\" className={styles.link} onClick={onOpenAccounts}>Accounts &amp; capacity →</button>\n </div>\n </div>\n );\n}\n","/**\n * dock/Dock.module.css — the chat dock: a column at ≥1024px, a right sheet\n * at 480–1023px, a bottom sheet (75vh) below 480px (dock-catalog.ts).\n * Hairlines, not shadows, separate it from the transcript in the column\n * layout; the sheets float, so they carry the dialog shadow. Tokens only\n * (style-scan-310).\n */\n.dock {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n height: 100%;\n background: var(--bg-surface);\n color: var(--text-primary);\n}\n.dock:focus { outline: none; }\n.dock[data-presentation='column'] {\n flex: none;\n border-left: 1px solid var(--border-subtle);\n}\n\n/* ---- sheets --------------------------------------------------------------- */\n.sheetLayer {\n position: absolute;\n inset: 0;\n z-index: var(--z-overlay);\n display: flex;\n justify-content: flex-end;\n pointer-events: none;\n}\n.sheetLayer[data-presentation='bottom-sheet'] {\n flex-direction: column;\n justify-content: flex-end;\n}\n.scrim {\n position: absolute;\n inset: 0;\n border: 0;\n padding: 0;\n background: var(--bg-overlay);\n cursor: default;\n pointer-events: auto;\n animation: dock-fade var(--duration-base) var(--ease-decelerate);\n}\n.sheetLayer .dock {\n z-index: 1;\n max-width: calc(100% - var(--space-8));\n border-left: 1px solid var(--border-default);\n box-shadow: var(--shadow-dialog);\n pointer-events: auto;\n animation: dock-in-right var(--duration-base) var(--ease-decelerate);\n}\n.sheetLayer[data-presentation='bottom-sheet'] .dock {\n width: 100%;\n max-width: none;\n height: 75vh;\n border-left: 0;\n border-top: 1px solid var(--border-default);\n border-radius: var(--radius-lg) var(--radius-lg) 0 0;\n animation-name: dock-in-up;\n}\n.grabber {\n flex: none;\n align-self: center;\n width: 36px;\n height: 4px;\n margin: var(--space-2) 0 0;\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n\n/* ---- head: tabs + actions ------------------------------------------------- */\n.head {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--space-1);\n height: calc(var(--strip-height) + var(--app-titlebar-height, 0px));\n padding: var(--app-titlebar-height, 0px) var(--space-2) 0;\n border-bottom: 1px solid var(--border-subtle);\n}\n.sheetLayer .head { height: var(--strip-height); padding-top: 0; }\n\n.tabs {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: var(--space-1);\n overflow-x: auto;\n scrollbar-width: none;\n}\n.tabs::-webkit-scrollbar { display: none; }\n\n.tabWrap {\n position: relative;\n flex: none;\n display: flex;\n align-items: center;\n border-radius: var(--radius-sm);\n}\n.tabWrap:hover { background: var(--bg-hover); }\n.tabWrap[data-selected] { background: var(--bg-selected); }\n/* The lower pane of a split wears a quiet underline: open, but not on top. */\n.tabWrap[data-below]::after {\n content: '';\n position: absolute;\n left: var(--space-2);\n right: var(--space-2);\n bottom: 2px;\n height: 1px;\n background: var(--border-strong);\n}\n\n.tab {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n min-height: var(--control-h-sm);\n padding: 0 var(--space-1) 0 var(--space-2);\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-secondary);\n font: inherit;\n font-size: var(--text-sm-size);\n white-space: nowrap;\n cursor: pointer;\n}\n.tabWrap[data-selected] .tab { color: var(--text-primary); font-weight: var(--font-weight-medium); }\n.tab:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.tabClose {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--control-h-xs);\n height: var(--control-h-xs);\n margin-right: 2px;\n padding: 0;\n border: 0;\n border-radius: var(--radius-xs);\n background: transparent;\n color: var(--text-tertiary);\n cursor: pointer;\n opacity: 0;\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n.tabWrap:hover .tabClose,\n.tabWrap[data-selected] .tabClose,\n.tabClose:focus-visible { opacity: 1; }\n.tabClose:hover { color: var(--text-primary); background: var(--bg-active); }\n\n.headActions {\n flex: none;\n display: flex;\n align-items: center;\n gap: 2px;\n}\n.iconButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--control-h-sm);\n height: var(--control-h-sm);\n padding: 0;\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-tertiary);\n cursor: pointer;\n}\n.iconButton:hover:not(:disabled) { color: var(--text-primary); background: var(--bg-hover); }\n.iconButton:disabled { color: var(--text-disabled); cursor: default; }\n.iconButton[aria-pressed='true'] { color: var(--text-primary); }\n.iconButton:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n.plus {\n font-size: var(--text-lg-size);\n line-height: 1;\n}\n\n/* ---- body: one pane, or two stacked --------------------------------------- */\n.body {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n.pane {\n flex: 1 1 100%;\n min-height: 0;\n overflow: auto;\n overscroll-behavior: contain;\n}\n.pane[hidden] { display: none; }\n.dock[data-split] .pane:not([hidden]) { flex-grow: 0; flex-shrink: 0; }\n\n.splitHandle {\n flex: none;\n position: relative;\n height: 1px;\n background: var(--border-subtle);\n cursor: row-resize;\n touch-action: none;\n}\n.splitHandle::before {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n top: -4px;\n bottom: -4px;\n}\n.splitHandle:hover,\n.splitHandle:focus-visible { background: var(--accent-500); outline: none; }\n\n/* ---- width handle (column only) ------------------------------------------- */\n.widthHandle {\n position: absolute;\n top: var(--app-titlebar-height, 0px);\n bottom: 0;\n left: -4px;\n z-index: 1;\n width: 9px;\n cursor: col-resize;\n touch-action: none;\n}\n.widthHandle::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 4px;\n width: 1px;\n background: transparent;\n transition: background var(--duration-fast) var(--ease-standard);\n}\n.widthHandle:hover::after,\n.widthHandle:focus-visible::after,\n.widthHandle[data-dragging]::after { background: var(--accent-500); }\n.widthHandle:focus-visible { outline: none; }\n\n/* Dark theme: a 4% top hairline instead of a shadow (SPEC-310C §6). */\n.dock[data-presentation='column'] { box-shadow: inset 0 1px 0 var(--hairline-lift); }\n\n@keyframes dock-fade { from { opacity: 0; } to { opacity: 1; } }\n@keyframes dock-in-right { from { opacity: 0; transform: translateX(4px); } to { opacity: 1; transform: none; } }\n@keyframes dock-in-up { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .scrim,\n :root:not([data-motion='full']) .sheetLayer .dock { animation: none; }\n}\n:root[data-motion='reduce'] .scrim,\n:root[data-motion='reduce'] .sheetLayer .dock { animation: none; }\n","/**\n * routes/verse/dock/Dock.tsx — the chat's right-hand workbench: Terminal,\n * Preview, Review, Tasks and Context as tabs, one pane or two stacked\n * (SPEC-310C §3, unit C2; contracts: shell/dock-catalog.ts, shell/slots.tsx).\n *\n * THE CONTAINER, NOT THE PANES. Terminal and Preview are C4's, Review is\n * C5's; the dock renders them through C0's slots, so it never imports their\n * code (xterm and the diff viewer stay off the chat's critical path) and a\n * pane whose file has not landed simply has no tab. Tasks and Context are\n * C2's own and arrive as render props from the Chat section, which holds\n * the data they show.\n *\n * LAYOUT follows the window (dockPresentation):\n * ≥ 1024px a column right of the transcript, 320px … 60% of the window,\n * resized by dragging its left edge or with ←/→ on that edge;\n * 480–1023 a sheet over the chat from the right;\n * < 480 a bottom sheet, 75vh.\n * Two panes split vertically (\"Preview over Terminal\"), their boundary\n * dragged or moved with ↑/↓.\n *\n * KEEP-ALIVE. A pane stays mounted from the moment its tab opens until the\n * tab closes — hidden, not unmounted, when another tab is on top — so a\n * terminal keeps its scrollback and a preview its page. Each pane is told\n * whether it is visible, so it can stop timers while hidden.\n *\n * State (open, tabs, split, width) lives in dock-store.ts and persists with\n * the shell's v3 blob.\n */\nimport { useCallback, useEffect, useId, useRef, useState, type KeyboardEvent, type PointerEvent as ReactPointerEvent, type ReactNode } from 'react';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport { ActionMenu, anchorBelow, type ActionMenuItem, type MenuAnchor } from '../chat/ActionMenu.js';\nimport { findCommand, formatChord } from '../shell/command-catalog.js';\nimport { DOCK_LAYOUT, DOCK_PANES, clampDockWidth, type DockPaneId, type DockPresentation } from '../shell/dock-catalog.js';\nimport { DiffPaneSlot, PreviewPaneSlot, TerminalPaneSlot, type TurnFileChange } from '../shell/slots.js';\nimport { DOCK_PANE_LABEL, isPaneAvailable } from './dock-panes.js';\nimport {\n closeDock,\n closeDockTab,\n openDockPane,\n requestTerminalBelow,\n setDockSplitRatio,\n setDockWidth,\n splitDock,\n useDock,\n} from './dock-store.js';\nimport { CloseGlyph, DOCK_PANE_GLYPH, SplitGlyph } from './dock-icons.js';\nimport styles from './Dock.module.css';\n\nexport interface DockProps {\n presentation: DockPresentation;\n /** Window width, for the 60% cap. */\n windowWidth: number;\n /** The width the column may actually take (after the transcript's floor); column presentation only. */\n columnWidth: number;\n sessionId: string | null;\n roots: readonly string[];\n turnFiles: readonly TurnFileChange[];\n /** Terminal ▸ Send selection to chat: already fenced. */\n onSendToChat: (text: string) => void;\n /** Review ▸ Add to message: `path:line: note`. */\n onAddToMessage: (text: string) => void;\n /** C2's own panes. */\n renderTasks: (visible: boolean) => ReactNode;\n renderContext: (visible: boolean) => ReactNode;\n}\n\nexport { DOCK_PANE_LABEL, isPaneAvailable };\n\n/** A catalog command's chord as this platform prints it (\"⌘N\" / \"Ctrl+N\"), or null when it has none. */\nfunction chordOf(id: string): string | null {\n const chord = findCommand(id)?.keys[0];\n return chord ? formatChord(chord) : null;\n}\n\nconst KEY_STEP = 16;\nconst KEY_STEP_COARSE = 64;\nconst RATIO_STEP = 0.05;\n\nexport function Dock(props: DockProps) {\n const { presentation, windowWidth, columnWidth } = props;\n const { state, requests } = useDock();\n const panelRef = useRef<HTMLElement>(null);\n const tabRefs = useRef(new Map<DockPaneId, HTMLButtonElement>());\n const idBase = useId();\n const [menu, setMenu] = useState<{ kind: 'add' | 'split'; anchor: MenuAnchor; from: HTMLElement } | null>(null);\n // Panes mount on first show and stay mounted while their tab is open.\n const [mounted, setMounted] = useState<ReadonlySet<DockPaneId>>(() => new Set(state.open && state.active ? [state.active] : []));\n\n const tabs = state.tabs.filter(isPaneAvailable);\n const active = state.active !== null && tabs.includes(state.active) ? state.active : tabs[0] ?? null;\n const split = state.splitWith !== null && tabs.includes(state.splitWith) && state.splitWith !== active ? state.splitWith : null;\n const open = state.open && active !== null;\n const sheet = presentation !== 'column';\n\n useEffect(() => {\n if (!open) return;\n setMounted((prev) => {\n const want = [active, split].filter((p): p is DockPaneId => p !== null);\n const next = new Set([...prev].filter((p) => tabs.includes(p)));\n for (const p of want) next.add(p);\n if (next.size === prev.size && [...next].every((p) => prev.has(p))) return prev;\n return next;\n });\n }, [open, active, split, tabs.join('|')]); // eslint-disable-line react-hooks/exhaustive-deps -- tabs is compared by content\n\n // A sheet takes focus when it opens and gives it back when it closes; a\n // column does not steal focus from the composer.\n useEffect(() => {\n if (!open || !sheet) return undefined;\n const before = document.activeElement as HTMLElement | null;\n panelRef.current?.focus({ preventScroll: true });\n return () => {\n if (before && document.contains(before)) before.focus({ preventScroll: true });\n };\n }, [open, sheet]);\n\n const onSheetKeyDown = useCallback((event: KeyboardEvent<HTMLElement>) => {\n if (!sheet) return;\n // Esc belongs to a terminal (vim, less, a REPL) when focus is in one.\n const inTerminal = event.target instanceof Element && event.target.closest('[data-dock-pane=\"terminal\"]') !== null;\n if (event.key === 'Escape' && !inTerminal && !event.defaultPrevented) {\n event.preventDefault();\n closeDock();\n return;\n }\n if (event.key !== 'Tab' || inTerminal) return;\n const node = panelRef.current;\n if (!node) return;\n const focusable = Array.from(node.querySelectorAll<HTMLElement>('button:not([disabled]), [href], input:not([disabled]), select, textarea, [tabindex]:not([tabindex=\"-1\"])'))\n .filter((el) => !el.closest('[hidden]'));\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last.focus(); }\n else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first.focus(); }\n }, [sheet]);\n\n if (!open) return null;\n\n function onTabKeyDown(event: KeyboardEvent<HTMLButtonElement>, pane: DockPaneId) {\n const i = tabs.indexOf(pane);\n let next: DockPaneId | undefined;\n if (event.key === 'ArrowRight') next = tabs[(i + 1) % tabs.length];\n else if (event.key === 'ArrowLeft') next = tabs[(i - 1 + tabs.length) % tabs.length];\n else if (event.key === 'Home') next = tabs[0];\n else if (event.key === 'End') next = tabs[tabs.length - 1];\n else if ((event.key === 'Delete' || event.key === 'Backspace') && tabs.length > 0) {\n event.preventDefault();\n closeDockTab(pane);\n return;\n }\n if (!next) return;\n event.preventDefault();\n openDockPane(next);\n tabRefs.current.get(next)?.focus();\n }\n\n const closedPanes = DOCK_PANES.map((p) => p.id).filter((id) => isPaneAvailable(id) && !tabs.includes(id));\n const addItems: ActionMenuItem[] = closedPanes.map((id) => ({\n id,\n label: DOCK_PANE_LABEL[id],\n icon: DOCK_PANE_GLYPH[id]({}),\n onSelect: () => openDockPane(id),\n }));\n const splitCandidates = DOCK_PANES.map((p) => p.id).filter((id) => isPaneAvailable(id) && id !== active);\n const splitItems: ActionMenuItem[] = [\n ...splitCandidates.map((id) => ({\n id,\n label: `${DOCK_PANE_LABEL[id]} below`,\n icon: DOCK_PANE_GLYPH[id]({}),\n onSelect: () => splitDock(id),\n })),\n ...(split ? [{ id: 'unsplit', label: 'One pane', separated: true, onSelect: () => splitDock(null) }] : []),\n ];\n\n const toggleChord = chordOf('dock.toggle');\n const width = presentation === 'column' ? columnWidth : clampDockWidth(state.width, windowWidth);\n const label = `Dock: ${DOCK_PANE_LABEL[active!]}${split ? ` over ${DOCK_PANE_LABEL[split]}` : ''}`;\n\n const panel = (\n <aside\n ref={panelRef}\n className={styles.dock}\n data-presentation={presentation}\n data-split={split ? 'true' : undefined}\n aria-label={label}\n role={sheet ? 'dialog' : 'complementary'}\n aria-modal={sheet ? true : undefined}\n tabIndex={-1}\n style={presentation === 'bottom-sheet' ? { height: `${DOCK_LAYOUT.bottomSheetHeightVh}vh` } : { width }}\n onKeyDown={onSheetKeyDown}\n >\n {presentation === 'column' ? <WidthHandle width={width} windowWidth={windowWidth} /> : null}\n {presentation === 'bottom-sheet' ? <span className={styles.grabber} aria-hidden=\"true\" /> : null}\n <div className={styles.head}>\n <div className={styles.tabs} role=\"tablist\" aria-label=\"Dock panes\">\n {tabs.map((pane) => {\n const Icon = DOCK_PANE_GLYPH[pane];\n const selected = pane === active;\n const below = pane === split;\n return (\n <div key={pane} className={styles.tabWrap} data-selected={selected || undefined} data-below={below || undefined}>\n <button\n ref={(node) => { if (node) tabRefs.current.set(pane, node); else tabRefs.current.delete(pane); }}\n type=\"button\"\n role=\"tab\"\n id={`${idBase}-tab-${pane}`}\n aria-selected={selected}\n aria-controls={`${idBase}-pane-${pane}`}\n tabIndex={selected ? 0 : -1}\n className={styles.tab}\n onClick={() => openDockPane(pane)}\n onKeyDown={(event) => onTabKeyDown(event, pane)}\n title={below ? `${DOCK_PANE_LABEL[pane]} (lower pane)` : undefined}\n >\n <Icon size={14} />\n <span className={styles.tabLabel}>{DOCK_PANE_LABEL[pane]}</span>\n </button>\n <button type=\"button\" className={styles.tabClose} aria-label={`Close ${DOCK_PANE_LABEL[pane]}`}\n title={`Close ${DOCK_PANE_LABEL[pane]}`} tabIndex={-1} onClick={() => closeDockTab(pane)}>\n <CloseGlyph size={12} />\n </button>\n </div>\n );\n })}\n </div>\n <div className={styles.headActions}>\n {/* Always drawn (disabled when every pane is open) so the actions\n never shift when the last closed pane is added back. */}\n <button type=\"button\" className={styles.iconButton} aria-label=\"Add a pane\"\n title={closedPanes.length > 0 ? 'Add a pane' : 'Every pane is already open'} aria-haspopup=\"menu\"\n aria-expanded={menu?.kind === 'add'} disabled={closedPanes.length === 0}\n onClick={(event) => setMenu({ kind: 'add', anchor: anchorBelow(event.currentTarget), from: event.currentTarget })}>\n <span className={styles.plus} aria-hidden=\"true\">+</span>\n </button>\n {presentation !== 'bottom-sheet' && splitItems.length > 0 ? (\n <button type=\"button\" className={styles.iconButton} aria-label={split ? 'Split: change or undo' : 'Split the dock'}\n title={split ? 'Change the split' : 'Split: show a second pane below'} aria-haspopup=\"menu\" aria-expanded={menu?.kind === 'split'}\n aria-pressed={split !== null}\n onClick={(event) => setMenu({ kind: 'split', anchor: anchorBelow(event.currentTarget), from: event.currentTarget })}>\n <SplitGlyph size={14} />\n </button>\n ) : null}\n <button type=\"button\" className={styles.iconButton} aria-label=\"Close the dock\"\n title={`Close the dock${toggleChord ? ` (${toggleChord})` : ''}`} onClick={closeDock}>\n <CloseGlyph size={14} />\n </button>\n </div>\n </div>\n\n <div className={styles.body}>\n {tabs.filter((p) => mounted.has(p) || p === active || p === split).map((pane) => {\n const shown = pane === active || (pane === split && presentation !== 'bottom-sheet');\n const position = pane === active ? 'top' : pane === split ? 'bottom' : 'hidden';\n return (\n <div\n key={pane}\n id={`${idBase}-pane-${pane}`}\n role=\"tabpanel\"\n aria-labelledby={`${idBase}-tab-${pane}`}\n className={styles.pane}\n data-dock-pane={pane}\n data-position={shown ? position : 'hidden'}\n hidden={!shown}\n inert={!shown}\n style={shown && split && presentation !== 'bottom-sheet'\n ? { flexBasis: `${(position === 'top' ? state.splitRatio : 1 - state.splitRatio) * 100}%`, order: position === 'top' ? 0 : 2 }\n : undefined}\n >\n <DockPane pane={pane} visible={shown} {...props} requests={requests} />\n </div>\n );\n })}\n {split && presentation !== 'bottom-sheet' ? <SplitHandle ratio={state.splitRatio} lower={DOCK_PANE_LABEL[split]} /> : null}\n </div>\n\n {menu ? (\n <ActionMenu\n label={menu.kind === 'add' ? 'Add a pane' : 'Split the dock'}\n items={menu.kind === 'add' ? addItems : splitItems}\n anchor={menu.anchor}\n returnFocus={menu.from}\n onClose={() => setMenu(null)}\n />\n ) : null}\n </aside>\n );\n\n if (!sheet) return panel;\n return (\n <div className={styles.sheetLayer} data-presentation={presentation}>\n <button type=\"button\" className={styles.scrim} aria-label=\"Close the dock\" tabIndex={-1} onClick={closeDock} />\n {panel}\n </div>\n );\n}\n\nfunction DockPane({ pane, visible, sessionId, roots, turnFiles, onSendToChat, onAddToMessage, renderTasks, renderContext, requests }:\n DockProps & { pane: DockPaneId; visible: boolean; requests: ReturnType<typeof useDock>['requests'] }) {\n if (pane === 'tasks') return <>{renderTasks(visible)}</>;\n if (pane === 'context') return <>{renderContext(visible)}</>;\n if (sessionId === null) {\n const newChat = chordOf('chat.new');\n return (\n <EmptyState compact title={`Open a chat to use ${DOCK_PANE_LABEL[pane]}`}\n body={`Pick a chat in the sidebar${newChat ? ` or start one with ${newChat}` : ''}. ${DOCK_PANE_LABEL[pane]} works in that chat's folders.`} />\n );\n }\n switch (pane) {\n case 'terminal':\n return <TerminalPaneSlot sessionId={sessionId} roots={roots} request={requests.terminal} onSendToChat={onSendToChat} visible={visible} />;\n case 'preview':\n return (\n // Dev-server Start: Terminal opens BELOW Preview, so the page appears\n // on top when its port answers (SPEC-310C acceptance step 3).\n <PreviewPaneSlot sessionId={sessionId} roots={roots} request={requests.preview} visible={visible}\n onOpenTerminal={requestTerminalBelow} />\n );\n case 'diff':\n return <DiffPaneSlot sessionId={sessionId} roots={roots} request={requests.diff} turnFiles={turnFiles} onAddToMessage={onAddToMessage} visible={visible} />;\n default:\n return null;\n }\n}\n\n/** The column's left edge: drag, or ←/→ (⇧ for coarse), double-click for the default. */\nfunction WidthHandle({ width, windowWidth }: { width: number; windowWidth: number }) {\n const max = Math.max(DOCK_LAYOUT.minWidth, Math.floor(windowWidth * DOCK_LAYOUT.maxWidthFraction));\n const drag = useRef<{ startX: number; startWidth: number } | null>(null);\n const [dragging, setDragging] = useState(false);\n\n function onPointerDown(event: ReactPointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n drag.current = { startX: event.clientX, startWidth: width };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n setDragging(true);\n document.body.setAttribute('data-verse-resizing', 'true');\n }\n function onPointerMove(event: ReactPointerEvent<HTMLDivElement>) {\n const start = drag.current;\n if (!start) return;\n // The dock grows leftward: moving the edge left by N widens it by N.\n setDockWidth(clampDockWidth(start.startWidth + (start.startX - event.clientX), windowWidth));\n }\n function end() {\n drag.current = null;\n setDragging(false);\n document.body.removeAttribute('data-verse-resizing');\n }\n useEffect(() => () => document.body.removeAttribute('data-verse-resizing'), []);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const step = event.shiftKey ? KEY_STEP_COARSE : KEY_STEP;\n let next: number | null = null;\n if (event.key === 'ArrowLeft') next = width + step;\n else if (event.key === 'ArrowRight') next = width - step;\n else if (event.key === 'Home') next = DOCK_LAYOUT.minWidth;\n else if (event.key === 'End') next = max;\n if (next === null) return;\n event.preventDefault();\n setDockWidth(clampDockWidth(next, windowWidth));\n }\n\n return (\n <div className={styles.widthHandle} role=\"separator\" aria-orientation=\"vertical\" aria-label=\"Resize the dock\"\n aria-valuemin={DOCK_LAYOUT.minWidth} aria-valuemax={max} aria-valuenow={Math.round(width)} tabIndex={0}\n data-dragging={dragging || undefined}\n onPointerDown={onPointerDown} onPointerMove={onPointerMove} onPointerUp={end} onPointerCancel={end} onLostPointerCapture={end}\n onDoubleClick={() => setDockWidth(DOCK_LAYOUT.defaultWidth)} onKeyDown={onKeyDown} />\n );\n}\n\n/** The boundary between the two stacked panes: drag, or ↑/↓. */\nfunction SplitHandle({ ratio, lower }: { ratio: number; lower: string }) {\n const ref = useRef<HTMLDivElement>(null);\n const drag = useRef<{ top: number; height: number } | null>(null);\n\n function onPointerDown(event: ReactPointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n const body = ref.current?.parentElement;\n if (!body) return;\n event.preventDefault();\n const rect = body.getBoundingClientRect();\n drag.current = { top: rect.top, height: rect.height };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n }\n function onPointerMove(event: ReactPointerEvent<HTMLDivElement>) {\n const d = drag.current;\n if (!d || d.height <= 0) return;\n setDockSplitRatio((event.clientY - d.top) / d.height);\n }\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (event.key === 'ArrowUp') { event.preventDefault(); setDockSplitRatio(ratio - RATIO_STEP); }\n else if (event.key === 'ArrowDown') { event.preventDefault(); setDockSplitRatio(ratio + RATIO_STEP); }\n }\n return (\n <div ref={ref} className={styles.splitHandle} role=\"separator\" aria-orientation=\"horizontal\"\n aria-label={`Resize: ${lower} below`} aria-valuemin={Math.round(DOCK_LAYOUT.splitRatio.min * 100)}\n aria-valuemax={Math.round(DOCK_LAYOUT.splitRatio.max * 100)} aria-valuenow={Math.round(ratio * 100)} tabIndex={0}\n style={{ order: 1 }}\n onPointerDown={onPointerDown} onPointerMove={onPointerMove}\n onPointerUp={() => { drag.current = null; }} onPointerCancel={() => { drag.current = null; }}\n onDoubleClick={() => setDockSplitRatio(DOCK_LAYOUT.splitRatio.default)} onKeyDown={onKeyDown} />\n );\n}\n","/**\n * routes/verse/dock/TasksPane.tsx — what is running, and where (SPEC-310C §3\n * \"Tasks\", unit C2; model: chat/tasks-model.ts).\n *\n * THIS CHAT ● Bash npm test running 1m 02s\n * ● Task review the auth module running 12s (subagent)\n * ✓ Read src/core/api.ts 0.4s\n * OTHER CHATS ● Fix the login bug · claude-a npm run build · 3m 10s\n *\n * Click a call to jump to it in the transcript (a folded group opens itself);\n * click another chat to open it. Finished calls of this turn stay listed\n * under the running ones (newest first, the last 20) so \"what did it just\n * do\" is answerable without scrolling the transcript.\n */\nimport type { VerseEngine } from '../../../data/api-types.js';\nimport { LiveTimer } from '../chat/LiveTimer.js';\nimport type { ChatTask, TurnTask } from '../chat/tasks-model.js';\nimport { toolAnchorId } from '../chat/tool-semantics.js';\nimport { requestTranscriptJump } from '../chat/transcript-jump.js';\nimport { findCommand, formatChord } from '../shell/command-catalog.js';\nimport { formatDuration } from '../verse-model.js';\nimport styles from './panes.module.css';\nimport { ProviderLogo } from '../../../components/primitives/ProviderLogo.js';\n\nconst FINISHED_SHOWN = 20;\n\nexport interface TasksPaneProps {\n /** This chat's calls since its last ask (running first). */\n turnTasks: readonly TurnTask[];\n otherChats: readonly ChatTask[];\n /** Whether a chat is open at all. */\n hasSession: boolean;\n onOpenSession: (sessionId: string) => void;\n}\n\nconst STATUS_WORD: Record<TurnTask['status'], string> = { running: 'running', done: 'done', failed: 'failed' };\n\nexport function TasksPane({ turnTasks, otherChats, hasSession, onOpenSession }: TasksPaneProps) {\n const newChatKey = findCommand('chat.new')?.keys[0];\n const newChat = newChatKey ? formatChord(newChatKey) : null;\n const running = turnTasks.filter((t) => t.status === 'running');\n const finished = turnTasks.filter((t) => t.status !== 'running').slice(0, FINISHED_SHOWN);\n\n return (\n <div className={styles.pane} aria-label=\"Tasks\">\n <section className={styles.section} aria-labelledby=\"dock-tasks-turn\">\n <h3 id=\"dock-tasks-turn\" className={styles.sectionTitle}>\n This chat <span className={styles.count}>{running.length > 0 ? `${running.length} running` : ''}</span>\n </h3>\n {!hasSession ? (\n <p className={styles.muted}>Open a chat to see its tool calls here.</p>\n ) : turnTasks.length === 0 ? (\n <>\n <p className={styles.muted}>No tool calls in the latest turn.</p>\n <p className={styles.hint}>Send a message: each tool the agent runs shows up here, and a click jumps to it in the chat.</p>\n </>\n ) : (\n <ul className={styles.taskList}>\n {[...running, ...finished].map((task) => (\n <li key={task.toolUseId}>\n <button type=\"button\" className={styles.task} data-status={task.status}\n onClick={() => { requestTranscriptJump(toolAnchorId(task.toolUseId)); }}\n aria-label={`${task.kind === 'subagent' ? 'Subagent' : task.name}: ${task.detail}, ${STATUS_WORD[task.status]}. Jump to it in the chat.`}>\n <span className={styles.taskMark} data-status={task.status} aria-hidden=\"true\" />\n <span className={styles.taskName} title={task.kind === 'subagent' ? 'Subagent' : task.name}>{task.kind === 'subagent' ? 'Subagent' : task.name}</span>\n <span className={styles.taskDetail} title={task.detail}>{task.detail}</span>\n <span className={styles.taskTime}>\n {task.status === 'running'\n ? <LiveTimer since={task.startedAt} />\n : task.status === 'failed'\n ? 'failed'\n : task.durationMs !== null && task.durationMs > 0 ? formatDuration(task.durationMs) : 'done'}\n </span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n\n <section className={styles.section} aria-labelledby=\"dock-tasks-chats\">\n <h3 id=\"dock-tasks-chats\" className={styles.sectionTitle}>\n Other chats <span className={styles.count}>{otherChats.length > 0 ? `${otherChats.length} running` : ''}</span>\n </h3>\n {otherChats.length === 0 ? (\n <>\n <p className={styles.muted}>No other chat is running.</p>\n <p className={styles.hint}>\n {newChat ? `Start another with ${newChat}` : 'Start another chat'} and it shows here while it works, one click away.\n </p>\n </>\n ) : (\n <ul className={styles.taskList}>\n {otherChats.map((chat) => (\n <li key={chat.sessionId}>\n <button type=\"button\" className={styles.task} data-status=\"running\" onClick={() => onOpenSession(chat.sessionId)}\n aria-label={`${chat.title || 'Untitled chat'}, running${chat.live ? `: ${chat.live}` : ''}. Open this chat.`}>\n <EngineTick engine={chat.engine} />\n <span className={styles.taskName} title={chat.title || 'Untitled chat'}>{chat.title || 'Untitled chat'}</span>\n <span className={styles.taskDetail} title={chat.live ?? undefined}>{chat.live ?? ''}</span>\n <span className={styles.taskTime}>{chat.startedAt ? <LiveTimer since={chat.startedAt} /> : 'running'}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n </div>\n );\n}\n\n/** Engine identity: a 2px tick plus the provider's mark (3.11.1). */\nexport function EngineTick({ engine }: { engine: VerseEngine }) {\n return <span className={styles.engineTick} data-engine={engine} aria-hidden=\"true\"><ProviderLogo engine={engine} size={12} /></span>;\n}\n","/**\n * routes/verse/dock/DockHost.tsx — the dock with the chat's own panes wired\n * in (unit C2). The Chat section loads THIS lazily the first time the dock\n * opens: the dock starts closed, so none of it — the container, the Tasks\n * and Context panes, the memory editor behind Context — belongs on the\n * chat's first-paint path (SPEC-310C budget: chat critical JS ≤ 350 KB).\n */\nimport { useMemo } from 'react';\nimport type { VerseEvent, VerseSeat, VerseSession, VerseSessionRootsResponse } from '../../../data/api-types.js';\nimport type { DockPresentation } from '../shell/dock-catalog.js';\nimport type { TurnFileChange } from '../shell/slots.js';\nimport { currentTurnTasks, type ChatTask } from '../chat/tasks-model.js';\nimport { useVerseTranscript } from '../useVerseTranscript.js';\nimport { ContextPane } from './ContextPane.js';\nimport { Dock } from './Dock.js';\nimport { TasksPane } from './TasksPane.js';\n\nexport interface DockHostProps {\n presentation: DockPresentation;\n windowWidth: number;\n columnWidth: number;\n session: VerseSession | null;\n seats: readonly VerseSeat[];\n events: readonly VerseEvent[];\n roots: readonly string[];\n rootsData: VerseSessionRootsResponse | null;\n rootsError: string | null;\n turnFiles: readonly TurnFileChange[];\n otherRunning: readonly ChatTask[];\n dispatchEnabled: boolean;\n onOpenSession: (sessionId: string) => void;\n onHandoff: (sessionId: string) => void;\n onOpenAccounts: () => void;\n onSendToChat: (text: string) => void;\n onAddToMessage: (text: string) => void;\n}\n\nexport function DockHost(props: DockHostProps) {\n const { session, seats, events, rootsData, rootsError, otherRunning, dispatchEnabled, onOpenSession, onHandoff, onOpenAccounts } = props;\n const handoffReason = !dispatchEnabled\n ? 'Sending is disabled on this server.'\n : session?.status === 'running' ? 'Available when the current turn finishes.' : null;\n return (\n <Dock presentation={props.presentation} windowWidth={props.windowWidth} columnWidth={props.columnWidth}\n sessionId={session?.id ?? null} roots={props.roots} turnFiles={props.turnFiles}\n onSendToChat={props.onSendToChat} onAddToMessage={props.onAddToMessage}\n renderTasks={() => <LiveTasksPane sessionId={session?.id ?? null} otherChats={otherRunning} onOpenSession={onOpenSession} />}\n renderContext={(visible) => (\n <ContextPane session={session} seats={seats} events={events} roots={rootsData} rootsError={rootsError} visible={visible}\n onHandoff={session ? () => onHandoff(session.id) : undefined} handoffDisabledReason={handoffReason}\n onOpenAccounts={onOpenAccounts} />\n )} />\n );\n}\n\n/** The Tasks pane, subscribed to the open chat's transcript on its own (a streamed token re-renders this, not the section). */\nfunction LiveTasksPane({ sessionId, otherChats, onOpenSession }: { sessionId: string | null; otherChats: readonly ChatTask[]; onOpenSession: (id: string) => void }) {\n const transcript = useVerseTranscript(sessionId);\n const turnTasks = useMemo(() => currentTurnTasks(transcript.items), [transcript.items]);\n return <TasksPane turnTasks={turnTasks} otherChats={otherChats} hasSession={sessionId !== null} onOpenSession={onOpenSession} />;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DockHost-aWP7liri.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/context/ChatUsage.module.css","../../../../../../src/web-ui/routes/verse/context/ChatUsage.tsx","../../../../../../src/web-ui/routes/verse/context/MemoryPanel.tsx","../../../../../../src/web-ui/routes/verse/SessionRoots.module.css","../../../../../../src/web-ui/routes/verse/SessionRoots.tsx","../../../../../../src/web-ui/routes/verse/dock/panes.module.css","../../../../../../src/web-ui/routes/verse/dock/ContextPane.tsx","../../../../../../src/web-ui/routes/verse/dock/Dock.module.css","../../../../../../src/web-ui/routes/verse/dock/Dock.tsx","../../../../../../src/web-ui/routes/verse/dock/TasksPane.tsx","../../../../../../src/web-ui/routes/verse/dock/DockHost.tsx"],"sourcesContent":["/**\n * context/ChatUsage.module.css — the figure grid for one chat's usage and\n * context efficiency (moved with ChatUsage from ResourcesPanel in 3.10).\n */\n.usage { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-2) var(--space-4); margin: 0; }\n.usage > div { display: flex; flex-direction: column; gap: 1px; min-width: 0; }\n.usage dt {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n.usage dd {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n font-variant-numeric: tabular-nums;\n color: var(--text-primary);\n}\n.usage + .muted { margin-top: var(--space-2); }\n.usage + .muted + .muted { margin-top: var(--space-1); }\n.subTitle {\n margin: var(--space-3) 0 var(--space-2);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-regular);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n.muted { color: var(--text-tertiary); font-size: var(--text-xs-size); line-height: var(--text-xs-line); }\n/* Idle past the prompt-cache lifetime. A status, in words, on the warning\n hairline — the colour repeats the sentence, it never replaces it. */\n.idleWarn {\n margin-top: var(--space-2);\n padding-left: var(--space-2);\n border-left: 2px solid var(--status-warning-solid);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--status-warning-fg);\n}\n","/**\n * routes/verse/context/ChatUsage.tsx — the open chat's usage and context\n * efficiency (moved out of ResourcesPanel in 3.10, unit C2).\n *\n * The resources column is gone: accounts and seat capacity moved to Apps &\n * Accounts (C6), and what was about THIS CHAT moved into the dock's Context\n * pane. This block came with it unchanged — every figure is still derived\n * from the session record and its own event log, with no request and no\n * spend, and every number the CLI did not report still reads \"—\" or \"≤\".\n */\nimport type { VerseEvent, VerseSeat, VerseSession } from '../../../data/api-types.js';\nimport { MEMORY_BLOCK_MAX_BYTES } from './context-model.js';\nimport {\n CONTEXT_MODE_LABEL,\n idleCacheWarning,\n reportedCacheHitRatio,\n sessionContext,\n turnContextStats,\n} from '../usage/context-model.js';\nimport { formatContextWindow, formatElapsed, windowSourceText } from '../verse-model.js';\nimport { formatWholePercent } from '../autonomy/format.js';\nimport { formatTokens, lastTurnActivityAt } from '../verse-readouts.js';\nimport styles from './ChatUsage.module.css';\n\n/**\n * The open chat's usage and context efficiency. Every figure is derived from\n * the session record and its own event log — no request, no spend.\n */\nexport function ChatUsage({\n session,\n seats,\n events,\n now,\n}: {\n session: VerseSession;\n seats: readonly VerseSeat[];\n events: readonly VerseEvent[] | undefined;\n now: number;\n}) {\n const usage = session.usage;\n const ctx = sessionContext(session, seats);\n const stats = turnContextStats(events ?? []);\n const promptTokens = usage.inputTokens + usage.cacheReadTokens + usage.cacheCreationTokens;\n const hit = reportedCacheHitRatio(usage);\n // The record's count is the durable one (a long log may be truncated); the\n // log's own count stands in only when the record predates the field.\n const compactions = session.compactionCount ?? stats.compactions;\n const idle = idleCacheWarning(session, ctx.tokens, now, lastTurnActivityAt(events ?? []));\n const bound = ctx.exact ? '' : '≤';\n const statBound = stats.exact ? '' : '≤';\n\n return (\n <>\n <dl className={styles.usage}>\n <div><dt>Input</dt><dd>{formatTokens(usage.inputTokens)}</dd></div>\n <div><dt>Output</dt><dd>{formatTokens(usage.outputTokens)}</dd></div>\n <div><dt>Cache read</dt><dd>{formatTokens(usage.cacheReadTokens)}</dd></div>\n <div><dt>Cache write</dt><dd>{formatTokens(usage.cacheCreationTokens)}</dd></div>\n <div><dt>Turns</dt><dd>{session.turnCount}</dd></div>\n <div>\n <dt>Context</dt>\n <dd title={ctx.exact ? undefined : 'An upper bound: the CLI reported only the turn total, which sums every call.'}>\n {bound}{formatTokens(ctx.tokens)}{ctx.window === null ? '' : ` / ${formatContextWindow(ctx.window)}`}\n </dd>\n </div>\n </dl>\n\n <h4 className={styles.subTitle}>Efficiency</h4>\n <dl className={styles.usage} aria-label=\"Context efficiency\">\n <div>\n <dt>Cache hit</dt>\n <dd title=\"Share of prompt tokens served from the provider's cache: cache read ÷ (input + cache read + cache write).\">\n {/* Whole percent, \"<1%\" for a sliver — never \"0%\" beside real cache reads. */}\n {hit !== null ? formatWholePercent(hit) : promptTokens > 0 ? 'none reported' : '—'}\n </dd>\n </div>\n <div><dt>Compactions</dt><dd>{compactions}</dd></div>\n <div>\n <dt>Avg context / turn</dt>\n <dd>{stats.average === null ? '—' : `${statBound}${formatTokens(stats.average)}`}</dd>\n </div>\n <div>\n <dt>Peak context</dt>\n <dd>{stats.peak === null ? '—' : `${statBound}${formatTokens(stats.peak)}`}</dd>\n </div>\n <div><dt>Mode</dt><dd>{CONTEXT_MODE_LABEL[ctx.mode]}</dd></div>\n <div>\n <dt>Compacts at</dt>\n <dd>{ctx.autoCompactAt === null ? '—' : `≈${formatTokens(ctx.autoCompactAt)}`}</dd>\n </div>\n </dl>\n <p className={styles.muted}>\n {ctx.source !== null\n ? `Window ${windowSourceText(ctx.source, session.engine)}.`\n : ctx.window !== null\n ? 'Window as stored when this chat was created; how it was known was not recorded.'\n : 'Window unknown for this chat.'}\n {stats.turns > 0 && !stats.exact ? ' Figures marked ≤ are upper bounds: the CLI reported only turn totals.' : ''}\n </p>\n {/* Pinned per chat at creation, like its roots: the memory panel below\n edits the PROJECT's file, not what this conversation was offered.\n On a paid seat memory is not free — its block rides in the system\n prompt of every turn — so the sentence says what it adds rather than\n leaving the operator to assume it costs nothing. */}\n <p className={styles.muted}>\n {session.memoryEnabled !== true\n ? 'This chat started without shared project memory.'\n : session.engine === 'local'\n ? 'Shared project memory was given to this chat’s agent when it started.'\n : `Shared project memory was given to this chat’s agent when it started: a block of up to ${MEMORY_BLOCK_MAX_BYTES / 1024} KB in its system prompt, re-sent every turn (cached after the first), plus the agent’s own reads and updates of MEMORY.md — a little of this seat’s usage.`}\n </p>\n {idle === null ? null : (\n <p role=\"status\" className={styles.idleWarn}>\n {idle.local\n ? `Idle for ${formatElapsed(idle.idleMs)}: the local model has likely dropped this chat from its cache, so the next turn re-processes ~${formatTokens(idle.tokens)} tokens before it replies — time, not spend.`\n : `Idle for ${formatElapsed(idle.idleMs)}, past the ~1 h prompt-cache lifetime: the next turn likely re-reads ~${formatTokens(idle.tokens)} tokens uncached, at full price.`}\n </p>\n )}\n </>\n );\n}\n","/**\n * routes/verse/context/MemoryPanel.tsx — shared project memory, as a section\n * of the resources panel.\n *\n * Every seat on a project — Claude, Codex, Grok, local, any account — is\n * pointed at ONE Verse-owned `MEMORY.md` for that project\n * (`~/.ashlr/verse/memory/<project>-<hash>/`). The agents keep it current;\n * this panel is where the operator sees what they wrote, corrects it, clears\n * it, or turns it off for the project.\n *\n * Three facts are stated rather than implied, because each one changes what\n * the operator should do:\n *\n * - SCOPE. The file is per PROJECT, shared across seats and accounts — not\n * per chat. Clearing it clears it for every chat on the project.\n * - WHO CAN WRITE. Claude, Codex and local seats are given the directory;\n * Grok's CLI can reach only its cwd, so a Grok seat gets the text and\n * cannot edit the file.\n * - WHEN IT APPLIES. A chat snapshots the memory block into its instructions\n * when it is CREATED (so the prompt prefix — and the provider's prompt\n * cache — stays byte-identical every turn). Chats already open see an edit\n * when they next read the file; the on/off switch affects new chats only.\n *\n * Saving is guarded against the one race this surface has: an agent can\n * write the file while the operator is editing it. The current file is\n * re-read before every save, and a change since editing began is shown as a\n * conflict instead of being silently overwritten.\n *\n * And against the one LOSSY read it has: every API response is sanitized, so\n * the text shown can have `~` for the home folder and `[REDACTED]` over\n * secret-shaped values that are still in the file (`contentSanitized`). Saving\n * that text back would write the placeholders over the real values — the\n * server refuses it (409 VERSE_MEMORY_REDACTED), and the editor says so first\n * and keeps Save off while any placeholder remains.\n *\n * The panel itself spends nothing (memory is a file on this machine), but\n * USING memory does on paid seats — the block rides in every new chat's\n * system prompt — and the panel says so (MEMORY_SPEND_NOTE).\n */\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { VERSE_MEMORY_MAX_BYTES } from '../../../../core/verse/types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { Switch } from '../../../components/primitives/Switch.js';\nimport { ApiError } from '../../../data/client.js';\nimport { useQuery, useRefresh } from '../../../data/hooks.js';\nimport { projectName } from '../verse-model.js';\nimport {\n formatBytes,\n jsonBodyBytes,\n MEMORY_BODY_MAX_BYTES,\n MEMORY_SPEND_NOTE,\n REDACTION_MARKER,\n redactionMarkers,\n relativePhrase,\n secretLike,\n utf8Bytes,\n} from './context-model.js';\nimport {\n fetchProjectMemory,\n updatePreferences,\n versePreferencesQuery,\n verseProjectMemoryQuery,\n writeProjectMemory,\n type VerseProjectMemoryView,\n} from './context-queries.js';\nimport { describeContextError, useTokenGate } from './use-token-gate.js';\nimport styles from './context.module.css';\n\nexport interface MemoryPanelProps {\n /** The project whose memory to show — the open chat's primary folder. Null when no chat is open. */\n projectPath: string | null;\n /**\n * Bump to re-read the file — e.g. the open chat's `turnCount`, since agents\n * write memory during turns. Optional; the panel also has a Refresh button.\n */\n refreshKey?: number | string;\n}\n\nexport function MemoryPanel({ projectPath, refreshKey }: MemoryPanelProps) {\n const headingId = useId();\n if (!projectPath) {\n return (\n <section className={styles.memory} aria-labelledby={headingId}>\n <h3 id={headingId} className={styles.memoryHead}>Project memory</h3>\n <p className={styles.hint}>Open a chat to see the memory its project shares across seats.</p>\n </section>\n );\n }\n // Keyed by path: switching projects discards any half-finished edit of the\n // previous project's file instead of letting it be saved onto the new one.\n return <MemoryPanelBody key={projectPath} projectPath={projectPath} refreshKey={refreshKey} />;\n}\n\ntype Mode = 'view' | 'edit' | 'confirm-clear';\ntype Busy = 'saving' | 'clearing' | 'toggling' | null;\n\nconst SAVE_REASON = 'Saving writes MEMORY.md for this project. Every seat on it reads this file.';\nconst CLEAR_REASON = 'Clearing empties MEMORY.md for every chat on this project.';\nconst TOGGLE_REASON = 'This changes whether new chats on this project are given shared memory.';\nconst GLOBAL_REASON = 'This changes whether new chats on ANY project are given shared memory.';\n\nfunction MemoryPanelBody({ projectPath, refreshKey }: { projectPath: string; refreshKey?: number | string }) {\n const headingId = useId();\n const editorId = useId();\n const counterId = useId();\n const def = useMemo(() => verseProjectMemoryQuery(projectPath), [projectPath]);\n const memory = useQuery(def);\n const refresh = useRefresh(def);\n const prefs = useQuery(versePreferencesQuery);\n const gate = useTokenGate();\n const name = projectName(projectPath);\n\n const [mode, setMode] = useState<Mode>('view');\n const [draft, setDraft] = useState('');\n /** The file as it was when editing began — what a save must still find on disk. */\n const [base, setBase] = useState('');\n /** Whether the text editing began from was sanitized — a placeholder in it stands for a real value on disk. */\n const [baseSanitized, setBaseSanitized] = useState(false);\n const [conflict, setConflict] = useState<VerseProjectMemoryView | null>(null);\n const [busy, setBusy] = useState<Busy>(null);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const editorRef = useRef<HTMLTextAreaElement>(null);\n\n // A finished turn may have changed the file; re-read on the caller's signal\n // (never on first render — useQuery already read it).\n const firstKey = useRef(refreshKey);\n useEffect(() => {\n if (refreshKey === firstKey.current) return;\n firstKey.current = refreshKey;\n refresh();\n }, [refreshKey, refresh]);\n\n // Entering the editor lands the caret at the END: the common edit is adding\n // a line, and a caret at offset 0 would prepend it above the heading.\n useEffect(() => {\n const editor = editorRef.current;\n if (mode !== 'edit' || !editor) return;\n editor.focus();\n editor.setSelectionRange(editor.value.length, editor.value.length);\n }, [mode]);\n\n // The record a write just returned, shown until the re-read it triggered\n // lands — otherwise \"Saved.\" would sit over the OLD text for a round trip.\n const [lastWritten, setLastWritten] = useState<VerseProjectMemoryView | null>(null);\n useEffect(() => {\n if (lastWritten !== null && memory.status === 'success') setLastWritten(null);\n }, [lastWritten, memory.status]);\n const data = lastWritten !== null && memory.status !== 'success' ? lastWritten : memory.data;\n const unsupported = memory.error instanceof ApiError && memory.error.status === 404;\n const globalOff = prefs.data ? !prefs.data.memory.enabled : false;\n const draftBytes = useMemo(() => utf8Bytes(draft), [draft]);\n const overCap = draftBytes > VERSE_MEMORY_MAX_BYTES;\n // Under the memory cap is not enough: the request that carries it must fit\n // POST /memory's body cap once JSON-escaped. That route's cap is sized for\n // a full 64 KB file (MEMORY_BODY_MAX_BYTES, the server's own figure) — the\n // 64 KB default every other POST uses would block saves the server accepts.\n // In practice this only trips on text that escapes to more than 2 bytes a\n // character (control characters), which the server would refuse too.\n const requestBytes = useMemo(() => jsonBodyBytes({ projectPath, content: draft }), [projectPath, draft]);\n const overBody = !overCap && requestBytes > MEMORY_BODY_MAX_BYTES;\n const secret = mode === 'edit' ? secretLike(draft) : null;\n // Only a sanitized base makes a placeholder dangerous: in an unsanitized\n // file a literal \"[REDACTED]\" is just text the file already had.\n const placeholders = mode === 'edit' && baseSanitized ? redactionMarkers(draft) : 0;\n\n function startEdit(from: string, sanitized: boolean) {\n setDraft(from);\n setBase(from);\n setBaseSanitized(sanitized);\n setConflict(null);\n setError(null);\n setNotice(null);\n setMode('edit');\n }\n\n async function save(overwrite = false) {\n if (busy) return;\n setBusy('saving');\n setError(null);\n try {\n // Re-read first: an agent may have written the file since editing began.\n const latest = await fetchProjectMemory(projectPath);\n if (!overwrite && latest.content !== base) {\n setConflict(latest);\n return;\n }\n const saved = await gate.run(SAVE_REASON, () => writeProjectMemory(projectPath, draft));\n if (saved === null) return;\n setLastWritten(saved);\n setConflict(null);\n setMode('view');\n setNotice(saved.content.length === 0 ? 'Saved — MEMORY.md is now empty.' : 'Saved.');\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setBusy(null);\n }\n }\n\n async function clear() {\n if (busy) return;\n setBusy('clearing');\n setError(null);\n try {\n const saved = await gate.run(CLEAR_REASON, () => writeProjectMemory(projectPath, ''));\n if (saved === null) return;\n setLastWritten(saved);\n setMode('view');\n setNotice('Cleared. Agents start MEMORY.md afresh on their next write.');\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setBusy(null);\n }\n }\n\n async function setProjectEnabled(next: boolean) {\n if (busy) return;\n setBusy('toggling');\n setError(null);\n setNotice(null);\n try {\n const result = await gate.run(TOGGLE_REASON, () => updatePreferences({ projectPath, memoryEnabled: next }));\n if (result !== null) {\n setNotice(next\n ? `New chats on ${name} will get shared memory. Chats already open keep what they started with.`\n : `New chats on ${name} will start without shared memory. The file is kept.`);\n }\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setBusy(null);\n }\n }\n\n async function setGlobalEnabled(next: boolean) {\n if (busy) return;\n setBusy('toggling');\n setError(null);\n setNotice(null);\n try {\n await gate.run(GLOBAL_REASON, () => updatePreferences({ memoryEnabled: next }));\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setBusy(null);\n }\n }\n\n const state = data ? (globalOff ? 'off everywhere' : data.enabled ? 'on' : 'off') : null;\n\n return (\n <section className={styles.memory} aria-labelledby={headingId} data-project={projectPath}>\n <h3 id={headingId} className={styles.memoryHead}>\n <span>Project memory</span>\n {state ? <span className={styles.memoryState}>{state}</span> : null}\n {unsupported ? null : (\n <button type=\"button\" className={styles.memoryHeadAction} onClick={refresh}\n aria-label=\"Refresh project memory\">Refresh</button>\n )}\n </h3>\n\n <p className={styles.hint}>\n One <code>MEMORY.md</code> shared by every chat on <strong title={projectPath}>{name}</strong>, whichever seat runs it. Agents keep it\n current — decisions and why, conventions, gotchas, plan status.\n </p>\n\n {unsupported ? (\n <p className={styles.hint}>This server has no project memory yet — update Ashlr and restart <code>ashlr verse</code>.</p>\n ) : memory.status === 'loading' || (memory.status === 'idle' && !data) ? (\n <div aria-busy=\"true\"><SkeletonLine width=\"80%\" /><SkeletonLine width=\"60%\" /><SkeletonLine width=\"70%\" /></div>\n ) : !data ? (\n <div className={styles.searchError} role=\"alert\">\n <span>Could not read this project’s memory: {describeContextError(memory.error)}</span>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`} onClick={refresh}>Retry</button>\n </div>\n ) : (\n <>\n {/* ---- on / off ---- */}\n {globalOff ? (\n <div className={styles.field}>\n <p className={styles.hint}>Shared memory is off for every project, so new chats start without it.</p>\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`} disabled={busy !== null}\n onClick={() => void setGlobalEnabled(true)}>Turn memory on</button>\n </div>\n </div>\n ) : (\n <Switch checked={data.enabled} disabled={busy !== null || !prefs.data}\n onChange={(next) => void setProjectEnabled(next)}\n label={`Give new chats on ${name} this memory`} />\n )}\n\n {/* ---- the file ---- */}\n {mode === 'edit' ? (\n <div className={styles.field}>\n <label className={styles.label} htmlFor={editorId}>Edit MEMORY.md</label>\n <textarea id={editorId} ref={editorRef} className={styles.textarea} value={draft} rows={12} spellCheck={false}\n aria-describedby={counterId} aria-invalid={overCap || overBody ? true : undefined}\n onChange={(event) => setDraft(event.target.value)} />\n <p id={counterId} className={`${styles.hint} ${styles.counter} ${overCap || overBody ? styles.counterOver : ''}`}>\n {formatBytes(draftBytes)} of {formatBytes(VERSE_MEMORY_MAX_BYTES)}\n {overCap ? ' — over the limit; trim it to save.' : ''}\n {overBody ? ` — ${formatBytes(requestBytes)} once line breaks and quotes are encoded for sending, over the ${formatBytes(MEMORY_BODY_MAX_BYTES)} request limit; trim it to save.` : ''}\n </p>\n {secret ? (\n <p className={styles.warn} role=\"alert\">\n This looks like it contains {secret}. MEMORY.md is sent to every seat’s model — remove it before saving.\n </p>\n ) : null}\n {placeholders > 0 ? (\n <p className={styles.warn} role=\"alert\">\n {placeholders === 1 ? 'One' : placeholders} <code>{REDACTION_MARKER}</code> placeholder{placeholders === 1 ? ' stands' : 's stand'} in\n for secret-looking text that is still in MEMORY.md. Saving {placeholders === 1 ? 'it' : 'them'} would replace the real\n value{placeholders === 1 ? '' : 's'}, so Save stays off until {placeholders === 1 ? 'it is' : 'they are'} gone. Deleting a\n placeholder drops that value from the file; to keep it, edit MEMORY.md directly under <code>~/.ashlr/verse/memory</code>.\n </p>\n ) : baseSanitized ? (\n <p className={styles.hint}>\n This copy was sanitized for the browser, so a home-folder path appears as <code>~</code>. Saving writes the text as\n shown; <code>~</code> names the same folder for every reader.\n </p>\n ) : null}\n {conflict ? (\n <div className={styles.warn} role=\"alert\">\n <p className={styles.hint}>\n An agent changed MEMORY.md while you were editing\n {relativePhrase(conflict.updatedAt) ? ` (${relativePhrase(conflict.updatedAt)})` : ''}.\n </p>\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`} disabled={busy !== null || placeholders > 0}\n onClick={() => void save(true)}>Overwrite with mine</button>\n <button type=\"button\" className={`${styles.cancel} ${styles.small}`} disabled={busy !== null}\n onClick={() => startEdit(conflict.content, conflict.contentSanitized === true)}>Start over from theirs</button>\n </div>\n </div>\n ) : null}\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.primary} ${styles.small}`}\n disabled={busy !== null || overCap || overBody || draft === base || conflict !== null || placeholders > 0}\n onClick={() => void save(false)}>{busy === 'saving' ? 'Saving…' : 'Save'}</button>\n <button type=\"button\" className={`${styles.cancel} ${styles.small}`} disabled={busy === 'saving'}\n onClick={() => { setMode('view'); setConflict(null); setError(null); }}>Cancel</button>\n </div>\n </div>\n ) : data.content.length === 0 ? (\n <div className={styles.field}>\n <p className={styles.hint}>\n MEMORY.md is empty. Agents add to it as they work, or write the first entries yourself.\n </p>\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`} onClick={() => startEdit('', false)}>Write it</button>\n </div>\n </div>\n ) : (\n <div className={styles.field}>\n <pre className={styles.memoryBody} tabIndex={0} aria-label={`MEMORY.md for ${name}`}>{data.content}</pre>\n <p className={`${styles.hint} ${styles.memoryMeta}`}>\n <span>{formatBytes(data.bytes)}</span>\n {relativePhrase(data.updatedAt) ? <span>updated {relativePhrase(data.updatedAt)}</span> : null}\n </p>\n {data.contentSanitized ? (\n <p className={styles.hint}>\n Shown sanitized for the browser: a home-folder path appears as <code>~</code> and secret-looking text as{' '}\n <code>{REDACTION_MARKER}</code>.{redactionMarkers(data.content) > 0 ? ' The real values are still in the file.' : ''}\n </p>\n ) : null}\n {mode === 'confirm-clear' ? (\n <div className={styles.warn} role=\"alert\">\n <p className={styles.hint}>Clear MEMORY.md for {name}? Every chat on this project loses what it says. Other files in the folder stay.</p>\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.secondary} ${styles.small} ${styles.danger}`} disabled={busy !== null}\n onClick={() => void clear()}>{busy === 'clearing' ? 'Clearing…' : 'Clear it'}</button>\n <button type=\"button\" className={`${styles.cancel} ${styles.small}`} onClick={() => setMode('view')}>Keep</button>\n </div>\n </div>\n ) : (\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`}\n onClick={() => startEdit(data.content, data.contentSanitized === true)}>Edit</button>\n <button type=\"button\" className={`${styles.cancel} ${styles.small}`}\n onClick={() => { setNotice(null); setMode('confirm-clear'); }}>Clear…</button>\n </div>\n )}\n </div>\n )}\n\n {data.files.length > 0 ? (\n <div className={styles.field}>\n <span className={styles.label}>Also in this folder</span>\n <ul className={styles.memoryFiles}>\n {data.files.map((file) => <li key={file}><code>{file}</code></li>)}\n </ul>\n </div>\n ) : null}\n\n {notice ? <p className={styles.hint} role=\"status\">{notice}</p> : null}\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n\n <details>\n <summary className={styles.hint}>How project memory works</summary>\n <div className={styles.field}>\n <p className={styles.hint}>\n Claude, Codex and local seats can read and edit the file. Grok’s CLI can reach only its working folder, so a\n Grok seat is given the text and can only read it.\n </p>\n <p className={styles.hint}>\n A chat copies the memory into its instructions when it starts, so every turn re-sends the same prefix and the\n provider’s prompt cache keeps working. Chats already open see your edits when they next read the file; the\n switch above applies to new chats.\n </p>\n <p className={styles.hint}>\n It lives on this machine under <code>~/.ashlr/verse/memory</code>, readable only by you. It is sent to every\n seat’s model, so never put secrets in it.\n </p>\n <p className={styles.hint}>{MEMORY_SPEND_NOTE}</p>\n {globalOff ? null : (\n <p className={styles.hint}>\n Memory is on for every project unless switched off per project.{' '}\n <button type=\"button\" className={styles.link} disabled={busy !== null}\n onClick={() => void setGlobalEnabled(false)}>Turn it off for every project</button>\n </p>\n )}\n </div>\n </details>\n </>\n )}\n\n <MutationTokenDialog open={gate.dialog.open} reason={gate.dialog.reason} tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\" onClose={gate.dialog.onClose} onUnlocked={gate.dialog.onUnlocked} />\n </section>\n );\n}\n","/**\n * SessionRoots.module.css — one row per folder this chat can reach.\n *\n * Tone is carried by a left border AND by words (the badge and the caveat\n * line), never by colour alone — DESIGN-V2 §6.\n */\n\n.roots { padding: var(--space-4) var(--space-4) 0; }\n\n.title {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n margin: 0 0 var(--space-2);\n font-size: var(--text-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--text-muted);\n}\n\n.count {\n padding: 0 var(--space-1);\n border-radius: var(--radius-sm);\n background: var(--surface-raised);\n font-variant-numeric: tabular-nums;\n letter-spacing: 0;\n}\n\n.workspace {\n margin: 0 0 var(--space-2);\n font-size: var(--text-xs);\n color: var(--text-muted);\n}\n\n.list {\n margin: 0;\n padding: 0;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n}\n\n.root {\n padding: var(--space-2);\n border-radius: var(--radius-sm);\n border-left: 3px solid var(--border-subtle);\n background: var(--surface-raised);\n}\n\n.root[data-tone='primary'] { border-left-color: var(--accent); }\n.root[data-tone='extra'] { border-left-color: var(--border-strong, var(--border-subtle)); }\n.root[data-tone='unreachable'] { border-left-color: var(--warning, #b7791f); }\n.root[data-tone='missing'] { border-left-color: var(--danger, #c53030); }\n\n.rootHead {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.name {\n font-size: var(--text-sm);\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.badge {\n flex: none;\n font-size: var(--text-2xs, 0.6875rem);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--text-muted);\n}\n\n/* The full path, shown rather than hovered. `direction: rtl` with the text\n isolated flips only WHICH END the ellipsis eats — the head, so the tail\n that actually disambiguates two same-named checkouts survives. The bdi\n isolation keeps the path itself rendering left-to-right. */\n.path {\n margin: var(--space-1) 0 0;\n direction: rtl;\n text-align: left;\n unicode-bidi: plaintext;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n font-size: var(--text-xs);\n color: var(--text-muted);\n}\n\n.git,\n.remote,\n.caveat {\n margin: var(--space-1) 0 0;\n font-size: var(--text-xs);\n color: var(--text-muted);\n}\n\n.git { font-variant-numeric: tabular-nums; }\n\n.remote {\n font-family: var(--font-mono);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.caveat { color: var(--text-strong, var(--text-default)); }\n\n.note,\n.error {\n margin: var(--space-2) 0 0;\n font-size: var(--text-xs);\n line-height: 1.45;\n color: var(--text-muted);\n}\n\n.error { color: var(--danger, #c53030); }\n","/**\n * routes/verse/SessionRoots.tsx — the folders THIS chat can reach, each with\n * its own git identity.\n *\n * WHY PER-ROOT IDENTITY IS THE POINT. A turn that edits two repositories\n * produces two diffs. Without a branch and a dirty count per root, the\n * transcript cannot attribute them, and \"3 files changed\" silently spans two\n * repositories on two different branches. So every root gets its own line:\n * branch, how many entries are dirty, and how far it has drifted from its\n * upstream.\n *\n * WHAT IT REFUSES TO IMPLY:\n * - A root the engine cannot reach (a Grok seat takes no additional-directory\n * flag) is LISTED and marked, never hidden — the operator chose it.\n * - A root that is not enrolled is marked as refused BY THE AUTONOMOUS LANE,\n * not as unusable here. This chat can edit it; the fleet cannot.\n * - A root with no repo says so, rather than leaving a gap that would read as\n * \"clean, on the default branch\".\n *\n * The read itself lives in chat/use-session-roots.ts (3.10): shared by every\n * consumer of a chat's roots, and refreshed each time a turn finishes,\n * because a branch is stale the moment a turn commits.\n */\nimport type { VerseSession, VerseSessionRootsResponse } from '../../data/api-types.js';\nimport { abbreviateHome } from './chat/path-display.js';\nimport { rootCaveat, rootGitLine, rootTone } from './workspace-model.js';\nimport styles from './SessionRoots.module.css';\n\nexport interface SessionRootsProps {\n session: VerseSession | null;\n /**\n * 3.10: the roots read, from the chat's shared `useSessionRoots` (one\n * request feeds the header breadcrumb, the dock panes and this list). It is\n * refreshed there whenever the chat's turnCount moves.\n */\n data: VerseSessionRootsResponse | null;\n error?: string | null;\n}\n\nexport function SessionRoots({ session, data, error = null }: SessionRootsProps) {\n if (!session) return null;\n\n // A single-folder chat is the overwhelmingly common case and already says\n // which folder it is everywhere else. Showing a one-row \"Folders\" list for\n // it would be noise, so this surfaces only when there is something to\n // attribute between.\n if (data !== null && data.roots.length <= 1 && data.workspaceId === null) return null;\n\n return (\n <section className={styles.roots} aria-labelledby=\"verse-res-roots\">\n <h3 id=\"verse-res-roots\" className={styles.title}>\n Folders\n {data ? <span className={styles.count}>{data.roots.length}</span> : null}\n </h3>\n\n {data?.workspaceName ? (\n <p className={styles.workspace}>\n Workspace <strong>{data.workspaceName}</strong>\n </p>\n ) : null}\n\n {error ? <p role=\"alert\" className={styles.error}>{error}</p> : null}\n\n <ul className={styles.list}>\n {(data?.roots ?? []).map((root) => {\n const git = rootGitLine(root);\n const caveat = rootCaveat(root);\n return (\n <li key={root.path} className={styles.root} data-tone={rootTone(root)}>\n <div className={styles.rootHead}>\n <span className={styles.name}>{root.name}</span>\n <span className={styles.badge}>{root.primary ? 'primary' : 'added'}</span>\n </div>\n {/* The path was a hover `title` on the folder name. This card is\n the one place in the app that exists to ATTRIBUTE a diff to a\n repository, and two checkouts of the same repo share a name —\n so the thing that tells them apart cannot be the one fact you\n have to hover to read. It is shown, directory-first, with the\n head clipping so the tail that disambiguates stays visible;\n `~`-abbreviated (3.10.1), the absolute path in the tooltip. */}\n <p className={styles.path} title={root.path}>{abbreviateHome(root.path)}</p>\n <p className={styles.git}>{git ?? 'not a git repo'}</p>\n {root.git?.remote ? <p className={styles.remote}>{root.git.remote}</p> : null}\n {caveat ? <p className={styles.caveat}>{caveat}</p> : null}\n </li>\n );\n })}\n </ul>\n\n {(data?.notes ?? []).map((note) => (\n <p key={note} className={styles.note}>{note}</p>\n ))}\n </section>\n );\n}\n","/**\n * dock/panes.module.css — the dock's own panes (Tasks, Context). Section\n * grammar matches the rest of the chat surface: micro-label headings, 16px\n * padding, hairline separators. Tokens only (style-scan-310).\n */\n.pane {\n display: flex;\n flex-direction: column;\n min-height: 0;\n padding-bottom: var(--space-6);\n}\n\n.section { padding: var(--space-4) var(--card-pad, var(--space-4)) 0; }\n.section + .section {\n margin-top: var(--space-4);\n padding-top: var(--space-4);\n border-top: 1px solid var(--border-subtle);\n}\n.sectionTitle {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n margin: 0 0 var(--space-3);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n.count {\n font-variant-numeric: tabular-nums;\n text-transform: none;\n letter-spacing: 0;\n color: var(--text-secondary);\n}\n.muted {\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n.muted + .action,\n.action + .muted { margin-top: var(--space-2); }\n/* The next step under an empty line (\"No tool calls…\" → what to do). */\n.hint {\n margin: var(--space-1) 0 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n/* A line that comes and goes with the turn keeps its row, so the sections\n below it do not jump every time a turn starts or ends. */\n.reserve { min-height: var(--text-xs-line); }\n\n.action {\n display: inline-flex;\n align-items: center;\n min-height: var(--control-h-sm);\n margin-top: var(--space-2);\n padding: 0 var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-surface);\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n cursor: pointer;\n}\n.action:hover:not(:disabled) { background: var(--bg-hover); border-color: var(--border-strong); }\n.action:disabled { color: var(--text-disabled); cursor: not-allowed; }\n.action:focus-visible,\n.link:focus-visible,\n.task:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.link {\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--text-link);\n font: inherit;\n font-size: var(--text-sm-size);\n cursor: pointer;\n}\n.link:hover { text-decoration: underline; }\n\n/* ---- tasks ---------------------------------------------------------------- */\n.taskList {\n display: flex;\n flex-direction: column;\n margin: 0 calc(-1 * var(--space-2));\n padding: 0;\n list-style: none;\n}\n.task {\n display: grid;\n grid-template-columns: minmax(12px, auto) auto minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--space-2);\n width: 100%;\n min-height: var(--density-row-sm);\n padding: 0 var(--space-2);\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n text-align: left;\n cursor: pointer;\n}\n.task:hover { background: var(--bg-hover); }\n.taskMark {\n justify-self: center;\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n.taskMark[data-status='running'] {\n background: var(--status-running-solid);\n animation: pane-pulse var(--duration-pulse) ease-in-out infinite;\n}\n.taskMark[data-status='failed'] { border-radius: 1px; background: var(--status-danger-solid); }\n.taskName {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 18ch;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n.taskDetail {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n.task:hover .taskDetail { color: var(--text-secondary); }\n.taskTime {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-variant-numeric: tabular-nums;\n color: var(--text-tertiary);\n white-space: nowrap;\n}\n.task[data-status='failed'] .taskTime { color: var(--status-danger-fg); }\n\n/* Engine identity: a 2px tick + monogram (SPEC-310C §6), never a logo. */\n.engineTick {\n justify-self: center;\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-secondary);\n}\n.engineTick::before {\n content: '';\n width: 2px;\n height: 10px;\n border-radius: 1px;\n background: var(--text-tertiary);\n}\n.engineTick[data-engine='claude']::before { background: var(--engine-claude); }\n.engineTick[data-engine='codex']::before { background: var(--engine-codex); }\n.engineTick[data-engine='grok']::before { background: var(--engine-grok); }\n.engineTick[data-engine='local']::before { background: var(--engine-local); }\n\n@keyframes pane-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.35; }\n}\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .taskMark { animation: none; }\n}\n:root[data-motion='reduce'] .taskMark { animation: none; }\n","/**\n * routes/verse/dock/ContextPane.tsx — everything about THIS chat's context,\n * in the dock (SPEC-310C §3 \"Context\", unit C2).\n *\n * It is the old resources column minus the accounts: seat meters, the local\n * runtime and the running list moved to Apps & Accounts (C6) and the Tasks\n * pane, because they were never about the chat you were reading. What stays:\n *\n * This chat usage, context efficiency, the idle-cache warning (ChatUsage)\n * Folders each root with its branch and dirty count (SessionRoots)\n * Handoff \"Continue in a fresh chat…\" — the same dialog the notice offers\n * Memory the project's shared MEMORY.md (MemoryPanel)\n * → Accounts & capacity\n *\n * Every figure is read from the session record, its event log and the\n * shared roots read — the pane itself makes no request except MemoryPanel's\n * own, and spends nothing.\n */\nimport { useEffect, useState } from 'react';\nimport type { VerseEvent, VerseSeat, VerseSession, VerseSessionRootsResponse } from '../../../data/api-types.js';\nimport { ChatUsage } from '../context/ChatUsage.js';\nimport { MemoryPanel } from '../context/MemoryPanel.js';\nimport { SessionRoots } from '../SessionRoots.js';\nimport styles from './panes.module.css';\n\n/** The idle-cache warning only has to notice an hour passing. */\nconst IDLE_TICK_MS = 30_000;\n\nexport interface ContextPaneProps {\n session: VerseSession | null;\n seats: readonly VerseSeat[];\n events: readonly VerseEvent[];\n roots: VerseSessionRootsResponse | null;\n rootsError: string | null;\n /** Opens the handoff dialog; absent → the action is not offered here. */\n onHandoff?: () => void;\n /** Why handoff is unavailable right now (a turn is running, dispatch is off); null = available. */\n handoffDisabledReason?: string | null;\n onOpenAccounts: () => void;\n /** False while this pane is a background tab: its clock stops. */\n visible: boolean;\n}\n\nfunction useSlowNow(active: boolean): number {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (!active) return undefined;\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), IDLE_TICK_MS);\n return () => clearInterval(id);\n }, [active]);\n return now;\n}\n\nexport function ContextPane({ session, seats, events, roots, rootsError, onHandoff, handoffDisabledReason = null, onOpenAccounts, visible }: ContextPaneProps) {\n const now = useSlowNow(visible && session !== null);\n return (\n <div className={styles.pane} aria-label=\"Context\">\n <section className={styles.section} aria-labelledby=\"dock-context-chat\">\n <h3 id=\"dock-context-chat\" className={styles.sectionTitle}>This chat</h3>\n {session\n ? <ChatUsage session={session} seats={seats} events={events} now={now} />\n : <p className={styles.muted}>Open a chat to see its usage and context.</p>}\n </section>\n\n {session ? (\n <div className={styles.section}>\n <SessionRoots session={session} data={roots} error={rootsError} />\n </div>\n ) : null}\n\n {session && onHandoff ? (\n <section className={styles.section} aria-labelledby=\"dock-context-handoff\">\n <h3 id=\"dock-context-handoff\" className={styles.sectionTitle}>Handoff</h3>\n <p className={styles.muted}>\n Verse drafts a note from this chat&apos;s log — free — and opens a fresh chat with it in the message box. Nothing is sent until you press Send.\n </p>\n <button type=\"button\" className={styles.action} onClick={onHandoff} disabled={handoffDisabledReason !== null}\n title={handoffDisabledReason ?? undefined}>\n Continue in a fresh chat…\n </button>\n {/* Always mounted: the reason comes and goes with every turn, and\n an unmounting line would shift Memory below it each time. */}\n <p className={`${styles.muted} ${styles.reserve}`}>{handoffDisabledReason ?? ''}</p>\n </section>\n ) : null}\n\n <div className={styles.section}>\n <MemoryPanel projectPath={session?.projectPath ?? null} refreshKey={session?.turnCount ?? 0} />\n </div>\n\n <div className={styles.section}>\n <button type=\"button\" className={styles.link} onClick={onOpenAccounts}>Accounts &amp; capacity →</button>\n </div>\n </div>\n );\n}\n","/**\n * dock/Dock.module.css — the chat dock: a column at ≥1024px, a right sheet\n * at 480–1023px, a bottom sheet (75vh) below 480px (dock-catalog.ts).\n * Hairlines, not shadows, separate it from the transcript in the column\n * layout; the sheets float, so they carry the dialog shadow. Tokens only\n * (style-scan-310).\n */\n.dock {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n height: 100%;\n background: var(--bg-surface);\n color: var(--text-primary);\n}\n.dock:focus { outline: none; }\n.dock[data-presentation='column'] {\n flex: none;\n border-left: 1px solid var(--border-subtle);\n}\n\n/* ---- sheets --------------------------------------------------------------- */\n.sheetLayer {\n position: absolute;\n inset: 0;\n z-index: var(--z-overlay);\n display: flex;\n justify-content: flex-end;\n pointer-events: none;\n}\n.sheetLayer[data-presentation='bottom-sheet'] {\n flex-direction: column;\n justify-content: flex-end;\n}\n.scrim {\n position: absolute;\n inset: 0;\n border: 0;\n padding: 0;\n background: var(--bg-overlay);\n cursor: default;\n pointer-events: auto;\n animation: dock-fade var(--duration-base) var(--ease-decelerate);\n}\n.sheetLayer .dock {\n z-index: 1;\n max-width: calc(100% - var(--space-8));\n border-left: 1px solid var(--border-default);\n box-shadow: var(--shadow-dialog);\n pointer-events: auto;\n animation: dock-in-right var(--duration-base) var(--ease-decelerate);\n}\n.sheetLayer[data-presentation='bottom-sheet'] .dock {\n width: 100%;\n max-width: none;\n height: 75vh;\n border-left: 0;\n border-top: 1px solid var(--border-default);\n border-radius: var(--radius-lg) var(--radius-lg) 0 0;\n animation-name: dock-in-up;\n}\n.grabber {\n flex: none;\n align-self: center;\n width: 36px;\n height: 4px;\n margin: var(--space-2) 0 0;\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n\n/* ---- head: tabs + actions ------------------------------------------------- */\n.head {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--space-1);\n height: calc(var(--strip-height) + var(--app-titlebar-height, 0px));\n padding: var(--app-titlebar-height, 0px) var(--space-2) 0;\n border-bottom: 1px solid var(--border-subtle);\n}\n.sheetLayer .head { height: var(--strip-height); padding-top: 0; }\n\n.tabs {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: var(--space-1);\n overflow-x: auto;\n scrollbar-width: none;\n}\n.tabs::-webkit-scrollbar { display: none; }\n\n.tabWrap {\n position: relative;\n flex: none;\n display: flex;\n align-items: center;\n border-radius: var(--radius-sm);\n}\n.tabWrap:hover { background: var(--bg-hover); }\n.tabWrap[data-selected] { background: var(--bg-selected); }\n/* The lower pane of a split wears a quiet underline: open, but not on top. */\n.tabWrap[data-below]::after {\n content: '';\n position: absolute;\n left: var(--space-2);\n right: var(--space-2);\n bottom: 2px;\n height: 1px;\n background: var(--border-strong);\n}\n\n.tab {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n min-height: var(--control-h-sm);\n padding: 0 var(--space-1) 0 var(--space-2);\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-secondary);\n font: inherit;\n font-size: var(--text-sm-size);\n white-space: nowrap;\n cursor: pointer;\n}\n.tabWrap[data-selected] .tab { color: var(--text-primary); font-weight: var(--font-weight-medium); }\n.tab:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.tabClose {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--control-h-xs);\n height: var(--control-h-xs);\n margin-right: 2px;\n padding: 0;\n border: 0;\n border-radius: var(--radius-xs);\n background: transparent;\n color: var(--text-tertiary);\n cursor: pointer;\n opacity: 0;\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n.tabWrap:hover .tabClose,\n.tabWrap[data-selected] .tabClose,\n.tabClose:focus-visible { opacity: 1; }\n.tabClose:hover { color: var(--text-primary); background: var(--bg-active); }\n\n.headActions {\n flex: none;\n display: flex;\n align-items: center;\n gap: 2px;\n}\n.iconButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--control-h-sm);\n height: var(--control-h-sm);\n padding: 0;\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-tertiary);\n cursor: pointer;\n}\n.iconButton:hover:not(:disabled) { color: var(--text-primary); background: var(--bg-hover); }\n.iconButton:disabled { color: var(--text-disabled); cursor: default; }\n.iconButton[aria-pressed='true'] { color: var(--text-primary); }\n.iconButton:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n.plus {\n font-size: var(--text-lg-size);\n line-height: 1;\n}\n\n/* ---- body: one pane, or two stacked --------------------------------------- */\n.body {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n.pane {\n flex: 1 1 100%;\n min-height: 0;\n overflow: auto;\n overscroll-behavior: contain;\n}\n.pane[hidden] { display: none; }\n.dock[data-split] .pane:not([hidden]) { flex-grow: 0; flex-shrink: 0; }\n\n.splitHandle {\n flex: none;\n position: relative;\n height: 1px;\n background: var(--border-subtle);\n cursor: row-resize;\n touch-action: none;\n}\n.splitHandle::before {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n top: -4px;\n bottom: -4px;\n}\n.splitHandle:hover,\n.splitHandle:focus-visible { background: var(--accent-500); outline: none; }\n\n/* ---- width handle (column only) ------------------------------------------- */\n.widthHandle {\n position: absolute;\n top: var(--app-titlebar-height, 0px);\n bottom: 0;\n left: -4px;\n z-index: 1;\n width: 9px;\n cursor: col-resize;\n touch-action: none;\n}\n.widthHandle::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 4px;\n width: 1px;\n background: transparent;\n transition: background var(--duration-fast) var(--ease-standard);\n}\n.widthHandle:hover::after,\n.widthHandle:focus-visible::after,\n.widthHandle[data-dragging]::after { background: var(--accent-500); }\n.widthHandle:focus-visible { outline: none; }\n\n/* Dark theme: a 4% top hairline instead of a shadow (SPEC-310C §6). */\n.dock[data-presentation='column'] { box-shadow: inset 0 1px 0 var(--hairline-lift); }\n\n@keyframes dock-fade { from { opacity: 0; } to { opacity: 1; } }\n@keyframes dock-in-right { from { opacity: 0; transform: translateX(4px); } to { opacity: 1; transform: none; } }\n@keyframes dock-in-up { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .scrim,\n :root:not([data-motion='full']) .sheetLayer .dock { animation: none; }\n}\n:root[data-motion='reduce'] .scrim,\n:root[data-motion='reduce'] .sheetLayer .dock { animation: none; }\n","/**\n * routes/verse/dock/Dock.tsx — the chat's right-hand workbench: Terminal,\n * Preview, Review, Tasks and Context as tabs, one pane or two stacked\n * (SPEC-310C §3, unit C2; contracts: shell/dock-catalog.ts, shell/slots.tsx).\n *\n * THE CONTAINER, NOT THE PANES. Terminal and Preview are C4's, Review is\n * C5's; the dock renders them through C0's slots, so it never imports their\n * code (xterm and the diff viewer stay off the chat's critical path) and a\n * pane whose file has not landed simply has no tab. Tasks and Context are\n * C2's own and arrive as render props from the Chat section, which holds\n * the data they show.\n *\n * LAYOUT follows the window (dockPresentation):\n * ≥ 1024px a column right of the transcript, 320px … 60% of the window,\n * resized by dragging its left edge or with ←/→ on that edge;\n * 480–1023 a sheet over the chat from the right;\n * < 480 a bottom sheet, 75vh.\n * Two panes split vertically (\"Preview over Terminal\"), their boundary\n * dragged or moved with ↑/↓.\n *\n * KEEP-ALIVE. A pane stays mounted from the moment its tab opens until the\n * tab closes — hidden, not unmounted, when another tab is on top — so a\n * terminal keeps its scrollback and a preview its page. Each pane is told\n * whether it is visible, so it can stop timers while hidden.\n *\n * State (open, tabs, split, width) lives in dock-store.ts and persists with\n * the shell's v3 blob.\n */\nimport { useCallback, useEffect, useId, useRef, useState, type KeyboardEvent, type PointerEvent as ReactPointerEvent, type ReactNode } from 'react';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport { ActionMenu, anchorBelow, type ActionMenuItem, type MenuAnchor } from '../chat/ActionMenu.js';\nimport { findCommand, formatChord } from '../shell/command-catalog.js';\nimport { DOCK_LAYOUT, DOCK_PANES, clampDockWidth, type DockPaneId, type DockPresentation } from '../shell/dock-catalog.js';\nimport { DiffPaneSlot, PreviewPaneSlot, TerminalPaneSlot, type TurnFileChange } from '../shell/slots.js';\nimport { DOCK_PANE_LABEL, isPaneAvailable } from './dock-panes.js';\nimport {\n closeDock,\n closeDockTab,\n openDockPane,\n requestTerminalBelow,\n setDockSplitRatio,\n setDockWidth,\n splitDock,\n useDock,\n} from './dock-store.js';\nimport { CloseGlyph, DOCK_PANE_GLYPH, SplitGlyph } from './dock-icons.js';\nimport styles from './Dock.module.css';\n\nexport interface DockProps {\n presentation: DockPresentation;\n /** Window width, for the 60% cap. */\n windowWidth: number;\n /** The width the column may actually take (after the transcript's floor); column presentation only. */\n columnWidth: number;\n sessionId: string | null;\n roots: readonly string[];\n turnFiles: readonly TurnFileChange[];\n /** Terminal ▸ Send selection to chat: already fenced. */\n onSendToChat: (text: string) => void;\n /** Review ▸ Add to message: `path:line: note`. */\n onAddToMessage: (text: string) => void;\n /** C2's own panes. */\n renderTasks: (visible: boolean) => ReactNode;\n renderContext: (visible: boolean) => ReactNode;\n}\n\nexport { DOCK_PANE_LABEL, isPaneAvailable };\n\n/** A catalog command's chord as this platform prints it (\"⌘N\" / \"Ctrl+N\"), or null when it has none. */\nfunction chordOf(id: string): string | null {\n const chord = findCommand(id)?.keys[0];\n return chord ? formatChord(chord) : null;\n}\n\nconst KEY_STEP = 16;\nconst KEY_STEP_COARSE = 64;\nconst RATIO_STEP = 0.05;\n\nexport function Dock(props: DockProps) {\n const { presentation, windowWidth, columnWidth } = props;\n const { state, requests } = useDock();\n const panelRef = useRef<HTMLElement>(null);\n const tabRefs = useRef(new Map<DockPaneId, HTMLButtonElement>());\n const idBase = useId();\n const [menu, setMenu] = useState<{ kind: 'add' | 'split'; anchor: MenuAnchor; from: HTMLElement } | null>(null);\n // Panes mount on first show and stay mounted while their tab is open.\n const [mounted, setMounted] = useState<ReadonlySet<DockPaneId>>(() => new Set(state.open && state.active ? [state.active] : []));\n\n const tabs = state.tabs.filter(isPaneAvailable);\n const active = state.active !== null && tabs.includes(state.active) ? state.active : tabs[0] ?? null;\n const split = state.splitWith !== null && tabs.includes(state.splitWith) && state.splitWith !== active ? state.splitWith : null;\n const open = state.open && active !== null;\n const sheet = presentation !== 'column';\n\n useEffect(() => {\n if (!open) return;\n setMounted((prev) => {\n const want = [active, split].filter((p): p is DockPaneId => p !== null);\n const next = new Set([...prev].filter((p) => tabs.includes(p)));\n for (const p of want) next.add(p);\n if (next.size === prev.size && [...next].every((p) => prev.has(p))) return prev;\n return next;\n });\n }, [open, active, split, tabs.join('|')]); // eslint-disable-line react-hooks/exhaustive-deps -- tabs is compared by content\n\n // A sheet takes focus when it opens and gives it back when it closes; a\n // column does not steal focus from the composer.\n useEffect(() => {\n if (!open || !sheet) return undefined;\n const before = document.activeElement as HTMLElement | null;\n panelRef.current?.focus({ preventScroll: true });\n return () => {\n if (before && document.contains(before)) before.focus({ preventScroll: true });\n };\n }, [open, sheet]);\n\n const onSheetKeyDown = useCallback((event: KeyboardEvent<HTMLElement>) => {\n if (!sheet) return;\n // Esc belongs to a terminal (vim, less, a REPL) when focus is in one.\n const inTerminal = event.target instanceof Element && event.target.closest('[data-dock-pane=\"terminal\"]') !== null;\n if (event.key === 'Escape' && !inTerminal && !event.defaultPrevented) {\n event.preventDefault();\n closeDock();\n return;\n }\n if (event.key !== 'Tab' || inTerminal) return;\n const node = panelRef.current;\n if (!node) return;\n const focusable = Array.from(node.querySelectorAll<HTMLElement>('button:not([disabled]), [href], input:not([disabled]), select, textarea, [tabindex]:not([tabindex=\"-1\"])'))\n .filter((el) => !el.closest('[hidden]'));\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last.focus(); }\n else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first.focus(); }\n }, [sheet]);\n\n if (!open) return null;\n\n function onTabKeyDown(event: KeyboardEvent<HTMLButtonElement>, pane: DockPaneId) {\n const i = tabs.indexOf(pane);\n let next: DockPaneId | undefined;\n if (event.key === 'ArrowRight') next = tabs[(i + 1) % tabs.length];\n else if (event.key === 'ArrowLeft') next = tabs[(i - 1 + tabs.length) % tabs.length];\n else if (event.key === 'Home') next = tabs[0];\n else if (event.key === 'End') next = tabs[tabs.length - 1];\n else if ((event.key === 'Delete' || event.key === 'Backspace') && tabs.length > 0) {\n event.preventDefault();\n closeDockTab(pane);\n return;\n }\n if (!next) return;\n event.preventDefault();\n openDockPane(next);\n tabRefs.current.get(next)?.focus();\n }\n\n const closedPanes = DOCK_PANES.map((p) => p.id).filter((id) => isPaneAvailable(id) && !tabs.includes(id));\n const addItems: ActionMenuItem[] = closedPanes.map((id) => ({\n id,\n label: DOCK_PANE_LABEL[id],\n icon: DOCK_PANE_GLYPH[id]({}),\n onSelect: () => openDockPane(id),\n }));\n const splitCandidates = DOCK_PANES.map((p) => p.id).filter((id) => isPaneAvailable(id) && id !== active);\n const splitItems: ActionMenuItem[] = [\n ...splitCandidates.map((id) => ({\n id,\n label: `${DOCK_PANE_LABEL[id]} below`,\n icon: DOCK_PANE_GLYPH[id]({}),\n onSelect: () => splitDock(id),\n })),\n ...(split ? [{ id: 'unsplit', label: 'One pane', separated: true, onSelect: () => splitDock(null) }] : []),\n ];\n\n const toggleChord = chordOf('dock.toggle');\n const width = presentation === 'column' ? columnWidth : clampDockWidth(state.width, windowWidth);\n const label = `Dock: ${DOCK_PANE_LABEL[active!]}${split ? ` over ${DOCK_PANE_LABEL[split]}` : ''}`;\n\n const panel = (\n <aside\n ref={panelRef}\n className={styles.dock}\n data-presentation={presentation}\n data-split={split ? 'true' : undefined}\n aria-label={label}\n role={sheet ? 'dialog' : 'complementary'}\n aria-modal={sheet ? true : undefined}\n tabIndex={-1}\n style={presentation === 'bottom-sheet' ? { height: `${DOCK_LAYOUT.bottomSheetHeightVh}vh` } : { width }}\n onKeyDown={onSheetKeyDown}\n >\n {presentation === 'column' ? <WidthHandle width={width} windowWidth={windowWidth} /> : null}\n {presentation === 'bottom-sheet' ? <span className={styles.grabber} aria-hidden=\"true\" /> : null}\n <div className={styles.head}>\n <div className={styles.tabs} role=\"tablist\" aria-label=\"Dock panes\">\n {tabs.map((pane) => {\n const Icon = DOCK_PANE_GLYPH[pane];\n const selected = pane === active;\n const below = pane === split;\n return (\n <div key={pane} className={styles.tabWrap} data-selected={selected || undefined} data-below={below || undefined}>\n <button\n ref={(node) => { if (node) tabRefs.current.set(pane, node); else tabRefs.current.delete(pane); }}\n type=\"button\"\n role=\"tab\"\n id={`${idBase}-tab-${pane}`}\n aria-selected={selected}\n aria-controls={`${idBase}-pane-${pane}`}\n tabIndex={selected ? 0 : -1}\n className={styles.tab}\n onClick={() => openDockPane(pane)}\n onKeyDown={(event) => onTabKeyDown(event, pane)}\n title={below ? `${DOCK_PANE_LABEL[pane]} (lower pane)` : undefined}\n >\n <Icon size={14} />\n <span className={styles.tabLabel}>{DOCK_PANE_LABEL[pane]}</span>\n </button>\n <button type=\"button\" className={styles.tabClose} aria-label={`Close ${DOCK_PANE_LABEL[pane]}`}\n title={`Close ${DOCK_PANE_LABEL[pane]}`} tabIndex={-1} onClick={() => closeDockTab(pane)}>\n <CloseGlyph size={12} />\n </button>\n </div>\n );\n })}\n </div>\n <div className={styles.headActions}>\n {/* Always drawn (disabled when every pane is open) so the actions\n never shift when the last closed pane is added back. */}\n <button type=\"button\" className={styles.iconButton} aria-label=\"Add a pane\"\n title={closedPanes.length > 0 ? 'Add a pane' : 'Every pane is already open'} aria-haspopup=\"menu\"\n aria-expanded={menu?.kind === 'add'} disabled={closedPanes.length === 0}\n onClick={(event) => setMenu({ kind: 'add', anchor: anchorBelow(event.currentTarget), from: event.currentTarget })}>\n <span className={styles.plus} aria-hidden=\"true\">+</span>\n </button>\n {presentation !== 'bottom-sheet' && splitItems.length > 0 ? (\n <button type=\"button\" className={styles.iconButton} aria-label={split ? 'Split: change or undo' : 'Split the dock'}\n title={split ? 'Change the split' : 'Split: show a second pane below'} aria-haspopup=\"menu\" aria-expanded={menu?.kind === 'split'}\n aria-pressed={split !== null}\n onClick={(event) => setMenu({ kind: 'split', anchor: anchorBelow(event.currentTarget), from: event.currentTarget })}>\n <SplitGlyph size={14} />\n </button>\n ) : null}\n <button type=\"button\" className={styles.iconButton} aria-label=\"Close the dock\"\n title={`Close the dock${toggleChord ? ` (${toggleChord})` : ''}`} onClick={closeDock}>\n <CloseGlyph size={14} />\n </button>\n </div>\n </div>\n\n <div className={styles.body}>\n {tabs.filter((p) => mounted.has(p) || p === active || p === split).map((pane) => {\n const shown = pane === active || (pane === split && presentation !== 'bottom-sheet');\n const position = pane === active ? 'top' : pane === split ? 'bottom' : 'hidden';\n return (\n <div\n key={pane}\n id={`${idBase}-pane-${pane}`}\n role=\"tabpanel\"\n aria-labelledby={`${idBase}-tab-${pane}`}\n className={styles.pane}\n data-dock-pane={pane}\n data-position={shown ? position : 'hidden'}\n hidden={!shown}\n inert={!shown}\n style={shown && split && presentation !== 'bottom-sheet'\n ? { flexBasis: `${(position === 'top' ? state.splitRatio : 1 - state.splitRatio) * 100}%`, order: position === 'top' ? 0 : 2 }\n : undefined}\n >\n <DockPane pane={pane} visible={shown} {...props} requests={requests} />\n </div>\n );\n })}\n {split && presentation !== 'bottom-sheet' ? <SplitHandle ratio={state.splitRatio} lower={DOCK_PANE_LABEL[split]} /> : null}\n </div>\n\n {menu ? (\n <ActionMenu\n label={menu.kind === 'add' ? 'Add a pane' : 'Split the dock'}\n items={menu.kind === 'add' ? addItems : splitItems}\n anchor={menu.anchor}\n returnFocus={menu.from}\n onClose={() => setMenu(null)}\n />\n ) : null}\n </aside>\n );\n\n if (!sheet) return panel;\n return (\n <div className={styles.sheetLayer} data-presentation={presentation}>\n <button type=\"button\" className={styles.scrim} aria-label=\"Close the dock\" tabIndex={-1} onClick={closeDock} />\n {panel}\n </div>\n );\n}\n\nfunction DockPane({ pane, visible, sessionId, roots, turnFiles, onSendToChat, onAddToMessage, renderTasks, renderContext, requests }:\n DockProps & { pane: DockPaneId; visible: boolean; requests: ReturnType<typeof useDock>['requests'] }) {\n if (pane === 'tasks') return <>{renderTasks(visible)}</>;\n if (pane === 'context') return <>{renderContext(visible)}</>;\n if (sessionId === null) {\n const newChat = chordOf('chat.new');\n return (\n <EmptyState compact title={`Open a chat to use ${DOCK_PANE_LABEL[pane]}`}\n body={`Pick a chat in the sidebar${newChat ? ` or start one with ${newChat}` : ''}. ${DOCK_PANE_LABEL[pane]} works in that chat's folders.`} />\n );\n }\n switch (pane) {\n case 'terminal':\n return <TerminalPaneSlot sessionId={sessionId} roots={roots} request={requests.terminal} onSendToChat={onSendToChat} visible={visible} />;\n case 'preview':\n return (\n // Dev-server Start: Terminal opens BELOW Preview, so the page appears\n // on top when its port answers (SPEC-310C acceptance step 3).\n <PreviewPaneSlot sessionId={sessionId} roots={roots} request={requests.preview} visible={visible}\n onOpenTerminal={requestTerminalBelow} />\n );\n case 'diff':\n return <DiffPaneSlot sessionId={sessionId} roots={roots} request={requests.diff} turnFiles={turnFiles} onAddToMessage={onAddToMessage} visible={visible} />;\n default:\n return null;\n }\n}\n\n/** The column's left edge: drag, or ←/→ (⇧ for coarse), double-click for the default. */\nfunction WidthHandle({ width, windowWidth }: { width: number; windowWidth: number }) {\n const max = Math.max(DOCK_LAYOUT.minWidth, Math.floor(windowWidth * DOCK_LAYOUT.maxWidthFraction));\n const drag = useRef<{ startX: number; startWidth: number } | null>(null);\n const [dragging, setDragging] = useState(false);\n\n function onPointerDown(event: ReactPointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n drag.current = { startX: event.clientX, startWidth: width };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n setDragging(true);\n document.body.setAttribute('data-verse-resizing', 'true');\n }\n function onPointerMove(event: ReactPointerEvent<HTMLDivElement>) {\n const start = drag.current;\n if (!start) return;\n // The dock grows leftward: moving the edge left by N widens it by N.\n setDockWidth(clampDockWidth(start.startWidth + (start.startX - event.clientX), windowWidth));\n }\n function end() {\n drag.current = null;\n setDragging(false);\n document.body.removeAttribute('data-verse-resizing');\n }\n useEffect(() => () => document.body.removeAttribute('data-verse-resizing'), []);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const step = event.shiftKey ? KEY_STEP_COARSE : KEY_STEP;\n let next: number | null = null;\n if (event.key === 'ArrowLeft') next = width + step;\n else if (event.key === 'ArrowRight') next = width - step;\n else if (event.key === 'Home') next = DOCK_LAYOUT.minWidth;\n else if (event.key === 'End') next = max;\n if (next === null) return;\n event.preventDefault();\n setDockWidth(clampDockWidth(next, windowWidth));\n }\n\n return (\n <div className={styles.widthHandle} role=\"separator\" aria-orientation=\"vertical\" aria-label=\"Resize the dock\"\n aria-valuemin={DOCK_LAYOUT.minWidth} aria-valuemax={max} aria-valuenow={Math.round(width)} tabIndex={0}\n data-dragging={dragging || undefined}\n onPointerDown={onPointerDown} onPointerMove={onPointerMove} onPointerUp={end} onPointerCancel={end} onLostPointerCapture={end}\n onDoubleClick={() => setDockWidth(DOCK_LAYOUT.defaultWidth)} onKeyDown={onKeyDown} />\n );\n}\n\n/** The boundary between the two stacked panes: drag, or ↑/↓. */\nfunction SplitHandle({ ratio, lower }: { ratio: number; lower: string }) {\n const ref = useRef<HTMLDivElement>(null);\n const drag = useRef<{ top: number; height: number } | null>(null);\n\n function onPointerDown(event: ReactPointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n const body = ref.current?.parentElement;\n if (!body) return;\n event.preventDefault();\n const rect = body.getBoundingClientRect();\n drag.current = { top: rect.top, height: rect.height };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n }\n function onPointerMove(event: ReactPointerEvent<HTMLDivElement>) {\n const d = drag.current;\n if (!d || d.height <= 0) return;\n setDockSplitRatio((event.clientY - d.top) / d.height);\n }\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (event.key === 'ArrowUp') { event.preventDefault(); setDockSplitRatio(ratio - RATIO_STEP); }\n else if (event.key === 'ArrowDown') { event.preventDefault(); setDockSplitRatio(ratio + RATIO_STEP); }\n }\n return (\n <div ref={ref} className={styles.splitHandle} role=\"separator\" aria-orientation=\"horizontal\"\n aria-label={`Resize: ${lower} below`} aria-valuemin={Math.round(DOCK_LAYOUT.splitRatio.min * 100)}\n aria-valuemax={Math.round(DOCK_LAYOUT.splitRatio.max * 100)} aria-valuenow={Math.round(ratio * 100)} tabIndex={0}\n style={{ order: 1 }}\n onPointerDown={onPointerDown} onPointerMove={onPointerMove}\n onPointerUp={() => { drag.current = null; }} onPointerCancel={() => { drag.current = null; }}\n onDoubleClick={() => setDockSplitRatio(DOCK_LAYOUT.splitRatio.default)} onKeyDown={onKeyDown} />\n );\n}\n","/**\n * routes/verse/dock/TasksPane.tsx — what is running, and where (SPEC-310C §3\n * \"Tasks\", unit C2; model: chat/tasks-model.ts).\n *\n * THIS CHAT ● Bash npm test running 1m 02s\n * ● Task review the auth module running 12s (subagent)\n * ✓ Read src/core/api.ts 0.4s\n * OTHER CHATS ● Fix the login bug · claude-a npm run build · 3m 10s\n *\n * Click a call to jump to it in the transcript (a folded group opens itself);\n * click another chat to open it. Finished calls of this turn stay listed\n * under the running ones (newest first, the last 20) so \"what did it just\n * do\" is answerable without scrolling the transcript.\n */\nimport type { VerseEngine } from '../../../data/api-types.js';\nimport { LiveTimer } from '../chat/LiveTimer.js';\nimport type { ChatTask, TurnTask } from '../chat/tasks-model.js';\nimport { toolAnchorId } from '../chat/tool-semantics.js';\nimport { requestTranscriptJump } from '../chat/transcript-jump.js';\nimport { findCommand, formatChord } from '../shell/command-catalog.js';\nimport { formatDuration } from '../verse-model.js';\nimport styles from './panes.module.css';\nimport { ProviderLogo } from '../../../components/primitives/ProviderLogo.js';\n\nconst FINISHED_SHOWN = 20;\n\nexport interface TasksPaneProps {\n /** This chat's calls since its last ask (running first). */\n turnTasks: readonly TurnTask[];\n otherChats: readonly ChatTask[];\n /** Whether a chat is open at all. */\n hasSession: boolean;\n onOpenSession: (sessionId: string) => void;\n}\n\nconst STATUS_WORD: Record<TurnTask['status'], string> = { running: 'running', done: 'done', failed: 'failed' };\n\nexport function TasksPane({ turnTasks, otherChats, hasSession, onOpenSession }: TasksPaneProps) {\n const newChatKey = findCommand('chat.new')?.keys[0];\n const newChat = newChatKey ? formatChord(newChatKey) : null;\n const running = turnTasks.filter((t) => t.status === 'running');\n const finished = turnTasks.filter((t) => t.status !== 'running').slice(0, FINISHED_SHOWN);\n\n return (\n <div className={styles.pane} aria-label=\"Tasks\">\n <section className={styles.section} aria-labelledby=\"dock-tasks-turn\">\n <h3 id=\"dock-tasks-turn\" className={styles.sectionTitle}>\n This chat <span className={styles.count}>{running.length > 0 ? `${running.length} running` : ''}</span>\n </h3>\n {!hasSession ? (\n <p className={styles.muted}>Open a chat to see its tool calls here.</p>\n ) : turnTasks.length === 0 ? (\n <>\n <p className={styles.muted}>No tool calls in the latest turn.</p>\n <p className={styles.hint}>Send a message: each tool the agent runs shows up here, and a click jumps to it in the chat.</p>\n </>\n ) : (\n <ul className={styles.taskList}>\n {[...running, ...finished].map((task) => (\n <li key={task.toolUseId}>\n <button type=\"button\" className={styles.task} data-status={task.status}\n onClick={() => { requestTranscriptJump(toolAnchorId(task.toolUseId)); }}\n aria-label={`${task.kind === 'subagent' ? 'Subagent' : task.name}: ${task.detail}, ${STATUS_WORD[task.status]}. Jump to it in the chat.`}>\n <span className={styles.taskMark} data-status={task.status} aria-hidden=\"true\" />\n <span className={styles.taskName} title={task.kind === 'subagent' ? 'Subagent' : task.name}>{task.kind === 'subagent' ? 'Subagent' : task.name}</span>\n <span className={styles.taskDetail} title={task.detail}>{task.detail}</span>\n <span className={styles.taskTime}>\n {task.status === 'running'\n ? <LiveTimer since={task.startedAt} />\n : task.status === 'failed'\n ? 'failed'\n : task.durationMs !== null && task.durationMs > 0 ? formatDuration(task.durationMs) : 'done'}\n </span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n\n <section className={styles.section} aria-labelledby=\"dock-tasks-chats\">\n <h3 id=\"dock-tasks-chats\" className={styles.sectionTitle}>\n Other chats <span className={styles.count}>{otherChats.length > 0 ? `${otherChats.length} running` : ''}</span>\n </h3>\n {otherChats.length === 0 ? (\n <>\n <p className={styles.muted}>No other chat is running.</p>\n <p className={styles.hint}>\n {newChat ? `Start another with ${newChat}` : 'Start another chat'} and it shows here while it works, one click away.\n </p>\n </>\n ) : (\n <ul className={styles.taskList}>\n {otherChats.map((chat) => (\n <li key={chat.sessionId}>\n <button type=\"button\" className={styles.task} data-status=\"running\" onClick={() => onOpenSession(chat.sessionId)}\n aria-label={`${chat.title || 'Untitled chat'}, running${chat.live ? `: ${chat.live}` : ''}. Open this chat.`}>\n <EngineTick engine={chat.engine} />\n <span className={styles.taskName} title={chat.title || 'Untitled chat'}>{chat.title || 'Untitled chat'}</span>\n <span className={styles.taskDetail} title={chat.live ?? undefined}>{chat.live ?? ''}</span>\n <span className={styles.taskTime}>{chat.startedAt ? <LiveTimer since={chat.startedAt} /> : 'running'}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n </div>\n );\n}\n\n/** Engine identity: a 2px tick plus the provider's mark (3.11.1). */\nexport function EngineTick({ engine }: { engine: VerseEngine }) {\n return <span className={styles.engineTick} data-engine={engine} aria-hidden=\"true\"><ProviderLogo engine={engine} size={12} /></span>;\n}\n","/**\n * routes/verse/dock/DockHost.tsx — the dock with the chat's own panes wired\n * in (unit C2). The Chat section loads THIS lazily the first time the dock\n * opens: the dock starts closed, so none of it — the container, the Tasks\n * and Context panes, the memory editor behind Context — belongs on the\n * chat's first-paint path (SPEC-310C budget: chat critical JS ≤ 350 KB).\n */\nimport { useMemo } from 'react';\nimport type { VerseEvent, VerseSeat, VerseSession, VerseSessionRootsResponse } from '../../../data/api-types.js';\nimport type { DockPresentation } from '../shell/dock-catalog.js';\nimport type { TurnFileChange } from '../shell/slots.js';\nimport { currentTurnTasks, type ChatTask } from '../chat/tasks-model.js';\nimport { useVerseTranscript } from '../useVerseTranscript.js';\nimport { ContextPane } from './ContextPane.js';\nimport { Dock } from './Dock.js';\nimport { TasksPane } from './TasksPane.js';\n\nexport interface DockHostProps {\n presentation: DockPresentation;\n windowWidth: number;\n columnWidth: number;\n session: VerseSession | null;\n seats: readonly VerseSeat[];\n events: readonly VerseEvent[];\n roots: readonly string[];\n rootsData: VerseSessionRootsResponse | null;\n rootsError: string | null;\n turnFiles: readonly TurnFileChange[];\n otherRunning: readonly ChatTask[];\n dispatchEnabled: boolean;\n onOpenSession: (sessionId: string) => void;\n onHandoff: (sessionId: string) => void;\n onOpenAccounts: () => void;\n onSendToChat: (text: string) => void;\n onAddToMessage: (text: string) => void;\n}\n\nexport function DockHost(props: DockHostProps) {\n const { session, seats, events, rootsData, rootsError, otherRunning, dispatchEnabled, onOpenSession, onHandoff, onOpenAccounts } = props;\n const handoffReason = !dispatchEnabled\n ? 'Sending is disabled on this server.'\n : session?.status === 'running' ? 'Available when the current turn finishes.' : null;\n return (\n <Dock presentation={props.presentation} windowWidth={props.windowWidth} columnWidth={props.columnWidth}\n sessionId={session?.id ?? null} roots={props.roots} turnFiles={props.turnFiles}\n onSendToChat={props.onSendToChat} onAddToMessage={props.onAddToMessage}\n renderTasks={() => <LiveTasksPane sessionId={session?.id ?? null} otherChats={otherRunning} onOpenSession={onOpenSession} />}\n renderContext={(visible) => (\n <ContextPane session={session} seats={seats} events={events} roots={rootsData} rootsError={rootsError} visible={visible}\n onHandoff={session ? () => onHandoff(session.id) : undefined} handoffDisabledReason={handoffReason}\n onOpenAccounts={onOpenAccounts} />\n )} />\n );\n}\n\n/** The Tasks pane, subscribed to the open chat's transcript on its own (a streamed token re-renders this, not the section). */\nfunction LiveTasksPane({ sessionId, otherChats, onOpenSession }: { sessionId: string | null; otherChats: readonly ChatTask[]; onOpenSession: (id: string) => void }) {\n const transcript = useVerseTranscript(sessionId);\n const turnTasks = useMemo(() => currentTurnTasks(transcript.items), [transcript.items]);\n return <TasksPane turnTasks={turnTasks} otherChats={otherChats} hasSession={sessionId !== null} onOpenSession={onOpenSession} />;\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./index-CyK31YRm.js";var t={empty:`_empty_yz3jf_13`,compact:`_compact_yz3jf_23`,icon:`_icon_yz3jf_28`,title:`_title_yz3jf_33`,body:`_body_yz3jf_42`,action:`_action_yz3jf_49`,error:`_error_yz3jf_56`,unauthorized:`_unauthorized_yz3jf_63`},n=e();function r({title:e,body:r,icon:i,action:a,tone:o=`neutral`,compact:s=!1,className:c}){return(0,n.jsxs)(`div`,{className:`${t.empty} ${t[o]} ${s?t.compact:``} ${c??``}`,role:o===`error`?`alert`:void 0,children:[i?(0,n.jsx)(`span`,{className:t.icon,children:i}):null,(0,n.jsx)(`p`,{className:t.title,children:e}),r?(0,n.jsx)(`p`,{className:t.body,children:r}):null,a?(0,n.jsx)(`div`,{className:t.action,children:a}):null]})}export{r as t};
2
- //# sourceMappingURL=EmptyState-DsN1H6MC.js.map
1
+ import{n as e}from"./index-DZ-UQ7v8.js";var t={empty:`_empty_yz3jf_13`,compact:`_compact_yz3jf_23`,icon:`_icon_yz3jf_28`,title:`_title_yz3jf_33`,body:`_body_yz3jf_42`,action:`_action_yz3jf_49`,error:`_error_yz3jf_56`,unauthorized:`_unauthorized_yz3jf_63`},n=e();function r({title:e,body:r,icon:i,action:a,tone:o=`neutral`,compact:s=!1,className:c}){return(0,n.jsxs)(`div`,{className:`${t.empty} ${t[o]} ${s?t.compact:``} ${c??``}`,role:o===`error`?`alert`:void 0,children:[i?(0,n.jsx)(`span`,{className:t.icon,children:i}):null,(0,n.jsx)(`p`,{className:t.title,children:e}),r?(0,n.jsx)(`p`,{className:t.body,children:r}):null,a?(0,n.jsx)(`div`,{className:t.action,children:a}):null]})}export{r as t};
2
+ //# sourceMappingURL=EmptyState-D2IRy3Cg.js.map