@cerbur/clutch-dsh-worktree 0.1.16 → 0.1.17

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 (358) hide show
  1. package/README.md +214 -15
  2. package/README.zh.md +175 -12
  3. package/assets/screenshots/screenshots-dashboard.png +0 -0
  4. package/assets/screenshots/screenshots-en.png +0 -0
  5. package/assets/screenshots/screenshots-git-reviewer.png +0 -0
  6. package/assets/screenshots/screenshots-import.png +0 -0
  7. package/assets/screenshots/screenshots-worktree-tool.png +0 -0
  8. package/assets/screenshots/screenshots-zh.png +0 -0
  9. package/cordis.patch.yml +6 -19
  10. package/lib/client/WorktreeSurface.d.ts.map +1 -1
  11. package/lib/client/WorktreeSurface.js +5 -4
  12. package/lib/client/WorktreeSurface.js.map +1 -1
  13. package/lib/client/command-activity.d.ts +11 -0
  14. package/lib/client/command-activity.d.ts.map +1 -0
  15. package/lib/client/command-activity.js +71 -0
  16. package/lib/client/command-activity.js.map +1 -0
  17. package/lib/client/dashboard/DashboardRequest.d.ts +2 -1
  18. package/lib/client/dashboard/DashboardRequest.d.ts.map +1 -1
  19. package/lib/client/dashboard/DashboardRequest.js +3 -3
  20. package/lib/client/dashboard/DashboardRequest.js.map +1 -1
  21. package/lib/client/dashboard/WorktreeDashboard.d.ts +2 -1
  22. package/lib/client/dashboard/WorktreeDashboard.d.ts.map +1 -1
  23. package/lib/client/dashboard/WorktreeDashboard.js +48 -24
  24. package/lib/client/dashboard/WorktreeDashboard.js.map +1 -1
  25. package/lib/client/dashboard/WorktreeInstructions.d.ts +2 -1
  26. package/lib/client/dashboard/WorktreeInstructions.d.ts.map +1 -1
  27. package/lib/client/dashboard/WorktreeInstructions.js +27 -8
  28. package/lib/client/dashboard/WorktreeInstructions.js.map +1 -1
  29. package/lib/client/dashboard/dashboard-overlay.d.ts.map +1 -1
  30. package/lib/client/dashboard/dashboard-overlay.js +38 -52
  31. package/lib/client/dashboard/dashboard-overlay.js.map +1 -1
  32. package/lib/client/dashboard/dashboard-selection.d.ts +1 -0
  33. package/lib/client/dashboard/dashboard-selection.d.ts.map +1 -1
  34. package/lib/client/dashboard/dashboard-selection.js.map +1 -1
  35. package/lib/client/dashboard/git/WorktreeGitPanel.d.ts +2 -1
  36. package/lib/client/dashboard/git/WorktreeGitPanel.d.ts.map +1 -1
  37. package/lib/client/dashboard/git/WorktreeGitPanel.js +54 -8
  38. package/lib/client/dashboard/git/WorktreeGitPanel.js.map +1 -1
  39. package/lib/client/dashboard/git/file-address.d.ts +2 -1
  40. package/lib/client/dashboard/git/file-address.d.ts.map +1 -1
  41. package/lib/client/dashboard/git/file-address.js +8 -13
  42. package/lib/client/dashboard/git/file-address.js.map +1 -1
  43. package/lib/client/dashboard/git/useWorktreeGitState.d.ts.map +1 -1
  44. package/lib/client/dashboard/git/useWorktreeGitState.js +4 -1
  45. package/lib/client/dashboard/git/useWorktreeGitState.js.map +1 -1
  46. package/lib/client/dsh-icons.d.ts +2 -0
  47. package/lib/client/dsh-icons.d.ts.map +1 -1
  48. package/lib/client/dsh-icons.js +3 -1
  49. package/lib/client/dsh-icons.js.map +1 -1
  50. package/lib/client/dsh-slot-contract.d.ts +9 -1
  51. package/lib/client/dsh-slot-contract.d.ts.map +1 -1
  52. package/lib/client/entry.d.ts.map +1 -1
  53. package/lib/client/entry.js +39 -2
  54. package/lib/client/entry.js.map +1 -1
  55. package/lib/client/layout/app-frame.d.ts +12 -0
  56. package/lib/client/layout/app-frame.d.ts.map +1 -0
  57. package/lib/client/layout/app-frame.js +82 -0
  58. package/lib/client/layout/app-frame.js.map +1 -0
  59. package/lib/client/locales.d.ts +144 -0
  60. package/lib/client/locales.d.ts.map +1 -1
  61. package/lib/client/locales.js +204 -60
  62. package/lib/client/locales.js.map +1 -1
  63. package/lib/client/overlay/overlay-bounds.d.ts.map +1 -1
  64. package/lib/client/overlay/overlay-bounds.js +8 -3
  65. package/lib/client/overlay/overlay-bounds.js.map +1 -1
  66. package/lib/client/overlay/sidebar-overlay-geometry.d.ts +3 -1
  67. package/lib/client/overlay/sidebar-overlay-geometry.d.ts.map +1 -1
  68. package/lib/client/overlay/sidebar-overlay-geometry.js +94 -34
  69. package/lib/client/overlay/sidebar-overlay-geometry.js.map +1 -1
  70. package/lib/client/restart-notice.d.ts +10 -3
  71. package/lib/client/restart-notice.d.ts.map +1 -1
  72. package/lib/client/restart-notice.js +44 -11
  73. package/lib/client/restart-notice.js.map +1 -1
  74. package/lib/client/session/session-view.d.ts +16 -2
  75. package/lib/client/session/session-view.d.ts.map +1 -1
  76. package/lib/client/session/session-view.js +24 -10
  77. package/lib/client/session/session-view.js.map +1 -1
  78. package/lib/client/session/worktree-session.d.ts +1 -0
  79. package/lib/client/session/worktree-session.d.ts.map +1 -1
  80. package/lib/client/session/worktree-session.js +3 -1
  81. package/lib/client/session/worktree-session.js.map +1 -1
  82. package/lib/client/settings/ToolSettings.d.ts +9 -0
  83. package/lib/client/settings/ToolSettings.d.ts.map +1 -0
  84. package/lib/client/settings/ToolSettings.js +77 -0
  85. package/lib/client/settings/ToolSettings.js.map +1 -0
  86. package/lib/client/settings/WorktreeSettings.d.ts +8 -0
  87. package/lib/client/settings/WorktreeSettings.d.ts.map +1 -0
  88. package/lib/client/settings/WorktreeSettings.js +46 -0
  89. package/lib/client/settings/WorktreeSettings.js.map +1 -0
  90. package/lib/client/settings/WorktreeSettingsNavIcon.d.ts +6 -0
  91. package/lib/client/settings/WorktreeSettingsNavIcon.d.ts.map +1 -0
  92. package/lib/client/settings/WorktreeSettingsNavIcon.js +51 -0
  93. package/lib/client/settings/WorktreeSettingsNavIcon.js.map +1 -0
  94. package/lib/client/settings/diagnostics.d.ts +24 -0
  95. package/lib/client/settings/diagnostics.d.ts.map +1 -0
  96. package/lib/client/settings/diagnostics.js +63 -0
  97. package/lib/client/settings/diagnostics.js.map +1 -0
  98. package/lib/client/settings/settings-navigation.d.ts +7 -0
  99. package/lib/client/settings/settings-navigation.d.ts.map +1 -0
  100. package/lib/client/settings/settings-navigation.js +12 -0
  101. package/lib/client/settings/settings-navigation.js.map +1 -0
  102. package/lib/client/surface/actions/useLifecycleActions.d.ts +2 -1
  103. package/lib/client/surface/actions/useLifecycleActions.d.ts.map +1 -1
  104. package/lib/client/surface/actions/useLifecycleActions.js +14 -5
  105. package/lib/client/surface/actions/useLifecycleActions.js.map +1 -1
  106. package/lib/client/surface/actions/useSessionActions.d.ts.map +1 -1
  107. package/lib/client/surface/actions/useSessionActions.js +6 -6
  108. package/lib/client/surface/actions/useSessionActions.js.map +1 -1
  109. package/lib/client/surface/actions/useWorktreeRegistration.d.ts.map +1 -1
  110. package/lib/client/surface/actions/useWorktreeRegistration.js +4 -2
  111. package/lib/client/surface/actions/useWorktreeRegistration.js.map +1 -1
  112. package/lib/client/surface/components/NotificationToasts.d.ts +19 -3
  113. package/lib/client/surface/components/NotificationToasts.d.ts.map +1 -1
  114. package/lib/client/surface/components/NotificationToasts.js +73 -7
  115. package/lib/client/surface/components/NotificationToasts.js.map +1 -1
  116. package/lib/client/surface/components/OverlayScrollbar.d.ts +6 -0
  117. package/lib/client/surface/components/OverlayScrollbar.d.ts.map +1 -0
  118. package/lib/client/surface/components/OverlayScrollbar.js +84 -0
  119. package/lib/client/surface/components/OverlayScrollbar.js.map +1 -0
  120. package/lib/client/surface/components/RestartToast.d.ts.map +1 -1
  121. package/lib/client/surface/components/RestartToast.js +4 -3
  122. package/lib/client/surface/components/RestartToast.js.map +1 -1
  123. package/lib/client/surface/components/SurfaceContent.d.ts.map +1 -1
  124. package/lib/client/surface/components/SurfaceContent.js +110 -39
  125. package/lib/client/surface/components/SurfaceContent.js.map +1 -1
  126. package/lib/client/surface/components/WorkspaceTree.d.ts.map +1 -1
  127. package/lib/client/surface/components/WorkspaceTree.js +2 -1
  128. package/lib/client/surface/components/WorkspaceTree.js.map +1 -1
  129. package/lib/client/surface/components/dialogs.d.ts.map +1 -1
  130. package/lib/client/surface/components/dialogs.js +14 -10
  131. package/lib/client/surface/components/dialogs.js.map +1 -1
  132. package/lib/client/surface/components/rows.d.ts +1 -1
  133. package/lib/client/surface/components/rows.d.ts.map +1 -1
  134. package/lib/client/surface/components/rows.js +15 -97
  135. package/lib/client/surface/components/rows.js.map +1 -1
  136. package/lib/client/surface/notification-queue.d.ts +15 -0
  137. package/lib/client/surface/notification-queue.d.ts.map +1 -1
  138. package/lib/client/surface/notification-queue.js +13 -2
  139. package/lib/client/surface/notification-queue.js.map +1 -1
  140. package/lib/client/surface/state/useSurfaceRefresh.d.ts +1 -1
  141. package/lib/client/surface/state/useSurfaceRefresh.d.ts.map +1 -1
  142. package/lib/client/surface/state/useSurfaceRefresh.js +13 -1
  143. package/lib/client/surface/state/useSurfaceRefresh.js.map +1 -1
  144. package/lib/client/surface/state/useSurfaceSources.d.ts +1 -1
  145. package/lib/client/surface/state/useSurfaceSources.d.ts.map +1 -1
  146. package/lib/client/surface/state/useSurfaceSources.js +4 -2
  147. package/lib/client/surface/state/useSurfaceSources.js.map +1 -1
  148. package/lib/client/surface/state/useTitleMarquee.d.ts +7 -0
  149. package/lib/client/surface/state/useTitleMarquee.d.ts.map +1 -0
  150. package/lib/client/surface/state/useTitleMarquee.js +60 -0
  151. package/lib/client/surface/state/useTitleMarquee.js.map +1 -0
  152. package/lib/client/surface/types.d.ts +8 -1
  153. package/lib/client/surface/types.d.ts.map +1 -1
  154. package/lib/client/view/worktree-error-copy.d.ts.map +1 -1
  155. package/lib/client/view/worktree-error-copy.js +69 -14
  156. package/lib/client/view/worktree-error-copy.js.map +1 -1
  157. package/lib/client/view/worktree-view-errors.d.ts.map +1 -1
  158. package/lib/client/view/worktree-view-errors.js +13 -5
  159. package/lib/client/view/worktree-view-errors.js.map +1 -1
  160. package/lib/client/worktree-connection.d.ts +6 -2
  161. package/lib/client/worktree-connection.d.ts.map +1 -1
  162. package/lib/client/worktree-connection.js +6 -0
  163. package/lib/client/worktree-connection.js.map +1 -1
  164. package/lib/client/worktree-tool-changes.d.ts +13 -0
  165. package/lib/client/worktree-tool-changes.d.ts.map +1 -0
  166. package/lib/client/worktree-tool-changes.js +64 -0
  167. package/lib/client/worktree-tool-changes.js.map +1 -0
  168. package/lib/client.js +2188 -947
  169. package/lib/client.js.map +1 -1
  170. package/lib/contract/index.d.ts +11 -1
  171. package/lib/contract/index.d.ts.map +1 -1
  172. package/lib/contract/index.js +9 -0
  173. package/lib/contract/index.js.map +1 -1
  174. package/lib/contract/tool-settings.d.ts +28 -0
  175. package/lib/contract/tool-settings.d.ts.map +1 -0
  176. package/lib/contract/tool-settings.js +10 -0
  177. package/lib/contract/tool-settings.js.map +1 -0
  178. package/lib/contract/worktree-tool-changes.d.ts +10 -0
  179. package/lib/contract/worktree-tool-changes.d.ts.map +1 -0
  180. package/lib/contract/worktree-tool-changes.js +2 -0
  181. package/lib/contract/worktree-tool-changes.js.map +1 -0
  182. package/lib/host/permission-preset-append.d.ts +15 -0
  183. package/lib/host/permission-preset-append.d.ts.map +1 -0
  184. package/lib/host/permission-preset-append.js +63 -0
  185. package/lib/host/permission-preset-append.js.map +1 -0
  186. package/lib/host/service.d.ts +17 -0
  187. package/lib/host/service.d.ts.map +1 -1
  188. package/lib/host/service.js +67 -11
  189. package/lib/host/service.js.map +1 -1
  190. package/lib/host/tool-settings.d.ts +14 -0
  191. package/lib/host/tool-settings.d.ts.map +1 -0
  192. package/lib/host/tool-settings.js +98 -0
  193. package/lib/host/tool-settings.js.map +1 -0
  194. package/lib/host/worktree-permission-manager.d.ts.map +1 -1
  195. package/lib/host/worktree-permission-manager.js +2 -4
  196. package/lib/host/worktree-permission-manager.js.map +1 -1
  197. package/lib/host/worktree-tool-changes.d.ts +12 -0
  198. package/lib/host/worktree-tool-changes.d.ts.map +1 -0
  199. package/lib/host/worktree-tool-changes.js +60 -0
  200. package/lib/host/worktree-tool-changes.js.map +1 -0
  201. package/lib/manage/manager-git-history.d.ts.map +1 -1
  202. package/lib/manage/manager-git-history.js +29 -28
  203. package/lib/manage/manager-git-history.js.map +1 -1
  204. package/lib/manage/manager-sessions.d.ts +5 -0
  205. package/lib/manage/manager-sessions.d.ts.map +1 -1
  206. package/lib/manage/manager-sessions.js +34 -11
  207. package/lib/manage/manager-sessions.js.map +1 -1
  208. package/lib/manage/manager-support.d.ts +3 -1
  209. package/lib/manage/manager-support.d.ts.map +1 -1
  210. package/lib/manage/manager-support.js +17 -0
  211. package/lib/manage/manager-support.js.map +1 -1
  212. package/lib/manage/manager-worktree-lifecycle.d.ts.map +1 -1
  213. package/lib/manage/manager-worktree-lifecycle.js +5 -4
  214. package/lib/manage/manager-worktree-lifecycle.js.map +1 -1
  215. package/lib/manage/manager-worktrees.d.ts +1 -0
  216. package/lib/manage/manager-worktrees.d.ts.map +1 -1
  217. package/lib/manage/manager-worktrees.js +74 -22
  218. package/lib/manage/manager-worktrees.js.map +1 -1
  219. package/lib/manage/manager.d.ts +10 -0
  220. package/lib/manage/manager.d.ts.map +1 -1
  221. package/lib/manage/manager.js +12 -1
  222. package/lib/manage/manager.js.map +1 -1
  223. package/lib/manage/types.d.ts +10 -1
  224. package/lib/manage/types.d.ts.map +1 -1
  225. package/lib/provider/generated-name.d.ts.map +1 -1
  226. package/lib/provider/generated-name.js +5 -4
  227. package/lib/provider/generated-name.js.map +1 -1
  228. package/lib/provider/git/adapter.d.ts.map +1 -1
  229. package/lib/provider/git/adapter.js +5 -2
  230. package/lib/provider/git/adapter.js.map +1 -1
  231. package/lib/provider/mutation-token.d.ts +1 -1
  232. package/lib/provider/mutation-token.d.ts.map +1 -1
  233. package/lib/provider/mutation-token.js +1 -0
  234. package/lib/provider/mutation-token.js.map +1 -1
  235. package/lib/provider/sidecar/repository.d.ts.map +1 -1
  236. package/lib/provider/sidecar/repository.js +1 -0
  237. package/lib/provider/sidecar/repository.js.map +1 -1
  238. package/lib/provider/sidecar/sidecar-schema.d.ts.map +1 -1
  239. package/lib/provider/sidecar/sidecar-schema.js +24 -4
  240. package/lib/provider/sidecar/sidecar-schema.js.map +1 -1
  241. package/lib/provider/transaction/operations/adopt-branch.d.ts.map +1 -1
  242. package/lib/provider/transaction/operations/adopt-branch.js +6 -5
  243. package/lib/provider/transaction/operations/adopt-branch.js.map +1 -1
  244. package/lib/provider/transaction/operations/clean.d.ts.map +1 -1
  245. package/lib/provider/transaction/operations/clean.js +20 -19
  246. package/lib/provider/transaction/operations/clean.js.map +1 -1
  247. package/lib/provider/transaction/operations/create.d.ts +1 -1
  248. package/lib/provider/transaction/operations/create.d.ts.map +1 -1
  249. package/lib/provider/transaction/operations/create.js +23 -13
  250. package/lib/provider/transaction/operations/create.js.map +1 -1
  251. package/lib/provider/transaction/operations/import.d.ts.map +1 -1
  252. package/lib/provider/transaction/operations/import.js +7 -1
  253. package/lib/provider/transaction/operations/import.js.map +1 -1
  254. package/lib/provider/transaction/operations/remove.d.ts.map +1 -1
  255. package/lib/provider/transaction/operations/remove.js +20 -19
  256. package/lib/provider/transaction/operations/remove.js.map +1 -1
  257. package/lib/provider/transaction/recovery/failure-recovery.d.ts.map +1 -1
  258. package/lib/provider/transaction/recovery/failure-recovery.js +19 -18
  259. package/lib/provider/transaction/recovery/failure-recovery.js.map +1 -1
  260. package/lib/provider/transaction/recovery/recover.d.ts.map +1 -1
  261. package/lib/provider/transaction/recovery/recover.js +6 -2
  262. package/lib/provider/transaction/recovery/recover.js.map +1 -1
  263. package/lib/provider/transaction/support/inspection.d.ts.map +1 -1
  264. package/lib/provider/transaction/support/inspection.js +3 -2
  265. package/lib/provider/transaction/support/inspection.js.map +1 -1
  266. package/lib/provider/transaction/support/journal.d.ts.map +1 -1
  267. package/lib/provider/transaction/support/journal.js +8 -5
  268. package/lib/provider/transaction/support/journal.js.map +1 -1
  269. package/lib/provider/transaction/support/path-safety.d.ts.map +1 -1
  270. package/lib/provider/transaction/support/path-safety.js +4 -3
  271. package/lib/provider/transaction/support/path-safety.js.map +1 -1
  272. package/lib/provider/transaction/types.d.ts +2 -1
  273. package/lib/provider/transaction/types.d.ts.map +1 -1
  274. package/lib/provider/types.d.ts +3 -1
  275. package/lib/provider/types.d.ts.map +1 -1
  276. package/lib/provider/types.js +1 -1
  277. package/lib/provider/types.js.map +1 -1
  278. package/lib/provider/worktree-path.d.ts +10 -0
  279. package/lib/provider/worktree-path.d.ts.map +1 -0
  280. package/lib/provider/worktree-path.js +47 -0
  281. package/lib/provider/worktree-path.js.map +1 -0
  282. package/lib/tool/context.d.ts +14 -0
  283. package/lib/tool/context.d.ts.map +1 -0
  284. package/lib/tool/context.js +95 -0
  285. package/lib/tool/context.js.map +1 -0
  286. package/lib/tool/delegation.d.ts +41 -0
  287. package/lib/tool/delegation.d.ts.map +1 -0
  288. package/lib/tool/delegation.js +196 -0
  289. package/lib/tool/delegation.js.map +1 -0
  290. package/lib/tool/errors.d.ts +3 -0
  291. package/lib/tool/errors.d.ts.map +1 -0
  292. package/lib/tool/errors.js +63 -0
  293. package/lib/tool/errors.js.map +1 -0
  294. package/lib/tool/guidance.d.ts +5 -0
  295. package/lib/tool/guidance.d.ts.map +1 -0
  296. package/lib/tool/guidance.js +48 -0
  297. package/lib/tool/guidance.js.map +1 -0
  298. package/lib/tool/history.d.ts +27 -0
  299. package/lib/tool/history.d.ts.map +1 -0
  300. package/lib/tool/history.js +157 -0
  301. package/lib/tool/history.js.map +1 -0
  302. package/lib/tool/index.d.ts +8 -0
  303. package/lib/tool/index.d.ts.map +1 -0
  304. package/lib/tool/index.js +296 -0
  305. package/lib/tool/index.js.map +1 -0
  306. package/lib/tool/inputs.d.ts +12 -0
  307. package/lib/tool/inputs.d.ts.map +1 -0
  308. package/lib/tool/inputs.js +24 -0
  309. package/lib/tool/inputs.js.map +1 -0
  310. package/lib/tool/list-models.d.ts +3 -0
  311. package/lib/tool/list-models.d.ts.map +1 -0
  312. package/lib/tool/list-models.js +38 -0
  313. package/lib/tool/list-models.js.map +1 -0
  314. package/lib/tool/list-sessions.d.ts +3 -0
  315. package/lib/tool/list-sessions.d.ts.map +1 -0
  316. package/lib/tool/list-sessions.js +70 -0
  317. package/lib/tool/list-sessions.js.map +1 -0
  318. package/lib/tool/list-worktrees.d.ts +3 -0
  319. package/lib/tool/list-worktrees.d.ts.map +1 -0
  320. package/lib/tool/list-worktrees.js +39 -0
  321. package/lib/tool/list-worktrees.js.map +1 -0
  322. package/lib/tool/native-session.d.ts +74 -0
  323. package/lib/tool/native-session.d.ts.map +1 -0
  324. package/lib/tool/native-session.js +248 -0
  325. package/lib/tool/native-session.js.map +1 -0
  326. package/lib/tool/new-worktree.d.ts +3 -0
  327. package/lib/tool/new-worktree.d.ts.map +1 -0
  328. package/lib/tool/new-worktree.js +81 -0
  329. package/lib/tool/new-worktree.js.map +1 -0
  330. package/lib/tool/outputs.d.ts +50 -0
  331. package/lib/tool/outputs.d.ts.map +1 -0
  332. package/lib/tool/outputs.js +65 -0
  333. package/lib/tool/outputs.js.map +1 -0
  334. package/lib/tool/report-result.d.ts +3 -0
  335. package/lib/tool/report-result.d.ts.map +1 -0
  336. package/lib/tool/report-result.js +83 -0
  337. package/lib/tool/report-result.js.map +1 -0
  338. package/lib/tool/schema.d.ts +7 -0
  339. package/lib/tool/schema.d.ts.map +1 -0
  340. package/lib/tool/schema.js +92 -0
  341. package/lib/tool/schema.js.map +1 -0
  342. package/lib/tool/send-message.d.ts +3 -0
  343. package/lib/tool/send-message.d.ts.map +1 -0
  344. package/lib/tool/send-message.js +64 -0
  345. package/lib/tool/send-message.js.map +1 -0
  346. package/lib/tool/span-worktree.d.ts +3 -0
  347. package/lib/tool/span-worktree.d.ts.map +1 -0
  348. package/lib/tool/span-worktree.js +114 -0
  349. package/lib/tool/span-worktree.js.map +1 -0
  350. package/lib/tool/types.d.ts +54 -0
  351. package/lib/tool/types.d.ts.map +1 -0
  352. package/lib/tool/types.js +2 -0
  353. package/lib/tool/types.js.map +1 -0
  354. package/lib/typert.host.js +215 -44
  355. package/lib/typert.remote-client.d.ts +7 -1
  356. package/lib/typert.remote-client.d.ts.map +1 -1
  357. package/lib/typert.remote-client.js +215 -44
  358. package/package.json +14 -2
