@ashlr/hub 3.12.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 (719) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/README.md +29 -16
  3. package/dist/authority-surface.json +274 -148
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/authority.d.ts +145 -33
  6. package/dist/cli/authority.js +1292 -315
  7. package/dist/cli/authority.js.map +1 -1
  8. package/dist/cli/cloud.js +12 -3
  9. package/dist/cli/cloud.js.map +1 -1
  10. package/dist/cli/comms.d.ts +33 -19
  11. package/dist/cli/comms.js +128 -151
  12. package/dist/cli/comms.js.map +1 -1
  13. package/dist/cli/completions.js +1 -1
  14. package/dist/cli/completions.js.map +1 -1
  15. package/dist/cli/daemon.js +29 -0
  16. package/dist/cli/daemon.js.map +1 -1
  17. package/dist/cli/director.d.ts +8 -12
  18. package/dist/cli/director.js +17 -52
  19. package/dist/cli/director.js.map +1 -1
  20. package/dist/cli/fleet.js +4 -1
  21. package/dist/cli/fleet.js.map +1 -1
  22. package/dist/cli/help.js +1 -0
  23. package/dist/cli/help.js.map +1 -1
  24. package/dist/cli/leader.d.ts +27 -3
  25. package/dist/cli/leader.js +253 -4
  26. package/dist/cli/leader.js.map +1 -1
  27. package/dist/core/authority/protected-paths.js +11 -0
  28. package/dist/core/authority/protected-paths.js.map +1 -1
  29. package/dist/core/authority/resident.d.ts +101 -0
  30. package/dist/core/authority/resident.js +246 -0
  31. package/dist/core/authority/resident.js.map +1 -0
  32. package/dist/core/authority/server-enforcement.d.ts +110 -0
  33. package/dist/core/authority/server-enforcement.js +260 -0
  34. package/dist/core/authority/server-enforcement.js.map +1 -0
  35. package/dist/core/authority/standing-grant.d.ts +24 -4
  36. package/dist/core/authority/standing-grant.js +19 -3
  37. package/dist/core/authority/standing-grant.js.map +1 -1
  38. package/dist/core/authority/types.d.ts +43 -0
  39. package/dist/core/authority/types.js +6 -0
  40. package/dist/core/authority/types.js.map +1 -1
  41. package/dist/core/cloud/budget.js +11 -1
  42. package/dist/core/cloud/budget.js.map +1 -1
  43. package/dist/core/cloud/cloud-api.d.ts +25 -2
  44. package/dist/core/cloud/cloud-api.js +139 -5
  45. package/dist/core/cloud/cloud-api.js.map +1 -1
  46. package/dist/core/cloud/pr-actions.d.ts +93 -0
  47. package/dist/core/cloud/pr-actions.js +436 -0
  48. package/dist/core/cloud/pr-actions.js.map +1 -0
  49. package/dist/core/cloud/pr-preview.d.ts +128 -0
  50. package/dist/core/cloud/pr-preview.js +228 -0
  51. package/dist/core/cloud/pr-preview.js.map +1 -0
  52. package/dist/core/cloud/store.d.ts +2 -0
  53. package/dist/core/cloud/store.js +28 -0
  54. package/dist/core/cloud/store.js.map +1 -1
  55. package/dist/core/cloud/timeline-api.d.ts +24 -0
  56. package/dist/core/cloud/timeline-api.js +46 -0
  57. package/dist/core/cloud/timeline-api.js.map +1 -0
  58. package/dist/core/cloud/timeline-types.d.ts +62 -0
  59. package/dist/core/cloud/timeline-types.js +36 -0
  60. package/dist/core/cloud/timeline-types.js.map +1 -0
  61. package/dist/core/cloud/timeline.d.ts +102 -0
  62. package/dist/core/cloud/timeline.js +925 -0
  63. package/dist/core/cloud/timeline.js.map +1 -0
  64. package/dist/core/cloud/tracker.js +67 -0
  65. package/dist/core/cloud/tracker.js.map +1 -1
  66. package/dist/core/cloud/types.d.ts +38 -0
  67. package/dist/core/cloud/types.js +1 -1
  68. package/dist/core/cloud/types.js.map +1 -1
  69. package/dist/core/comms/change-digest.d.ts +130 -0
  70. package/dist/core/comms/change-digest.js +451 -0
  71. package/dist/core/comms/change-digest.js.map +1 -0
  72. package/dist/core/comms/director-prompt.d.ts +4 -5
  73. package/dist/core/comms/director-prompt.js +4 -71
  74. package/dist/core/comms/director-prompt.js.map +1 -1
  75. package/dist/core/comms/director.d.ts +24 -61
  76. package/dist/core/comms/director.js +29 -382
  77. package/dist/core/comms/director.js.map +1 -1
  78. package/dist/core/comms/dispatch.d.ts +37 -12
  79. package/dist/core/comms/dispatch.js +244 -177
  80. package/dist/core/comms/dispatch.js.map +1 -1
  81. package/dist/core/comms/elon-dialogue.d.ts +23 -15
  82. package/dist/core/comms/elon-dialogue.js +36 -307
  83. package/dist/core/comms/elon-dialogue.js.map +1 -1
  84. package/dist/core/comms/fleet-pulse.js +4 -7
  85. package/dist/core/comms/fleet-pulse.js.map +1 -1
  86. package/dist/core/comms/handlers.d.ts +10 -6
  87. package/dist/core/comms/handlers.js +14 -48
  88. package/dist/core/comms/handlers.js.map +1 -1
  89. package/dist/core/comms/migrations.d.ts +47 -0
  90. package/dist/core/comms/migrations.js +125 -0
  91. package/dist/core/comms/migrations.js.map +1 -0
  92. package/dist/core/comms/requests.d.ts +32 -5
  93. package/dist/core/comms/requests.js +101 -5
  94. package/dist/core/comms/requests.js.map +1 -1
  95. package/dist/core/comms/telegram-channel.d.ts +104 -0
  96. package/dist/core/comms/telegram-channel.js +622 -0
  97. package/dist/core/comms/telegram-channel.js.map +1 -0
  98. package/dist/core/comms/telegram-thread-map.d.ts +56 -0
  99. package/dist/core/comms/telegram-thread-map.js +144 -0
  100. package/dist/core/comms/telegram-thread-map.js.map +1 -0
  101. package/dist/core/daemon/capacity-publisher.d.ts +8 -1
  102. package/dist/core/daemon/capacity-publisher.js +40 -2
  103. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  104. package/dist/core/daemon/loop.js +18 -4
  105. package/dist/core/daemon/loop.js.map +1 -1
  106. package/dist/core/daemon/service-install-authority.d.ts +10 -2
  107. package/dist/core/daemon/service-install-authority.js +14 -5
  108. package/dist/core/daemon/service-install-authority.js.map +1 -1
  109. package/dist/core/daemon/service.d.ts +15 -0
  110. package/dist/core/daemon/service.js +26 -0
  111. package/dist/core/daemon/service.js.map +1 -1
  112. package/dist/core/daemon/tick-deadline.d.ts +44 -0
  113. package/dist/core/daemon/tick-deadline.js +83 -0
  114. package/dist/core/daemon/tick-deadline.js.map +1 -0
  115. package/dist/core/daemon/tick-hooks.d.ts +7 -0
  116. package/dist/core/daemon/tick-hooks.js.map +1 -1
  117. package/dist/core/daemon/tick-progress.d.ts +39 -0
  118. package/dist/core/daemon/tick-progress.js +194 -0
  119. package/dist/core/daemon/tick-progress.js.map +1 -0
  120. package/dist/core/dashboard.js +3 -1
  121. package/dist/core/dashboard.js.map +1 -1
  122. package/dist/core/fleet/cloud-intake.d.ts +95 -0
  123. package/dist/core/fleet/cloud-intake.js +557 -0
  124. package/dist/core/fleet/cloud-intake.js.map +1 -0
  125. package/dist/core/fleet/dispatch-router.d.ts +13 -0
  126. package/dist/core/fleet/dispatch-router.js +32 -8
  127. package/dist/core/fleet/dispatch-router.js.map +1 -1
  128. package/dist/core/fleet/fleet-merge-state.d.ts +16 -0
  129. package/dist/core/fleet/fleet-merge-state.js.map +1 -1
  130. package/dist/core/fleet/host-merge.d.ts +14 -0
  131. package/dist/core/fleet/host-merge.js +24 -2
  132. package/dist/core/fleet/host-merge.js.map +1 -1
  133. package/dist/core/fleet/merge-gates.d.ts +21 -0
  134. package/dist/core/fleet/merge-gates.js +39 -5
  135. package/dist/core/fleet/merge-gates.js.map +1 -1
  136. package/dist/core/fleet/mirrors.d.ts +162 -6
  137. package/dist/core/fleet/mirrors.js +1051 -49
  138. package/dist/core/fleet/mirrors.js.map +1 -1
  139. package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
  140. package/dist/core/fleet/standing-merge-pass.js +102 -1
  141. package/dist/core/fleet/standing-merge-pass.js.map +1 -1
  142. package/dist/core/fleet/status.d.ts +17 -0
  143. package/dist/core/fleet/status.js +22 -0
  144. package/dist/core/fleet/status.js.map +1 -1
  145. package/dist/core/fleet/tick-hooks-live.d.ts +10 -1
  146. package/dist/core/fleet/tick-hooks-live.js +57 -8
  147. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  148. package/dist/core/fleet/verify-check-run.d.ts +90 -0
  149. package/dist/core/fleet/verify-check-run.js +274 -0
  150. package/dist/core/fleet/verify-check-run.js.map +1 -0
  151. package/dist/core/git.d.ts +17 -0
  152. package/dist/core/git.js +124 -25
  153. package/dist/core/git.js.map +1 -1
  154. package/dist/core/goals/open-goals.d.ts +47 -0
  155. package/dist/core/goals/open-goals.js +33 -0
  156. package/dist/core/goals/open-goals.js.map +1 -0
  157. package/dist/core/inbox/merge.d.ts +5 -0
  158. package/dist/core/inbox/merge.js +58 -2
  159. package/dist/core/inbox/merge.js.map +1 -1
  160. package/dist/core/integrations/locus.d.ts +28 -0
  161. package/dist/core/integrations/locus.js +155 -30
  162. package/dist/core/integrations/locus.js.map +1 -1
  163. package/dist/core/integrations/telegram-format.d.ts +40 -0
  164. package/dist/core/integrations/telegram-format.js +123 -0
  165. package/dist/core/integrations/telegram-format.js.map +1 -0
  166. package/dist/core/integrations/telegram.d.ts +60 -4
  167. package/dist/core/integrations/telegram.js +161 -28
  168. package/dist/core/integrations/telegram.js.map +1 -1
  169. package/dist/core/mcp-registry.d.ts +12 -0
  170. package/dist/core/mcp-registry.js +70 -0
  171. package/dist/core/mcp-registry.js.map +1 -1
  172. package/dist/core/observability/rollup.d.ts +12 -10
  173. package/dist/core/observability/rollup.js +44 -17
  174. package/dist/core/observability/rollup.js.map +1 -1
  175. package/dist/core/resources/connection-monitor.d.ts +9 -0
  176. package/dist/core/resources/connection-monitor.js +19 -9
  177. package/dist/core/resources/connection-monitor.js.map +1 -1
  178. package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
  179. package/dist/core/resources/quota-refresh-lease.js +34 -1
  180. package/dist/core/resources/quota-refresh-lease.js.map +1 -1
  181. package/dist/core/routing/budget-api.d.ts +18 -1
  182. package/dist/core/routing/budget-api.js +120 -10
  183. package/dist/core/routing/budget-api.js.map +1 -1
  184. package/dist/core/routing/budget-store.d.ts +22 -1
  185. package/dist/core/routing/budget-store.js +22 -8
  186. package/dist/core/routing/budget-store.js.map +1 -1
  187. package/dist/core/routing/readiness-types.d.ts +82 -0
  188. package/dist/core/routing/readiness-types.js +23 -0
  189. package/dist/core/routing/readiness-types.js.map +1 -0
  190. package/dist/core/routing/readiness.d.ts +103 -0
  191. package/dist/core/routing/readiness.js +480 -0
  192. package/dist/core/routing/readiness.js.map +1 -0
  193. package/dist/core/sandbox/confine.js +22 -1
  194. package/dist/core/sandbox/confine.js.map +1 -1
  195. package/dist/core/sandbox/policy.d.ts +23 -0
  196. package/dist/core/sandbox/policy.js +100 -0
  197. package/dist/core/sandbox/policy.js.map +1 -1
  198. package/dist/core/types.d.ts +13 -0
  199. package/dist/core/types.js.map +1 -1
  200. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  201. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
  202. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
  203. package/dist/core/usage/frontier-usage.d.ts +20 -2
  204. package/dist/core/usage/frontier-usage.js +75 -17
  205. package/dist/core/usage/frontier-usage.js.map +1 -1
  206. package/dist/core/verse/account-health.js +9 -3
  207. package/dist/core/verse/account-health.js.map +1 -1
  208. package/dist/core/verse/accounts.d.ts +45 -0
  209. package/dist/core/verse/accounts.js +246 -17
  210. package/dist/core/verse/accounts.js.map +1 -1
  211. package/dist/core/verse/activity-api.d.ts +5 -1
  212. package/dist/core/verse/activity-api.js +62 -14
  213. package/dist/core/verse/activity-api.js.map +1 -1
  214. package/dist/core/verse/apps-api.js +23 -11
  215. package/dist/core/verse/apps-api.js.map +1 -1
  216. package/dist/core/verse/apps.d.ts +11 -9
  217. package/dist/core/verse/apps.js +2 -2
  218. package/dist/core/verse/apps.js.map +1 -1
  219. package/dist/core/verse/authority-api.d.ts +17 -3
  220. package/dist/core/verse/authority-api.js +122 -7
  221. package/dist/core/verse/authority-api.js.map +1 -1
  222. package/dist/core/verse/autonomy-ladder.d.ts +172 -0
  223. package/dist/core/verse/autonomy-ladder.js +251 -0
  224. package/dist/core/verse/autonomy-ladder.js.map +1 -0
  225. package/dist/core/verse/context-fit.js +7 -5
  226. package/dist/core/verse/context-fit.js.map +1 -1
  227. package/dist/core/verse/control-api.d.ts +23 -1
  228. package/dist/core/verse/control-api.js +117 -10
  229. package/dist/core/verse/control-api.js.map +1 -1
  230. package/dist/core/verse/fleet-live-api.js +13 -5
  231. package/dist/core/verse/fleet-live-api.js.map +1 -1
  232. package/dist/core/verse/folder-io.d.ts +50 -0
  233. package/dist/core/verse/folder-io.js +142 -0
  234. package/dist/core/verse/folder-io.js.map +1 -0
  235. package/dist/core/verse/git-api.js +5 -4
  236. package/dist/core/verse/git-api.js.map +1 -1
  237. package/dist/core/verse/git-ops.d.ts +10 -1
  238. package/dist/core/verse/git-ops.js +18 -2
  239. package/dist/core/verse/git-ops.js.map +1 -1
  240. package/dist/core/verse/github-api.d.ts +1 -1
  241. package/dist/core/verse/github-api.js +5 -4
  242. package/dist/core/verse/github-api.js.map +1 -1
  243. package/dist/core/verse/github-repo.js +118 -14
  244. package/dist/core/verse/github-repo.js.map +1 -1
  245. package/dist/core/verse/leader-api.d.ts +5 -4
  246. package/dist/core/verse/leader-api.js +237 -10
  247. package/dist/core/verse/leader-api.js.map +1 -1
  248. package/dist/core/verse/local-models.d.ts +10 -0
  249. package/dist/core/verse/local-models.js +10 -1
  250. package/dist/core/verse/local-models.js.map +1 -1
  251. package/dist/core/verse/login-path.d.ts +73 -0
  252. package/dist/core/verse/login-path.js +123 -14
  253. package/dist/core/verse/login-path.js.map +1 -1
  254. package/dist/core/verse/mcp-control-api.js +4 -4
  255. package/dist/core/verse/mcp-control-api.js.map +1 -1
  256. package/dist/core/verse/mcp-scope.d.ts +22 -0
  257. package/dist/core/verse/mcp-scope.js +41 -1
  258. package/dist/core/verse/mcp-scope.js.map +1 -1
  259. package/dist/core/verse/mcp-seat-view.d.ts +10 -0
  260. package/dist/core/verse/mcp-seat-view.js +30 -4
  261. package/dist/core/verse/mcp-seat-view.js.map +1 -1
  262. package/dist/core/verse/overnight-api.js +20 -2
  263. package/dist/core/verse/overnight-api.js.map +1 -1
  264. package/dist/core/verse/path-guard.d.ts +24 -0
  265. package/dist/core/verse/path-guard.js +91 -22
  266. package/dist/core/verse/path-guard.js.map +1 -1
  267. package/dist/core/verse/preview-api.js +22 -0
  268. package/dist/core/verse/preview-api.js.map +1 -1
  269. package/dist/core/verse/projects.d.ts +21 -0
  270. package/dist/core/verse/projects.js +82 -0
  271. package/dist/core/verse/projects.js.map +1 -1
  272. package/dist/core/verse/seat-readiness.d.ts +25 -0
  273. package/dist/core/verse/seat-readiness.js +43 -6
  274. package/dist/core/verse/seat-readiness.js.map +1 -1
  275. package/dist/core/verse/session-controls-api.js +5 -3
  276. package/dist/core/verse/session-controls-api.js.map +1 -1
  277. package/dist/core/verse/session-handoff.d.ts +26 -0
  278. package/dist/core/verse/session-handoff.js +90 -12
  279. package/dist/core/verse/session-handoff.js.map +1 -1
  280. package/dist/core/verse/terminal-api.js +7 -4
  281. package/dist/core/verse/terminal-api.js.map +1 -1
  282. package/dist/core/verse/terminal.js +9 -5
  283. package/dist/core/verse/terminal.js.map +1 -1
  284. package/dist/core/verse/verse-api.d.ts +3 -1
  285. package/dist/core/verse/verse-api.js +87 -27
  286. package/dist/core/verse/verse-api.js.map +1 -1
  287. package/dist/core/verse/workspaces.d.ts +51 -0
  288. package/dist/core/verse/workspaces.js +177 -47
  289. package/dist/core/verse/workspaces.js.map +1 -1
  290. package/dist/core/vision/leader-apply.d.ts +40 -0
  291. package/dist/core/vision/leader-apply.js +101 -30
  292. package/dist/core/vision/leader-apply.js.map +1 -1
  293. package/dist/core/vision/leader-cadence.d.ts +114 -0
  294. package/dist/core/vision/leader-cadence.js +127 -0
  295. package/dist/core/vision/leader-cadence.js.map +1 -0
  296. package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
  297. package/dist/core/vision/leader-goal-evidence.js +36 -0
  298. package/dist/core/vision/leader-goal-evidence.js.map +1 -0
  299. package/dist/core/vision/leader-health.d.ts +53 -0
  300. package/dist/core/vision/leader-health.js +92 -0
  301. package/dist/core/vision/leader-health.js.map +1 -0
  302. package/dist/core/vision/leader-operator.d.ts +176 -0
  303. package/dist/core/vision/leader-operator.js +355 -0
  304. package/dist/core/vision/leader-operator.js.map +1 -0
  305. package/dist/core/vision/leader-run-chain.d.ts +41 -0
  306. package/dist/core/vision/leader-run-chain.js +54 -0
  307. package/dist/core/vision/leader-run-chain.js.map +1 -0
  308. package/dist/core/vision/leader-seat-plan.d.ts +68 -0
  309. package/dist/core/vision/leader-seat-plan.js +93 -0
  310. package/dist/core/vision/leader-seat-plan.js.map +1 -0
  311. package/dist/core/vision/leader-seat.d.ts +71 -5
  312. package/dist/core/vision/leader-seat.js +235 -33
  313. package/dist/core/vision/leader-seat.js.map +1 -1
  314. package/dist/core/vision/leader-thread-types.d.ts +104 -0
  315. package/dist/core/vision/leader-thread-types.js +9 -0
  316. package/dist/core/vision/leader-thread-types.js.map +1 -0
  317. package/dist/core/vision/leader-thread.d.ts +138 -0
  318. package/dist/core/vision/leader-thread.js +926 -0
  319. package/dist/core/vision/leader-thread.js.map +1 -0
  320. package/dist/core/vision/leader-types.d.ts +75 -1
  321. package/dist/core/vision/leader.d.ts +88 -18
  322. package/dist/core/vision/leader.js +269 -69
  323. package/dist/core/vision/leader.js.map +1 -1
  324. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js → ActionMenu-CIiX2X8w.js} +2 -2
  325. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
  327. package/dist/core/web/public/next/assets/{Advanced-B-LqYXvd.js.map → Advanced-DHsysoIL.js.map} +1 -1
  328. package/dist/core/web/public/next/assets/App-CMeAocmW.js +7 -0
  329. package/dist/core/web/public/next/assets/{App-E2zCDRxm.js.map → App-CMeAocmW.js.map} +1 -1
  330. package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
  331. package/dist/core/web/public/next/assets/{AppsSection-8wXPPhZb.js.map → AppsSection-DISYnMnc.js.map} +1 -1
  332. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
  333. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
  334. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js +3 -0
  335. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js.map +1 -0
  336. package/dist/core/web/public/next/assets/AutonomyOffState-CmSSTHVe.css +1 -0
  337. package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
  338. package/dist/core/web/public/next/assets/{AutonomySection-B46igJKR.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
  339. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
  340. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
  341. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js → BranchBar-BxhdiIpx.js} +2 -2
  342. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
  343. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js +2 -0
  344. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js.map +1 -0
  345. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js → Button-D90dzI_o.js} +2 -2
  346. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js.map → Button-D90dzI_o.js.map} +1 -1
  347. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js → CapacityStrip-qKDBC65C.js} +2 -2
  348. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
  350. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
  351. package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
  352. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
  353. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js.map +1 -0
  354. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
  355. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
  356. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
  357. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
  358. package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
  359. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
  360. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
  361. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
  362. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
  363. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js → DeleteChatDialog-BCfP12GH.js} +2 -2
  364. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
  365. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js → Dialog-D3msQlCj.js} +2 -2
  366. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js.map → Dialog-D3msQlCj.js.map} +1 -1
  367. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js → DiffPane-Ix6hvXlY.js} +2 -2
  368. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
  369. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js → DiffViewer-C4WKsCIe.js} +2 -2
  370. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
  371. package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
  372. package/dist/core/web/public/next/assets/{DockHost-DW9q0NdR.js.map → DockHost-aWP7liri.js.map} +1 -1
  373. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js → EmptyState-D2IRy3Cg.js} +2 -2
  374. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
  375. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js → Epistemic-DMr18muX.js} +2 -2
  376. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js.map → Epistemic-DMr18muX.js.map} +1 -1
  377. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js +2 -0
  378. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js.map +1 -0
  379. package/dist/core/web/public/next/assets/EvidenceTimeline-PBDAiSuG.css +1 -0
  380. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
  381. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
  382. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
  383. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
  384. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js → GearTray-Dt-ee32-.js} +2 -2
  385. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js.map → GearTray-Dt-ee32-.js.map} +1 -1
  386. package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
  387. package/dist/core/web/public/next/assets/{GrowthSection-iiQg6wvK.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
  388. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js → HandoffDialog-CLJQLe7M.js} +2 -2
  389. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
  390. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js → Input-D_KRJA9V.js} +2 -2
  391. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js.map → Input-D_KRJA9V.js.map} +1 -1
  392. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
  393. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
  394. package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
  395. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
  396. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
  397. package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
  398. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
  399. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
  400. package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
  401. package/dist/core/web/public/next/assets/{McpSection-BRuCcTjT.js.map → McpSection-DGbRcyv8.js.map} +1 -1
  402. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js → MessageMarkdown-DFvk06qG.js} +3 -3
  403. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
  404. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
  405. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
  406. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js → Meter-CMj-VafN.js} +2 -2
  407. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js.map → Meter-CMj-VafN.js.map} +1 -1
  408. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
  409. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
  410. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
  411. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
  412. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
  413. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
  414. package/dist/core/web/public/next/assets/NeedsYouList-CCsijdWt.js +2 -0
  415. package/dist/core/web/public/next/assets/{NeedsYouList-BgH8ezqf.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
  416. package/dist/core/web/public/next/assets/NeedsYouList-CH6Mq-E_.css +1 -0
  417. package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
  418. package/dist/core/web/public/next/assets/{NewChatDialog-Db5Xjrk8.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
  419. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js +3 -0
  420. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js.map +1 -0
  421. package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
  422. package/dist/core/web/public/next/assets/{OnboardingGate-C4VXn7BJ.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
  423. package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
  424. package/dist/core/web/public/next/assets/{PreviewPane-BPBbcROb.js.map → PreviewPane-COid5A0f.js.map} +1 -1
  425. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js → ProviderLogo-Cq-CYIwT.js} +2 -2
  426. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
  427. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js → RailStatus-Co5UB6We.js} +2 -2
  428. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js.map → RailStatus-Co5UB6We.js.map} +1 -1
  429. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js → RefreshIndicator-DO9ibnSq.js} +2 -2
  430. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
  431. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
  432. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BX2nkdmZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
  433. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
  434. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
  435. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
  436. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
  437. package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
  438. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
  439. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
  440. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
  441. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
  442. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js → SeatSelector-J5R3zDkB.js} +3 -3
  443. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
  444. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js → Segmented-CGh_-tBb.js} +2 -2
  445. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js.map → Segmented-CGh_-tBb.js.map} +1 -1
  446. package/dist/core/web/public/next/assets/{Select-De52fghU.js → Select-CWnmUzs3.js} +2 -2
  447. package/dist/core/web/public/next/assets/{Select-De52fghU.js.map → Select-CWnmUzs3.js.map} +1 -1
  448. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js → SessionGate-sp4KsnUo.js} +2 -2
  449. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
  450. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js → SessionInsightChip-DLFAzdbi.js} +2 -2
  451. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
  452. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js → SessionSearch-DbFjwR1h.js} +2 -2
  453. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
  454. package/dist/core/web/public/next/assets/{SettingsSection-mI9wQYZg.js → SettingsSection-Ch23msJ5.js} +2 -2
  455. package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
  456. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js +2 -0
  457. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js.map +1 -0
  458. package/dist/core/web/public/next/assets/SetupChecklist-BhZpFLsj.css +1 -0
  459. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
  460. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
  461. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js → Sheet-BZ2AG4Eo.js} +2 -2
  462. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
  463. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
  464. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
  465. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
  466. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js.map +1 -0
  467. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js → Slider-KVoJLDD6.js} +2 -2
  468. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js.map → Slider-KVoJLDD6.js.map} +1 -1
  469. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
  470. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
  471. package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
  472. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js → StatusBadge-CXsYqmdU.js} +2 -2
  473. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
  474. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
  475. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
  476. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js → Surface-BfDmQcKe.js} +2 -2
  477. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js.map → Surface-BfDmQcKe.js.map} +1 -1
  478. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
  479. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
  480. package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
  481. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js → Switch-9NtO_6Lj.js} +2 -2
  482. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js.map → Switch-9NtO_6Lj.js.map} +1 -1
  483. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js → Tag-DscCRFcN.js} +2 -2
  484. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js.map → Tag-DscCRFcN.js.map} +1 -1
  485. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js → TerminalPane-B668-DJW.js} +5 -5
  486. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js.map → TerminalPane-B668-DJW.js.map} +1 -1
  487. package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
  488. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DtXFhAhw.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
  489. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js → UniverseView-DG70zH0W.js} +4 -4
  490. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js.map → UniverseView-DG70zH0W.js.map} +1 -1
  491. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
  492. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
  493. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
  494. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
  495. package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
  496. package/dist/core/web/public/next/assets/{Workspace-BQSZFSeO.js.map → Workspace-D1nP9BhD.js.map} +1 -1
  497. package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
  498. package/dist/core/web/public/next/assets/{actions-Ci6I4C0l.js.map → actions-CY-PjpGc.js.map} +1 -1
  499. package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
  500. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js → apps-model-Du02KhAf.js} +2 -2
  501. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js.map → apps-model-Du02KhAf.js.map} +1 -1
  502. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js → authority-model-79SeuKlJ.js} +2 -2
  503. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js.map → authority-model-79SeuKlJ.js.map} +1 -1
  504. package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
  505. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
  506. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
  507. package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
  508. package/dist/core/web/public/next/assets/{budget-queries-DsAjH8ac.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
  509. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
  510. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
  511. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
  512. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
  513. package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
  514. package/dist/core/web/public/next/assets/cloud-model-BDivRMqv.js +2 -0
  515. package/dist/core/web/public/next/assets/{cloud-model-CX407gPY.js.map → cloud-model-BDivRMqv.js.map} +1 -1
  516. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js → cloud-queries-BPQQ5_pJ.js} +2 -2
  517. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
  518. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
  519. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
  520. package/dist/core/web/public/next/assets/{command-catalog-CF0cQQac.js → command-catalog-BIntSa9l.js} +2 -2
  521. package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
  522. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js → context-model-Br8t9jgG.js} +2 -2
  523. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js.map → context-model-Br8t9jgG.js.map} +1 -1
  524. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js → context-model-CokrgEUq.js} +3 -3
  525. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js.map → context-model-CokrgEUq.js.map} +1 -1
  526. package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
  527. package/dist/core/web/public/next/assets/{context-queries-CktFQqSS.js.map → context-queries-eL3caKVG.js.map} +1 -1
  528. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js → control-queries-B9K-wmcB.js} +2 -2
  529. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js.map → control-queries-B9K-wmcB.js.map} +1 -1
  530. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js +2 -0
  531. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js.map +1 -0
  532. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js → dock-icons-BJ6ZqB2t.js} +2 -2
  533. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
  534. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js → fleet-model-BvDR3gjp.js} +2 -2
  535. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
  536. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js → fleet-queries-W2UFVMZJ.js} +2 -2
  537. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
  538. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js → focus-trap-CtI1SlMX.js} +2 -2
  539. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
  540. package/dist/core/web/public/next/assets/format-CH4g_sl1.js +2 -0
  541. package/dist/core/web/public/next/assets/format-CH4g_sl1.js.map +1 -0
  542. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
  543. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
  544. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js → git-model-Dnkd1TnK.js} +2 -2
  545. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js.map → git-model-Dnkd1TnK.js.map} +1 -1
  546. package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
  547. package/dist/core/web/public/next/assets/{global-CNNGMril.js.map → global-CMNW_dqn.js.map} +1 -1
  548. package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
  549. package/dist/core/web/public/next/assets/{guarded-runners-DPh2d32e.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
  550. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js → icons-D1sYbCTQ.js} +2 -2
  551. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js.map → icons-D1sYbCTQ.js.map} +1 -1
  552. package/dist/core/web/public/next/assets/{index-QesfXBsb.js → index-DZ-UQ7v8.js} +3 -3
  553. package/dist/core/web/public/next/assets/{index-QesfXBsb.js.map → index-DZ-UQ7v8.js.map} +1 -1
  554. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
  555. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
  556. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
  557. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
  558. package/dist/core/web/public/next/assets/{live-model-De-q0ZFK.js → live-model-D_32RAOR.js} +2 -2
  559. package/dist/core/web/public/next/assets/live-model-D_32RAOR.js.map +1 -0
  560. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js → mind.module-7hA92hRg.js} +2 -2
  561. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js.map → mind.module-7hA92hRg.js.map} +1 -1
  562. package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
  563. package/dist/core/web/public/next/assets/{mutations-DTCtKCn_.js.map → mutations-DQPbFdRJ.js.map} +1 -1
  564. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js → nav-0dOYe2rJ.js} +2 -2
  565. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js.map → nav-0dOYe2rJ.js.map} +1 -1
  566. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js → overnight-queries-C4wOnFtE.js} +2 -2
  567. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
  568. package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
  569. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js → queries-BTXWdZzU.js} +2 -2
  570. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js.map → queries-BTXWdZzU.js.map} +1 -1
  571. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js → reasoning-pref-Ca6lN6x_.js} +2 -2
  572. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
  573. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js → reveal-anchor-DfNLgK_I.js} +2 -2
  574. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
  575. package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
  576. package/dist/core/web/public/next/assets/{seat-subscription-C5Tvr0WQ.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
  577. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js → sidebar-model-CLCdqwkR.js} +2 -2
  578. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
  579. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js → slots-C-qBeu-8.js} +3 -3
  580. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js.map → slots-C-qBeu-8.js.map} +1 -1
  581. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js → surface-data-Dj71tdD-.js} +2 -2
  582. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js.map → surface-data-Dj71tdD-.js.map} +1 -1
  583. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
  584. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
  585. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js → tasks-model-O8yR5YXp.js} +2 -2
  586. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
  587. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js → terminal-icons-CoRZq9iO.js} +2 -2
  588. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
  589. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
  590. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
  591. package/dist/core/web/public/next/assets/types-IYKrYLku.js +2 -0
  592. package/dist/core/web/public/next/assets/types-IYKrYLku.js.map +1 -0
  593. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js → usage-queries-AdjEyEtn.js} +2 -2
  594. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
  595. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js → use-guarded-action-CuuMHeDX.js} +2 -2
  596. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
  597. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js → use-ticker-BBcp02SZ.js} +2 -2
  598. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
  599. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js → use-token-gate-CbXVYQYI.js} +2 -2
  600. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
  601. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js → useOnboarding-C_Fpe_sH.js} +2 -2
  602. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
  603. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
  604. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
  605. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js → useVerseTranscript-DgbigUlV.js} +2 -2
  606. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
  607. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js → verse-icons-S56hIiXS.js} +2 -2
  608. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js.map → verse-icons-S56hIiXS.js.map} +1 -1
  609. package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
  610. package/dist/core/web/public/next/assets/{verse-model-MMySehjj.js.map → verse-model-DAVevkNe.js.map} +1 -1
  611. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js → warmup-B_RAtNZ_.js} +3 -3
  612. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js.map → warmup-B_RAtNZ_.js.map} +1 -1
  613. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js +2 -0
  614. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js.map +1 -0
  615. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js → workspace-model-dji5-Al3.js} +2 -2
  616. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js.map → workspace-model-dji5-Al3.js.map} +1 -1
  617. package/dist/core/web/public/next/index.html +1 -1
  618. package/dist/core/web/read-projection-worker.js +2 -1
  619. package/dist/core/web/read-projection-worker.js.map +1 -1
  620. package/dist/core/web/read-projections.d.ts +3 -0
  621. package/dist/core/web/read-projections.js +2 -2
  622. package/dist/core/web/read-projections.js.map +1 -1
  623. package/dist/core/web/visibility.js +3 -4
  624. package/dist/core/web/visibility.js.map +1 -1
  625. package/dist/release-dependency-inventory.json +1 -1
  626. package/docs/AUTONOMY-GAP.md +1 -1
  627. package/package.json +3 -2
  628. package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js +0 -2
  629. package/dist/core/web/public/next/assets/App-E2zCDRxm.js +0 -7
  630. package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js +0 -2
  631. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js +0 -2
  632. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js.map +0 -1
  633. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js +0 -2
  634. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js.map +0 -1
  635. package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +0 -1
  636. package/dist/core/web/public/next/assets/AutonomySection-B46igJKR.js +0 -2
  637. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js +0 -2
  638. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js.map +0 -1
  639. package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
  640. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js +0 -2
  641. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js.map +0 -1
  642. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js +0 -3
  643. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js.map +0 -1
  644. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js +0 -2
  645. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js.map +0 -1
  646. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
  647. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js +0 -2
  648. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js.map +0 -1
  649. package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js +0 -2
  650. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js +0 -3
  651. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js.map +0 -1
  652. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js +0 -2
  653. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js.map +0 -1
  654. package/dist/core/web/public/next/assets/GrowthSection-iiQg6wvK.js +0 -2
  655. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js +0 -2
  656. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js.map +0 -1
  657. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js +0 -2
  658. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js.map +0 -1
  659. package/dist/core/web/public/next/assets/McpSection-BRuCcTjT.js +0 -2
  660. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js +0 -2
  661. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js.map +0 -1
  662. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js +0 -2
  663. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js.map +0 -1
  664. package/dist/core/web/public/next/assets/NeedsYouList-BgH8ezqf.js +0 -2
  665. package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +0 -1
  666. package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js +0 -3
  667. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js +0 -2
  668. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js.map +0 -1
  669. package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js +0 -3
  670. package/dist/core/web/public/next/assets/PreviewPane-BPBbcROb.js +0 -2
  671. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BX2nkdmZ.js +0 -7
  672. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js +0 -3
  673. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js.map +0 -1
  674. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
  675. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js +0 -2
  676. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js.map +0 -1
  677. package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js.map +0 -1
  678. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js +0 -3
  679. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js.map +0 -1
  680. package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
  681. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js +0 -2
  682. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js.map +0 -1
  683. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js +0 -2
  684. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js.map +0 -1
  685. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js +0 -2
  686. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js.map +0 -1
  687. package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
  688. package/dist/core/web/public/next/assets/UniverseConsoleApp-DtXFhAhw.js +0 -2
  689. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js +0 -3
  690. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js.map +0 -1
  691. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js +0 -3
  692. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js.map +0 -1
  693. package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js +0 -10
  694. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
  695. package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js +0 -2
  696. package/dist/core/web/public/next/assets/budget-queries-DsAjH8ac.js +0 -2
  697. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js +0 -2
  698. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js.map +0 -1
  699. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
  700. package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js +0 -2
  701. package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js.map +0 -1
  702. package/dist/core/web/public/next/assets/context-queries-CktFQqSS.js +0 -2
  703. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js +0 -2
  704. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js.map +0 -1
  705. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js +0 -2
  706. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js.map +0 -1
  707. package/dist/core/web/public/next/assets/global-CNNGMril.js +0 -2
  708. package/dist/core/web/public/next/assets/guarded-runners-DPh2d32e.js +0 -2
  709. package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js.map +0 -1
  710. package/dist/core/web/public/next/assets/mutations-DTCtKCn_.js +0 -2
  711. package/dist/core/web/public/next/assets/primitives-D0Fb3TtS.js +0 -1
  712. package/dist/core/web/public/next/assets/seat-subscription-C5Tvr0WQ.js +0 -2
  713. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js +0 -2
  714. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js.map +0 -1
  715. package/dist/core/web/public/next/assets/types-D5XOdyw8.js +0 -2
  716. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +0 -1
  717. package/dist/core/web/public/next/assets/verse-model-MMySehjj.js +0 -2
  718. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js +0 -2
  719. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{a as e,c as t,n}from"./index-QesfXBsb.js";import{i as r}from"./global-CNNGMril.js";import{i,n as a,r as o,t as s}from"./highlight-CMCZK9jW.js";import{t as c}from"./Segmented-CametjLt.js";import{a as l,c as u,l as d,n as ee,o as f,t as p,x as m,y as te}from"./git-model-_BnI_Ogh.js";import{n as h,t as g}from"./Button-BhO-WKPp.js";import{t as _}from"./line-diff-B5Eonif2.js";import{_ as v}from"./icons-0haWy6nh.js";import{t as y}from"./EmptyState-DPrd2aak.js";import{t as b}from"./pane-chrome.module-D7o-fVd0.js";var x=t(e(),1),S={pane:`_pane_pqbe2_10`,head:`_head_pqbe2_34`,rootName:`_rootName_pqbe2_36`,rootPick:`_rootPick_pqbe2_43`,select:`_select_pqbe2_44`,summary:`_summary_pqbe2_57`,muted:`_muted_pqbe2_66`,add:`_add_pqbe2_67`,del:`_del_pqbe2_68`,ref:`_ref_pqbe2_69`,skeleton:`_skeleton_pqbe2_78`,body:`_body_pqbe2_87`,files:`_files_pqbe2_96`,fileList:`_fileList_pqbe2_111`,group:`_group_pqbe2_117`,groupFiles:`_groupFiles_pqbe2_118`,dir:`_dir_pqbe2_119`,file:`_file_pqbe2_96`,fileStatus:`_fileStatus_pqbe2_144`,fileName:`_fileName_pqbe2_156`,fileCounts:`_fileCounts_pqbe2_165`,fileSettled:`_fileSettled_pqbe2_166`,fileComments:`_fileComments_pqbe2_173`,patchArea:`_patchArea_pqbe2_185`,patchPath:`_patchPath_pqbe2_192`,patchNotice:`_patchNotice_pqbe2_210`,patchError:`_patchError_pqbe2_211`,truncated:`_truncated_pqbe2_224`,patch:`_patch_pqbe2_185`,grid:`_grid_pqbe2_236`,hunkRow:`_hunkRow_pqbe2_247`,lineRow:`_lineRow_pqbe2_258`,half:`_half_pqbe2_260`,no:`_no_pqbe2_265`,gutter:`_gutter_pqbe2_277`,marker:`_marker_pqbe2_283`,code:`_code_pqbe2_291`,codeText:`_codeText_pqbe2_301`,em:`_em_pqbe2_302`,gutterAdd:`_gutterAdd_pqbe2_309`,tok_plain:`_tok_plain_pqbe2_331`,tok_comment:`_tok_comment_pqbe2_333`,tok_string:`_tok_string_pqbe2_334`,tok_number:`_tok_number_pqbe2_335`,tok_keyword:`_tok_keyword_pqbe2_336`,showAll:`_showAll_pqbe2_338`,threadRow:`_threadRow_pqbe2_350`,comment:`_comment_pqbe2_360`,commentWhere:`_commentWhere_pqbe2_367`,commentText:`_commentText_pqbe2_375`,commentRemove:`_commentRemove_pqbe2_376`,linkButton:`_linkButton_pqbe2_377`,editor:`_editor_pqbe2_390`,editorLabel:`_editorLabel_pqbe2_391`,editorInput:`_editorInput_pqbe2_392`,editorActions:`_editorActions_pqbe2_405`,editorHint:`_editorHint_pqbe2_406`,saveButton:`_saveButton_pqbe2_408`,foot:`_foot_pqbe2_424`,footCount:`_footCount_pqbe2_432`,visuallyHidden:`_visuallyHidden_pqbe2_434`},C=n(),w=3e3,T=20;function E(e,t){return e.kind===`del`?{key:t,line:e.oldLineNo??0,side:`old`}:{key:t,line:e.newLineNo??e.oldLineNo??0,side:`new`}}function D(e,t){let n=e.replace(/^@@[^@]*@@/,``).trim(),r=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(e),i=r?`line ${r[2]}`:`hunk ${t+1}`;return n?`${i} · ${n}`:i}function O(e){let t=o(e).files[0];if(!t)return{unified:[],split:[],notice:null,status:`modified`};let n=[],r=[];return t.hunks.forEach((e,t)=>{let a=D(e.header,t);n.push({kind:`hunk`,key:`h${t}`,label:a}),r.push({kind:`hunk`,key:`h${t}`,label:a});let o=i(e.lines),s=new Map;for(let e of o)if(e.left&&e.right&&e.left.kind===`del`&&e.right.kind===`add`){let t=_(e.left.text,e.right.text);s.set(e.left,t?t.old:null),s.set(e.right,t?t.new:null)}e.lines.forEach((e,r)=>{let i=`h${t}l${r}`;n.push({kind:`line`,key:i,line:e,anchor:E(e,i),emphasis:s.get(e)??null})}),o.forEach((e,n)=>{let i=`h${t}p${n}`,a=e.right??e.left;r.push({kind:`pair`,key:i,left:e.left,right:e.right,anchor:E(a,i),leftEmphasis:e.left?s.get(e.left)??null:null,rightEmphasis:e.right?s.get(e.right)??null:null})})}),{unified:n,split:r,notice:t.unparsedNotice,status:t.status}}function ne(e){return e>=1048576?`${(e/1048576).toFixed(1)} MB`:`${Math.round(e/1024)} KB`}function k({path:e,text:t,truncated:n,totalBytes:r,layout:i,comments:a,onAddComment:o,onRemoveComment:c}){let l=s(e),d=(0,x.useMemo)(()=>O(t),[t]),[ee,f]=(0,x.useState)(!1),[p,m]=(0,x.useState)(0),[te,h]=(0,x.useState)(null),g=(0,x.useRef)(null),_=(0,x.useId)(),v=i===`split`?d.split:d.unified,y=!ee&&v.length>3e3,b=y?v.slice(0,w):v,D=(0,x.useMemo)(()=>b.flatMap((e,t)=>e.kind===`hunk`?[]:[t]),[b]);(0,x.useEffect)(()=>{m(0),h(null),f(!1)},[t,i]);let k=D[Math.min(p,Math.max(0,D.length-1))]??-1,F=k>=0?b[k]:void 0,I=F&&F.kind!==`hunk`?F.anchor:null,L=e=>`${_}-${e}`;(0,x.useEffect)(()=>{I!==null&&document.getElementById(L(I.key))?.scrollIntoView?.({block:`nearest`})},[I?.key]);let R=e=>{if(e.target!==e.currentTarget)return;let t=D.length-1,n=n=>{e.preventDefault(),m(Math.max(0,Math.min(t,n)))};switch(e.key){case`ArrowDown`:n(p+1);break;case`ArrowUp`:n(p-1);break;case`PageDown`:n(p+T);break;case`PageUp`:n(p-T);break;case`Home`:n(0);break;case`End`:n(t);break;case`Enter`:I&&(e.preventDefault(),h(I))}},z=e=>a.filter(t=>t.line===e.line&&t.side===e.side),B=(e,t)=>{let n=D.indexOf(t);n>=0&&m(n),h(e)},V=()=>{h(null),g.current?.focus()};return d.notice&&v.length===0?(0,C.jsx)(`p`,{className:S.patchNotice,children:/binary/i.test(d.notice)?`Binary file — no lines to show.`:d.notice}):v.length===0?(0,C.jsx)(`p`,{className:S.patchNotice,children:d.status===`renamed`?`Renamed with no content changes.`:`No line changes (a mode or permission change).`}):(0,C.jsxs)(`div`,{className:S.patch,children:[n?(0,C.jsxs)(`p`,{className:S.truncated,role:`note`,children:[`Showing the first 256 KB`,r?` of ${ne(r)}`:``,`. Open the file in your editor for the rest.`]}):null,(0,C.jsx)(`table`,{ref:g,role:`grid`,className:S.grid,"data-layout":i,tabIndex:0,"aria-label":`Changes in ${e}. Arrow keys move between lines; Enter adds a comment.`,"aria-activedescendant":I?L(I.key):void 0,"aria-rowcount":b.length,onKeyDown:R,children:(0,C.jsx)(`tbody`,{children:b.map((t,n)=>{if(t.kind===`hunk`)return(0,C.jsx)(`tr`,{className:S.hunkRow,children:(0,C.jsx)(`td`,{colSpan:5,className:S.hunkCell,role:`gridcell`,children:t.label})},t.key);let r=n===k,i=t.kind===`pair`&&t.left&&t.left.kind===`del`&&t.right?[...z(t.anchor),...z(E(t.left,t.key))]:z(t.anchor),a=te?.key===t.anchor.key;return(0,C.jsxs)(A,{children:[t.kind===`line`?(0,C.jsxs)(`tr`,{className:S.lineRow,"data-kind":t.line.kind,"data-active":r?`true`:void 0,children:[(0,C.jsx)(`td`,{className:S.no,"aria-hidden":`true`,children:t.line.oldLineNo??``}),(0,C.jsx)(`td`,{className:S.no,"aria-hidden":`true`,children:t.line.newLineNo??``}),(0,C.jsx)(`td`,{className:S.gutter,children:(0,C.jsx)(M,{onClick:()=>B(t.anchor,n),line:t.anchor.line})}),(0,C.jsx)(`td`,{className:S.marker,"aria-hidden":`true`,children:t.line.kind===`add`?`+`:t.line.kind===`del`?`−`:``}),(0,C.jsx)(`td`,{id:L(t.key),role:`gridcell`,className:S.code,"aria-label":j(t.line),children:(0,C.jsx)(N,{text:t.line.text,lang:l,emphasis:t.emphasis,kind:t.line.kind})})]}):(0,C.jsxs)(`tr`,{className:S.lineRow,"data-kind":`pair`,"data-active":r?`true`:void 0,children:[(0,C.jsx)(`td`,{className:S.no,"aria-hidden":`true`,children:t.left?.oldLineNo??``}),(0,C.jsx)(`td`,{className:S.half,"data-kind":t.left?.kind??`empty`,children:t.left?(0,C.jsx)(N,{text:t.left.text,lang:l,emphasis:t.leftEmphasis,kind:t.left.kind}):null}),(0,C.jsx)(`td`,{className:S.gutter,children:(0,C.jsx)(M,{onClick:()=>B(t.anchor,n),line:t.anchor.line})}),(0,C.jsx)(`td`,{className:S.no,"aria-hidden":`true`,children:t.right?.newLineNo??``}),(0,C.jsx)(`td`,{id:L(t.key),role:`gridcell`,className:S.half,"data-kind":t.right?.kind??`empty`,"aria-label":[t.left?j(t.left):null,t.right&&t.right!==t.left?j(t.right):null].filter(Boolean).join(`; `),children:t.right?(0,C.jsx)(N,{text:t.right.text,lang:l,emphasis:t.rightEmphasis,kind:t.right.kind}):null})]}),i.length>0||a?(0,C.jsx)(`tr`,{className:S.threadRow,children:(0,C.jsxs)(`td`,{colSpan:5,role:`gridcell`,children:[i.map(e=>(0,C.jsxs)(`div`,{className:S.comment,children:[(0,C.jsxs)(`span`,{className:S.commentWhere,children:[e.side===`old`?`Removed line`:`Line`,` `,e.line]}),(0,C.jsx)(`p`,{className:S.commentText,children:e.note}),(0,C.jsx)(`button`,{type:`button`,className:S.commentRemove,onClick:()=>c(e.id),"aria-label":`Remove the comment on line ${e.line}`,children:`Remove`})]},e.id)),a?(0,C.jsx)(P,{anchor:t.anchor,onCancel:V,onSave:n=>{o({path:e,line:t.anchor.line,side:t.anchor.side,note:n}),V()}}):null]})}):null]},t.key)})})}),y?(0,C.jsxs)(`button`,{type:`button`,className:S.showAll,onClick:()=>f(!0),children:[`Show all `,u(v.length),` lines`]}):null]})}function A({children:e}){return(0,C.jsx)(C.Fragment,{children:e})}function j(e){let t=e.kind===`del`?e.oldLineNo:e.newLineNo,n=e.kind===`add`?`added`:e.kind===`del`?`removed`:`unchanged`;return`Line ${t??`—`}, ${n}: ${e.text}`}function M({onClick:e,line:t}){return(0,C.jsx)(`button`,{type:`button`,className:S.gutterAdd,tabIndex:-1,onClick:e,"aria-label":`Add a comment on line ${t}`,title:`Add a comment on line ${t}`,children:`+`})}function N({text:e,lang:t,emphasis:n,kind:r}){let i=a(e,t);if(!n||r===`context`)return(0,C.jsx)(`code`,{className:S.codeText,children:i.map((e,t)=>(0,C.jsx)(`span`,{className:S[`tok_${e.kind}`],children:e.text},t))});let[o,s]=n,c=[],l=0;for(let t of i){let n=l,r=l+t.text.length,i=[n,Math.max(n,Math.min(r,o)),Math.max(n,Math.min(r,s)),r];for(let n=0;n<3;n++){let r=i[n],a=i[n+1];a>r&&c.push({text:e.slice(r,a),kind:t.kind,em:n===1})}l=r}return(0,C.jsx)(`code`,{className:S.codeText,children:c.map((e,t)=>(0,C.jsx)(`span`,{className:`${S[`tok_${e.kind}`]??``} ${e.em?S.em:``}`,children:e.text},t))})}function P({anchor:e,onSave:t,onCancel:n}){let[r,i]=(0,x.useState)(``),a=(0,x.useRef)(null),o=(0,x.useId)();(0,x.useEffect)(()=>{a.current?.focus()},[]);let s=()=>{r.trim()&&t(r.trim())};return(0,C.jsxs)(`div`,{className:S.editor,children:[(0,C.jsxs)(`label`,{htmlFor:o,className:S.editorLabel,children:[`Comment on `,e.side===`old`?`removed line`:`line`,` `,e.line]}),(0,C.jsx)(`textarea`,{id:o,ref:a,className:S.editorInput,rows:2,value:r,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)?(e.preventDefault(),s()):e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),n())},placeholder:`What should change here?`,maxLength:4e3}),(0,C.jsxs)(`div`,{className:S.editorActions,children:[(0,C.jsx)(`span`,{className:S.editorHint,children:`⌘Enter saves · Esc cancels`}),(0,C.jsx)(`button`,{type:`button`,className:S.linkButton,onClick:n,children:`Cancel`}),(0,C.jsx)(`button`,{type:`button`,className:S.saveButton,onClick:s,disabled:!r.trim(),children:`Save comment`})]})]})}var F=640;function I(e){let t=e.replace(/[\\/]+$/,``).split(/[\\/]/);return t[t.length-1]||e}function L(e){return e===`branch`?`branch`:`working`}function R({roots:e,request:t,turnFiles:n,onAddToMessage:i,visible:a,fetchDiff:o=te}){let[s,_]=(0,x.useState)(e[0]??null),[w,T]=(0,x.useState)(`working`),[E,D]=(0,x.useState)(null),[O,ne]=(0,x.useState)(`unified`),[A,j]=(0,x.useState)({state:`idle`}),[M,N]=(0,x.useState)({state:`idle`}),[P,R]=(0,x.useState)([]),[V,H]=(0,x.useState)(``),[re,ie]=(0,x.useState)(0),[U,ae]=(0,x.useState)(!0),W=(0,x.useRef)(null),G=(0,x.useRef)(new Map),oe=(0,x.useRef)(null),se=(0,x.useRef)(1),ce=(0,x.useRef)(null),K=(0,x.useId)(),le=(0,x.useId)();(0,x.useEffect)(()=>{(s===null||!e.includes(s))&&_(e[0]??null)},[e,s]),(0,x.useEffect)(()=>{t&&ce.current!==t.nonce&&(ce.current=t.nonce,_(t.root),T(t.scope),D(t.file??null))},[t]),(0,x.useEffect)(()=>{let e=W.current;if(!e||typeof ResizeObserver>`u`)return;let t=new ResizeObserver(e=>{let t=e[0]?.contentRect.width??0;ae(t>=F)});return t.observe(e),()=>t.disconnect()},[]),(0,x.useEffect)(()=>{if(!a||s===null)return;let e=new AbortController,t=`${s}\0${L(w)}`;return G.current.clear(),j(e=>e.state===`ready`&&e.key===t?e:{state:`loading`}),o(s,L(w),null,e.signal).then(n=>{e.signal.aborted||j({state:`ready`,data:n,key:t})}).catch(t=>{e.signal.aborted||(m(t)?j({state:`not-a-repo`}):(console.warn(`[verse] review list failed`,t),j({state:`error`,message:l(t)})))}),()=>e.abort()},[s,w,a,re,o]);let ue=s===null?``:`${s}\0${L(w)}`,q=(0,x.useMemo)(()=>A.state===`ready`&&A.key!==ue?{state:`loading`}:A,[A,ue]),J=(0,x.useMemo)(()=>{if(q.state!==`ready`)return[];if(w!==`turn`)return q.data.files.map(e=>({file:e,settled:!1}));let e=n.filter(e=>e.root===s).map(e=>e.path),t=new Map(q.data.files.map(e=>[e.path,e]));return[...new Set(e)].map(e=>{let n=t.get(e);return n?{file:n,settled:!1}:{file:{path:e,oldPath:null,status:`M`,additions:0,deletions:0,binary:!1},settled:!0}})},[q,w,n,s]),Y=(0,x.useMemo)(()=>d(J.map(e=>e.file)),[J]),X=(0,x.useMemo)(()=>{let e=new Map(J.map(e=>[e.file.path,e]));return Y.flatMap(t=>t.files.map(t=>e.get(t.path))).filter(e=>!e.settled)},[Y,J]);(0,x.useEffect)(()=>{q.state===`ready`&&(E!==null&&X.some(e=>e.file.path===E)||D(X[0]?.file.path??null))},[q,X,E]),(0,x.useEffect)(()=>{if(!a||s===null||E===null||q.state!==`ready`){N({state:`idle`});return}let e=X.find(e=>e.file.path===E);if(!e)return;let t=`${L(w)}\0${E}`,n=G.current.get(t);if(n){N(n);return}if(e.file.binary){N({state:`ready`,text:``,truncated:!1,totalBytes:null});return}let r=new AbortController;return N({state:`loading`}),o(s,L(w),E,r.signal).then(e=>{if(r.signal.aborted)return;let n={state:`ready`,text:e.patch?.text??``,truncated:e.patch?.truncated??!1,totalBytes:e.patchBytes??null};G.current.set(t,n),N(n)}).catch(e=>{r.signal.aborted||(console.warn(`[verse] review patch failed`,e),N({state:`error`,message:l(e)}))}),()=>r.abort()},[s,w,E,a,q,X,o]);let de=(0,x.useCallback)(e=>{R(t=>[...t,{...e,id:`c${se.current++}`}]),H(`Comment added on line ${e.line}.`)},[]),fe=(0,x.useCallback)(e=>{R(t=>t.filter(t=>t.id!==e)),H(`Comment removed.`)},[]),pe=()=>{P.length!==0&&(i(ee(P)),H(`Added ${P.length} ${P.length===1?`comment`:`comments`} to the message.`),R([]))},me=e=>{if(X.length===0)return;let t=X.findIndex(e=>e.file.path===E),n=t;if(e.key===`ArrowDown`)n=Math.min(X.length-1,t+1);else if(e.key===`ArrowUp`)n=Math.max(0,t-1);else if(e.key===`Home`)n=0;else if(e.key===`End`)n=X.length-1;else return;e.preventDefault();let r=X[n].file.path;D(r);let i=typeof CSS<`u`&&typeof CSS.escape==`function`?CSS.escape(r):r.replace(/["\\]/g,`\\$&`);oe.current?.querySelector(`[data-path="${i}"]`)?.scrollIntoView?.({block:`nearest`})},he=[{value:`turn`,label:`This turn`,disabled:n.filter(e=>e.root===s).length===0},{value:`working`,label:`Uncommitted`},{value:`branch`,label:`Branch`}],ge=[{value:`unified`,label:`Unified`},{value:`split`,label:`Split`}],_e=O===`split`&&!U?`unified`:O,Z=J.reduce((e,t)=>t.settled?e:{files:e.files+1,additions:e.additions+t.file.additions,deletions:e.deletions+t.file.deletions},{files:0,additions:0,deletions:0}),Q=q.state===`ready`?q.data.base:null,ve=P.filter(e=>e.path===E),$=()=>ie(e=>e+1);return e.length===0||s===null?(0,C.jsx)(`div`,{className:S.pane,ref:W,children:(0,C.jsx)(y,{compact:!0,title:`No folder to review`,body:`This chat has no project folder. Start a chat in a project to review the changes it makes.`})}):(0,C.jsxs)(`div`,{className:S.pane,ref:W,"data-wide":U?`true`:`false`,children:[(0,C.jsxs)(`header`,{className:`${b.header} ${S.head}`,children:[e.length>1?(0,C.jsxs)(`label`,{className:S.rootPick,children:[(0,C.jsx)(`span`,{className:S.visuallyHidden,children:`Repository`}),(0,C.jsx)(`select`,{id:le,value:s,onChange:e=>{_(e.target.value),D(null)},className:S.select,title:s,children:e.map(e=>(0,C.jsx)(`option`,{value:e,children:I(e)},e))})]}):(0,C.jsx)(`span`,{className:`${b.title} ${S.rootName}`,title:s,children:I(s)}),(0,C.jsx)(c,{"aria-label":`What to review`,size:`sm`,options:he,value:w,onChange:e=>{T(e),D(null)}}),(0,C.jsxs)(`div`,{className:b.actions,children:[(0,C.jsx)(c,{"aria-label":`Diff layout`,size:`sm`,options:ge.map(e=>e.value===`split`&&!U?{...e,disabled:!0}:e),value:_e,onChange:ne}),(0,C.jsx)(h,{variant:`ghost`,size:`sm`,icon:(0,C.jsx)(v,{}),"aria-label":`Refresh changes`,title:`Refresh changes`,onClick:$})]})]}),(0,C.jsx)(`p`,{className:S.summary,children:q.state===`ready`?Z.files===0?(0,C.jsx)(`span`,{children:B(w,Q)}):(0,C.jsxs)(`span`,{"aria-label":f(Z.files,Z.additions,Z.deletions),children:[u(Z.files),` `,Z.files===1?`file`:`files`,` · `,(0,C.jsxs)(`span`,{className:S.add,children:[`+`,u(Z.additions)]}),` `,(0,C.jsxs)(`span`,{className:S.del,children:[`−`,u(Z.deletions)]}),w===`branch`&&Q?(0,C.jsxs)(C.Fragment,{children:[` against `,(0,C.jsx)(`code`,{className:S.ref,children:Q})]}):null,w===`working`?` uncommitted`:null]}):q.state===`loading`||q.state===`idle`?(0,C.jsx)(`span`,{className:S.muted,children:`Reading changes…`}):null}),q.state===`not-a-repo`?(0,C.jsx)(y,{compact:!0,title:`Not a git repository`,body:`${I(s)} is not tracked by git, so there is nothing to review. Run git init in the terminal to start tracking it.`}):q.state===`error`?(0,C.jsx)(y,{compact:!0,tone:`error`,title:`Could not read the changes`,body:q.message,action:(0,C.jsx)(g,{size:`sm`,variant:`subtle`,onClick:$,children:`Try again`})}):q.state===`ready`?J.length===0?(0,C.jsx)(`p`,{className:S.patchNotice,children:z(w)}):(0,C.jsxs)(`div`,{className:S.body,children:[(0,C.jsx)(`nav`,{className:S.files,"aria-label":`Changed files`,children:(0,C.jsx)(`ul`,{ref:oe,id:K,role:`listbox`,"aria-label":`Changed files`,className:S.fileList,tabIndex:0,"aria-activedescendant":E?`${K}-${encodeURIComponent(E)}`:void 0,onKeyDown:me,children:Y.map(e=>(0,C.jsxs)(`li`,{role:`presentation`,className:S.group,children:[e.dir?(0,C.jsxs)(`span`,{className:S.dir,role:`presentation`,title:`${e.dir}/`,children:[e.dir,`/`,`‎`]}):null,(0,C.jsx)(`ul`,{role:`presentation`,className:S.groupFiles,children:e.files.map(e=>{let t=J.find(t=>t.file.path===e.path)?.settled??!1,n=e.path===E,r=P.filter(t=>t.path===e.path).length;return(0,C.jsxs)(`li`,{id:`${K}-${encodeURIComponent(e.path)}`,"data-path":e.path,role:`option`,"aria-selected":n,"aria-disabled":t||void 0,className:S.file,"data-status":e.status,onClick:()=>{t||D(e.path)},title:e.oldPath?`${e.oldPath} → ${e.path}`:e.path,children:[(0,C.jsx)(`span`,{className:S.fileStatus,"aria-label":p[e.status],children:e.status}),(0,C.jsx)(`span`,{className:S.fileName,children:e.name}),r>0?(0,C.jsx)(`span`,{className:S.fileComments,"aria-label":`${r} ${r===1?`comment`:`comments`}`,children:r}):null,t?(0,C.jsx)(`span`,{className:S.fileSettled,children:`committed`}):e.binary?(0,C.jsx)(`span`,{className:S.fileCounts,children:`binary`}):(0,C.jsxs)(`span`,{className:S.fileCounts,children:[(0,C.jsxs)(`span`,{className:S.add,children:[`+`,u(e.additions)]}),` `,(0,C.jsxs)(`span`,{className:S.del,children:[`−`,u(e.deletions)]})]})]},e.path)})})]},e.dir||`.`))})}),(0,C.jsx)(`section`,{className:S.patchArea,"aria-label":E?`Patch for ${E}`:`Patch`,children:E===null?(0,C.jsx)(`p`,{className:S.patchNotice,children:`Choose a file in the list to see its changes.`}):M.state===`loading`||M.state===`idle`?(0,C.jsxs)(`div`,{className:S.skeleton,"aria-hidden":`true`,children:[(0,C.jsx)(r,{}),(0,C.jsx)(r,{})]}):M.state===`error`?(0,C.jsxs)(`div`,{className:S.patchError,role:`alert`,children:[(0,C.jsx)(`p`,{children:M.message}),(0,C.jsx)(g,{size:`sm`,variant:`subtle`,onClick:$,children:`Try again`})]}):(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(`h3`,{className:S.patchPath,title:E,children:E}),X.find(e=>e.file.path===E)?.file.binary?(0,C.jsx)(`p`,{className:S.patchNotice,children:`Binary file — no lines to show.`}):(0,C.jsx)(k,{path:E,text:M.text,truncated:M.truncated,totalBytes:M.totalBytes,layout:_e,comments:ve,onAddComment:de,onRemoveComment:fe})]})})]}):(0,C.jsxs)(`div`,{className:S.skeleton,"aria-hidden":`true`,children:[(0,C.jsx)(r,{}),(0,C.jsx)(r,{}),(0,C.jsx)(r,{})]}),P.length>0?(0,C.jsxs)(`footer`,{className:S.foot,children:[(0,C.jsxs)(`span`,{className:S.footCount,children:[P.length,` `,P.length===1?`comment`:`comments`,new Set(P.map(e=>e.path)).size>1?` in ${new Set(P.map(e=>e.path)).size} files`:``]}),(0,C.jsx)(`button`,{type:`button`,className:S.linkButton,onClick:()=>{R([]),H(`Comments discarded.`)},children:`Discard`}),(0,C.jsx)(`button`,{type:`button`,className:S.saveButton,onClick:pe,children:`Add to message`})]}):null,(0,C.jsx)(`p`,{className:S.visuallyHidden,role:`status`,"aria-live":`polite`,children:V})]})}function z(e){return e===`turn`?`Switch to Uncommitted or Branch to see the rest of the changes.`:e===`working`?`Edits the chat makes show up here as they land. Branch shows what is already committed.`:`Commits on this branch show up here. Uncommitted shows edits that are not committed yet.`}function B(e,t){return e===`turn`?`The latest turn changed no files here.`:e===`working`?`No uncommitted changes.`:t?`This branch has no changes against ${t}.`:`No changes on this branch.`}export{R as DiffPane};
2
- //# sourceMappingURL=DiffPane-BpNuJmth.js.map
1
+ import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";import{i as r}from"./global-CMNW_dqn.js";import{i,n as a,r as o,t as s}from"./highlight-CMCZK9jW.js";import{t as c}from"./Segmented-CGh_-tBb.js";import{a as l,c as u,l as d,n as ee,o as f,t as p,x as m,y as te}from"./git-model-Dnkd1TnK.js";import{n as h,t as g}from"./Button-D90dzI_o.js";import{t as _}from"./line-diff-B5Eonif2.js";import{_ as v}from"./icons-D1sYbCTQ.js";import{t as y}from"./EmptyState-D2IRy3Cg.js";import{t as b}from"./pane-chrome.module-D7o-fVd0.js";var x=t(e(),1),S={pane:`_pane_pqbe2_10`,head:`_head_pqbe2_34`,rootName:`_rootName_pqbe2_36`,rootPick:`_rootPick_pqbe2_43`,select:`_select_pqbe2_44`,summary:`_summary_pqbe2_57`,muted:`_muted_pqbe2_66`,add:`_add_pqbe2_67`,del:`_del_pqbe2_68`,ref:`_ref_pqbe2_69`,skeleton:`_skeleton_pqbe2_78`,body:`_body_pqbe2_87`,files:`_files_pqbe2_96`,fileList:`_fileList_pqbe2_111`,group:`_group_pqbe2_117`,groupFiles:`_groupFiles_pqbe2_118`,dir:`_dir_pqbe2_119`,file:`_file_pqbe2_96`,fileStatus:`_fileStatus_pqbe2_144`,fileName:`_fileName_pqbe2_156`,fileCounts:`_fileCounts_pqbe2_165`,fileSettled:`_fileSettled_pqbe2_166`,fileComments:`_fileComments_pqbe2_173`,patchArea:`_patchArea_pqbe2_185`,patchPath:`_patchPath_pqbe2_192`,patchNotice:`_patchNotice_pqbe2_210`,patchError:`_patchError_pqbe2_211`,truncated:`_truncated_pqbe2_224`,patch:`_patch_pqbe2_185`,grid:`_grid_pqbe2_236`,hunkRow:`_hunkRow_pqbe2_247`,lineRow:`_lineRow_pqbe2_258`,half:`_half_pqbe2_260`,no:`_no_pqbe2_265`,gutter:`_gutter_pqbe2_277`,marker:`_marker_pqbe2_283`,code:`_code_pqbe2_291`,codeText:`_codeText_pqbe2_301`,em:`_em_pqbe2_302`,gutterAdd:`_gutterAdd_pqbe2_309`,tok_plain:`_tok_plain_pqbe2_331`,tok_comment:`_tok_comment_pqbe2_333`,tok_string:`_tok_string_pqbe2_334`,tok_number:`_tok_number_pqbe2_335`,tok_keyword:`_tok_keyword_pqbe2_336`,showAll:`_showAll_pqbe2_338`,threadRow:`_threadRow_pqbe2_350`,comment:`_comment_pqbe2_360`,commentWhere:`_commentWhere_pqbe2_367`,commentText:`_commentText_pqbe2_375`,commentRemove:`_commentRemove_pqbe2_376`,linkButton:`_linkButton_pqbe2_377`,editor:`_editor_pqbe2_390`,editorLabel:`_editorLabel_pqbe2_391`,editorInput:`_editorInput_pqbe2_392`,editorActions:`_editorActions_pqbe2_405`,editorHint:`_editorHint_pqbe2_406`,saveButton:`_saveButton_pqbe2_408`,foot:`_foot_pqbe2_424`,footCount:`_footCount_pqbe2_432`,visuallyHidden:`_visuallyHidden_pqbe2_434`},C=n(),w=3e3,T=20;function E(e,t){return e.kind===`del`?{key:t,line:e.oldLineNo??0,side:`old`}:{key:t,line:e.newLineNo??e.oldLineNo??0,side:`new`}}function D(e,t){let n=e.replace(/^@@[^@]*@@/,``).trim(),r=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(e),i=r?`line ${r[2]}`:`hunk ${t+1}`;return n?`${i} · ${n}`:i}function O(e){let t=o(e).files[0];if(!t)return{unified:[],split:[],notice:null,status:`modified`};let n=[],r=[];return t.hunks.forEach((e,t)=>{let a=D(e.header,t);n.push({kind:`hunk`,key:`h${t}`,label:a}),r.push({kind:`hunk`,key:`h${t}`,label:a});let o=i(e.lines),s=new Map;for(let e of o)if(e.left&&e.right&&e.left.kind===`del`&&e.right.kind===`add`){let t=_(e.left.text,e.right.text);s.set(e.left,t?t.old:null),s.set(e.right,t?t.new:null)}e.lines.forEach((e,r)=>{let i=`h${t}l${r}`;n.push({kind:`line`,key:i,line:e,anchor:E(e,i),emphasis:s.get(e)??null})}),o.forEach((e,n)=>{let i=`h${t}p${n}`,a=e.right??e.left;r.push({kind:`pair`,key:i,left:e.left,right:e.right,anchor:E(a,i),leftEmphasis:e.left?s.get(e.left)??null:null,rightEmphasis:e.right?s.get(e.right)??null:null})})}),{unified:n,split:r,notice:t.unparsedNotice,status:t.status}}function ne(e){return e>=1048576?`${(e/1048576).toFixed(1)} MB`:`${Math.round(e/1024)} KB`}function k({path:e,text:t,truncated:n,totalBytes:r,layout:i,comments:a,onAddComment:o,onRemoveComment:c}){let l=s(e),d=(0,x.useMemo)(()=>O(t),[t]),[ee,f]=(0,x.useState)(!1),[p,m]=(0,x.useState)(0),[te,h]=(0,x.useState)(null),g=(0,x.useRef)(null),_=(0,x.useId)(),v=i===`split`?d.split:d.unified,y=!ee&&v.length>3e3,b=y?v.slice(0,w):v,D=(0,x.useMemo)(()=>b.flatMap((e,t)=>e.kind===`hunk`?[]:[t]),[b]);(0,x.useEffect)(()=>{m(0),h(null),f(!1)},[t,i]);let k=D[Math.min(p,Math.max(0,D.length-1))]??-1,F=k>=0?b[k]:void 0,I=F&&F.kind!==`hunk`?F.anchor:null,L=e=>`${_}-${e}`;(0,x.useEffect)(()=>{I!==null&&document.getElementById(L(I.key))?.scrollIntoView?.({block:`nearest`})},[I?.key]);let R=e=>{if(e.target!==e.currentTarget)return;let t=D.length-1,n=n=>{e.preventDefault(),m(Math.max(0,Math.min(t,n)))};switch(e.key){case`ArrowDown`:n(p+1);break;case`ArrowUp`:n(p-1);break;case`PageDown`:n(p+T);break;case`PageUp`:n(p-T);break;case`Home`:n(0);break;case`End`:n(t);break;case`Enter`:I&&(e.preventDefault(),h(I))}},z=e=>a.filter(t=>t.line===e.line&&t.side===e.side),B=(e,t)=>{let n=D.indexOf(t);n>=0&&m(n),h(e)},V=()=>{h(null),g.current?.focus()};return d.notice&&v.length===0?(0,C.jsx)(`p`,{className:S.patchNotice,children:/binary/i.test(d.notice)?`Binary file — no lines to show.`:d.notice}):v.length===0?(0,C.jsx)(`p`,{className:S.patchNotice,children:d.status===`renamed`?`Renamed with no content changes.`:`No line changes (a mode or permission change).`}):(0,C.jsxs)(`div`,{className:S.patch,children:[n?(0,C.jsxs)(`p`,{className:S.truncated,role:`note`,children:[`Showing the first 256 KB`,r?` of ${ne(r)}`:``,`. Open the file in your editor for the rest.`]}):null,(0,C.jsx)(`table`,{ref:g,role:`grid`,className:S.grid,"data-layout":i,tabIndex:0,"aria-label":`Changes in ${e}. Arrow keys move between lines; Enter adds a comment.`,"aria-activedescendant":I?L(I.key):void 0,"aria-rowcount":b.length,onKeyDown:R,children:(0,C.jsx)(`tbody`,{children:b.map((t,n)=>{if(t.kind===`hunk`)return(0,C.jsx)(`tr`,{className:S.hunkRow,children:(0,C.jsx)(`td`,{colSpan:5,className:S.hunkCell,role:`gridcell`,children:t.label})},t.key);let r=n===k,i=t.kind===`pair`&&t.left&&t.left.kind===`del`&&t.right?[...z(t.anchor),...z(E(t.left,t.key))]:z(t.anchor),a=te?.key===t.anchor.key;return(0,C.jsxs)(A,{children:[t.kind===`line`?(0,C.jsxs)(`tr`,{className:S.lineRow,"data-kind":t.line.kind,"data-active":r?`true`:void 0,children:[(0,C.jsx)(`td`,{className:S.no,"aria-hidden":`true`,children:t.line.oldLineNo??``}),(0,C.jsx)(`td`,{className:S.no,"aria-hidden":`true`,children:t.line.newLineNo??``}),(0,C.jsx)(`td`,{className:S.gutter,children:(0,C.jsx)(M,{onClick:()=>B(t.anchor,n),line:t.anchor.line})}),(0,C.jsx)(`td`,{className:S.marker,"aria-hidden":`true`,children:t.line.kind===`add`?`+`:t.line.kind===`del`?`−`:``}),(0,C.jsx)(`td`,{id:L(t.key),role:`gridcell`,className:S.code,"aria-label":j(t.line),children:(0,C.jsx)(N,{text:t.line.text,lang:l,emphasis:t.emphasis,kind:t.line.kind})})]}):(0,C.jsxs)(`tr`,{className:S.lineRow,"data-kind":`pair`,"data-active":r?`true`:void 0,children:[(0,C.jsx)(`td`,{className:S.no,"aria-hidden":`true`,children:t.left?.oldLineNo??``}),(0,C.jsx)(`td`,{className:S.half,"data-kind":t.left?.kind??`empty`,children:t.left?(0,C.jsx)(N,{text:t.left.text,lang:l,emphasis:t.leftEmphasis,kind:t.left.kind}):null}),(0,C.jsx)(`td`,{className:S.gutter,children:(0,C.jsx)(M,{onClick:()=>B(t.anchor,n),line:t.anchor.line})}),(0,C.jsx)(`td`,{className:S.no,"aria-hidden":`true`,children:t.right?.newLineNo??``}),(0,C.jsx)(`td`,{id:L(t.key),role:`gridcell`,className:S.half,"data-kind":t.right?.kind??`empty`,"aria-label":[t.left?j(t.left):null,t.right&&t.right!==t.left?j(t.right):null].filter(Boolean).join(`; `),children:t.right?(0,C.jsx)(N,{text:t.right.text,lang:l,emphasis:t.rightEmphasis,kind:t.right.kind}):null})]}),i.length>0||a?(0,C.jsx)(`tr`,{className:S.threadRow,children:(0,C.jsxs)(`td`,{colSpan:5,role:`gridcell`,children:[i.map(e=>(0,C.jsxs)(`div`,{className:S.comment,children:[(0,C.jsxs)(`span`,{className:S.commentWhere,children:[e.side===`old`?`Removed line`:`Line`,` `,e.line]}),(0,C.jsx)(`p`,{className:S.commentText,children:e.note}),(0,C.jsx)(`button`,{type:`button`,className:S.commentRemove,onClick:()=>c(e.id),"aria-label":`Remove the comment on line ${e.line}`,children:`Remove`})]},e.id)),a?(0,C.jsx)(P,{anchor:t.anchor,onCancel:V,onSave:n=>{o({path:e,line:t.anchor.line,side:t.anchor.side,note:n}),V()}}):null]})}):null]},t.key)})})}),y?(0,C.jsxs)(`button`,{type:`button`,className:S.showAll,onClick:()=>f(!0),children:[`Show all `,u(v.length),` lines`]}):null]})}function A({children:e}){return(0,C.jsx)(C.Fragment,{children:e})}function j(e){let t=e.kind===`del`?e.oldLineNo:e.newLineNo,n=e.kind===`add`?`added`:e.kind===`del`?`removed`:`unchanged`;return`Line ${t??`—`}, ${n}: ${e.text}`}function M({onClick:e,line:t}){return(0,C.jsx)(`button`,{type:`button`,className:S.gutterAdd,tabIndex:-1,onClick:e,"aria-label":`Add a comment on line ${t}`,title:`Add a comment on line ${t}`,children:`+`})}function N({text:e,lang:t,emphasis:n,kind:r}){let i=a(e,t);if(!n||r===`context`)return(0,C.jsx)(`code`,{className:S.codeText,children:i.map((e,t)=>(0,C.jsx)(`span`,{className:S[`tok_${e.kind}`],children:e.text},t))});let[o,s]=n,c=[],l=0;for(let t of i){let n=l,r=l+t.text.length,i=[n,Math.max(n,Math.min(r,o)),Math.max(n,Math.min(r,s)),r];for(let n=0;n<3;n++){let r=i[n],a=i[n+1];a>r&&c.push({text:e.slice(r,a),kind:t.kind,em:n===1})}l=r}return(0,C.jsx)(`code`,{className:S.codeText,children:c.map((e,t)=>(0,C.jsx)(`span`,{className:`${S[`tok_${e.kind}`]??``} ${e.em?S.em:``}`,children:e.text},t))})}function P({anchor:e,onSave:t,onCancel:n}){let[r,i]=(0,x.useState)(``),a=(0,x.useRef)(null),o=(0,x.useId)();(0,x.useEffect)(()=>{a.current?.focus()},[]);let s=()=>{r.trim()&&t(r.trim())};return(0,C.jsxs)(`div`,{className:S.editor,children:[(0,C.jsxs)(`label`,{htmlFor:o,className:S.editorLabel,children:[`Comment on `,e.side===`old`?`removed line`:`line`,` `,e.line]}),(0,C.jsx)(`textarea`,{id:o,ref:a,className:S.editorInput,rows:2,value:r,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)?(e.preventDefault(),s()):e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),n())},placeholder:`What should change here?`,maxLength:4e3}),(0,C.jsxs)(`div`,{className:S.editorActions,children:[(0,C.jsx)(`span`,{className:S.editorHint,children:`⌘Enter saves · Esc cancels`}),(0,C.jsx)(`button`,{type:`button`,className:S.linkButton,onClick:n,children:`Cancel`}),(0,C.jsx)(`button`,{type:`button`,className:S.saveButton,onClick:s,disabled:!r.trim(),children:`Save comment`})]})]})}var F=640;function I(e){let t=e.replace(/[\\/]+$/,``).split(/[\\/]/);return t[t.length-1]||e}function L(e){return e===`branch`?`branch`:`working`}function R({roots:e,request:t,turnFiles:n,onAddToMessage:i,visible:a,fetchDiff:o=te}){let[s,_]=(0,x.useState)(e[0]??null),[w,T]=(0,x.useState)(`working`),[E,D]=(0,x.useState)(null),[O,ne]=(0,x.useState)(`unified`),[A,j]=(0,x.useState)({state:`idle`}),[M,N]=(0,x.useState)({state:`idle`}),[P,R]=(0,x.useState)([]),[V,H]=(0,x.useState)(``),[re,ie]=(0,x.useState)(0),[U,ae]=(0,x.useState)(!0),W=(0,x.useRef)(null),G=(0,x.useRef)(new Map),oe=(0,x.useRef)(null),se=(0,x.useRef)(1),ce=(0,x.useRef)(null),K=(0,x.useId)(),le=(0,x.useId)();(0,x.useEffect)(()=>{(s===null||!e.includes(s))&&_(e[0]??null)},[e,s]),(0,x.useEffect)(()=>{t&&ce.current!==t.nonce&&(ce.current=t.nonce,_(t.root),T(t.scope),D(t.file??null))},[t]),(0,x.useEffect)(()=>{let e=W.current;if(!e||typeof ResizeObserver>`u`)return;let t=new ResizeObserver(e=>{let t=e[0]?.contentRect.width??0;ae(t>=F)});return t.observe(e),()=>t.disconnect()},[]),(0,x.useEffect)(()=>{if(!a||s===null)return;let e=new AbortController,t=`${s}\0${L(w)}`;return G.current.clear(),j(e=>e.state===`ready`&&e.key===t?e:{state:`loading`}),o(s,L(w),null,e.signal).then(n=>{e.signal.aborted||j({state:`ready`,data:n,key:t})}).catch(t=>{e.signal.aborted||(m(t)?j({state:`not-a-repo`}):(console.warn(`[verse] review list failed`,t),j({state:`error`,message:l(t)})))}),()=>e.abort()},[s,w,a,re,o]);let ue=s===null?``:`${s}\0${L(w)}`,q=(0,x.useMemo)(()=>A.state===`ready`&&A.key!==ue?{state:`loading`}:A,[A,ue]),J=(0,x.useMemo)(()=>{if(q.state!==`ready`)return[];if(w!==`turn`)return q.data.files.map(e=>({file:e,settled:!1}));let e=n.filter(e=>e.root===s).map(e=>e.path),t=new Map(q.data.files.map(e=>[e.path,e]));return[...new Set(e)].map(e=>{let n=t.get(e);return n?{file:n,settled:!1}:{file:{path:e,oldPath:null,status:`M`,additions:0,deletions:0,binary:!1},settled:!0}})},[q,w,n,s]),Y=(0,x.useMemo)(()=>d(J.map(e=>e.file)),[J]),X=(0,x.useMemo)(()=>{let e=new Map(J.map(e=>[e.file.path,e]));return Y.flatMap(t=>t.files.map(t=>e.get(t.path))).filter(e=>!e.settled)},[Y,J]);(0,x.useEffect)(()=>{q.state===`ready`&&(E!==null&&X.some(e=>e.file.path===E)||D(X[0]?.file.path??null))},[q,X,E]),(0,x.useEffect)(()=>{if(!a||s===null||E===null||q.state!==`ready`){N({state:`idle`});return}let e=X.find(e=>e.file.path===E);if(!e)return;let t=`${L(w)}\0${E}`,n=G.current.get(t);if(n){N(n);return}if(e.file.binary){N({state:`ready`,text:``,truncated:!1,totalBytes:null});return}let r=new AbortController;return N({state:`loading`}),o(s,L(w),E,r.signal).then(e=>{if(r.signal.aborted)return;let n={state:`ready`,text:e.patch?.text??``,truncated:e.patch?.truncated??!1,totalBytes:e.patchBytes??null};G.current.set(t,n),N(n)}).catch(e=>{r.signal.aborted||(console.warn(`[verse] review patch failed`,e),N({state:`error`,message:l(e)}))}),()=>r.abort()},[s,w,E,a,q,X,o]);let de=(0,x.useCallback)(e=>{R(t=>[...t,{...e,id:`c${se.current++}`}]),H(`Comment added on line ${e.line}.`)},[]),fe=(0,x.useCallback)(e=>{R(t=>t.filter(t=>t.id!==e)),H(`Comment removed.`)},[]),pe=()=>{P.length!==0&&(i(ee(P)),H(`Added ${P.length} ${P.length===1?`comment`:`comments`} to the message.`),R([]))},me=e=>{if(X.length===0)return;let t=X.findIndex(e=>e.file.path===E),n=t;if(e.key===`ArrowDown`)n=Math.min(X.length-1,t+1);else if(e.key===`ArrowUp`)n=Math.max(0,t-1);else if(e.key===`Home`)n=0;else if(e.key===`End`)n=X.length-1;else return;e.preventDefault();let r=X[n].file.path;D(r);let i=typeof CSS<`u`&&typeof CSS.escape==`function`?CSS.escape(r):r.replace(/["\\]/g,`\\$&`);oe.current?.querySelector(`[data-path="${i}"]`)?.scrollIntoView?.({block:`nearest`})},he=[{value:`turn`,label:`This turn`,disabled:n.filter(e=>e.root===s).length===0},{value:`working`,label:`Uncommitted`},{value:`branch`,label:`Branch`}],ge=[{value:`unified`,label:`Unified`},{value:`split`,label:`Split`}],_e=O===`split`&&!U?`unified`:O,Z=J.reduce((e,t)=>t.settled?e:{files:e.files+1,additions:e.additions+t.file.additions,deletions:e.deletions+t.file.deletions},{files:0,additions:0,deletions:0}),Q=q.state===`ready`?q.data.base:null,ve=P.filter(e=>e.path===E),$=()=>ie(e=>e+1);return e.length===0||s===null?(0,C.jsx)(`div`,{className:S.pane,ref:W,children:(0,C.jsx)(y,{compact:!0,title:`No folder to review`,body:`This chat has no project folder. Start a chat in a project to review the changes it makes.`})}):(0,C.jsxs)(`div`,{className:S.pane,ref:W,"data-wide":U?`true`:`false`,children:[(0,C.jsxs)(`header`,{className:`${b.header} ${S.head}`,children:[e.length>1?(0,C.jsxs)(`label`,{className:S.rootPick,children:[(0,C.jsx)(`span`,{className:S.visuallyHidden,children:`Repository`}),(0,C.jsx)(`select`,{id:le,value:s,onChange:e=>{_(e.target.value),D(null)},className:S.select,title:s,children:e.map(e=>(0,C.jsx)(`option`,{value:e,children:I(e)},e))})]}):(0,C.jsx)(`span`,{className:`${b.title} ${S.rootName}`,title:s,children:I(s)}),(0,C.jsx)(c,{"aria-label":`What to review`,size:`sm`,options:he,value:w,onChange:e=>{T(e),D(null)}}),(0,C.jsxs)(`div`,{className:b.actions,children:[(0,C.jsx)(c,{"aria-label":`Diff layout`,size:`sm`,options:ge.map(e=>e.value===`split`&&!U?{...e,disabled:!0}:e),value:_e,onChange:ne}),(0,C.jsx)(h,{variant:`ghost`,size:`sm`,icon:(0,C.jsx)(v,{}),"aria-label":`Refresh changes`,title:`Refresh changes`,onClick:$})]})]}),(0,C.jsx)(`p`,{className:S.summary,children:q.state===`ready`?Z.files===0?(0,C.jsx)(`span`,{children:B(w,Q)}):(0,C.jsxs)(`span`,{"aria-label":f(Z.files,Z.additions,Z.deletions),children:[u(Z.files),` `,Z.files===1?`file`:`files`,` · `,(0,C.jsxs)(`span`,{className:S.add,children:[`+`,u(Z.additions)]}),` `,(0,C.jsxs)(`span`,{className:S.del,children:[`−`,u(Z.deletions)]}),w===`branch`&&Q?(0,C.jsxs)(C.Fragment,{children:[` against `,(0,C.jsx)(`code`,{className:S.ref,children:Q})]}):null,w===`working`?` uncommitted`:null]}):q.state===`loading`||q.state===`idle`?(0,C.jsx)(`span`,{className:S.muted,children:`Reading changes…`}):null}),q.state===`not-a-repo`?(0,C.jsx)(y,{compact:!0,title:`Not a git repository`,body:`${I(s)} is not tracked by git, so there is nothing to review. Run git init in the terminal to start tracking it.`}):q.state===`error`?(0,C.jsx)(y,{compact:!0,tone:`error`,title:`Could not read the changes`,body:q.message,action:(0,C.jsx)(g,{size:`sm`,variant:`subtle`,onClick:$,children:`Try again`})}):q.state===`ready`?J.length===0?(0,C.jsx)(`p`,{className:S.patchNotice,children:z(w)}):(0,C.jsxs)(`div`,{className:S.body,children:[(0,C.jsx)(`nav`,{className:S.files,"aria-label":`Changed files`,children:(0,C.jsx)(`ul`,{ref:oe,id:K,role:`listbox`,"aria-label":`Changed files`,className:S.fileList,tabIndex:0,"aria-activedescendant":E?`${K}-${encodeURIComponent(E)}`:void 0,onKeyDown:me,children:Y.map(e=>(0,C.jsxs)(`li`,{role:`presentation`,className:S.group,children:[e.dir?(0,C.jsxs)(`span`,{className:S.dir,role:`presentation`,title:`${e.dir}/`,children:[e.dir,`/`,`‎`]}):null,(0,C.jsx)(`ul`,{role:`presentation`,className:S.groupFiles,children:e.files.map(e=>{let t=J.find(t=>t.file.path===e.path)?.settled??!1,n=e.path===E,r=P.filter(t=>t.path===e.path).length;return(0,C.jsxs)(`li`,{id:`${K}-${encodeURIComponent(e.path)}`,"data-path":e.path,role:`option`,"aria-selected":n,"aria-disabled":t||void 0,className:S.file,"data-status":e.status,onClick:()=>{t||D(e.path)},title:e.oldPath?`${e.oldPath} → ${e.path}`:e.path,children:[(0,C.jsx)(`span`,{className:S.fileStatus,"aria-label":p[e.status],children:e.status}),(0,C.jsx)(`span`,{className:S.fileName,children:e.name}),r>0?(0,C.jsx)(`span`,{className:S.fileComments,"aria-label":`${r} ${r===1?`comment`:`comments`}`,children:r}):null,t?(0,C.jsx)(`span`,{className:S.fileSettled,children:`committed`}):e.binary?(0,C.jsx)(`span`,{className:S.fileCounts,children:`binary`}):(0,C.jsxs)(`span`,{className:S.fileCounts,children:[(0,C.jsxs)(`span`,{className:S.add,children:[`+`,u(e.additions)]}),` `,(0,C.jsxs)(`span`,{className:S.del,children:[`−`,u(e.deletions)]})]})]},e.path)})})]},e.dir||`.`))})}),(0,C.jsx)(`section`,{className:S.patchArea,"aria-label":E?`Patch for ${E}`:`Patch`,children:E===null?(0,C.jsx)(`p`,{className:S.patchNotice,children:`Choose a file in the list to see its changes.`}):M.state===`loading`||M.state===`idle`?(0,C.jsxs)(`div`,{className:S.skeleton,"aria-hidden":`true`,children:[(0,C.jsx)(r,{}),(0,C.jsx)(r,{})]}):M.state===`error`?(0,C.jsxs)(`div`,{className:S.patchError,role:`alert`,children:[(0,C.jsx)(`p`,{children:M.message}),(0,C.jsx)(g,{size:`sm`,variant:`subtle`,onClick:$,children:`Try again`})]}):(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(`h3`,{className:S.patchPath,title:E,children:E}),X.find(e=>e.file.path===E)?.file.binary?(0,C.jsx)(`p`,{className:S.patchNotice,children:`Binary file — no lines to show.`}):(0,C.jsx)(k,{path:E,text:M.text,truncated:M.truncated,totalBytes:M.totalBytes,layout:_e,comments:ve,onAddComment:de,onRemoveComment:fe})]})})]}):(0,C.jsxs)(`div`,{className:S.skeleton,"aria-hidden":`true`,children:[(0,C.jsx)(r,{}),(0,C.jsx)(r,{}),(0,C.jsx)(r,{})]}),P.length>0?(0,C.jsxs)(`footer`,{className:S.foot,children:[(0,C.jsxs)(`span`,{className:S.footCount,children:[P.length,` `,P.length===1?`comment`:`comments`,new Set(P.map(e=>e.path)).size>1?` in ${new Set(P.map(e=>e.path)).size} files`:``]}),(0,C.jsx)(`button`,{type:`button`,className:S.linkButton,onClick:()=>{R([]),H(`Comments discarded.`)},children:`Discard`}),(0,C.jsx)(`button`,{type:`button`,className:S.saveButton,onClick:pe,children:`Add to message`})]}):null,(0,C.jsx)(`p`,{className:S.visuallyHidden,role:`status`,"aria-live":`polite`,children:V})]})}function z(e){return e===`turn`?`Switch to Uncommitted or Branch to see the rest of the changes.`:e===`working`?`Edits the chat makes show up here as they land. Branch shows what is already committed.`:`Commits on this branch show up here. Uncommitted shows edits that are not committed yet.`}function B(e,t){return e===`turn`?`The latest turn changed no files here.`:e===`working`?`No uncommitted changes.`:t?`This branch has no changes against ${t}.`:`No changes on this branch.`}export{R as DiffPane};
2
+ //# sourceMappingURL=DiffPane-Ix6hvXlY.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DiffPane-BpNuJmth.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/git/DiffPane.module.css","../../../../../../src/web-ui/routes/verse/git/PatchView.tsx","../../../../../../src/web-ui/routes/verse/git/DiffPane.tsx"],"sourcesContent":["/*\n * Review pane (SPEC-310C §3). Lives in the dock: 320px to 60% of the window,\n * a sheet below 1024, a bottom sheet below 480 — so the layout answers the\n * PANE's width (a container query), not the window's. Narrow: file list over\n * patch. At 720px+ of pane: list beside patch.\n *\n * Diff tints are the diff's own mixes over --bg-code (as in chat.module.css),\n * and the +/− marker column carries the meaning, never colour alone.\n */\n.pane {\n container-type: inline-size;\n display: flex;\n flex-direction: column;\n min-width: 0;\n height: 100%;\n min-height: 0;\n background: var(--bg-canvas);\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n /* Same row tints as the transcript's DiffBlock (chat.module.css), so a\n change looks the same in the chat and in Review; the emphasis mix marks\n the changed span inside a line (git-contrast.test.ts holds text on all four). */\n --diff-add: color-mix(in srgb, var(--status-success-solid) 22%, var(--bg-code));\n --diff-del: color-mix(in srgb, var(--status-danger-solid) 22%, var(--bg-code));\n --diff-add-em: color-mix(in srgb, var(--status-success-solid) 36%, var(--bg-code));\n --diff-del-em: color-mix(in srgb, var(--status-danger-solid) 36%, var(--bg-code));\n}\n\n/* ---- header -------------------------------------------------------------- */\n\n/* Height, padding, border and surface come from ../dock/pane-chrome.module.css\n (the row every dock pane shares); Review only wraps it at narrow widths. */\n.head { flex-wrap: wrap; }\n/* Scoped under .head so it outranks the shared title's size and colour. */\n.head .rootName {\n max-width: 16ch;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.rootPick { display: inline-flex; min-width: 0; }\n.select {\n min-height: var(--control-h-sm);\n max-width: 16ch;\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n}\n.select:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.summary {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-variant-numeric: tabular-nums;\n}\n.summary:empty { display: none; }\n.muted { color: var(--text-tertiary); }\n.add { color: var(--status-success-fg); }\n.del { color: var(--status-danger-fg); }\n.ref {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n padding: 0 var(--space-1);\n border-radius: var(--radius-xs);\n background: var(--bg-code);\n color: var(--text-primary);\n}\n\n.skeleton {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3);\n}\n\n/* ---- body: list over patch, or beside it --------------------------------- */\n\n.body {\n flex: 1 1 auto;\n min-height: 0;\n display: grid;\n /* Stacked: the list takes what it needs, up to a cap, and the patch the rest. */\n grid-template-rows: auto minmax(0, 1fr);\n overflow: hidden;\n}\n\n.files {\n min-height: 0;\n max-height: min(34vh, 14rem);\n overflow: auto;\n border-bottom: 1px solid var(--border-subtle);\n}\n/* Side by side once the PANE is wide enough. Declared after .files so it wins. */\n@container (min-width: 720px) {\n .body {\n grid-template-rows: none;\n grid-template-columns: minmax(12rem, 30%) minmax(0, 1fr);\n }\n .files { border-bottom: 0; border-right: 1px solid var(--border-subtle); max-height: none; }\n}\n\n.fileList {\n list-style: none;\n margin: 0;\n padding: var(--space-1) 0;\n}\n.fileList:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--border-focus); }\n.group { display: block; }\n.groupFiles { list-style: none; margin: 0; padding: 0; }\n.dir {\n display: block;\n padding: var(--space-2) var(--space-3) var(--space-1);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n direction: rtl;\n text-align: left;\n}\n.file {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n min-height: var(--control-h-xs);\n padding: 0 var(--space-3) 0 var(--space-4);\n cursor: pointer;\n border-left: 2px solid transparent;\n}\n.file:hover { background: var(--bg-hover); }\n.file[aria-selected='true'] { background: var(--bg-selected); border-left-color: var(--accent-600); }\n.file[aria-disabled='true'] { cursor: default; color: var(--text-tertiary); }\n.fileStatus {\n flex: none;\n width: 1.4em;\n text-align: center;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-secondary);\n}\n.file[data-status='A'] .fileStatus { color: var(--status-success-fg); }\n.file[data-status='D'] .fileStatus { color: var(--status-danger-fg); }\n.file[data-status='U'] .fileStatus { color: var(--status-warning-fg); }\n.fileName {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n.fileCounts,\n.fileSettled {\n flex: none;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n font-variant-numeric: tabular-nums;\n color: var(--text-tertiary);\n}\n.fileComments {\n flex: none;\n min-width: 1.5em;\n padding: 0 var(--space-1);\n border-radius: var(--radius-full);\n background: var(--accent-100);\n color: var(--accent-700);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n text-align: center;\n}\n\n.patchArea {\n min-height: 0;\n min-width: 0;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n.patchPath {\n position: sticky;\n top: 0;\n z-index: 1;\n margin: 0;\n padding: var(--space-2) var(--space-3);\n background: var(--bg-canvas);\n border-bottom: 1px solid var(--border-subtle);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-weight: var(--font-weight-medium);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n direction: rtl;\n text-align: left;\n}\n.patchNotice,\n.patchError {\n margin: 0;\n padding: var(--space-4) var(--space-3);\n color: var(--text-secondary);\n}\n.patchError {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--space-2);\n color: var(--status-danger-fg);\n}\n.patchError > p { margin: 0; }\n.truncated {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n font-size: var(--text-xs-size);\n}\n\n/* ---- the patch grid ------------------------------------------------------ */\n\n.patch { min-width: 0; }\n.grid {\n width: 100%;\n border-collapse: collapse;\n table-layout: auto;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n background: var(--bg-code);\n}\n.grid:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--border-focus); }\n\n.hunkRow > td {\n padding: var(--space-1) var(--space-3);\n background: var(--bg-surface);\n color: var(--text-tertiary);\n border-top: 1px solid var(--border-subtle);\n border-bottom: 1px solid var(--border-subtle);\n font-family: var(--font-ui);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n}\n\n.lineRow[data-kind='add'] > td { background: var(--diff-add); }\n.lineRow[data-kind='del'] > td { background: var(--diff-del); }\n.half[data-kind='add'] { background: var(--diff-add); }\n.half[data-kind='del'] { background: var(--diff-del); }\n.half[data-kind='empty'] { background: color-mix(in srgb, var(--text-tertiary) 6%, var(--bg-code)); }\n.lineRow[data-active='true'] > td { box-shadow: inset 0 1px 0 var(--border-focus), inset 0 -1px 0 var(--border-focus); }\n\n.no {\n width: 1%;\n min-width: 3.5ch;\n padding: 0 var(--space-2);\n text-align: right;\n /* Real line numbers, read to find the change in an editor: the body floor\n on the code ground, which --text-tertiary misses in light (chat.module.css). */\n color: var(--text-secondary);\n user-select: none;\n white-space: nowrap;\n vertical-align: top;\n}\n.gutter {\n width: 1.6em;\n padding: 0;\n vertical-align: top;\n text-align: center;\n}\n.marker {\n width: 1.2em;\n padding: 0;\n text-align: center;\n color: var(--text-secondary);\n user-select: none;\n vertical-align: top;\n}\n.code,\n.half {\n padding: 0 var(--space-3) 0 var(--space-1);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n word-break: break-word;\n vertical-align: top;\n color: var(--text-primary);\n}\n.grid[data-layout='split'] .half { width: 50%; }\n.codeText { font-family: inherit; }\n.em { border-radius: 2px; }\n.lineRow[data-kind='add'] .em,\n.half[data-kind='add'] .em { background: var(--diff-add-em); }\n.lineRow[data-kind='del'] .em,\n.half[data-kind='del'] .em { background: var(--diff-del-em); }\n\n/* The gutter \"+\" appears on the hovered or active line (the pointer's GitHub habit). */\n.gutterAdd {\n display: inline-grid;\n place-items: center;\n width: 1.3em;\n height: 1.3em;\n margin-top: 1px;\n padding: 0;\n border: 0;\n border-radius: var(--radius-xs);\n background: var(--accent-600);\n color: var(--text-on-accent);\n font: inherit;\n font-weight: var(--font-weight-bold);\n line-height: 1;\n cursor: pointer;\n opacity: 0;\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n.lineRow:hover .gutterAdd,\n.lineRow[data-active='true'] .gutterAdd,\n.gutterAdd:focus-visible { opacity: 1; }\n\n.tok_plain { color: inherit; }\n/* Secondary, not tertiary: tertiary falls to 3.5:1 on the add tint (git-contrast.test.ts); italics carry \"comment\". */\n.tok_comment { color: var(--text-secondary); font-style: italic; }\n.tok_string { color: var(--status-success-fg); }\n.tok_number { color: var(--status-warning-fg); }\n.tok_keyword { color: var(--accent-700); font-weight: var(--font-weight-medium); }\n\n.showAll {\n margin: var(--space-2) var(--space-3);\n align-self: flex-start;\n border: 0;\n background: transparent;\n color: var(--text-link);\n font: inherit;\n cursor: pointer;\n}\n\n/* ---- comments ------------------------------------------------------------ */\n\n.threadRow > td {\n padding: var(--space-2) var(--space-3);\n background: var(--bg-surface);\n border-top: 1px solid var(--border-subtle);\n border-bottom: 1px solid var(--border-subtle);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n white-space: normal;\n}\n.comment {\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: baseline;\n gap: var(--space-2);\n padding: var(--space-1) 0;\n}\n.commentWhere {\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n text-transform: uppercase;\n letter-spacing: var(--tracking-label);\n color: var(--text-tertiary);\n font-family: var(--font-display);\n}\n.commentText { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--text-primary); }\n.commentRemove,\n.linkButton {\n border: 0;\n background: transparent;\n color: var(--text-link);\n font: inherit;\n font-size: var(--text-xs-size);\n cursor: pointer;\n padding: 0 var(--space-1);\n border-radius: var(--radius-xs);\n}\n.commentRemove:focus-visible,\n.linkButton:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.editor { display: flex; flex-direction: column; gap: var(--space-2); }\n.editorLabel { font-size: var(--text-xs-size); color: var(--text-secondary); font-weight: var(--font-weight-medium); }\n.editorInput {\n width: 100%;\n box-sizing: border-box;\n min-height: calc(var(--text-sm-line) * 2 + var(--space-4));\n padding: var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font: inherit;\n resize: vertical;\n}\n.editorInput:focus-visible { outline: none; border-color: var(--border-focus); box-shadow: var(--shadow-focus-ring); }\n.editorActions { display: flex; align-items: center; gap: var(--space-2); justify-content: flex-end; flex-wrap: wrap; }\n.editorHint { margin-right: auto; font-size: var(--text-xs-size); color: var(--text-tertiary); }\n\n.saveButton {\n min-height: var(--control-h-xs);\n padding: 0 var(--space-3);\n border: 1px solid var(--accent-600);\n border-radius: var(--radius-sm);\n background: var(--accent-600);\n color: var(--text-on-accent);\n font: inherit;\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n cursor: pointer;\n}\n.saveButton:hover { background: var(--accent-700); border-color: var(--accent-700); }\n.saveButton:disabled { opacity: 0.6; cursor: default; }\n.saveButton:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.foot {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding: var(--space-2) var(--space-3);\n border-top: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n.footCount { margin-right: auto; color: var(--text-secondary); font-size: var(--text-sm-size); }\n\n.visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .gutterAdd { transition: none; }\n}\n","/**\n * routes/verse/git/PatchView.tsx — one file's patch in the Review pane,\n * unified or split, with line comments (unit C5; SPEC-310C §3 \"Diff/Review\").\n *\n * Reuses the inbox parser (`parseUnifiedDiff`, `toSplitRows`) and highlighter\n * (`tokenizeLine`) verbatim — the same pieces DiffBlock renders the\n * transcript's inline diffs with — plus `intralineSpans` (chat/line-diff.ts)\n * to emphasise the part of a changed line that changed.\n *\n * KEYBOARD. The patch is ONE tab stop (a grid with an active line, announced\n * through aria-activedescendant — thousands of focusable rows would make Tab\n * useless): ↑ ↓ move a line, PageUp PageDown move twenty, Home End jump,\n * Enter opens a comment on the active line. In the comment box ⌘/Ctrl+Enter\n * saves and Escape cancels, returning focus to the patch. The pointer gets a\n * \"+\" in the gutter of the hovered line, as on GitHub.\n *\n * A patch the server cut at 256 KB says so, and rows past ROW_LIMIT are\n * behind \"Show all\" — every row is DOM.\n */\nimport { useEffect, useId, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from 'react';\nimport { parseUnifiedDiff, toSplitRows, type DiffLine } from '../../inbox/diff-parser.js';\nimport { languageForPath, tokenizeLine, type LangFamily } from '../../inbox/highlight.js';\nimport { intralineSpans } from '../chat/line-diff.js';\nimport { formatCount, type ReviewComment } from './git-model.js';\nimport styles from './DiffPane.module.css';\n\nexport type PatchLayout = 'unified' | 'split';\n\n/** Rows rendered before \"Show all\". */\nexport const ROW_LIMIT = 3_000;\nconst PAGE = 20;\n\nexport interface PatchViewProps {\n path: string;\n text: string;\n truncated: boolean;\n /** Bytes of the whole patch before the cut (for \"showing 256 KB of 1.2 MB\"). */\n totalBytes: number | null;\n layout: PatchLayout;\n comments: readonly ReviewComment[];\n onAddComment: (c: Omit<ReviewComment, 'id'>) => void;\n onRemoveComment: (id: string) => void;\n}\n\n/** One commentable line, in display order. */\ninterface Anchor {\n key: string;\n line: number;\n side: 'new' | 'old';\n}\n\ntype UnifiedRow =\n | { kind: 'hunk'; key: string; label: string }\n | { kind: 'line'; key: string; line: DiffLine; anchor: Anchor; emphasis: [number, number] | null };\n\ntype SplitRowView =\n | { kind: 'hunk'; key: string; label: string }\n | {\n kind: 'pair';\n key: string;\n left: DiffLine | null;\n right: DiffLine | null;\n anchor: Anchor;\n leftEmphasis: [number, number] | null;\n rightEmphasis: [number, number] | null;\n };\n\nfunction anchorFor(line: DiffLine, key: string): Anchor {\n if (line.kind === 'del') return { key, line: line.oldLineNo ?? 0, side: 'old' };\n return { key, line: line.newLineNo ?? line.oldLineNo ?? 0, side: 'new' };\n}\n\nfunction hunkLabel(header: string, index: number): string {\n const section = header.replace(/^@@[^@]*@@/, '').trim();\n const m = /^@@ -(\\d+)(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/.exec(header);\n const where = m ? `line ${m[2]}` : `hunk ${index + 1}`;\n return section ? `${where} · ${section}` : where;\n}\n\nfunction buildRows(text: string): { unified: UnifiedRow[]; split: SplitRowView[]; notice: string | null; status: string } {\n const parsed = parseUnifiedDiff(text);\n const file = parsed.files[0];\n if (!file) return { unified: [], split: [], notice: null, status: 'modified' };\n const unified: UnifiedRow[] = [];\n const split: SplitRowView[] = [];\n file.hunks.forEach((hunk, h) => {\n const label = hunkLabel(hunk.header, h);\n unified.push({ kind: 'hunk', key: `h${h}`, label });\n split.push({ kind: 'hunk', key: `h${h}`, label });\n // Pair each run of deletions with the run of additions after it, for emphasis in both layouts.\n const pairs = toSplitRows(hunk.lines);\n const emphasisOf = new Map<DiffLine, [number, number] | null>();\n for (const p of pairs) {\n if (p.left && p.right && p.left.kind === 'del' && p.right.kind === 'add') {\n const spans = intralineSpans(p.left.text, p.right.text);\n emphasisOf.set(p.left, spans ? spans.old : null);\n emphasisOf.set(p.right, spans ? spans.new : null);\n }\n }\n hunk.lines.forEach((line, i) => {\n const key = `h${h}l${i}`;\n unified.push({ kind: 'line', key, line, anchor: anchorFor(line, key), emphasis: emphasisOf.get(line) ?? null });\n });\n pairs.forEach((p, i) => {\n const key = `h${h}p${i}`;\n const anchorLine = p.right ?? p.left!;\n split.push({\n kind: 'pair',\n key,\n left: p.left,\n right: p.right,\n anchor: anchorFor(anchorLine, key),\n leftEmphasis: p.left ? emphasisOf.get(p.left) ?? null : null,\n rightEmphasis: p.right ? emphasisOf.get(p.right) ?? null : null,\n });\n });\n });\n return { unified, split, notice: file.unparsedNotice, status: file.status };\n}\n\nfunction formatBytes(n: number): string {\n if (n >= 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n return `${Math.round(n / 1024)} KB`;\n}\n\nexport function PatchView({ path, text, truncated, totalBytes, layout, comments, onAddComment, onRemoveComment }: PatchViewProps) {\n const lang = languageForPath(path);\n const built = useMemo(() => buildRows(text), [text]);\n const [showAll, setShowAll] = useState(false);\n const [active, setActive] = useState(0);\n const [editing, setEditing] = useState<Anchor | null>(null);\n const gridRef = useRef<HTMLTableElement>(null);\n const idBase = useId();\n\n const rows = layout === 'split' ? built.split : built.unified;\n const limited = !showAll && rows.length > ROW_LIMIT;\n const visible = limited ? rows.slice(0, ROW_LIMIT) : rows;\n /** Indexes (into `visible`) of commentable rows — what the arrow keys walk. */\n const lineIndexes = useMemo(() => visible.flatMap((r, i) => (r.kind === 'hunk' ? [] : [i])), [visible]);\n\n useEffect(() => {\n setActive(0);\n setEditing(null);\n setShowAll(false);\n }, [text, layout]);\n\n const activeRowIndex = lineIndexes[Math.min(active, Math.max(0, lineIndexes.length - 1))] ?? -1;\n const activeRow = activeRowIndex >= 0 ? visible[activeRowIndex] : undefined;\n const activeAnchor = activeRow && activeRow.kind !== 'hunk' ? activeRow.anchor : null;\n const cellId = (key: string) => `${idBase}-${key}`;\n\n useEffect(() => {\n if (activeAnchor === null) return;\n const el = document.getElementById(cellId(activeAnchor.key));\n el?.scrollIntoView?.({ block: 'nearest' });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeAnchor?.key]);\n\n const onKey = (e: ReactKeyboardEvent<HTMLTableElement>) => {\n if (e.target !== e.currentTarget) return;\n const last = lineIndexes.length - 1;\n const go = (n: number) => {\n e.preventDefault();\n setActive(Math.max(0, Math.min(last, n)));\n };\n switch (e.key) {\n case 'ArrowDown': go(active + 1); break;\n case 'ArrowUp': go(active - 1); break;\n case 'PageDown': go(active + PAGE); break;\n case 'PageUp': go(active - PAGE); break;\n case 'Home': go(0); break;\n case 'End': go(last); break;\n case 'Enter':\n if (activeAnchor) {\n e.preventDefault();\n setEditing(activeAnchor);\n }\n break;\n default:\n break;\n }\n };\n\n const commentsAt = (anchor: Anchor) => comments.filter((c) => c.line === anchor.line && c.side === anchor.side);\n const startComment = (anchor: Anchor, rowIndex: number) => {\n const at = lineIndexes.indexOf(rowIndex);\n if (at >= 0) setActive(at);\n setEditing(anchor);\n };\n const closeEditor = () => {\n setEditing(null);\n gridRef.current?.focus();\n };\n\n if (built.notice && rows.length === 0) {\n return <p className={styles.patchNotice}>{/binary/i.test(built.notice) ? 'Binary file — no lines to show.' : built.notice}</p>;\n }\n if (rows.length === 0) {\n return (\n <p className={styles.patchNotice}>\n {built.status === 'renamed' ? 'Renamed with no content changes.' : 'No line changes (a mode or permission change).'}\n </p>\n );\n }\n\n // Both layouts are five columns: two numbers + gutter + marker + code, or number + half + gutter + number + half.\n const colSpan = 5;\n return (\n <div className={styles.patch}>\n {truncated ? (\n <p className={styles.truncated} role=\"note\">\n Showing the first 256 KB{totalBytes ? ` of ${formatBytes(totalBytes)}` : ''}. Open the file in your editor for the rest.\n </p>\n ) : null}\n <table\n ref={gridRef}\n role=\"grid\"\n className={styles.grid}\n data-layout={layout}\n tabIndex={0}\n aria-label={`Changes in ${path}. Arrow keys move between lines; Enter adds a comment.`}\n aria-activedescendant={activeAnchor ? cellId(activeAnchor.key) : undefined}\n aria-rowcount={visible.length}\n onKeyDown={onKey}\n >\n <tbody>\n {visible.map((row, index) => {\n if (row.kind === 'hunk') {\n return (\n <tr key={row.key} className={styles.hunkRow}>\n <td colSpan={colSpan} className={styles.hunkCell} role=\"gridcell\">\n {row.label}\n </td>\n </tr>\n );\n }\n const isActive = index === activeRowIndex;\n // A split row shows two lines; a comment made on either side (in\n // either layout) belongs under it.\n const thread = row.kind === 'pair' && row.left && row.left.kind === 'del' && row.right\n ? [...commentsAt(row.anchor), ...commentsAt(anchorFor(row.left, row.key))]\n : commentsAt(row.anchor);\n const isEditing = editing?.key === row.anchor.key;\n return (\n <FragmentRows key={row.key}>\n {row.kind === 'line' ? (\n <tr className={styles.lineRow} data-kind={row.line.kind} data-active={isActive ? 'true' : undefined}>\n <td className={styles.no} aria-hidden=\"true\">{row.line.oldLineNo ?? ''}</td>\n <td className={styles.no} aria-hidden=\"true\">{row.line.newLineNo ?? ''}</td>\n <td className={styles.gutter}>\n <AddButton onClick={() => startComment(row.anchor, index)} line={row.anchor.line} />\n </td>\n <td className={styles.marker} aria-hidden=\"true\">\n {row.line.kind === 'add' ? '+' : row.line.kind === 'del' ? '−' : ''}\n </td>\n <td id={cellId(row.key)} role=\"gridcell\" className={styles.code} aria-label={lineLabel(row.line)}>\n <Code text={row.line.text} lang={lang} emphasis={row.emphasis} kind={row.line.kind} />\n </td>\n </tr>\n ) : (\n <tr className={styles.lineRow} data-kind=\"pair\" data-active={isActive ? 'true' : undefined}>\n <td className={styles.no} aria-hidden=\"true\">{row.left?.oldLineNo ?? ''}</td>\n <td className={styles.half} data-kind={row.left?.kind ?? 'empty'}>\n {row.left ? <Code text={row.left.text} lang={lang} emphasis={row.leftEmphasis} kind={row.left.kind} /> : null}\n </td>\n <td className={styles.gutter}>\n <AddButton onClick={() => startComment(row.anchor, index)} line={row.anchor.line} />\n </td>\n <td className={styles.no} aria-hidden=\"true\">{row.right?.newLineNo ?? ''}</td>\n <td\n id={cellId(row.key)}\n role=\"gridcell\"\n className={styles.half}\n data-kind={row.right?.kind ?? 'empty'}\n aria-label={[row.left ? lineLabel(row.left) : null, row.right && row.right !== row.left ? lineLabel(row.right) : null].filter(Boolean).join('; ')}\n >\n {row.right ? <Code text={row.right.text} lang={lang} emphasis={row.rightEmphasis} kind={row.right.kind} /> : null}\n </td>\n </tr>\n )}\n {thread.length > 0 || isEditing ? (\n <tr className={styles.threadRow}>\n <td colSpan={colSpan} role=\"gridcell\">\n {thread.map((c) => (\n <div key={c.id} className={styles.comment}>\n <span className={styles.commentWhere}>\n {c.side === 'old' ? 'Removed line' : 'Line'} {c.line}\n </span>\n <p className={styles.commentText}>{c.note}</p>\n <button type=\"button\" className={styles.commentRemove} onClick={() => onRemoveComment(c.id)} aria-label={`Remove the comment on line ${c.line}`}>\n Remove\n </button>\n </div>\n ))}\n {isEditing ? (\n <CommentEditor\n anchor={row.anchor}\n onCancel={closeEditor}\n onSave={(note) => {\n onAddComment({ path, line: row.anchor.line, side: row.anchor.side, note });\n closeEditor();\n }}\n />\n ) : null}\n </td>\n </tr>\n ) : null}\n </FragmentRows>\n );\n })}\n </tbody>\n </table>\n {limited ? (\n <button type=\"button\" className={styles.showAll} onClick={() => setShowAll(true)}>\n Show all {formatCount(rows.length)} lines\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction FragmentRows({ children }: { children: ReactNode }) {\n return <>{children}</>;\n}\n\nfunction lineLabel(line: DiffLine): string {\n const n = line.kind === 'del' ? line.oldLineNo : line.newLineNo;\n const what = line.kind === 'add' ? 'added' : line.kind === 'del' ? 'removed' : 'unchanged';\n return `Line ${n ?? '—'}, ${what}: ${line.text}`;\n}\n\nfunction AddButton({ onClick, line }: { onClick: () => void; line: number }) {\n return (\n <button type=\"button\" className={styles.gutterAdd} tabIndex={-1} onClick={onClick} aria-label={`Add a comment on line ${line}`}\n title={`Add a comment on line ${line}`}>\n +\n </button>\n );\n}\n\nfunction Code({ text, lang, emphasis, kind }: { text: string; lang: LangFamily; emphasis: [number, number] | null; kind: DiffLine['kind'] }) {\n const tokens = tokenizeLine(text, lang);\n if (!emphasis || kind === 'context') {\n return (\n <code className={styles.codeText}>\n {tokens.map((t, i) => (\n <span key={i} className={styles[`tok_${t.kind}`]}>{t.text}</span>\n ))}\n </code>\n );\n }\n // Split tokens at the emphasis boundaries so highlighting and emphasis compose.\n const [from, to] = emphasis;\n const parts: Array<{ text: string; kind: string; em: boolean }> = [];\n let at = 0;\n for (const t of tokens) {\n const start = at;\n const end = at + t.text.length;\n const cuts = [start, Math.max(start, Math.min(end, from)), Math.max(start, Math.min(end, to)), end];\n for (let c = 0; c < 3; c++) {\n const a = cuts[c]!;\n const b = cuts[c + 1]!;\n if (b > a) parts.push({ text: text.slice(a, b), kind: t.kind, em: c === 1 });\n }\n at = end;\n }\n return (\n <code className={styles.codeText}>\n {parts.map((p, i) => (\n <span key={i} className={`${styles[`tok_${p.kind}`] ?? ''} ${p.em ? styles.em : ''}`}>{p.text}</span>\n ))}\n </code>\n );\n}\n\nfunction CommentEditor({ anchor, onSave, onCancel }: { anchor: Anchor; onSave: (note: string) => void; onCancel: () => void }) {\n const [note, setNote] = useState('');\n const ref = useRef<HTMLTextAreaElement>(null);\n const id = useId();\n useEffect(() => {\n ref.current?.focus();\n }, []);\n const save = () => {\n if (note.trim()) onSave(note.trim());\n };\n return (\n <div className={styles.editor}>\n <label htmlFor={id} className={styles.editorLabel}>\n Comment on {anchor.side === 'old' ? 'removed line' : 'line'} {anchor.line}\n </label>\n <textarea\n id={id}\n ref={ref}\n className={styles.editorInput}\n rows={2}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n save();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n onCancel();\n }\n }}\n placeholder=\"What should change here?\"\n maxLength={4_000}\n />\n <div className={styles.editorActions}>\n <span className={styles.editorHint}>⌘Enter saves · Esc cancels</span>\n <button type=\"button\" className={styles.linkButton} onClick={onCancel}>\n Cancel\n </button>\n <button type=\"button\" className={styles.saveButton} onClick={save} disabled={!note.trim()}>\n Save comment\n </button>\n </div>\n </div>\n );\n}\n","/**\n * routes/verse/git/DiffPane.tsx — the dock's Review pane (unit C5; SPEC-310C\n * §3 \"Diff/Review\"). Mounted by C2 through the `diff-pane` slot with exactly\n * DiffPaneProps.\n *\n * [repo ▾] [This turn | Uncommitted | Branch] [Unified|Split] ⟳\n * 12 files · +340 −20 against main\n * ┌ file list (M/A/D/R/U + ± per file) ┐\n * └ patch of the selected file (lazy, ≤ 256 KB) with \"+\" line comments ┘\n * 2 comments [Add to message]\n *\n * SCOPES\n * This turn the files the chat's latest turn touched (C2 derives them\n * from events), shown with their CURRENT uncommitted diff; a\n * file the turn touched that has since been committed is listed\n * as such rather than silently dropped.\n * Uncommitted working tree against HEAD, untracked files included.\n * Branch everything the branch would ship against its base.\n *\n * PATCHES LOAD LAZILY: the list is one request; a patch is fetched when its\n * file is selected, cached for the life of the listing, and capped by the\n * server at 256 KB. Nothing is fetched while the pane is a background tab\n * (`visible` false) — it catches up when shown.\n *\n * COMMENTS are drafts held here, per file, until \"Add to message\" hands them\n * to the composer as `path:line: note` lines (C2's onAddToMessage; ⌘Enter in\n * the composer sends). They survive switching files and scopes, not a reload.\n *\n * KEYBOARD: the scope and layout switches are radio groups (← →); the file\n * list is a listbox (↑ ↓ Home End select and load); the patch is a grid (see\n * PatchView). Tab moves between those four stops.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { Button, IconButton } from '../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport { Segmented } from '../../../components/primitives/Segmented.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { IconRefresh } from '../../../components/primitives/icons.js';\nimport type { VerseGitDiffFile, VerseGitDiffScope, VerseReviewScope } from '../../../data/api-types.js';\nimport type { DiffPaneProps } from '../shell/slots.js';\nimport {\n FILE_STATUS_WORD,\n commentsToMessage,\n describeGitError,\n diffstatLabel,\n formatCount,\n groupFiles,\n type ReviewComment,\n} from './git-model.js';\nimport { fetchGitDiff, isRootUnavailable, type GitDiffView } from './git-queries.js';\nimport { PatchView, type PatchLayout } from './PatchView.js';\nimport chrome from '../dock/pane-chrome.module.css';\nimport styles from './DiffPane.module.css';\n\nexport interface DiffPaneTestProps {\n /** Test seam for the diff reads. */\n fetchDiff?: typeof fetchGitDiff;\n}\n\n/** Below this pane width the split layout is offered but unified is the default. */\nconst SPLIT_MIN_WIDTH = 640;\n\ntype ListState =\n | { state: 'idle' }\n | { state: 'loading' }\n | { state: 'ready'; data: GitDiffView; key: string }\n | { state: 'not-a-repo' }\n | { state: 'error'; message: string };\n\ntype PatchState =\n | { state: 'idle' }\n | { state: 'loading' }\n | { state: 'ready'; text: string; truncated: boolean; totalBytes: number | null }\n | { state: 'error'; message: string };\n\n/** One row of the file list: a real change, or a turn file that is no longer uncommitted. */\ninterface ListEntry {\n file: VerseGitDiffFile;\n /** \"This turn\" only: the turn touched it, but it has no uncommitted change now. */\n settled: boolean;\n}\n\nfunction rootName(root: string): string {\n const parts = root.replace(/[\\\\/]+$/, '').split(/[\\\\/]/);\n return parts[parts.length - 1] || root;\n}\n\nfunction serverScope(scope: VerseReviewScope): VerseGitDiffScope {\n return scope === 'branch' ? 'branch' : 'working';\n}\n\nexport function DiffPane({ roots, request, turnFiles, onAddToMessage, visible, fetchDiff = fetchGitDiff }: DiffPaneProps & DiffPaneTestProps) {\n const [root, setRoot] = useState<string | null>(roots[0] ?? null);\n const [scope, setScope] = useState<VerseReviewScope>('working');\n const [file, setFile] = useState<string | null>(null);\n const [layout, setLayout] = useState<PatchLayout>('unified');\n const [rawList, setList] = useState<ListState>({ state: 'idle' });\n const [patch, setPatch] = useState<PatchState>({ state: 'idle' });\n const [comments, setComments] = useState<ReviewComment[]>([]);\n const [announce, setAnnounce] = useState('');\n const [reloadKey, setReloadKey] = useState(0);\n const [wide, setWide] = useState(true);\n const paneRef = useRef<HTMLDivElement>(null);\n const patchCache = useRef(new Map<string, PatchState & { state: 'ready' }>());\n const listRef = useRef<HTMLUListElement>(null);\n const nextCommentId = useRef(1);\n const handledNonce = useRef<number | null>(null);\n const listId = useId();\n const rootId = useId();\n\n // Keep the chosen root valid as the chat's roots change.\n useEffect(() => {\n if (root === null || !roots.includes(root)) setRoot(roots[0] ?? null);\n }, [roots, root]);\n\n // An open request from the bar's ± counts, the dock command, or a transcript link.\n useEffect(() => {\n if (!request || handledNonce.current === request.nonce) return;\n handledNonce.current = request.nonce;\n setRoot(request.root);\n setScope(request.scope);\n setFile(request.file ?? null);\n }, [request]);\n\n // The pane's own width (it lives in a resizable dock), for the split default.\n useEffect(() => {\n const el = paneRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width ?? 0;\n setWide(w >= SPLIT_MIN_WIDTH);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n // ---- the file list ------------------------------------------------------\n useEffect(() => {\n if (!visible || root === null) return;\n const controller = new AbortController();\n const key = `${root}\\0${serverScope(scope)}`;\n patchCache.current.clear();\n // A refresh of the SAME listing keeps showing it while it reloads; a new\n // root or scope must not show the previous one's files under its name.\n setList((prev) => (prev.state === 'ready' && prev.key === key ? prev : { state: 'loading' }));\n fetchDiff(root, serverScope(scope), null, controller.signal)\n .then((data) => {\n if (!controller.signal.aborted) setList({ state: 'ready', data, key });\n })\n .catch((err: unknown) => {\n if (controller.signal.aborted) return;\n if (isRootUnavailable(err)) setList({ state: 'not-a-repo' });\n else {\n console.warn('[verse] review list failed', err);\n setList({ state: 'error', message: describeGitError(err) });\n }\n });\n return () => controller.abort();\n }, [root, scope, visible, reloadKey, fetchDiff]);\n\n // The listing as it applies to what is on screen NOW: in the render right\n // after a root or scope switch, the previous listing is still in state and\n // must read as loading, or the selection and patch effects would act on it.\n const currentKey = root === null ? '' : `${root}\\0${serverScope(scope)}`;\n const list: ListState = useMemo(\n () => (rawList.state === 'ready' && rawList.key !== currentKey ? { state: 'loading' } : rawList),\n [rawList, currentKey],\n );\n\n const entries: ListEntry[] = useMemo(() => {\n if (list.state !== 'ready') return [];\n if (scope !== 'turn') return list.data.files.map((f) => ({ file: f, settled: false }));\n const touched = turnFiles.filter((t) => t.root === root).map((t) => t.path);\n const byPath = new Map(list.data.files.map((f) => [f.path, f]));\n return [...new Set(touched)].map((path) => {\n const change = byPath.get(path);\n return change\n ? { file: change, settled: false }\n : { file: { path, oldPath: null, status: 'M' as const, additions: 0, deletions: 0, binary: false }, settled: true };\n });\n }, [list, scope, turnFiles, root]);\n\n // Grouped exactly as the list draws them, so ↑/↓ and \"the first file\" follow what is on screen.\n const groups = useMemo(() => groupFiles(entries.map((e) => e.file)), [entries]);\n const selectable = useMemo(() => {\n const byPath = new Map(entries.map((e) => [e.file.path, e]));\n return groups.flatMap((g) => g.files.map((f) => byPath.get(f.path)!)).filter((e) => !e.settled);\n }, [groups, entries]);\n\n // Keep a valid selection: the requested file, else the first change.\n useEffect(() => {\n if (list.state !== 'ready') return;\n if (file !== null && selectable.some((e) => e.file.path === file)) return;\n setFile(selectable[0]?.file.path ?? null);\n }, [list, selectable, file]);\n\n // ---- the selected file's patch -------------------------------------------\n useEffect(() => {\n if (!visible || root === null || file === null || list.state !== 'ready') {\n setPatch({ state: 'idle' });\n return;\n }\n const entry = selectable.find((e) => e.file.path === file);\n if (!entry) return;\n const key = `${serverScope(scope)}\\0${file}`;\n const hit = patchCache.current.get(key);\n if (hit) {\n setPatch(hit);\n return;\n }\n if (entry.file.binary) {\n setPatch({ state: 'ready', text: '', truncated: false, totalBytes: null });\n return;\n }\n const controller = new AbortController();\n setPatch({ state: 'loading' });\n fetchDiff(root, serverScope(scope), file, controller.signal)\n .then((data) => {\n if (controller.signal.aborted) return;\n const ready = { state: 'ready' as const, text: data.patch?.text ?? '', truncated: data.patch?.truncated ?? false, totalBytes: data.patchBytes ?? null };\n patchCache.current.set(key, ready);\n setPatch(ready);\n })\n .catch((err: unknown) => {\n if (controller.signal.aborted) return;\n console.warn('[verse] review patch failed', err);\n setPatch({ state: 'error', message: describeGitError(err) });\n });\n return () => controller.abort();\n }, [root, scope, file, visible, list, selectable, fetchDiff]);\n\n // ---- comments ------------------------------------------------------------\n const addComment = useCallback((c: Omit<ReviewComment, 'id'>) => {\n setComments((prev) => [...prev, { ...c, id: `c${nextCommentId.current++}` }]);\n setAnnounce(`Comment added on line ${c.line}.`);\n }, []);\n const removeComment = useCallback((id: string) => {\n setComments((prev) => prev.filter((c) => c.id !== id));\n setAnnounce('Comment removed.');\n }, []);\n const sendComments = () => {\n if (comments.length === 0) return;\n onAddToMessage(commentsToMessage(comments));\n setAnnounce(`Added ${comments.length} ${comments.length === 1 ? 'comment' : 'comments'} to the message.`);\n setComments([]);\n };\n\n // ---- file list keyboard (listbox) -----------------------------------------\n const onListKey = (e: ReactKeyboardEvent<HTMLUListElement>) => {\n if (selectable.length === 0) return;\n const at = selectable.findIndex((x) => x.file.path === file);\n let next = at;\n if (e.key === 'ArrowDown') next = Math.min(selectable.length - 1, at + 1);\n else if (e.key === 'ArrowUp') next = Math.max(0, at - 1);\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = selectable.length - 1;\n else return;\n e.preventDefault();\n const path = selectable[next]!.file.path;\n setFile(path);\n const escaped = typeof CSS !== 'undefined' && typeof CSS.escape === 'function' ? CSS.escape(path) : path.replace(/[\"\\\\]/g, '\\\\$&');\n listRef.current?.querySelector<HTMLElement>(`[data-path=\"${escaped}\"]`)?.scrollIntoView?.({ block: 'nearest' });\n };\n\n // ---- render --------------------------------------------------------------\n const turnCount = turnFiles.filter((t) => t.root === root).length;\n const scopeOptions = [\n { value: 'turn' as const, label: 'This turn', disabled: turnCount === 0 },\n { value: 'working' as const, label: 'Uncommitted' },\n { value: 'branch' as const, label: 'Branch' },\n ];\n const layoutOptions = [\n { value: 'unified' as const, label: 'Unified' },\n { value: 'split' as const, label: 'Split' },\n ];\n const effectiveLayout: PatchLayout = layout === 'split' && !wide ? 'unified' : layout;\n const totals = entries.reduce(\n (acc, e) => (e.settled ? acc : { files: acc.files + 1, additions: acc.additions + e.file.additions, deletions: acc.deletions + e.file.deletions }),\n { files: 0, additions: 0, deletions: 0 },\n );\n const base = list.state === 'ready' ? list.data.base : null;\n const fileComments = comments.filter((c) => c.path === file);\n const refresh = () => setReloadKey((n) => n + 1);\n\n if (roots.length === 0 || root === null) {\n return (\n <div className={styles.pane} ref={paneRef}>\n <EmptyState compact title=\"No folder to review\"\n body=\"This chat has no project folder. Start a chat in a project to review the changes it makes.\" />\n </div>\n );\n }\n\n return (\n <div className={styles.pane} ref={paneRef} data-wide={wide ? 'true' : 'false'}>\n <header className={`${chrome.header} ${styles.head}`}>\n {roots.length > 1 ? (\n <label className={styles.rootPick}>\n <span className={styles.visuallyHidden}>Repository</span>\n <select id={rootId} value={root} onChange={(e) => { setRoot(e.target.value); setFile(null); }} className={styles.select} title={root}>\n {roots.map((r) => (\n <option key={r} value={r}>{rootName(r)}</option>\n ))}\n </select>\n </label>\n ) : (\n <span className={`${chrome.title} ${styles.rootName}`} title={root}>{rootName(root)}</span>\n )}\n <Segmented\n aria-label=\"What to review\"\n size=\"sm\"\n options={scopeOptions}\n value={scope}\n onChange={(next) => { setScope(next); setFile(null); }}\n />\n <div className={chrome.actions}>\n <Segmented\n aria-label=\"Diff layout\"\n size=\"sm\"\n options={layoutOptions.map((o) => (o.value === 'split' && !wide ? { ...o, disabled: true } : o))}\n value={effectiveLayout}\n onChange={setLayout}\n />\n {/* The same ghost sm icon button the Terminal and Preview headers use. */}\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconRefresh />} aria-label=\"Refresh changes\" title=\"Refresh changes\" onClick={refresh} />\n </div>\n </header>\n\n <p className={styles.summary}>\n {list.state === 'ready' ? (\n totals.files === 0 ? (\n <span>{emptySentence(scope, base)}</span>\n ) : (\n <span aria-label={diffstatLabel(totals.files, totals.additions, totals.deletions)}>\n {formatCount(totals.files)} {totals.files === 1 ? 'file' : 'files'} · <span className={styles.add}>+{formatCount(totals.additions)}</span>{' '}\n <span className={styles.del}>{'\\u2212'}{formatCount(totals.deletions)}</span>\n {scope === 'branch' && base ? <> against <code className={styles.ref}>{base}</code></> : null}\n {scope === 'working' ? ' uncommitted' : null}\n </span>\n )\n ) : list.state === 'loading' || list.state === 'idle' ? (\n <span className={styles.muted}>Reading changes…</span>\n ) : null}\n </p>\n\n {list.state === 'not-a-repo' ? (\n <EmptyState compact title=\"Not a git repository\"\n body={`${rootName(root)} is not tracked by git, so there is nothing to review. Run git init in the terminal to start tracking it.`} />\n ) : list.state === 'error' ? (\n <EmptyState compact tone=\"error\" title=\"Could not read the changes\" body={list.message}\n action={<Button size=\"sm\" variant=\"subtle\" onClick={refresh}>Try again</Button>} />\n ) : list.state !== 'ready' ? (\n <div className={styles.skeleton} aria-hidden=\"true\">\n <SkeletonLine />\n <SkeletonLine />\n <SkeletonLine />\n </div>\n ) : entries.length === 0 ? (\n // The summary line above states the fact; this says where to look next.\n <p className={styles.patchNotice}>{emptyNextStep(scope)}</p>\n ) : (\n <div className={styles.body}>\n <nav className={styles.files} aria-label=\"Changed files\">\n <ul\n ref={listRef}\n id={listId}\n role=\"listbox\"\n aria-label=\"Changed files\"\n className={styles.fileList}\n tabIndex={0}\n aria-activedescendant={file ? `${listId}-${encodeURIComponent(file)}` : undefined}\n onKeyDown={onListKey}\n >\n {groups.map((group) => (\n <li key={group.dir || '.'} role=\"presentation\" className={styles.group}>\n {/* RTL truncation keeps the tail of a long path visible; the LRM keeps\n the trailing slash from being reordered to the front. */}\n {group.dir ? <span className={styles.dir} role=\"presentation\" title={`${group.dir}/`}>{group.dir}/{'\\u200E'}</span> : null}\n <ul role=\"presentation\" className={styles.groupFiles}>\n {group.files.map((f) => {\n const settled = entries.find((e) => e.file.path === f.path)?.settled ?? false;\n const selected = f.path === file;\n const count = comments.filter((c) => c.path === f.path).length;\n return (\n <li\n key={f.path}\n id={`${listId}-${encodeURIComponent(f.path)}`}\n data-path={f.path}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={settled || undefined}\n className={styles.file}\n data-status={f.status}\n onClick={() => { if (!settled) setFile(f.path); }}\n title={f.oldPath ? `${f.oldPath} → ${f.path}` : f.path}\n >\n <span className={styles.fileStatus} aria-label={FILE_STATUS_WORD[f.status]}>{f.status}</span>\n <span className={styles.fileName}>{f.name}</span>\n {count > 0 ? <span className={styles.fileComments} aria-label={`${count} ${count === 1 ? 'comment' : 'comments'}`}>{count}</span> : null}\n {settled ? (\n <span className={styles.fileSettled}>committed</span>\n ) : f.binary ? (\n <span className={styles.fileCounts}>binary</span>\n ) : (\n <span className={styles.fileCounts}>\n <span className={styles.add}>+{formatCount(f.additions)}</span> <span className={styles.del}>{'−'}{formatCount(f.deletions)}</span>\n </span>\n )}\n </li>\n );\n })}\n </ul>\n </li>\n ))}\n </ul>\n </nav>\n\n <section className={styles.patchArea} aria-label={file ? `Patch for ${file}` : 'Patch'}>\n {file === null ? (\n <p className={styles.patchNotice}>Choose a file in the list to see its changes.</p>\n ) : patch.state === 'loading' || patch.state === 'idle' ? (\n <div className={styles.skeleton} aria-hidden=\"true\">\n <SkeletonLine />\n <SkeletonLine />\n </div>\n ) : patch.state === 'error' ? (\n <div className={styles.patchError} role=\"alert\">\n <p>{patch.message}</p>\n <Button size=\"sm\" variant=\"subtle\" onClick={refresh}>Try again</Button>\n </div>\n ) : (\n <>\n <h3 className={styles.patchPath} title={file}>{file}</h3>\n {selectable.find((e) => e.file.path === file)?.file.binary ? (\n <p className={styles.patchNotice}>Binary file — no lines to show.</p>\n ) : (\n <PatchView\n path={file}\n text={patch.text}\n truncated={patch.truncated}\n totalBytes={patch.totalBytes}\n layout={effectiveLayout}\n comments={fileComments}\n onAddComment={addComment}\n onRemoveComment={removeComment}\n />\n )}\n </>\n )}\n </section>\n </div>\n )}\n\n {comments.length > 0 ? (\n <footer className={styles.foot}>\n <span className={styles.footCount}>\n {comments.length} {comments.length === 1 ? 'comment' : 'comments'}\n {new Set(comments.map((c) => c.path)).size > 1 ? ` in ${new Set(comments.map((c) => c.path)).size} files` : ''}\n </span>\n <button type=\"button\" className={styles.linkButton} onClick={() => { setComments([]); setAnnounce('Comments discarded.'); }}>\n Discard\n </button>\n <button type=\"button\" className={styles.saveButton} onClick={sendComments}>\n Add to message\n </button>\n </footer>\n ) : null}\n <p className={styles.visuallyHidden} role=\"status\" aria-live=\"polite\">{announce}</p>\n </div>\n );\n}\n\n/** What to do about an empty scope: the next place to look, never a dead end. */\nfunction emptyNextStep(scope: VerseReviewScope): string {\n if (scope === 'turn') return 'Switch to Uncommitted or Branch to see the rest of the changes.';\n if (scope === 'working') return 'Edits the chat makes show up here as they land. Branch shows what is already committed.';\n return 'Commits on this branch show up here. Uncommitted shows edits that are not committed yet.';\n}\n\nfunction emptySentence(scope: VerseReviewScope, base: string | null): string {\n if (scope === 'turn') return 'The latest turn changed no files here.';\n if (scope === 'working') return 'No uncommitted changes.';\n return base ? `This branch has no changes against ${base}.` : 'No changes on this branch.';\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DiffPane-Ix6hvXlY.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/git/DiffPane.module.css","../../../../../../src/web-ui/routes/verse/git/PatchView.tsx","../../../../../../src/web-ui/routes/verse/git/DiffPane.tsx"],"sourcesContent":["/*\n * Review pane (SPEC-310C §3). Lives in the dock: 320px to 60% of the window,\n * a sheet below 1024, a bottom sheet below 480 — so the layout answers the\n * PANE's width (a container query), not the window's. Narrow: file list over\n * patch. At 720px+ of pane: list beside patch.\n *\n * Diff tints are the diff's own mixes over --bg-code (as in chat.module.css),\n * and the +/− marker column carries the meaning, never colour alone.\n */\n.pane {\n container-type: inline-size;\n display: flex;\n flex-direction: column;\n min-width: 0;\n height: 100%;\n min-height: 0;\n background: var(--bg-canvas);\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n /* Same row tints as the transcript's DiffBlock (chat.module.css), so a\n change looks the same in the chat and in Review; the emphasis mix marks\n the changed span inside a line (git-contrast.test.ts holds text on all four). */\n --diff-add: color-mix(in srgb, var(--status-success-solid) 22%, var(--bg-code));\n --diff-del: color-mix(in srgb, var(--status-danger-solid) 22%, var(--bg-code));\n --diff-add-em: color-mix(in srgb, var(--status-success-solid) 36%, var(--bg-code));\n --diff-del-em: color-mix(in srgb, var(--status-danger-solid) 36%, var(--bg-code));\n}\n\n/* ---- header -------------------------------------------------------------- */\n\n/* Height, padding, border and surface come from ../dock/pane-chrome.module.css\n (the row every dock pane shares); Review only wraps it at narrow widths. */\n.head { flex-wrap: wrap; }\n/* Scoped under .head so it outranks the shared title's size and colour. */\n.head .rootName {\n max-width: 16ch;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.rootPick { display: inline-flex; min-width: 0; }\n.select {\n min-height: var(--control-h-sm);\n max-width: 16ch;\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n}\n.select:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.summary {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-variant-numeric: tabular-nums;\n}\n.summary:empty { display: none; }\n.muted { color: var(--text-tertiary); }\n.add { color: var(--status-success-fg); }\n.del { color: var(--status-danger-fg); }\n.ref {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n padding: 0 var(--space-1);\n border-radius: var(--radius-xs);\n background: var(--bg-code);\n color: var(--text-primary);\n}\n\n.skeleton {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-3);\n}\n\n/* ---- body: list over patch, or beside it --------------------------------- */\n\n.body {\n flex: 1 1 auto;\n min-height: 0;\n display: grid;\n /* Stacked: the list takes what it needs, up to a cap, and the patch the rest. */\n grid-template-rows: auto minmax(0, 1fr);\n overflow: hidden;\n}\n\n.files {\n min-height: 0;\n max-height: min(34vh, 14rem);\n overflow: auto;\n border-bottom: 1px solid var(--border-subtle);\n}\n/* Side by side once the PANE is wide enough. Declared after .files so it wins. */\n@container (min-width: 720px) {\n .body {\n grid-template-rows: none;\n grid-template-columns: minmax(12rem, 30%) minmax(0, 1fr);\n }\n .files { border-bottom: 0; border-right: 1px solid var(--border-subtle); max-height: none; }\n}\n\n.fileList {\n list-style: none;\n margin: 0;\n padding: var(--space-1) 0;\n}\n.fileList:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--border-focus); }\n.group { display: block; }\n.groupFiles { list-style: none; margin: 0; padding: 0; }\n.dir {\n display: block;\n padding: var(--space-2) var(--space-3) var(--space-1);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n direction: rtl;\n text-align: left;\n}\n.file {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n min-height: var(--control-h-xs);\n padding: 0 var(--space-3) 0 var(--space-4);\n cursor: pointer;\n border-left: 2px solid transparent;\n}\n.file:hover { background: var(--bg-hover); }\n.file[aria-selected='true'] { background: var(--bg-selected); border-left-color: var(--accent-600); }\n.file[aria-disabled='true'] { cursor: default; color: var(--text-tertiary); }\n.fileStatus {\n flex: none;\n width: 1.4em;\n text-align: center;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-secondary);\n}\n.file[data-status='A'] .fileStatus { color: var(--status-success-fg); }\n.file[data-status='D'] .fileStatus { color: var(--status-danger-fg); }\n.file[data-status='U'] .fileStatus { color: var(--status-warning-fg); }\n.fileName {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n.fileCounts,\n.fileSettled {\n flex: none;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n font-variant-numeric: tabular-nums;\n color: var(--text-tertiary);\n}\n.fileComments {\n flex: none;\n min-width: 1.5em;\n padding: 0 var(--space-1);\n border-radius: var(--radius-full);\n background: var(--accent-100);\n color: var(--accent-700);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n text-align: center;\n}\n\n.patchArea {\n min-height: 0;\n min-width: 0;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n.patchPath {\n position: sticky;\n top: 0;\n z-index: 1;\n margin: 0;\n padding: var(--space-2) var(--space-3);\n background: var(--bg-canvas);\n border-bottom: 1px solid var(--border-subtle);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-weight: var(--font-weight-medium);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n direction: rtl;\n text-align: left;\n}\n.patchNotice,\n.patchError {\n margin: 0;\n padding: var(--space-4) var(--space-3);\n color: var(--text-secondary);\n}\n.patchError {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--space-2);\n color: var(--status-danger-fg);\n}\n.patchError > p { margin: 0; }\n.truncated {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n font-size: var(--text-xs-size);\n}\n\n/* ---- the patch grid ------------------------------------------------------ */\n\n.patch { min-width: 0; }\n.grid {\n width: 100%;\n border-collapse: collapse;\n table-layout: auto;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n background: var(--bg-code);\n}\n.grid:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--border-focus); }\n\n.hunkRow > td {\n padding: var(--space-1) var(--space-3);\n background: var(--bg-surface);\n color: var(--text-tertiary);\n border-top: 1px solid var(--border-subtle);\n border-bottom: 1px solid var(--border-subtle);\n font-family: var(--font-ui);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n}\n\n.lineRow[data-kind='add'] > td { background: var(--diff-add); }\n.lineRow[data-kind='del'] > td { background: var(--diff-del); }\n.half[data-kind='add'] { background: var(--diff-add); }\n.half[data-kind='del'] { background: var(--diff-del); }\n.half[data-kind='empty'] { background: color-mix(in srgb, var(--text-tertiary) 6%, var(--bg-code)); }\n.lineRow[data-active='true'] > td { box-shadow: inset 0 1px 0 var(--border-focus), inset 0 -1px 0 var(--border-focus); }\n\n.no {\n width: 1%;\n min-width: 3.5ch;\n padding: 0 var(--space-2);\n text-align: right;\n /* Real line numbers, read to find the change in an editor: the body floor\n on the code ground, which --text-tertiary misses in light (chat.module.css). */\n color: var(--text-secondary);\n user-select: none;\n white-space: nowrap;\n vertical-align: top;\n}\n.gutter {\n width: 1.6em;\n padding: 0;\n vertical-align: top;\n text-align: center;\n}\n.marker {\n width: 1.2em;\n padding: 0;\n text-align: center;\n color: var(--text-secondary);\n user-select: none;\n vertical-align: top;\n}\n.code,\n.half {\n padding: 0 var(--space-3) 0 var(--space-1);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n word-break: break-word;\n vertical-align: top;\n color: var(--text-primary);\n}\n.grid[data-layout='split'] .half { width: 50%; }\n.codeText { font-family: inherit; }\n.em { border-radius: 2px; }\n.lineRow[data-kind='add'] .em,\n.half[data-kind='add'] .em { background: var(--diff-add-em); }\n.lineRow[data-kind='del'] .em,\n.half[data-kind='del'] .em { background: var(--diff-del-em); }\n\n/* The gutter \"+\" appears on the hovered or active line (the pointer's GitHub habit). */\n.gutterAdd {\n display: inline-grid;\n place-items: center;\n width: 1.3em;\n height: 1.3em;\n margin-top: 1px;\n padding: 0;\n border: 0;\n border-radius: var(--radius-xs);\n background: var(--accent-600);\n color: var(--text-on-accent);\n font: inherit;\n font-weight: var(--font-weight-bold);\n line-height: 1;\n cursor: pointer;\n opacity: 0;\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n.lineRow:hover .gutterAdd,\n.lineRow[data-active='true'] .gutterAdd,\n.gutterAdd:focus-visible { opacity: 1; }\n\n.tok_plain { color: inherit; }\n/* Secondary, not tertiary: tertiary falls to 3.5:1 on the add tint (git-contrast.test.ts); italics carry \"comment\". */\n.tok_comment { color: var(--text-secondary); font-style: italic; }\n.tok_string { color: var(--status-success-fg); }\n.tok_number { color: var(--status-warning-fg); }\n.tok_keyword { color: var(--accent-700); font-weight: var(--font-weight-medium); }\n\n.showAll {\n margin: var(--space-2) var(--space-3);\n align-self: flex-start;\n border: 0;\n background: transparent;\n color: var(--text-link);\n font: inherit;\n cursor: pointer;\n}\n\n/* ---- comments ------------------------------------------------------------ */\n\n.threadRow > td {\n padding: var(--space-2) var(--space-3);\n background: var(--bg-surface);\n border-top: 1px solid var(--border-subtle);\n border-bottom: 1px solid var(--border-subtle);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n white-space: normal;\n}\n.comment {\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: baseline;\n gap: var(--space-2);\n padding: var(--space-1) 0;\n}\n.commentWhere {\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n text-transform: uppercase;\n letter-spacing: var(--tracking-label);\n color: var(--text-tertiary);\n font-family: var(--font-display);\n}\n.commentText { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--text-primary); }\n.commentRemove,\n.linkButton {\n border: 0;\n background: transparent;\n color: var(--text-link);\n font: inherit;\n font-size: var(--text-xs-size);\n cursor: pointer;\n padding: 0 var(--space-1);\n border-radius: var(--radius-xs);\n}\n.commentRemove:focus-visible,\n.linkButton:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.editor { display: flex; flex-direction: column; gap: var(--space-2); }\n.editorLabel { font-size: var(--text-xs-size); color: var(--text-secondary); font-weight: var(--font-weight-medium); }\n.editorInput {\n width: 100%;\n box-sizing: border-box;\n min-height: calc(var(--text-sm-line) * 2 + var(--space-4));\n padding: var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font: inherit;\n resize: vertical;\n}\n.editorInput:focus-visible { outline: none; border-color: var(--border-focus); box-shadow: var(--shadow-focus-ring); }\n.editorActions { display: flex; align-items: center; gap: var(--space-2); justify-content: flex-end; flex-wrap: wrap; }\n.editorHint { margin-right: auto; font-size: var(--text-xs-size); color: var(--text-tertiary); }\n\n.saveButton {\n min-height: var(--control-h-xs);\n padding: 0 var(--space-3);\n border: 1px solid var(--accent-600);\n border-radius: var(--radius-sm);\n background: var(--accent-600);\n color: var(--text-on-accent);\n font: inherit;\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n cursor: pointer;\n}\n.saveButton:hover { background: var(--accent-700); border-color: var(--accent-700); }\n.saveButton:disabled { opacity: 0.6; cursor: default; }\n.saveButton:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.foot {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding: var(--space-2) var(--space-3);\n border-top: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n.footCount { margin-right: auto; color: var(--text-secondary); font-size: var(--text-sm-size); }\n\n.visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .gutterAdd { transition: none; }\n}\n","/**\n * routes/verse/git/PatchView.tsx — one file's patch in the Review pane,\n * unified or split, with line comments (unit C5; SPEC-310C §3 \"Diff/Review\").\n *\n * Reuses the inbox parser (`parseUnifiedDiff`, `toSplitRows`) and highlighter\n * (`tokenizeLine`) verbatim — the same pieces DiffBlock renders the\n * transcript's inline diffs with — plus `intralineSpans` (chat/line-diff.ts)\n * to emphasise the part of a changed line that changed.\n *\n * KEYBOARD. The patch is ONE tab stop (a grid with an active line, announced\n * through aria-activedescendant — thousands of focusable rows would make Tab\n * useless): ↑ ↓ move a line, PageUp PageDown move twenty, Home End jump,\n * Enter opens a comment on the active line. In the comment box ⌘/Ctrl+Enter\n * saves and Escape cancels, returning focus to the patch. The pointer gets a\n * \"+\" in the gutter of the hovered line, as on GitHub.\n *\n * A patch the server cut at 256 KB says so, and rows past ROW_LIMIT are\n * behind \"Show all\" — every row is DOM.\n */\nimport { useEffect, useId, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from 'react';\nimport { parseUnifiedDiff, toSplitRows, type DiffLine } from '../../inbox/diff-parser.js';\nimport { languageForPath, tokenizeLine, type LangFamily } from '../../inbox/highlight.js';\nimport { intralineSpans } from '../chat/line-diff.js';\nimport { formatCount, type ReviewComment } from './git-model.js';\nimport styles from './DiffPane.module.css';\n\nexport type PatchLayout = 'unified' | 'split';\n\n/** Rows rendered before \"Show all\". */\nexport const ROW_LIMIT = 3_000;\nconst PAGE = 20;\n\nexport interface PatchViewProps {\n path: string;\n text: string;\n truncated: boolean;\n /** Bytes of the whole patch before the cut (for \"showing 256 KB of 1.2 MB\"). */\n totalBytes: number | null;\n layout: PatchLayout;\n comments: readonly ReviewComment[];\n onAddComment: (c: Omit<ReviewComment, 'id'>) => void;\n onRemoveComment: (id: string) => void;\n}\n\n/** One commentable line, in display order. */\ninterface Anchor {\n key: string;\n line: number;\n side: 'new' | 'old';\n}\n\ntype UnifiedRow =\n | { kind: 'hunk'; key: string; label: string }\n | { kind: 'line'; key: string; line: DiffLine; anchor: Anchor; emphasis: [number, number] | null };\n\ntype SplitRowView =\n | { kind: 'hunk'; key: string; label: string }\n | {\n kind: 'pair';\n key: string;\n left: DiffLine | null;\n right: DiffLine | null;\n anchor: Anchor;\n leftEmphasis: [number, number] | null;\n rightEmphasis: [number, number] | null;\n };\n\nfunction anchorFor(line: DiffLine, key: string): Anchor {\n if (line.kind === 'del') return { key, line: line.oldLineNo ?? 0, side: 'old' };\n return { key, line: line.newLineNo ?? line.oldLineNo ?? 0, side: 'new' };\n}\n\nfunction hunkLabel(header: string, index: number): string {\n const section = header.replace(/^@@[^@]*@@/, '').trim();\n const m = /^@@ -(\\d+)(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/.exec(header);\n const where = m ? `line ${m[2]}` : `hunk ${index + 1}`;\n return section ? `${where} · ${section}` : where;\n}\n\nfunction buildRows(text: string): { unified: UnifiedRow[]; split: SplitRowView[]; notice: string | null; status: string } {\n const parsed = parseUnifiedDiff(text);\n const file = parsed.files[0];\n if (!file) return { unified: [], split: [], notice: null, status: 'modified' };\n const unified: UnifiedRow[] = [];\n const split: SplitRowView[] = [];\n file.hunks.forEach((hunk, h) => {\n const label = hunkLabel(hunk.header, h);\n unified.push({ kind: 'hunk', key: `h${h}`, label });\n split.push({ kind: 'hunk', key: `h${h}`, label });\n // Pair each run of deletions with the run of additions after it, for emphasis in both layouts.\n const pairs = toSplitRows(hunk.lines);\n const emphasisOf = new Map<DiffLine, [number, number] | null>();\n for (const p of pairs) {\n if (p.left && p.right && p.left.kind === 'del' && p.right.kind === 'add') {\n const spans = intralineSpans(p.left.text, p.right.text);\n emphasisOf.set(p.left, spans ? spans.old : null);\n emphasisOf.set(p.right, spans ? spans.new : null);\n }\n }\n hunk.lines.forEach((line, i) => {\n const key = `h${h}l${i}`;\n unified.push({ kind: 'line', key, line, anchor: anchorFor(line, key), emphasis: emphasisOf.get(line) ?? null });\n });\n pairs.forEach((p, i) => {\n const key = `h${h}p${i}`;\n const anchorLine = p.right ?? p.left!;\n split.push({\n kind: 'pair',\n key,\n left: p.left,\n right: p.right,\n anchor: anchorFor(anchorLine, key),\n leftEmphasis: p.left ? emphasisOf.get(p.left) ?? null : null,\n rightEmphasis: p.right ? emphasisOf.get(p.right) ?? null : null,\n });\n });\n });\n return { unified, split, notice: file.unparsedNotice, status: file.status };\n}\n\nfunction formatBytes(n: number): string {\n if (n >= 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n return `${Math.round(n / 1024)} KB`;\n}\n\nexport function PatchView({ path, text, truncated, totalBytes, layout, comments, onAddComment, onRemoveComment }: PatchViewProps) {\n const lang = languageForPath(path);\n const built = useMemo(() => buildRows(text), [text]);\n const [showAll, setShowAll] = useState(false);\n const [active, setActive] = useState(0);\n const [editing, setEditing] = useState<Anchor | null>(null);\n const gridRef = useRef<HTMLTableElement>(null);\n const idBase = useId();\n\n const rows = layout === 'split' ? built.split : built.unified;\n const limited = !showAll && rows.length > ROW_LIMIT;\n const visible = limited ? rows.slice(0, ROW_LIMIT) : rows;\n /** Indexes (into `visible`) of commentable rows — what the arrow keys walk. */\n const lineIndexes = useMemo(() => visible.flatMap((r, i) => (r.kind === 'hunk' ? [] : [i])), [visible]);\n\n useEffect(() => {\n setActive(0);\n setEditing(null);\n setShowAll(false);\n }, [text, layout]);\n\n const activeRowIndex = lineIndexes[Math.min(active, Math.max(0, lineIndexes.length - 1))] ?? -1;\n const activeRow = activeRowIndex >= 0 ? visible[activeRowIndex] : undefined;\n const activeAnchor = activeRow && activeRow.kind !== 'hunk' ? activeRow.anchor : null;\n const cellId = (key: string) => `${idBase}-${key}`;\n\n useEffect(() => {\n if (activeAnchor === null) return;\n const el = document.getElementById(cellId(activeAnchor.key));\n el?.scrollIntoView?.({ block: 'nearest' });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeAnchor?.key]);\n\n const onKey = (e: ReactKeyboardEvent<HTMLTableElement>) => {\n if (e.target !== e.currentTarget) return;\n const last = lineIndexes.length - 1;\n const go = (n: number) => {\n e.preventDefault();\n setActive(Math.max(0, Math.min(last, n)));\n };\n switch (e.key) {\n case 'ArrowDown': go(active + 1); break;\n case 'ArrowUp': go(active - 1); break;\n case 'PageDown': go(active + PAGE); break;\n case 'PageUp': go(active - PAGE); break;\n case 'Home': go(0); break;\n case 'End': go(last); break;\n case 'Enter':\n if (activeAnchor) {\n e.preventDefault();\n setEditing(activeAnchor);\n }\n break;\n default:\n break;\n }\n };\n\n const commentsAt = (anchor: Anchor) => comments.filter((c) => c.line === anchor.line && c.side === anchor.side);\n const startComment = (anchor: Anchor, rowIndex: number) => {\n const at = lineIndexes.indexOf(rowIndex);\n if (at >= 0) setActive(at);\n setEditing(anchor);\n };\n const closeEditor = () => {\n setEditing(null);\n gridRef.current?.focus();\n };\n\n if (built.notice && rows.length === 0) {\n return <p className={styles.patchNotice}>{/binary/i.test(built.notice) ? 'Binary file — no lines to show.' : built.notice}</p>;\n }\n if (rows.length === 0) {\n return (\n <p className={styles.patchNotice}>\n {built.status === 'renamed' ? 'Renamed with no content changes.' : 'No line changes (a mode or permission change).'}\n </p>\n );\n }\n\n // Both layouts are five columns: two numbers + gutter + marker + code, or number + half + gutter + number + half.\n const colSpan = 5;\n return (\n <div className={styles.patch}>\n {truncated ? (\n <p className={styles.truncated} role=\"note\">\n Showing the first 256 KB{totalBytes ? ` of ${formatBytes(totalBytes)}` : ''}. Open the file in your editor for the rest.\n </p>\n ) : null}\n <table\n ref={gridRef}\n role=\"grid\"\n className={styles.grid}\n data-layout={layout}\n tabIndex={0}\n aria-label={`Changes in ${path}. Arrow keys move between lines; Enter adds a comment.`}\n aria-activedescendant={activeAnchor ? cellId(activeAnchor.key) : undefined}\n aria-rowcount={visible.length}\n onKeyDown={onKey}\n >\n <tbody>\n {visible.map((row, index) => {\n if (row.kind === 'hunk') {\n return (\n <tr key={row.key} className={styles.hunkRow}>\n <td colSpan={colSpan} className={styles.hunkCell} role=\"gridcell\">\n {row.label}\n </td>\n </tr>\n );\n }\n const isActive = index === activeRowIndex;\n // A split row shows two lines; a comment made on either side (in\n // either layout) belongs under it.\n const thread = row.kind === 'pair' && row.left && row.left.kind === 'del' && row.right\n ? [...commentsAt(row.anchor), ...commentsAt(anchorFor(row.left, row.key))]\n : commentsAt(row.anchor);\n const isEditing = editing?.key === row.anchor.key;\n return (\n <FragmentRows key={row.key}>\n {row.kind === 'line' ? (\n <tr className={styles.lineRow} data-kind={row.line.kind} data-active={isActive ? 'true' : undefined}>\n <td className={styles.no} aria-hidden=\"true\">{row.line.oldLineNo ?? ''}</td>\n <td className={styles.no} aria-hidden=\"true\">{row.line.newLineNo ?? ''}</td>\n <td className={styles.gutter}>\n <AddButton onClick={() => startComment(row.anchor, index)} line={row.anchor.line} />\n </td>\n <td className={styles.marker} aria-hidden=\"true\">\n {row.line.kind === 'add' ? '+' : row.line.kind === 'del' ? '−' : ''}\n </td>\n <td id={cellId(row.key)} role=\"gridcell\" className={styles.code} aria-label={lineLabel(row.line)}>\n <Code text={row.line.text} lang={lang} emphasis={row.emphasis} kind={row.line.kind} />\n </td>\n </tr>\n ) : (\n <tr className={styles.lineRow} data-kind=\"pair\" data-active={isActive ? 'true' : undefined}>\n <td className={styles.no} aria-hidden=\"true\">{row.left?.oldLineNo ?? ''}</td>\n <td className={styles.half} data-kind={row.left?.kind ?? 'empty'}>\n {row.left ? <Code text={row.left.text} lang={lang} emphasis={row.leftEmphasis} kind={row.left.kind} /> : null}\n </td>\n <td className={styles.gutter}>\n <AddButton onClick={() => startComment(row.anchor, index)} line={row.anchor.line} />\n </td>\n <td className={styles.no} aria-hidden=\"true\">{row.right?.newLineNo ?? ''}</td>\n <td\n id={cellId(row.key)}\n role=\"gridcell\"\n className={styles.half}\n data-kind={row.right?.kind ?? 'empty'}\n aria-label={[row.left ? lineLabel(row.left) : null, row.right && row.right !== row.left ? lineLabel(row.right) : null].filter(Boolean).join('; ')}\n >\n {row.right ? <Code text={row.right.text} lang={lang} emphasis={row.rightEmphasis} kind={row.right.kind} /> : null}\n </td>\n </tr>\n )}\n {thread.length > 0 || isEditing ? (\n <tr className={styles.threadRow}>\n <td colSpan={colSpan} role=\"gridcell\">\n {thread.map((c) => (\n <div key={c.id} className={styles.comment}>\n <span className={styles.commentWhere}>\n {c.side === 'old' ? 'Removed line' : 'Line'} {c.line}\n </span>\n <p className={styles.commentText}>{c.note}</p>\n <button type=\"button\" className={styles.commentRemove} onClick={() => onRemoveComment(c.id)} aria-label={`Remove the comment on line ${c.line}`}>\n Remove\n </button>\n </div>\n ))}\n {isEditing ? (\n <CommentEditor\n anchor={row.anchor}\n onCancel={closeEditor}\n onSave={(note) => {\n onAddComment({ path, line: row.anchor.line, side: row.anchor.side, note });\n closeEditor();\n }}\n />\n ) : null}\n </td>\n </tr>\n ) : null}\n </FragmentRows>\n );\n })}\n </tbody>\n </table>\n {limited ? (\n <button type=\"button\" className={styles.showAll} onClick={() => setShowAll(true)}>\n Show all {formatCount(rows.length)} lines\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction FragmentRows({ children }: { children: ReactNode }) {\n return <>{children}</>;\n}\n\nfunction lineLabel(line: DiffLine): string {\n const n = line.kind === 'del' ? line.oldLineNo : line.newLineNo;\n const what = line.kind === 'add' ? 'added' : line.kind === 'del' ? 'removed' : 'unchanged';\n return `Line ${n ?? '—'}, ${what}: ${line.text}`;\n}\n\nfunction AddButton({ onClick, line }: { onClick: () => void; line: number }) {\n return (\n <button type=\"button\" className={styles.gutterAdd} tabIndex={-1} onClick={onClick} aria-label={`Add a comment on line ${line}`}\n title={`Add a comment on line ${line}`}>\n +\n </button>\n );\n}\n\nfunction Code({ text, lang, emphasis, kind }: { text: string; lang: LangFamily; emphasis: [number, number] | null; kind: DiffLine['kind'] }) {\n const tokens = tokenizeLine(text, lang);\n if (!emphasis || kind === 'context') {\n return (\n <code className={styles.codeText}>\n {tokens.map((t, i) => (\n <span key={i} className={styles[`tok_${t.kind}`]}>{t.text}</span>\n ))}\n </code>\n );\n }\n // Split tokens at the emphasis boundaries so highlighting and emphasis compose.\n const [from, to] = emphasis;\n const parts: Array<{ text: string; kind: string; em: boolean }> = [];\n let at = 0;\n for (const t of tokens) {\n const start = at;\n const end = at + t.text.length;\n const cuts = [start, Math.max(start, Math.min(end, from)), Math.max(start, Math.min(end, to)), end];\n for (let c = 0; c < 3; c++) {\n const a = cuts[c]!;\n const b = cuts[c + 1]!;\n if (b > a) parts.push({ text: text.slice(a, b), kind: t.kind, em: c === 1 });\n }\n at = end;\n }\n return (\n <code className={styles.codeText}>\n {parts.map((p, i) => (\n <span key={i} className={`${styles[`tok_${p.kind}`] ?? ''} ${p.em ? styles.em : ''}`}>{p.text}</span>\n ))}\n </code>\n );\n}\n\nfunction CommentEditor({ anchor, onSave, onCancel }: { anchor: Anchor; onSave: (note: string) => void; onCancel: () => void }) {\n const [note, setNote] = useState('');\n const ref = useRef<HTMLTextAreaElement>(null);\n const id = useId();\n useEffect(() => {\n ref.current?.focus();\n }, []);\n const save = () => {\n if (note.trim()) onSave(note.trim());\n };\n return (\n <div className={styles.editor}>\n <label htmlFor={id} className={styles.editorLabel}>\n Comment on {anchor.side === 'old' ? 'removed line' : 'line'} {anchor.line}\n </label>\n <textarea\n id={id}\n ref={ref}\n className={styles.editorInput}\n rows={2}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n save();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n onCancel();\n }\n }}\n placeholder=\"What should change here?\"\n maxLength={4_000}\n />\n <div className={styles.editorActions}>\n <span className={styles.editorHint}>⌘Enter saves · Esc cancels</span>\n <button type=\"button\" className={styles.linkButton} onClick={onCancel}>\n Cancel\n </button>\n <button type=\"button\" className={styles.saveButton} onClick={save} disabled={!note.trim()}>\n Save comment\n </button>\n </div>\n </div>\n );\n}\n","/**\n * routes/verse/git/DiffPane.tsx — the dock's Review pane (unit C5; SPEC-310C\n * §3 \"Diff/Review\"). Mounted by C2 through the `diff-pane` slot with exactly\n * DiffPaneProps.\n *\n * [repo ▾] [This turn | Uncommitted | Branch] [Unified|Split] ⟳\n * 12 files · +340 −20 against main\n * ┌ file list (M/A/D/R/U + ± per file) ┐\n * └ patch of the selected file (lazy, ≤ 256 KB) with \"+\" line comments ┘\n * 2 comments [Add to message]\n *\n * SCOPES\n * This turn the files the chat's latest turn touched (C2 derives them\n * from events), shown with their CURRENT uncommitted diff; a\n * file the turn touched that has since been committed is listed\n * as such rather than silently dropped.\n * Uncommitted working tree against HEAD, untracked files included.\n * Branch everything the branch would ship against its base.\n *\n * PATCHES LOAD LAZILY: the list is one request; a patch is fetched when its\n * file is selected, cached for the life of the listing, and capped by the\n * server at 256 KB. Nothing is fetched while the pane is a background tab\n * (`visible` false) — it catches up when shown.\n *\n * COMMENTS are drafts held here, per file, until \"Add to message\" hands them\n * to the composer as `path:line: note` lines (C2's onAddToMessage; ⌘Enter in\n * the composer sends). They survive switching files and scopes, not a reload.\n *\n * KEYBOARD: the scope and layout switches are radio groups (← →); the file\n * list is a listbox (↑ ↓ Home End select and load); the patch is a grid (see\n * PatchView). Tab moves between those four stops.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { Button, IconButton } from '../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport { Segmented } from '../../../components/primitives/Segmented.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { IconRefresh } from '../../../components/primitives/icons.js';\nimport type { VerseGitDiffFile, VerseGitDiffScope, VerseReviewScope } from '../../../data/api-types.js';\nimport type { DiffPaneProps } from '../shell/slots.js';\nimport {\n FILE_STATUS_WORD,\n commentsToMessage,\n describeGitError,\n diffstatLabel,\n formatCount,\n groupFiles,\n type ReviewComment,\n} from './git-model.js';\nimport { fetchGitDiff, isRootUnavailable, type GitDiffView } from './git-queries.js';\nimport { PatchView, type PatchLayout } from './PatchView.js';\nimport chrome from '../dock/pane-chrome.module.css';\nimport styles from './DiffPane.module.css';\n\nexport interface DiffPaneTestProps {\n /** Test seam for the diff reads. */\n fetchDiff?: typeof fetchGitDiff;\n}\n\n/** Below this pane width the split layout is offered but unified is the default. */\nconst SPLIT_MIN_WIDTH = 640;\n\ntype ListState =\n | { state: 'idle' }\n | { state: 'loading' }\n | { state: 'ready'; data: GitDiffView; key: string }\n | { state: 'not-a-repo' }\n | { state: 'error'; message: string };\n\ntype PatchState =\n | { state: 'idle' }\n | { state: 'loading' }\n | { state: 'ready'; text: string; truncated: boolean; totalBytes: number | null }\n | { state: 'error'; message: string };\n\n/** One row of the file list: a real change, or a turn file that is no longer uncommitted. */\ninterface ListEntry {\n file: VerseGitDiffFile;\n /** \"This turn\" only: the turn touched it, but it has no uncommitted change now. */\n settled: boolean;\n}\n\nfunction rootName(root: string): string {\n const parts = root.replace(/[\\\\/]+$/, '').split(/[\\\\/]/);\n return parts[parts.length - 1] || root;\n}\n\nfunction serverScope(scope: VerseReviewScope): VerseGitDiffScope {\n return scope === 'branch' ? 'branch' : 'working';\n}\n\nexport function DiffPane({ roots, request, turnFiles, onAddToMessage, visible, fetchDiff = fetchGitDiff }: DiffPaneProps & DiffPaneTestProps) {\n const [root, setRoot] = useState<string | null>(roots[0] ?? null);\n const [scope, setScope] = useState<VerseReviewScope>('working');\n const [file, setFile] = useState<string | null>(null);\n const [layout, setLayout] = useState<PatchLayout>('unified');\n const [rawList, setList] = useState<ListState>({ state: 'idle' });\n const [patch, setPatch] = useState<PatchState>({ state: 'idle' });\n const [comments, setComments] = useState<ReviewComment[]>([]);\n const [announce, setAnnounce] = useState('');\n const [reloadKey, setReloadKey] = useState(0);\n const [wide, setWide] = useState(true);\n const paneRef = useRef<HTMLDivElement>(null);\n const patchCache = useRef(new Map<string, PatchState & { state: 'ready' }>());\n const listRef = useRef<HTMLUListElement>(null);\n const nextCommentId = useRef(1);\n const handledNonce = useRef<number | null>(null);\n const listId = useId();\n const rootId = useId();\n\n // Keep the chosen root valid as the chat's roots change.\n useEffect(() => {\n if (root === null || !roots.includes(root)) setRoot(roots[0] ?? null);\n }, [roots, root]);\n\n // An open request from the bar's ± counts, the dock command, or a transcript link.\n useEffect(() => {\n if (!request || handledNonce.current === request.nonce) return;\n handledNonce.current = request.nonce;\n setRoot(request.root);\n setScope(request.scope);\n setFile(request.file ?? null);\n }, [request]);\n\n // The pane's own width (it lives in a resizable dock), for the split default.\n useEffect(() => {\n const el = paneRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width ?? 0;\n setWide(w >= SPLIT_MIN_WIDTH);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n // ---- the file list ------------------------------------------------------\n useEffect(() => {\n if (!visible || root === null) return;\n const controller = new AbortController();\n const key = `${root}\\0${serverScope(scope)}`;\n patchCache.current.clear();\n // A refresh of the SAME listing keeps showing it while it reloads; a new\n // root or scope must not show the previous one's files under its name.\n setList((prev) => (prev.state === 'ready' && prev.key === key ? prev : { state: 'loading' }));\n fetchDiff(root, serverScope(scope), null, controller.signal)\n .then((data) => {\n if (!controller.signal.aborted) setList({ state: 'ready', data, key });\n })\n .catch((err: unknown) => {\n if (controller.signal.aborted) return;\n if (isRootUnavailable(err)) setList({ state: 'not-a-repo' });\n else {\n console.warn('[verse] review list failed', err);\n setList({ state: 'error', message: describeGitError(err) });\n }\n });\n return () => controller.abort();\n }, [root, scope, visible, reloadKey, fetchDiff]);\n\n // The listing as it applies to what is on screen NOW: in the render right\n // after a root or scope switch, the previous listing is still in state and\n // must read as loading, or the selection and patch effects would act on it.\n const currentKey = root === null ? '' : `${root}\\0${serverScope(scope)}`;\n const list: ListState = useMemo(\n () => (rawList.state === 'ready' && rawList.key !== currentKey ? { state: 'loading' } : rawList),\n [rawList, currentKey],\n );\n\n const entries: ListEntry[] = useMemo(() => {\n if (list.state !== 'ready') return [];\n if (scope !== 'turn') return list.data.files.map((f) => ({ file: f, settled: false }));\n const touched = turnFiles.filter((t) => t.root === root).map((t) => t.path);\n const byPath = new Map(list.data.files.map((f) => [f.path, f]));\n return [...new Set(touched)].map((path) => {\n const change = byPath.get(path);\n return change\n ? { file: change, settled: false }\n : { file: { path, oldPath: null, status: 'M' as const, additions: 0, deletions: 0, binary: false }, settled: true };\n });\n }, [list, scope, turnFiles, root]);\n\n // Grouped exactly as the list draws them, so ↑/↓ and \"the first file\" follow what is on screen.\n const groups = useMemo(() => groupFiles(entries.map((e) => e.file)), [entries]);\n const selectable = useMemo(() => {\n const byPath = new Map(entries.map((e) => [e.file.path, e]));\n return groups.flatMap((g) => g.files.map((f) => byPath.get(f.path)!)).filter((e) => !e.settled);\n }, [groups, entries]);\n\n // Keep a valid selection: the requested file, else the first change.\n useEffect(() => {\n if (list.state !== 'ready') return;\n if (file !== null && selectable.some((e) => e.file.path === file)) return;\n setFile(selectable[0]?.file.path ?? null);\n }, [list, selectable, file]);\n\n // ---- the selected file's patch -------------------------------------------\n useEffect(() => {\n if (!visible || root === null || file === null || list.state !== 'ready') {\n setPatch({ state: 'idle' });\n return;\n }\n const entry = selectable.find((e) => e.file.path === file);\n if (!entry) return;\n const key = `${serverScope(scope)}\\0${file}`;\n const hit = patchCache.current.get(key);\n if (hit) {\n setPatch(hit);\n return;\n }\n if (entry.file.binary) {\n setPatch({ state: 'ready', text: '', truncated: false, totalBytes: null });\n return;\n }\n const controller = new AbortController();\n setPatch({ state: 'loading' });\n fetchDiff(root, serverScope(scope), file, controller.signal)\n .then((data) => {\n if (controller.signal.aborted) return;\n const ready = { state: 'ready' as const, text: data.patch?.text ?? '', truncated: data.patch?.truncated ?? false, totalBytes: data.patchBytes ?? null };\n patchCache.current.set(key, ready);\n setPatch(ready);\n })\n .catch((err: unknown) => {\n if (controller.signal.aborted) return;\n console.warn('[verse] review patch failed', err);\n setPatch({ state: 'error', message: describeGitError(err) });\n });\n return () => controller.abort();\n }, [root, scope, file, visible, list, selectable, fetchDiff]);\n\n // ---- comments ------------------------------------------------------------\n const addComment = useCallback((c: Omit<ReviewComment, 'id'>) => {\n setComments((prev) => [...prev, { ...c, id: `c${nextCommentId.current++}` }]);\n setAnnounce(`Comment added on line ${c.line}.`);\n }, []);\n const removeComment = useCallback((id: string) => {\n setComments((prev) => prev.filter((c) => c.id !== id));\n setAnnounce('Comment removed.');\n }, []);\n const sendComments = () => {\n if (comments.length === 0) return;\n onAddToMessage(commentsToMessage(comments));\n setAnnounce(`Added ${comments.length} ${comments.length === 1 ? 'comment' : 'comments'} to the message.`);\n setComments([]);\n };\n\n // ---- file list keyboard (listbox) -----------------------------------------\n const onListKey = (e: ReactKeyboardEvent<HTMLUListElement>) => {\n if (selectable.length === 0) return;\n const at = selectable.findIndex((x) => x.file.path === file);\n let next = at;\n if (e.key === 'ArrowDown') next = Math.min(selectable.length - 1, at + 1);\n else if (e.key === 'ArrowUp') next = Math.max(0, at - 1);\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = selectable.length - 1;\n else return;\n e.preventDefault();\n const path = selectable[next]!.file.path;\n setFile(path);\n const escaped = typeof CSS !== 'undefined' && typeof CSS.escape === 'function' ? CSS.escape(path) : path.replace(/[\"\\\\]/g, '\\\\$&');\n listRef.current?.querySelector<HTMLElement>(`[data-path=\"${escaped}\"]`)?.scrollIntoView?.({ block: 'nearest' });\n };\n\n // ---- render --------------------------------------------------------------\n const turnCount = turnFiles.filter((t) => t.root === root).length;\n const scopeOptions = [\n { value: 'turn' as const, label: 'This turn', disabled: turnCount === 0 },\n { value: 'working' as const, label: 'Uncommitted' },\n { value: 'branch' as const, label: 'Branch' },\n ];\n const layoutOptions = [\n { value: 'unified' as const, label: 'Unified' },\n { value: 'split' as const, label: 'Split' },\n ];\n const effectiveLayout: PatchLayout = layout === 'split' && !wide ? 'unified' : layout;\n const totals = entries.reduce(\n (acc, e) => (e.settled ? acc : { files: acc.files + 1, additions: acc.additions + e.file.additions, deletions: acc.deletions + e.file.deletions }),\n { files: 0, additions: 0, deletions: 0 },\n );\n const base = list.state === 'ready' ? list.data.base : null;\n const fileComments = comments.filter((c) => c.path === file);\n const refresh = () => setReloadKey((n) => n + 1);\n\n if (roots.length === 0 || root === null) {\n return (\n <div className={styles.pane} ref={paneRef}>\n <EmptyState compact title=\"No folder to review\"\n body=\"This chat has no project folder. Start a chat in a project to review the changes it makes.\" />\n </div>\n );\n }\n\n return (\n <div className={styles.pane} ref={paneRef} data-wide={wide ? 'true' : 'false'}>\n <header className={`${chrome.header} ${styles.head}`}>\n {roots.length > 1 ? (\n <label className={styles.rootPick}>\n <span className={styles.visuallyHidden}>Repository</span>\n <select id={rootId} value={root} onChange={(e) => { setRoot(e.target.value); setFile(null); }} className={styles.select} title={root}>\n {roots.map((r) => (\n <option key={r} value={r}>{rootName(r)}</option>\n ))}\n </select>\n </label>\n ) : (\n <span className={`${chrome.title} ${styles.rootName}`} title={root}>{rootName(root)}</span>\n )}\n <Segmented\n aria-label=\"What to review\"\n size=\"sm\"\n options={scopeOptions}\n value={scope}\n onChange={(next) => { setScope(next); setFile(null); }}\n />\n <div className={chrome.actions}>\n <Segmented\n aria-label=\"Diff layout\"\n size=\"sm\"\n options={layoutOptions.map((o) => (o.value === 'split' && !wide ? { ...o, disabled: true } : o))}\n value={effectiveLayout}\n onChange={setLayout}\n />\n {/* The same ghost sm icon button the Terminal and Preview headers use. */}\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconRefresh />} aria-label=\"Refresh changes\" title=\"Refresh changes\" onClick={refresh} />\n </div>\n </header>\n\n <p className={styles.summary}>\n {list.state === 'ready' ? (\n totals.files === 0 ? (\n <span>{emptySentence(scope, base)}</span>\n ) : (\n <span aria-label={diffstatLabel(totals.files, totals.additions, totals.deletions)}>\n {formatCount(totals.files)} {totals.files === 1 ? 'file' : 'files'} · <span className={styles.add}>+{formatCount(totals.additions)}</span>{' '}\n <span className={styles.del}>{'\\u2212'}{formatCount(totals.deletions)}</span>\n {scope === 'branch' && base ? <> against <code className={styles.ref}>{base}</code></> : null}\n {scope === 'working' ? ' uncommitted' : null}\n </span>\n )\n ) : list.state === 'loading' || list.state === 'idle' ? (\n <span className={styles.muted}>Reading changes…</span>\n ) : null}\n </p>\n\n {list.state === 'not-a-repo' ? (\n <EmptyState compact title=\"Not a git repository\"\n body={`${rootName(root)} is not tracked by git, so there is nothing to review. Run git init in the terminal to start tracking it.`} />\n ) : list.state === 'error' ? (\n <EmptyState compact tone=\"error\" title=\"Could not read the changes\" body={list.message}\n action={<Button size=\"sm\" variant=\"subtle\" onClick={refresh}>Try again</Button>} />\n ) : list.state !== 'ready' ? (\n <div className={styles.skeleton} aria-hidden=\"true\">\n <SkeletonLine />\n <SkeletonLine />\n <SkeletonLine />\n </div>\n ) : entries.length === 0 ? (\n // The summary line above states the fact; this says where to look next.\n <p className={styles.patchNotice}>{emptyNextStep(scope)}</p>\n ) : (\n <div className={styles.body}>\n <nav className={styles.files} aria-label=\"Changed files\">\n <ul\n ref={listRef}\n id={listId}\n role=\"listbox\"\n aria-label=\"Changed files\"\n className={styles.fileList}\n tabIndex={0}\n aria-activedescendant={file ? `${listId}-${encodeURIComponent(file)}` : undefined}\n onKeyDown={onListKey}\n >\n {groups.map((group) => (\n <li key={group.dir || '.'} role=\"presentation\" className={styles.group}>\n {/* RTL truncation keeps the tail of a long path visible; the LRM keeps\n the trailing slash from being reordered to the front. */}\n {group.dir ? <span className={styles.dir} role=\"presentation\" title={`${group.dir}/`}>{group.dir}/{'\\u200E'}</span> : null}\n <ul role=\"presentation\" className={styles.groupFiles}>\n {group.files.map((f) => {\n const settled = entries.find((e) => e.file.path === f.path)?.settled ?? false;\n const selected = f.path === file;\n const count = comments.filter((c) => c.path === f.path).length;\n return (\n <li\n key={f.path}\n id={`${listId}-${encodeURIComponent(f.path)}`}\n data-path={f.path}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={settled || undefined}\n className={styles.file}\n data-status={f.status}\n onClick={() => { if (!settled) setFile(f.path); }}\n title={f.oldPath ? `${f.oldPath} → ${f.path}` : f.path}\n >\n <span className={styles.fileStatus} aria-label={FILE_STATUS_WORD[f.status]}>{f.status}</span>\n <span className={styles.fileName}>{f.name}</span>\n {count > 0 ? <span className={styles.fileComments} aria-label={`${count} ${count === 1 ? 'comment' : 'comments'}`}>{count}</span> : null}\n {settled ? (\n <span className={styles.fileSettled}>committed</span>\n ) : f.binary ? (\n <span className={styles.fileCounts}>binary</span>\n ) : (\n <span className={styles.fileCounts}>\n <span className={styles.add}>+{formatCount(f.additions)}</span> <span className={styles.del}>{'−'}{formatCount(f.deletions)}</span>\n </span>\n )}\n </li>\n );\n })}\n </ul>\n </li>\n ))}\n </ul>\n </nav>\n\n <section className={styles.patchArea} aria-label={file ? `Patch for ${file}` : 'Patch'}>\n {file === null ? (\n <p className={styles.patchNotice}>Choose a file in the list to see its changes.</p>\n ) : patch.state === 'loading' || patch.state === 'idle' ? (\n <div className={styles.skeleton} aria-hidden=\"true\">\n <SkeletonLine />\n <SkeletonLine />\n </div>\n ) : patch.state === 'error' ? (\n <div className={styles.patchError} role=\"alert\">\n <p>{patch.message}</p>\n <Button size=\"sm\" variant=\"subtle\" onClick={refresh}>Try again</Button>\n </div>\n ) : (\n <>\n <h3 className={styles.patchPath} title={file}>{file}</h3>\n {selectable.find((e) => e.file.path === file)?.file.binary ? (\n <p className={styles.patchNotice}>Binary file — no lines to show.</p>\n ) : (\n <PatchView\n path={file}\n text={patch.text}\n truncated={patch.truncated}\n totalBytes={patch.totalBytes}\n layout={effectiveLayout}\n comments={fileComments}\n onAddComment={addComment}\n onRemoveComment={removeComment}\n />\n )}\n </>\n )}\n </section>\n </div>\n )}\n\n {comments.length > 0 ? (\n <footer className={styles.foot}>\n <span className={styles.footCount}>\n {comments.length} {comments.length === 1 ? 'comment' : 'comments'}\n {new Set(comments.map((c) => c.path)).size > 1 ? ` in ${new Set(comments.map((c) => c.path)).size} files` : ''}\n </span>\n <button type=\"button\" className={styles.linkButton} onClick={() => { setComments([]); setAnnounce('Comments discarded.'); }}>\n Discard\n </button>\n <button type=\"button\" className={styles.saveButton} onClick={sendComments}>\n Add to message\n </button>\n </footer>\n ) : null}\n <p className={styles.visuallyHidden} role=\"status\" aria-live=\"polite\">{announce}</p>\n </div>\n );\n}\n\n/** What to do about an empty scope: the next place to look, never a dead end. */\nfunction emptyNextStep(scope: VerseReviewScope): string {\n if (scope === 'turn') return 'Switch to Uncommitted or Branch to see the rest of the changes.';\n if (scope === 'working') return 'Edits the chat makes show up here as they land. Branch shows what is already committed.';\n return 'Commits on this branch show up here. Uncommitted shows edits that are not committed yet.';\n}\n\nfunction emptySentence(scope: VerseReviewScope, base: string | null): string {\n if (scope === 'turn') return 'The latest turn changed no files here.';\n if (scope === 'working') return 'No uncommitted changes.';\n return base ? `This branch has no changes against ${base}.` : 'No changes on this branch.';\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as e,c as t,n}from"./index-QesfXBsb.js";import{i as r,n as i,r as a,t as o}from"./highlight-CMCZK9jW.js";var s=t(e(),1),c={viewer:`_viewer_gf84p_1`,malformedNotice:`_malformedNotice_gf84p_9`,empty:`_empty_gf84p_18`,tree:`_tree_gf84p_27`,treeItem:`_treeItem_gf84p_40`,treeItemActive:`_treeItemActive_gf84p_59`,statusDot:`_statusDot_gf84p_64`,status_added:`_status_added_gf84p_70`,status_deleted:`_status_deleted_gf84p_71`,status_modified:`_status_modified_gf84p_72`,status_renamed:`_status_renamed_gf84p_73`,treePath:`_treePath_gf84p_75`,treeStats:`_treeStats_gf84p_83`,add:`_add_gf84p_89`,del:`_del_gf84p_90`,body:`_body_gf84p_92`,fileHeader:`_fileHeader_gf84p_99`,filePath:`_filePath_gf84p_109`,modeToggle:`_modeToggle_gf84p_118`,modeActive:`_modeActive_gf84p_132`,notice:`_notice_gf84p_138`,emptyFile:`_emptyFile_gf84p_149`,hunkTable:`_hunkTable_gf84p_155`,hunkCaption:`_hunkCaption_gf84p_163`,lineNo:`_lineNo_gf84p_173`,lineMarker:`_lineMarker_gf84p_184`,lineText:`_lineText_gf84p_192`,hunkTableSplit:`_hunkTableSplit_gf84p_199`,rowBlank:`_rowBlank_gf84p_203`,row_add:`_row_add_gf84p_207`,row_del:`_row_del_gf84p_210`,row_context:`_row_context_gf84p_213`,code:`_code_gf84p_217`,tok_plain:`_tok_plain_gf84p_221`,tok_comment:`_tok_comment_gf84p_222`,tok_string:`_tok_string_gf84p_223`,tok_number:`_tok_number_gf84p_224`,tok_keyword:`_tok_keyword_gf84p_225`},l=n();function u({diff:e,proposalKind:t}){let n=(0,s.useMemo)(()=>a(e),[e]),[r,i]=(0,s.useState)(n.files[0]?.id??null),[o,u]=(0,s.useState)(`unified`);if((0,s.useEffect)(()=>{i(n.files[0]?.id??null)},[e]),n.files.length===0)return(0,l.jsxs)(`div`,{className:c.empty,children:[`No diff attached to this proposal (kind: `,t,`).`]});let f=n.files.find(e=>e.id===r)??n.files[0];function p(e){let t=n.files.findIndex(e=>e.id===f.id);e.key===`ArrowDown`?(e.preventDefault(),i(n.files[Math.min(t+1,n.files.length-1)].id)):e.key===`ArrowUp`&&(e.preventDefault(),i(n.files[Math.max(t-1,0)].id))}return(0,l.jsxs)(`div`,{className:c.viewer,children:[n.malformed?(0,l.jsx)(`p`,{className:c.malformedNotice,children:`Could not parse this as a unified diff — showing raw content.`}):null,(0,l.jsx)(`div`,{className:c.tree,role:`tree`,"aria-label":`Changed files`,onKeyDown:p,children:n.files.map(e=>(0,l.jsxs)(`button`,{type:`button`,role:`treeitem`,"aria-selected":e.id===f.id,tabIndex:e.id===f.id?0:-1,className:`${c.treeItem} ${e.id===f.id?c.treeItemActive:``}`,onClick:()=>i(e.id),children:[(0,l.jsx)(`span`,{className:`${c.statusDot} ${c[`status_${e.status}`]}`,"aria-hidden":`true`}),(0,l.jsx)(`span`,{className:c.treePath,title:e.displayPath,children:e.displayPath}),(0,l.jsxs)(`span`,{className:c.treeStats,children:[e.additions>0?(0,l.jsxs)(`span`,{className:c.add,children:[`+`,e.additions]}):null,e.deletions>0?(0,l.jsxs)(`span`,{className:c.del,children:[`-`,e.deletions]}):null]})]},e.id))}),(0,l.jsxs)(`div`,{className:c.body,children:[(0,l.jsxs)(`div`,{className:c.fileHeader,children:[(0,l.jsx)(`span`,{className:c.filePath,children:f.displayPath}),(0,l.jsxs)(`div`,{className:c.modeToggle,role:`group`,"aria-label":`Diff view mode`,children:[(0,l.jsx)(`button`,{type:`button`,"aria-pressed":o===`unified`,className:o===`unified`?c.modeActive:``,onClick:()=>u(`unified`),children:`Unified`}),(0,l.jsx)(`button`,{type:`button`,"aria-pressed":o===`split`,className:o===`split`?c.modeActive:``,onClick:()=>u(`split`),children:`Split`})]})]}),f.unparsedNotice?(0,l.jsx)(`pre`,{className:c.notice,children:f.unparsedNotice}):null,f.hunks.length===0&&!f.unparsedNotice?(0,l.jsx)(`p`,{className:c.emptyFile,children:`No line-level changes captured for this file.`}):f.hunks.map((e,t)=>(0,l.jsx)(d,{hunk:e,mode:o,path:f.displayPath},t))]})]})}function d({hunk:e,mode:t,path:n}){let i=o(n);if(t===`split`){let t=r(e.lines);return(0,l.jsxs)(`table`,{className:`${c.hunkTable} ${c.hunkTableSplit}`,children:[(0,l.jsx)(`caption`,{className:c.hunkCaption,children:e.header}),(0,l.jsx)(`tbody`,{children:t.map((e,t)=>(0,l.jsxs)(`tr`,{children:[(0,l.jsx)(`td`,{className:c.lineNo,children:e.left?.oldLineNo??``}),(0,l.jsx)(`td`,{className:`${c.lineText} ${e.left?c[`row_${e.left.kind}`]:c.rowBlank}`,children:e.left?(0,l.jsx)(f,{text:e.left.text,lang:i}):null}),(0,l.jsx)(`td`,{className:c.lineNo,children:e.right?.newLineNo??``}),(0,l.jsx)(`td`,{className:`${c.lineText} ${e.right?c[`row_${e.right.kind}`]:c.rowBlank}`,children:e.right?(0,l.jsx)(f,{text:e.right.text,lang:i}):null})]},t))})]})}return(0,l.jsxs)(`table`,{className:c.hunkTable,children:[(0,l.jsx)(`caption`,{className:c.hunkCaption,children:e.header}),(0,l.jsx)(`tbody`,{children:e.lines.map((e,t)=>(0,l.jsxs)(`tr`,{className:c[`row_${e.kind}`],children:[(0,l.jsx)(`td`,{className:c.lineNo,children:e.oldLineNo??``}),(0,l.jsx)(`td`,{className:c.lineNo,children:e.newLineNo??``}),(0,l.jsx)(`td`,{className:c.lineMarker,"aria-hidden":`true`,children:e.kind===`add`?`+`:e.kind===`del`?`-`:``}),(0,l.jsx)(`td`,{className:c.lineText,children:(0,l.jsx)(f,{text:e.text,lang:i})})]},t))})]})}function f({text:e,lang:t}){let n=i(e,t);return(0,l.jsx)(`code`,{className:c.code,children:n.map((e,t)=>(0,l.jsx)(`span`,{className:c[`tok_${e.kind}`],children:e.text},t))})}export{u as t};
2
- //# sourceMappingURL=DiffViewer-CJarUvs0.js.map
1
+ import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";import{i as r,n as i,r as a,t as o}from"./highlight-CMCZK9jW.js";var s=t(e(),1),c={viewer:`_viewer_gf84p_1`,malformedNotice:`_malformedNotice_gf84p_9`,empty:`_empty_gf84p_18`,tree:`_tree_gf84p_27`,treeItem:`_treeItem_gf84p_40`,treeItemActive:`_treeItemActive_gf84p_59`,statusDot:`_statusDot_gf84p_64`,status_added:`_status_added_gf84p_70`,status_deleted:`_status_deleted_gf84p_71`,status_modified:`_status_modified_gf84p_72`,status_renamed:`_status_renamed_gf84p_73`,treePath:`_treePath_gf84p_75`,treeStats:`_treeStats_gf84p_83`,add:`_add_gf84p_89`,del:`_del_gf84p_90`,body:`_body_gf84p_92`,fileHeader:`_fileHeader_gf84p_99`,filePath:`_filePath_gf84p_109`,modeToggle:`_modeToggle_gf84p_118`,modeActive:`_modeActive_gf84p_132`,notice:`_notice_gf84p_138`,emptyFile:`_emptyFile_gf84p_149`,hunkTable:`_hunkTable_gf84p_155`,hunkCaption:`_hunkCaption_gf84p_163`,lineNo:`_lineNo_gf84p_173`,lineMarker:`_lineMarker_gf84p_184`,lineText:`_lineText_gf84p_192`,hunkTableSplit:`_hunkTableSplit_gf84p_199`,rowBlank:`_rowBlank_gf84p_203`,row_add:`_row_add_gf84p_207`,row_del:`_row_del_gf84p_210`,row_context:`_row_context_gf84p_213`,code:`_code_gf84p_217`,tok_plain:`_tok_plain_gf84p_221`,tok_comment:`_tok_comment_gf84p_222`,tok_string:`_tok_string_gf84p_223`,tok_number:`_tok_number_gf84p_224`,tok_keyword:`_tok_keyword_gf84p_225`},l=n();function u({diff:e,proposalKind:t}){let n=(0,s.useMemo)(()=>a(e),[e]),[r,i]=(0,s.useState)(n.files[0]?.id??null),[o,u]=(0,s.useState)(`unified`);if((0,s.useEffect)(()=>{i(n.files[0]?.id??null)},[e]),n.files.length===0)return(0,l.jsxs)(`div`,{className:c.empty,children:[`No diff attached to this proposal (kind: `,t,`).`]});let f=n.files.find(e=>e.id===r)??n.files[0];function p(e){let t=n.files.findIndex(e=>e.id===f.id);e.key===`ArrowDown`?(e.preventDefault(),i(n.files[Math.min(t+1,n.files.length-1)].id)):e.key===`ArrowUp`&&(e.preventDefault(),i(n.files[Math.max(t-1,0)].id))}return(0,l.jsxs)(`div`,{className:c.viewer,children:[n.malformed?(0,l.jsx)(`p`,{className:c.malformedNotice,children:`Could not parse this as a unified diff — showing raw content.`}):null,(0,l.jsx)(`div`,{className:c.tree,role:`tree`,"aria-label":`Changed files`,onKeyDown:p,children:n.files.map(e=>(0,l.jsxs)(`button`,{type:`button`,role:`treeitem`,"aria-selected":e.id===f.id,tabIndex:e.id===f.id?0:-1,className:`${c.treeItem} ${e.id===f.id?c.treeItemActive:``}`,onClick:()=>i(e.id),children:[(0,l.jsx)(`span`,{className:`${c.statusDot} ${c[`status_${e.status}`]}`,"aria-hidden":`true`}),(0,l.jsx)(`span`,{className:c.treePath,title:e.displayPath,children:e.displayPath}),(0,l.jsxs)(`span`,{className:c.treeStats,children:[e.additions>0?(0,l.jsxs)(`span`,{className:c.add,children:[`+`,e.additions]}):null,e.deletions>0?(0,l.jsxs)(`span`,{className:c.del,children:[`-`,e.deletions]}):null]})]},e.id))}),(0,l.jsxs)(`div`,{className:c.body,children:[(0,l.jsxs)(`div`,{className:c.fileHeader,children:[(0,l.jsx)(`span`,{className:c.filePath,children:f.displayPath}),(0,l.jsxs)(`div`,{className:c.modeToggle,role:`group`,"aria-label":`Diff view mode`,children:[(0,l.jsx)(`button`,{type:`button`,"aria-pressed":o===`unified`,className:o===`unified`?c.modeActive:``,onClick:()=>u(`unified`),children:`Unified`}),(0,l.jsx)(`button`,{type:`button`,"aria-pressed":o===`split`,className:o===`split`?c.modeActive:``,onClick:()=>u(`split`),children:`Split`})]})]}),f.unparsedNotice?(0,l.jsx)(`pre`,{className:c.notice,children:f.unparsedNotice}):null,f.hunks.length===0&&!f.unparsedNotice?(0,l.jsx)(`p`,{className:c.emptyFile,children:`No line-level changes captured for this file.`}):f.hunks.map((e,t)=>(0,l.jsx)(d,{hunk:e,mode:o,path:f.displayPath},t))]})]})}function d({hunk:e,mode:t,path:n}){let i=o(n);if(t===`split`){let t=r(e.lines);return(0,l.jsxs)(`table`,{className:`${c.hunkTable} ${c.hunkTableSplit}`,children:[(0,l.jsx)(`caption`,{className:c.hunkCaption,children:e.header}),(0,l.jsx)(`tbody`,{children:t.map((e,t)=>(0,l.jsxs)(`tr`,{children:[(0,l.jsx)(`td`,{className:c.lineNo,children:e.left?.oldLineNo??``}),(0,l.jsx)(`td`,{className:`${c.lineText} ${e.left?c[`row_${e.left.kind}`]:c.rowBlank}`,children:e.left?(0,l.jsx)(f,{text:e.left.text,lang:i}):null}),(0,l.jsx)(`td`,{className:c.lineNo,children:e.right?.newLineNo??``}),(0,l.jsx)(`td`,{className:`${c.lineText} ${e.right?c[`row_${e.right.kind}`]:c.rowBlank}`,children:e.right?(0,l.jsx)(f,{text:e.right.text,lang:i}):null})]},t))})]})}return(0,l.jsxs)(`table`,{className:c.hunkTable,children:[(0,l.jsx)(`caption`,{className:c.hunkCaption,children:e.header}),(0,l.jsx)(`tbody`,{children:e.lines.map((e,t)=>(0,l.jsxs)(`tr`,{className:c[`row_${e.kind}`],children:[(0,l.jsx)(`td`,{className:c.lineNo,children:e.oldLineNo??``}),(0,l.jsx)(`td`,{className:c.lineNo,children:e.newLineNo??``}),(0,l.jsx)(`td`,{className:c.lineMarker,"aria-hidden":`true`,children:e.kind===`add`?`+`:e.kind===`del`?`-`:``}),(0,l.jsx)(`td`,{className:c.lineText,children:(0,l.jsx)(f,{text:e.text,lang:i})})]},t))})]})}function f({text:e,lang:t}){let n=i(e,t);return(0,l.jsx)(`code`,{className:c.code,children:n.map((e,t)=>(0,l.jsx)(`span`,{className:c[`tok_${e.kind}`],children:e.text},t))})}export{u as t};
2
+ //# sourceMappingURL=DiffViewer-C4WKsCIe.js.map