@@ -0,0 +1,98 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { mkdir, open, readFile, rename, unlink } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { WORKTREE_TOOL_IDS, } from '../contract/tool-settings.js';
5
+ /** Preferences have their own files; relationship shards never contain tool configuration. */
6
+ export class WorktreeToolSettings {
7
+ dshHome;
8
+ queue = Promise.resolve();
9
+ listeners = new Set();
10
+ constructor(dshHome) {
11
+ this.dshHome = dshHome;
12
+ }
13
+ subscribe(listener) {
14
+ this.listeners.add(listener);
15
+ return () => this.listeners.delete(listener);
16
+ }
17
+ filename(scope) {
18
+ const root = path.join(this.dshHome, 'clutch-dsh-worktree', 'tool-settings');
19
+ if (scope.kind === 'general')
20
+ return path.join(root, 'general.json');
21
+ if (scope.kind === 'local' && scope.workspaceId)
22
+ return path.join(root, 'locals', 'ws-' + encodeURIComponent(scope.workspaceId) + '.json');
23
+ if (scope.kind !== 'worktree' || !scope.workspaceId || !scope.worktreeId)
24
+ throw new Error('Invalid tool settings scope');
25
+ return path.join(root, 'worktrees', 'ws-' + encodeURIComponent(scope.workspaceId), 'wt-' + encodeURIComponent(scope.worktreeId) + '.json');
26
+ }
27
+ async read(scope) {
28
+ try {
29
+ const text = await readFile(this.filename(scope), 'utf8');
30
+ if (text.length > 32_000)
31
+ throw new Error('Tool settings file is too large');
32
+ const data = JSON.parse(text);
33
+ if (data.version !== 1)
34
+ throw new Error('Unsupported tool settings version');
35
+ return normalizeToolSelection(data.selection);
36
+ }
37
+ catch (error) {
38
+ if (error.code !== 'ENOENT')
39
+ throw error;
40
+ return { enabled: false, tools: [...WORKTREE_TOOL_IDS] };
41
+ }
42
+ }
43
+ update(scope, selection, expected) {
44
+ const operation = this.queue.then(async () => {
45
+ const next = normalizeToolSelection(selection);
46
+ const current = await this.read(scope);
47
+ if (JSON.stringify(current) !== JSON.stringify(normalizeToolSelection(expected)))
48
+ throw new Error('Tool settings changed elsewhere. Reload the settings and try again.');
49
+ const filename = this.filename(scope);
50
+ const directory = path.dirname(filename);
51
+ await mkdir(directory, { recursive: true });
52
+ const temporary = filename + '.' + randomUUID() + '.tmp';
53
+ try {
54
+ const handle = await open(temporary, 'wx', 0o600);
55
+ try {
56
+ await handle.writeFile(JSON.stringify({ version: 1, selection: next }) + '\n');
57
+ await handle.sync();
58
+ }
59
+ finally {
60
+ await handle.close();
61
+ }
62
+ await rename(temporary, filename);
63
+ // Only directory syncing is best effort; file syncing must succeed before publication.
64
+ try {
65
+ const directoryHandle = await open(directory, 'r');
66
+ try {
67
+ await directoryHandle.sync();
68
+ }
69
+ finally {
70
+ await directoryHandle.close();
71
+ }
72
+ }
73
+ catch {
74
+ /* Filesystems may not support directory syncing. */
75
+ }
76
+ }
77
+ finally {
78
+ await unlink(temporary).catch(() => undefined);
79
+ }
80
+ for (const listener of this.listeners)
81
+ listener(scope, next);
82
+ return next;
83
+ });
84
+ this.queue = operation.catch(() => undefined);
85
+ return operation;
86
+ }
87
+ }
88
+ export function normalizeToolSelection(value) {
89
+ const selection = value;
90
+ if (!selection ||
91
+ typeof selection.enabled !== 'boolean' ||
92
+ !Array.isArray(selection.tools) ||
93
+ selection.tools.some((tool) => !WORKTREE_TOOL_IDS.includes(tool)))
94
+ throw new Error('Invalid Worktree tool selection');
95
+ const tools = WORKTREE_TOOL_IDS.filter((tool) => selection.tools.includes(tool));
96
+ return { enabled: selection.enabled && tools.length > 0, tools };
97
+ }
98
+ //# sourceMappingURL=tool-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-settings.js","sourceRoot":"","sources":["../../src/host/tool-settings.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"worktree-permission-manager.d.ts","sourceRoot":"","sources":["../../src/host/worktree-permission-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,yBAAyB,EAEzB,sBAAsB,EAGvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI3D,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,eAAe,GAAG,cAAc,CAAC,CAAC;IAC1E,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,sBAAsB,CAAC;CAC/C;AAyBD;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,gCAAgC,GACxC,yBAAyB,CAmJ3B"}
1
+ {"version":3,"file":"worktree-permission-manager.d.ts","sourceRoot":"","sources":["../../src/host/worktree-permission-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,yBAAyB,EAEzB,sBAAsB,EAGvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI3D,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,eAAe,GAAG,cAAc,CAAC,CAAC;IAC1E,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,sBAAsB,CAAC;CAC/C;AAyBD;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,gCAAgC,GACxC,yBAAyB,CAkJ3B"}
@@ -1,6 +1,5 @@
1
- import path from 'node:path';
2
1
  import { providerError } from '../provider/types.js';
3
- import { samePhysicalPath } from '../provider/path-identity.js';
2
+ import { boundSessionCwdMatchesWorktree } from '../provider/worktree-path.js';
4
3
  function unverified() {
5
4
  return { status: 'unverified', retryable: true };
6
5
  }
@@ -60,8 +59,7 @@ export function createWorktreePermissionManager(options) {
60
59
  sessionId: input.sessionId,
61
60
  });
62
61
  }
63
- const sessionCwdMatches = path.isAbsolute(session.cwd) &&
64
- await samePhysicalPath(session.cwd, worktree.absolutePath);
62
+ const sessionCwdMatches = await boundSessionCwdMatchesWorktree(session.cwd, worktree);
65
63
  if ((session.workspaceId !== undefined && session.workspaceId !== workspace.workspaceId) ||
66
64
  !sessionCwdMatches) {
67
65
  throw providerError('SESSION_CWD_MISMATCH', `Session "${input.sessionId}" does not belong to this Worktree`, {
@@ -1 +1 @@
1
- {"version":3,"file":"worktree-permission-manager.js","sourceRoot":"","sources":["../../src/host/worktree-permission-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worktree-permission-manager.js","sourceRoot":"","sources":["../../src/host/worktree-permission-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { WorktreeToolChangeBatch } from '../contract/worktree-tool-changes.js';
2
+ /** Coalesced identities and bounded long-poll lifetime; no Git or Session facts. */
3
+ export declare class WorktreeToolChanges {
4
+ private revision;
5
+ private readonly latest;
6
+ private readonly waiters;
7
+ private disposed;
8
+ changed(workspaceId: string, worktreeId: string): void;
9
+ watch(afterRevision: number, signal: AbortSignal): Promise<WorktreeToolChangeBatch>;
10
+ dispose(): void;
11
+ }
12
+ //# sourceMappingURL=worktree-tool-changes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-tool-changes.d.ts","sourceRoot":"","sources":["../../src/host/worktree-tool-changes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAEpF,oFAAoF;AACpF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGnB;IACJ,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAUhD,KAAK,CACT,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,uBAAuB,CAAC;IAgCnC,OAAO,IAAI,IAAI;CAKhB"}
@@ -0,0 +1,60 @@
1
+ /** Coalesced identities and bounded long-poll lifetime; no Git or Session facts. */
2
+ export class WorktreeToolChanges {
3
+ revision = 0;
4
+ latest = new Map();
5
+ waiters = new Set();
6
+ disposed = false;
7
+ changed(workspaceId, worktreeId) {
8
+ if (this.disposed)
9
+ return;
10
+ this.latest.set(workspaceId, {
11
+ revision: ++this.revision,
12
+ workspaceId,
13
+ worktreeId,
14
+ });
15
+ for (const wake of [...this.waiters])
16
+ wake();
17
+ }
18
+ async watch(afterRevision, signal) {
19
+ signal.throwIfAborted();
20
+ if (!Number.isSafeInteger(afterRevision) || afterRevision < 0)
21
+ throw new Error('Invalid revision');
22
+ if (this.disposed)
23
+ throw new Error('Worktree plugin is disposed');
24
+ if (afterRevision === this.revision) {
25
+ await new Promise((resolve, reject) => {
26
+ const done = (error) => {
27
+ clearTimeout(timer);
28
+ this.waiters.delete(wake);
29
+ signal.removeEventListener('abort', abort);
30
+ if (error)
31
+ reject(error);
32
+ else
33
+ resolve();
34
+ };
35
+ const wake = () => done();
36
+ const abort = () => done(signal.reason ?? new Error('Aborted'));
37
+ const timer = setTimeout(wake, 20000);
38
+ this.waiters.add(wake);
39
+ signal.addEventListener('abort', abort, { once: true });
40
+ });
41
+ }
42
+ signal.throwIfAborted();
43
+ if (this.disposed)
44
+ throw new Error('Worktree plugin is disposed');
45
+ const baseline = afterRevision > this.revision ? 0 : afterRevision;
46
+ return {
47
+ revision: this.revision,
48
+ changes: [...this.latest.values()]
49
+ .filter((change) => change.revision > baseline)
50
+ .map(({ workspaceId, worktreeId }) => ({ workspaceId, worktreeId })),
51
+ };
52
+ }
53
+ dispose() {
54
+ this.disposed = true;
55
+ for (const wake of [...this.waiters])
56
+ wake();
57
+ this.latest.clear();
58
+ }
59
+ }
60
+ //# sourceMappingURL=worktree-tool-changes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-tool-changes.js","sourceRoot":"","sources":["../../src/host/worktree-tool-changes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"manager-git-history.d.ts","sourceRoot":"","sources":["../../src/manage/manager-git-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAElC,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,EAExB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AA4RnE,iFAAiF;AACjF,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE;IACL,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC,GACA,OAAO,CAAC,MAAM,CAAC,CA4EjB;AAwRD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACjG,OAAO,CAAC,kBAAkB,CAAC,CA8C7B;AAuYD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAiEjC;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,mBAAmB,CAAC,CA0I9B"}
1
+ {"version":3,"file":"manager-git-history.d.ts","sourceRoot":"","sources":["../../src/manage/manager-git-history.ts"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAElC,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,EAExB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AA4RnE,iFAAiF;AACjF,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE;IACL,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC,GACA,OAAO,CAAC,MAAM,CAAC,CA4EjB;AAwRD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACjG,OAAO,CAAC,kBAAkB,CAAC,CA8C7B;AAuYD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAiEjC;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,mBAAmB,CAAC,CA0I9B"}
@@ -1,3 +1,4 @@
1
+ import { gitWorktreeRoot } from '../contract/index.js';
1
2
  import { WORKTREE_GIT_COMMIT_PATTERN, WORKTREE_GIT_SUMMARY, WORKTREE_GIT_WORKING_TREE, } from '../contract/index.js';
2
3
  import { providerError } from '../provider/types.js';
3
4
  import { isDirectory, requireWorkspace, samePhysicalPath } from './manager-support.js';
@@ -85,22 +86,22 @@ async function resolveWorktree(context, input) {
85
86
  worktreeId: input.worktreeId,
86
87
  });
87
88
  }
88
- if (!(await isDirectory(record.absolutePath))) {
89
- throw providerError('WORKTREE_NOT_FOUND', `Worktree directory is unavailable: ${record.absolutePath}`, {
89
+ if (!(await isDirectory(gitWorktreeRoot(record)))) {
90
+ throw providerError('WORKTREE_NOT_FOUND', `Worktree directory is unavailable: ${gitWorktreeRoot(record)}`, {
90
91
  workspaceId: input.workspaceId,
91
92
  worktreeId: input.worktreeId,
92
- absolutePath: record.absolutePath,
93
+ absolutePath: gitWorktreeRoot(record),
93
94
  });
94
95
  }
95
96
  const repositoryRoot = context.git.resolveRepositoryRoot
96
97
  ? await context.git.resolveRepositoryRoot(workspace.rootPath, { signal: context.signal })
97
98
  : workspace.rootPath;
98
- const live = await findLiveWorktree(await context.git.listWorktrees(repositoryRoot, { signal: context.signal }), record.absolutePath);
99
+ const live = await findLiveWorktree(await context.git.listWorktrees(repositoryRoot, { signal: context.signal }), gitWorktreeRoot(record));
99
100
  if (!live) {
100
- throw providerError('WORKTREE_NOT_FOUND', `Git Worktree registration is unavailable: ${record.absolutePath}`, {
101
+ throw providerError('WORKTREE_NOT_FOUND', `Git Worktree registration is unavailable: ${gitWorktreeRoot(record)}`, {
101
102
  workspaceId: input.workspaceId,
102
103
  worktreeId: input.worktreeId,
103
- absolutePath: record.absolutePath,
104
+ absolutePath: gitWorktreeRoot(record),
104
105
  });
105
106
  }
106
107
  return {
@@ -155,7 +156,7 @@ async function resolveLocalBranchCommit(context, resolved, baseBranch, options =
155
156
  return undefined;
156
157
  unavailable();
157
158
  }
158
- const commit = await resolveCommit(resolved.record.absolutePath, baseBranch, {
159
+ const commit = await resolveCommit(gitWorktreeRoot(resolved.record), baseBranch, {
159
160
  signal: context.signal,
160
161
  });
161
162
  if (!COMMIT_PATTERN.test(commit)) {
@@ -182,7 +183,7 @@ async function resolveSelectedBaseline(context, resolved, rawBranch) {
182
183
  const headCommit = await baselineHeadCommit(context, resolved);
183
184
  const findMergeBase = gitReadOptional(context, 'findMergeBase');
184
185
  const mergeBase = headCommit !== undefined && findMergeBase !== undefined
185
- ? await findMergeBase(resolved.record.absolutePath, commit, headCommit, { signal: context.signal })
186
+ ? await findMergeBase(gitWorktreeRoot(resolved.record), commit, headCommit, { signal: context.signal })
186
187
  : undefined;
187
188
  if (mergeBase !== undefined && !COMMIT_PATTERN.test(mergeBase)) {
188
189
  throw providerError('GIT_OPERATION_FAILED', 'Git returned an invalid selected branch merge base', {
@@ -284,7 +285,7 @@ async function resolveBaseline(context, resolved, requestedBaseBranch) {
284
285
  });
285
286
  }
286
287
  const commit = context.git.resolveCommit
287
- ? await context.git.resolveCommit(record.absolutePath, record.baseCommit, { signal: context.signal })
288
+ ? await context.git.resolveCommit(gitWorktreeRoot(record), record.baseCommit, { signal: context.signal })
288
289
  : record.baseCommit;
289
290
  return {
290
291
  baseline: {
@@ -305,7 +306,7 @@ async function resolveBaseline(context, resolved, requestedBaseBranch) {
305
306
  if (currentBranch === undefined || currentBranch === record.baseBranch || context.git.findMergeBase === undefined) {
306
307
  return undefined;
307
308
  }
308
- const commit = await context.git.findMergeBase(record.absolutePath, record.baseBranch, 'HEAD', { signal: context.signal });
309
+ const commit = await context.git.findMergeBase(gitWorktreeRoot(record), record.baseBranch, 'HEAD', { signal: context.signal });
309
310
  if (commit === undefined)
310
311
  return undefined;
311
312
  if (!COMMIT_PATTERN.test(commit)) {
@@ -336,7 +337,7 @@ async function baselineHeadCommit(context, resolved) {
336
337
  const resolveCommit = gitReadOptional(context, 'resolveCommit');
337
338
  return resolveCommit === undefined
338
339
  ? undefined
339
- : await resolveCommit(resolved.record.absolutePath, 'HEAD', { signal: context.signal });
340
+ : await resolveCommit(gitWorktreeRoot(resolved.record), 'HEAD', { signal: context.signal });
340
341
  }
341
342
  /** Count commits unique to each head for one resolved comparison boundary. */
342
343
  async function readCommitDivergence(context, resolved, comparison, head) {
@@ -345,7 +346,7 @@ async function readCommitDivergence(context, resolved, comparison, head) {
345
346
  return undefined;
346
347
  // Count each branch from its current tip. The tree boundary may be the
347
348
  // merge base, but ahead/behind must include commits unique to both heads.
348
- return getCommitDivergence(resolved.record.absolutePath, comparison.baseHeadCommit, head, { signal: context.signal });
349
+ return getCommitDivergence(gitWorktreeRoot(resolved.record), comparison.baseHeadCommit, head, { signal: context.signal });
349
350
  }
350
351
  /**
351
352
  * Authorize commit SHAs against one pinned comparison projection.
@@ -369,7 +370,7 @@ async function authorizeCommits(context, resolved, comparison, candidates) {
369
370
  return candidate;
370
371
  });
371
372
  const listCommits = gitRead(context, 'listCommits', worktreeId);
372
- const history = await listCommits(resolved.record.absolutePath, comparison.baseHeadCommit, {
373
+ const history = await listCommits(gitWorktreeRoot(resolved.record), comparison.baseHeadCommit, {
373
374
  signal: context.signal,
374
375
  });
375
376
  const members = new Set(history.commits.map((commit) => commit.sha));
@@ -493,10 +494,10 @@ export async function listWorktreeCommits(context, input) {
493
494
  const readWorkingTreePaths = gitReadOptional(context, 'listWorkingTreeChangedPaths')
494
495
  ?? gitReadOptional(context, 'listWorkingTreeFiles');
495
496
  const [history, workingTreeFiles] = await Promise.all([
496
- listCommits(resolved.value.record.absolutePath, baseline.baseHeadCommit, { signal: context.signal }),
497
+ listCommits(gitWorktreeRoot(resolved.value.record), baseline.baseHeadCommit, { signal: context.signal }),
497
498
  readWorkingTreePaths === undefined
498
499
  ? Promise.resolve({ files: [], truncated: false })
499
- : readWorkingTreePaths(resolved.value.record.absolutePath, { signal: context.signal }),
500
+ : readWorkingTreePaths(gitWorktreeRoot(resolved.value.record), { signal: context.signal }),
500
501
  ]);
501
502
  const divergence = await readCommitDivergence(context, resolved.value, baseline, history.headCommit);
502
503
  return {
@@ -609,7 +610,7 @@ async function authorizeLiveSummaryHead(context, resolved) {
609
610
  const resolveCommit = gitReadOptional(context, 'resolveCommit');
610
611
  if (resolveCommit === undefined)
611
612
  return;
612
- const currentHead = await resolveCommit(resolved.record.absolutePath, 'HEAD', { signal: context.signal });
613
+ const currentHead = await resolveCommit(gitWorktreeRoot(resolved.record), 'HEAD', { signal: context.signal });
613
614
  if (!COMMIT_PATTERN.test(currentHead)) {
614
615
  throw providerError('GIT_OPERATION_FAILED', 'Git returned an invalid live Worktree HEAD', {
615
616
  worktreeId: resolved.record.worktreeId,
@@ -620,19 +621,19 @@ async function listSummaryFiles(context, resolved, selection, baseCommit, headCo
620
621
  if (selection.includeWorkingTree === true) {
621
622
  const listWorkingTreeDiffFiles = gitRead(context, 'listWorkingTreeDiffFiles', resolved.record.worktreeId);
622
623
  await authorizeLiveSummaryHead(context, resolved);
623
- return listWorkingTreeDiffFiles(resolved.record.absolutePath, baseCommit, { signal: context.signal });
624
+ return listWorkingTreeDiffFiles(gitWorktreeRoot(resolved.record), baseCommit, { signal: context.signal });
624
625
  }
625
626
  const listDiffFiles = gitRead(context, 'listDiffFiles', resolved.record.worktreeId);
626
- return listDiffFiles(resolved.record.absolutePath, baseCommit, headCommit, { signal: context.signal });
627
+ return listDiffFiles(gitWorktreeRoot(resolved.record), baseCommit, headCommit, { signal: context.signal });
627
628
  }
628
629
  async function readSummaryFileDiff(context, resolved, selection, baseCommit, headCommit, filePath) {
629
630
  if (selection.includeWorkingTree === true) {
630
631
  const readWorkingTreeDiffFileDiff = gitRead(context, 'readWorkingTreeDiffFileDiff', resolved.record.worktreeId);
631
632
  await authorizeLiveSummaryHead(context, resolved);
632
- return readWorkingTreeDiffFileDiff(resolved.record.absolutePath, baseCommit, filePath, { signal: context.signal });
633
+ return readWorkingTreeDiffFileDiff(gitWorktreeRoot(resolved.record), baseCommit, filePath, { signal: context.signal });
633
634
  }
634
635
  const readDiffFileDiff = gitRead(context, 'readDiffFileDiff', resolved.record.worktreeId);
635
- return readDiffFileDiff(resolved.record.absolutePath, baseCommit, headCommit, filePath, { signal: context.signal });
636
+ return readDiffFileDiff(gitWorktreeRoot(resolved.record), baseCommit, headCommit, filePath, { signal: context.signal });
636
637
  }
637
638
  async function selectedAggregateFileDiff(context, absolutePath, worktreeId, selection, commits, requestedPath) {
638
639
  if (requestedPath.length === 0) {
@@ -701,7 +702,7 @@ async function listAggregateFiles(context, resolved, selection, requestedBaseBra
701
702
  ...(read.truncated ? { truncated: true } : {}),
702
703
  };
703
704
  }
704
- const groups = await selectedCommitFiles(context, resolved.record.absolutePath, resolved.record.worktreeId, authorized.commits);
705
+ const groups = await selectedCommitFiles(context, gitWorktreeRoot(resolved.record), resolved.record.worktreeId, authorized.commits);
705
706
  return {
706
707
  commit: authorized.commits[0],
707
708
  selection: authorized.selection,
@@ -733,7 +734,7 @@ async function aggregateFileDiff(context, resolved, selection, requestedPath, re
733
734
  selection: authorized.selection,
734
735
  };
735
736
  }
736
- return selectedAggregateFileDiff(context, resolved.record.absolutePath, resolved.record.worktreeId, authorized.selection, authorized.commits, requestedPath);
737
+ return selectedAggregateFileDiff(context, gitWorktreeRoot(resolved.record), resolved.record.worktreeId, authorized.selection, authorized.commits, requestedPath);
737
738
  }
738
739
  export async function listWorktreeCommitFiles(context, input) {
739
740
  const resolved = await resolveWorktree(context, input);
@@ -767,7 +768,7 @@ export async function listWorktreeCommitFiles(context, input) {
767
768
  if (commit === WORKTREE_GIT_WORKING_TREE) {
768
769
  await authorizeWorkingTree(context, resolved.value, input.baseBranch);
769
770
  const listWorkingTreeFiles = gitRead(context, 'listWorkingTreeFiles', input.worktreeId);
770
- const read = await listWorkingTreeFiles(resolved.value.record.absolutePath, { signal: context.signal });
771
+ const read = await listWorkingTreeFiles(gitWorktreeRoot(resolved.value.record), { signal: context.signal });
771
772
  return {
772
773
  commit: WORKTREE_GIT_WORKING_TREE,
773
774
  files: read.files,
@@ -776,7 +777,7 @@ export async function listWorktreeCommitFiles(context, input) {
776
777
  }
777
778
  const authorized = await authorizeCommit(context, resolved.value, commit, input.baseBranch);
778
779
  const listCommitFiles = gitRead(context, 'listCommitFiles', input.worktreeId);
779
- const read = await listCommitFiles(resolved.value.record.absolutePath, authorized.commit, { signal: context.signal });
780
+ const read = await listCommitFiles(gitWorktreeRoot(resolved.value.record), authorized.commit, { signal: context.signal });
780
781
  return {
781
782
  commit: authorized.commit,
782
783
  files: read.files,
@@ -848,7 +849,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
848
849
  // untracked file on each file click.
849
850
  const readChangedPaths = gitReadOptional(context, 'listWorkingTreeChangedPaths')
850
851
  ?? gitRead(context, 'listWorkingTreeFiles', input.worktreeId);
851
- const readPaths = await readChangedPaths(resolved.value.record.absolutePath, { signal: context.signal });
852
+ const readPaths = await readChangedPaths(gitWorktreeRoot(resolved.value.record), { signal: context.signal });
852
853
  const changedFile = findChangedFile(readPaths.files, input.path);
853
854
  if (changedFile === undefined) {
854
855
  throw providerError('WORKTREE_STATE_CONFLICT', 'The requested path is not changed in the working tree', {
@@ -857,7 +858,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
857
858
  path: input.path,
858
859
  });
859
860
  }
860
- const diff = await readWorkingTreeFileDiff(resolved.value.record.absolutePath, changedFile.path, { signal: context.signal });
861
+ const diff = await readWorkingTreeFileDiff(gitWorktreeRoot(resolved.value.record), changedFile.path, { signal: context.signal });
861
862
  return {
862
863
  ...diff,
863
864
  commit: WORKTREE_GIT_WORKING_TREE,
@@ -869,7 +870,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
869
870
  const listCommitFiles = gitRead(context, 'listCommitFiles', input.worktreeId);
870
871
  // The changed-file projection is the authorization boundary for the path, so
871
872
  // the diff is only read for an exact member of that projection.
872
- const filesRead = await listCommitFiles(resolved.value.record.absolutePath, authorized.commit, { signal: context.signal });
873
+ const filesRead = await listCommitFiles(gitWorktreeRoot(resolved.value.record), authorized.commit, { signal: context.signal });
873
874
  const changedFile = findChangedFile(filesRead.files, input.path);
874
875
  if (changedFile === undefined) {
875
876
  throw providerError('WORKTREE_STATE_CONFLICT', 'The requested path is not changed by this commit', {
@@ -878,7 +879,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
878
879
  path: input.path,
879
880
  });
880
881
  }
881
- const diff = await readCommitFileDiff(resolved.value.record.absolutePath, authorized.commit, changedFile.path, { signal: context.signal });
882
+ const diff = await readCommitFileDiff(gitWorktreeRoot(resolved.value.record), authorized.commit, changedFile.path, { signal: context.signal });
882
883
  return {
883
884
  ...diff,
884
885
  commit: authorized.commit,