@cerbur/clutch-dsh-worktree 0.1.15 → 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 (367) hide show
  1. package/README.md +243 -22
  2. package/README.zh.md +203 -20
  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 +35 -11
  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 +11 -0
  18. package/lib/client/dashboard/DashboardRequest.d.ts.map +1 -0
  19. package/lib/client/dashboard/DashboardRequest.js +38 -0
  20. package/lib/client/dashboard/DashboardRequest.js.map +1 -0
  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 +89 -59
  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 -42
  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 +57 -1
  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 +150 -0
  60. package/lib/client/locales.d.ts.map +1 -1
  61. package/lib/client/locales.js +208 -58
  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 +6 -0
  67. package/lib/client/overlay/sidebar-overlay-geometry.d.ts.map +1 -1
  68. package/lib/client/overlay/sidebar-overlay-geometry.js +180 -32
  69. package/lib/client/overlay/sidebar-overlay-geometry.js.map +1 -1
  70. package/lib/client/restart-notice.d.ts +25 -0
  71. package/lib/client/restart-notice.d.ts.map +1 -0
  72. package/lib/client/restart-notice.js +97 -0
  73. package/lib/client/restart-notice.js.map +1 -0
  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/AnimatedTree.d.ts +32 -0
  113. package/lib/client/surface/components/AnimatedTree.d.ts.map +1 -0
  114. package/lib/client/surface/components/AnimatedTree.js +139 -0
  115. package/lib/client/surface/components/AnimatedTree.js.map +1 -0
  116. package/lib/client/surface/components/NotificationToasts.d.ts +19 -3
  117. package/lib/client/surface/components/NotificationToasts.d.ts.map +1 -1
  118. package/lib/client/surface/components/NotificationToasts.js +73 -7
  119. package/lib/client/surface/components/NotificationToasts.js.map +1 -1
  120. package/lib/client/surface/components/OverlayScrollbar.d.ts +6 -0
  121. package/lib/client/surface/components/OverlayScrollbar.d.ts.map +1 -0
  122. package/lib/client/surface/components/OverlayScrollbar.js +84 -0
  123. package/lib/client/surface/components/OverlayScrollbar.js.map +1 -0
  124. package/lib/client/surface/components/RestartToast.d.ts +6 -0
  125. package/lib/client/surface/components/RestartToast.d.ts.map +1 -0
  126. package/lib/client/surface/components/RestartToast.js +11 -0
  127. package/lib/client/surface/components/RestartToast.js.map +1 -0
  128. package/lib/client/surface/components/SurfaceContent.d.ts.map +1 -1
  129. package/lib/client/surface/components/SurfaceContent.js +110 -39
  130. package/lib/client/surface/components/SurfaceContent.js.map +1 -1
  131. package/lib/client/surface/components/WorkspaceTree.d.ts.map +1 -1
  132. package/lib/client/surface/components/WorkspaceTree.js +7 -2
  133. package/lib/client/surface/components/WorkspaceTree.js.map +1 -1
  134. package/lib/client/surface/components/dialogs.d.ts.map +1 -1
  135. package/lib/client/surface/components/dialogs.js +16 -10
  136. package/lib/client/surface/components/dialogs.js.map +1 -1
  137. package/lib/client/surface/components/rows.d.ts +1 -1
  138. package/lib/client/surface/components/rows.d.ts.map +1 -1
  139. package/lib/client/surface/components/rows.js +24 -101
  140. package/lib/client/surface/components/rows.js.map +1 -1
  141. package/lib/client/surface/notification-queue.d.ts +15 -0
  142. package/lib/client/surface/notification-queue.d.ts.map +1 -1
  143. package/lib/client/surface/notification-queue.js +13 -2
  144. package/lib/client/surface/notification-queue.js.map +1 -1
  145. package/lib/client/surface/state/useSurfaceRefresh.d.ts +1 -1
  146. package/lib/client/surface/state/useSurfaceRefresh.d.ts.map +1 -1
  147. package/lib/client/surface/state/useSurfaceRefresh.js +13 -1
  148. package/lib/client/surface/state/useSurfaceRefresh.js.map +1 -1
  149. package/lib/client/surface/state/useSurfaceSources.d.ts +2 -1
  150. package/lib/client/surface/state/useSurfaceSources.d.ts.map +1 -1
  151. package/lib/client/surface/state/useSurfaceSources.js +7 -5
  152. package/lib/client/surface/state/useSurfaceSources.js.map +1 -1
  153. package/lib/client/surface/state/useTitleMarquee.d.ts +7 -0
  154. package/lib/client/surface/state/useTitleMarquee.d.ts.map +1 -0
  155. package/lib/client/surface/state/useTitleMarquee.js +60 -0
  156. package/lib/client/surface/state/useTitleMarquee.js.map +1 -0
  157. package/lib/client/surface/types.d.ts +8 -1
  158. package/lib/client/surface/types.d.ts.map +1 -1
  159. package/lib/client/view/worktree-error-copy.d.ts.map +1 -1
  160. package/lib/client/view/worktree-error-copy.js +69 -8
  161. package/lib/client/view/worktree-error-copy.js.map +1 -1
  162. package/lib/client/view/worktree-view-errors.d.ts.map +1 -1
  163. package/lib/client/view/worktree-view-errors.js +13 -5
  164. package/lib/client/view/worktree-view-errors.js.map +1 -1
  165. package/lib/client/view/worktree-view-read.d.ts +3 -0
  166. package/lib/client/view/worktree-view-read.d.ts.map +1 -1
  167. package/lib/client/view/worktree-view-read.js +9 -0
  168. package/lib/client/view/worktree-view-read.js.map +1 -1
  169. package/lib/client/worktree-connection.d.ts +14 -2
  170. package/lib/client/worktree-connection.d.ts.map +1 -1
  171. package/lib/client/worktree-connection.js +20 -2
  172. package/lib/client/worktree-connection.js.map +1 -1
  173. package/lib/client/worktree-tool-changes.d.ts +13 -0
  174. package/lib/client/worktree-tool-changes.d.ts.map +1 -0
  175. package/lib/client/worktree-tool-changes.js +64 -0
  176. package/lib/client/worktree-tool-changes.js.map +1 -0
  177. package/lib/client.js +2791 -1131
  178. package/lib/client.js.map +1 -1
  179. package/lib/contract/index.d.ts +12 -2
  180. package/lib/contract/index.d.ts.map +1 -1
  181. package/lib/contract/index.js +10 -0
  182. package/lib/contract/index.js.map +1 -1
  183. package/lib/contract/tool-settings.d.ts +28 -0
  184. package/lib/contract/tool-settings.d.ts.map +1 -0
  185. package/lib/contract/tool-settings.js +10 -0
  186. package/lib/contract/tool-settings.js.map +1 -0
  187. package/lib/contract/worktree-tool-changes.d.ts +10 -0
  188. package/lib/contract/worktree-tool-changes.d.ts.map +1 -0
  189. package/lib/contract/worktree-tool-changes.js +2 -0
  190. package/lib/contract/worktree-tool-changes.js.map +1 -0
  191. package/lib/host/permission-preset-append.d.ts +15 -0
  192. package/lib/host/permission-preset-append.d.ts.map +1 -0
  193. package/lib/host/permission-preset-append.js +63 -0
  194. package/lib/host/permission-preset-append.js.map +1 -0
  195. package/lib/host/service.d.ts +17 -0
  196. package/lib/host/service.d.ts.map +1 -1
  197. package/lib/host/service.js +67 -11
  198. package/lib/host/service.js.map +1 -1
  199. package/lib/host/tool-settings.d.ts +14 -0
  200. package/lib/host/tool-settings.d.ts.map +1 -0
  201. package/lib/host/tool-settings.js +98 -0
  202. package/lib/host/tool-settings.js.map +1 -0
  203. package/lib/host/worktree-permission-manager.d.ts.map +1 -1
  204. package/lib/host/worktree-permission-manager.js +2 -4
  205. package/lib/host/worktree-permission-manager.js.map +1 -1
  206. package/lib/host/worktree-tool-changes.d.ts +12 -0
  207. package/lib/host/worktree-tool-changes.d.ts.map +1 -0
  208. package/lib/host/worktree-tool-changes.js +60 -0
  209. package/lib/host/worktree-tool-changes.js.map +1 -0
  210. package/lib/manage/manager-git-history.d.ts.map +1 -1
  211. package/lib/manage/manager-git-history.js +43 -38
  212. package/lib/manage/manager-git-history.js.map +1 -1
  213. package/lib/manage/manager-sessions.d.ts +5 -0
  214. package/lib/manage/manager-sessions.d.ts.map +1 -1
  215. package/lib/manage/manager-sessions.js +35 -12
  216. package/lib/manage/manager-sessions.js.map +1 -1
  217. package/lib/manage/manager-support.d.ts +10 -2
  218. package/lib/manage/manager-support.d.ts.map +1 -1
  219. package/lib/manage/manager-support.js +90 -14
  220. package/lib/manage/manager-support.js.map +1 -1
  221. package/lib/manage/manager-worktree-lifecycle.d.ts.map +1 -1
  222. package/lib/manage/manager-worktree-lifecycle.js +5 -4
  223. package/lib/manage/manager-worktree-lifecycle.js.map +1 -1
  224. package/lib/manage/manager-worktrees.d.ts +1 -0
  225. package/lib/manage/manager-worktrees.d.ts.map +1 -1
  226. package/lib/manage/manager-worktrees.js +80 -26
  227. package/lib/manage/manager-worktrees.js.map +1 -1
  228. package/lib/manage/manager.d.ts +10 -0
  229. package/lib/manage/manager.d.ts.map +1 -1
  230. package/lib/manage/manager.js +14 -3
  231. package/lib/manage/manager.js.map +1 -1
  232. package/lib/manage/types.d.ts +10 -1
  233. package/lib/manage/types.d.ts.map +1 -1
  234. package/lib/provider/generated-name.d.ts.map +1 -1
  235. package/lib/provider/generated-name.js +5 -4
  236. package/lib/provider/generated-name.js.map +1 -1
  237. package/lib/provider/git/adapter.d.ts.map +1 -1
  238. package/lib/provider/git/adapter.js +5 -2
  239. package/lib/provider/git/adapter.js.map +1 -1
  240. package/lib/provider/mutation-token.d.ts +1 -1
  241. package/lib/provider/mutation-token.d.ts.map +1 -1
  242. package/lib/provider/mutation-token.js +1 -0
  243. package/lib/provider/mutation-token.js.map +1 -1
  244. package/lib/provider/sidecar/repository.d.ts.map +1 -1
  245. package/lib/provider/sidecar/repository.js +1 -0
  246. package/lib/provider/sidecar/repository.js.map +1 -1
  247. package/lib/provider/sidecar/sidecar-schema.d.ts.map +1 -1
  248. package/lib/provider/sidecar/sidecar-schema.js +24 -4
  249. package/lib/provider/sidecar/sidecar-schema.js.map +1 -1
  250. package/lib/provider/transaction/operations/adopt-branch.d.ts.map +1 -1
  251. package/lib/provider/transaction/operations/adopt-branch.js +6 -5
  252. package/lib/provider/transaction/operations/adopt-branch.js.map +1 -1
  253. package/lib/provider/transaction/operations/clean.d.ts.map +1 -1
  254. package/lib/provider/transaction/operations/clean.js +20 -19
  255. package/lib/provider/transaction/operations/clean.js.map +1 -1
  256. package/lib/provider/transaction/operations/create.d.ts +1 -1
  257. package/lib/provider/transaction/operations/create.d.ts.map +1 -1
  258. package/lib/provider/transaction/operations/create.js +23 -13
  259. package/lib/provider/transaction/operations/create.js.map +1 -1
  260. package/lib/provider/transaction/operations/import.d.ts.map +1 -1
  261. package/lib/provider/transaction/operations/import.js +7 -1
  262. package/lib/provider/transaction/operations/import.js.map +1 -1
  263. package/lib/provider/transaction/operations/remove.d.ts.map +1 -1
  264. package/lib/provider/transaction/operations/remove.js +20 -19
  265. package/lib/provider/transaction/operations/remove.js.map +1 -1
  266. package/lib/provider/transaction/recovery/failure-recovery.d.ts.map +1 -1
  267. package/lib/provider/transaction/recovery/failure-recovery.js +19 -18
  268. package/lib/provider/transaction/recovery/failure-recovery.js.map +1 -1
  269. package/lib/provider/transaction/recovery/recover.d.ts.map +1 -1
  270. package/lib/provider/transaction/recovery/recover.js +6 -2
  271. package/lib/provider/transaction/recovery/recover.js.map +1 -1
  272. package/lib/provider/transaction/support/inspection.d.ts.map +1 -1
  273. package/lib/provider/transaction/support/inspection.js +3 -2
  274. package/lib/provider/transaction/support/inspection.js.map +1 -1
  275. package/lib/provider/transaction/support/journal.d.ts.map +1 -1
  276. package/lib/provider/transaction/support/journal.js +8 -5
  277. package/lib/provider/transaction/support/journal.js.map +1 -1
  278. package/lib/provider/transaction/support/path-safety.d.ts.map +1 -1
  279. package/lib/provider/transaction/support/path-safety.js +4 -3
  280. package/lib/provider/transaction/support/path-safety.js.map +1 -1
  281. package/lib/provider/transaction/types.d.ts +2 -1
  282. package/lib/provider/transaction/types.d.ts.map +1 -1
  283. package/lib/provider/types.d.ts +3 -1
  284. package/lib/provider/types.d.ts.map +1 -1
  285. package/lib/provider/types.js +1 -1
  286. package/lib/provider/types.js.map +1 -1
  287. package/lib/provider/worktree-path.d.ts +10 -0
  288. package/lib/provider/worktree-path.d.ts.map +1 -0
  289. package/lib/provider/worktree-path.js +47 -0
  290. package/lib/provider/worktree-path.js.map +1 -0
  291. package/lib/tool/context.d.ts +14 -0
  292. package/lib/tool/context.d.ts.map +1 -0
  293. package/lib/tool/context.js +95 -0
  294. package/lib/tool/context.js.map +1 -0
  295. package/lib/tool/delegation.d.ts +41 -0
  296. package/lib/tool/delegation.d.ts.map +1 -0
  297. package/lib/tool/delegation.js +196 -0
  298. package/lib/tool/delegation.js.map +1 -0
  299. package/lib/tool/errors.d.ts +3 -0
  300. package/lib/tool/errors.d.ts.map +1 -0
  301. package/lib/tool/errors.js +63 -0
  302. package/lib/tool/errors.js.map +1 -0
  303. package/lib/tool/guidance.d.ts +5 -0
  304. package/lib/tool/guidance.d.ts.map +1 -0
  305. package/lib/tool/guidance.js +48 -0
  306. package/lib/tool/guidance.js.map +1 -0
  307. package/lib/tool/history.d.ts +27 -0
  308. package/lib/tool/history.d.ts.map +1 -0
  309. package/lib/tool/history.js +157 -0
  310. package/lib/tool/history.js.map +1 -0
  311. package/lib/tool/index.d.ts +8 -0
  312. package/lib/tool/index.d.ts.map +1 -0
  313. package/lib/tool/index.js +296 -0
  314. package/lib/tool/index.js.map +1 -0
  315. package/lib/tool/inputs.d.ts +12 -0
  316. package/lib/tool/inputs.d.ts.map +1 -0
  317. package/lib/tool/inputs.js +24 -0
  318. package/lib/tool/inputs.js.map +1 -0
  319. package/lib/tool/list-models.d.ts +3 -0
  320. package/lib/tool/list-models.d.ts.map +1 -0
  321. package/lib/tool/list-models.js +38 -0
  322. package/lib/tool/list-models.js.map +1 -0
  323. package/lib/tool/list-sessions.d.ts +3 -0
  324. package/lib/tool/list-sessions.d.ts.map +1 -0
  325. package/lib/tool/list-sessions.js +70 -0
  326. package/lib/tool/list-sessions.js.map +1 -0
  327. package/lib/tool/list-worktrees.d.ts +3 -0
  328. package/lib/tool/list-worktrees.d.ts.map +1 -0
  329. package/lib/tool/list-worktrees.js +39 -0
  330. package/lib/tool/list-worktrees.js.map +1 -0
  331. package/lib/tool/native-session.d.ts +74 -0
  332. package/lib/tool/native-session.d.ts.map +1 -0
  333. package/lib/tool/native-session.js +248 -0
  334. package/lib/tool/native-session.js.map +1 -0
  335. package/lib/tool/new-worktree.d.ts +3 -0
  336. package/lib/tool/new-worktree.d.ts.map +1 -0
  337. package/lib/tool/new-worktree.js +81 -0
  338. package/lib/tool/new-worktree.js.map +1 -0
  339. package/lib/tool/outputs.d.ts +50 -0
  340. package/lib/tool/outputs.d.ts.map +1 -0
  341. package/lib/tool/outputs.js +65 -0
  342. package/lib/tool/outputs.js.map +1 -0
  343. package/lib/tool/report-result.d.ts +3 -0
  344. package/lib/tool/report-result.d.ts.map +1 -0
  345. package/lib/tool/report-result.js +83 -0
  346. package/lib/tool/report-result.js.map +1 -0
  347. package/lib/tool/schema.d.ts +7 -0
  348. package/lib/tool/schema.d.ts.map +1 -0
  349. package/lib/tool/schema.js +92 -0
  350. package/lib/tool/schema.js.map +1 -0
  351. package/lib/tool/send-message.d.ts +3 -0
  352. package/lib/tool/send-message.d.ts.map +1 -0
  353. package/lib/tool/send-message.js +64 -0
  354. package/lib/tool/send-message.js.map +1 -0
  355. package/lib/tool/span-worktree.d.ts +3 -0
  356. package/lib/tool/span-worktree.d.ts.map +1 -0
  357. package/lib/tool/span-worktree.js +114 -0
  358. package/lib/tool/span-worktree.js.map +1 -0
  359. package/lib/tool/types.d.ts +54 -0
  360. package/lib/tool/types.d.ts.map +1 -0
  361. package/lib/tool/types.js +2 -0
  362. package/lib/tool/types.js.map +1 -0
  363. package/lib/typert.host.js +237 -66
  364. package/lib/typert.remote-client.d.ts +7 -1
  365. package/lib/typert.remote-client.d.ts.map +1 -1
  366. package/lib/typert.remote-client.js +237 -66
  367. package/package.json +55 -43
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,iBAAiB,GAGlB,MAAM,8BAA8B,CAAC;AAEtC,8FAA8F;AAC9F,MAAM,OAAO,oBAAoB;IAKF;IAJrB,KAAK,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IACnC,SAAS,GAAG,IAAI,GAAG,EAEjC,CAAC;IACJ,YAA6B,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAAG,CAAC;IAEhD,SAAS,CACP,QAAsF;QAEtF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAEO,QAAQ,CAAC,KAAgC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAAC;QAC7E,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACrE,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,WAAW;YAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,CAAC;QAC5F,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,UAAU;YACtE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,IAAI,CACd,IAAI,EACJ,WAAW,EACX,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,EAC7C,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,OAAO,CACvD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAgC;QACzC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;YAC1D,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA+C,CAAC;YAC5E,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC7E,OAAO,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA2B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;YAChE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,MAAM,CACJ,KAAgC,EAChC,SAAgC,EAChC,QAA+B;QAE/B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC3C,MAAM,IAAI,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;gBAC9E,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;YACzF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,QAAQ,GAAG,GAAG,GAAG,UAAU,EAAE,GAAG,MAAM,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBAClD,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;oBAC/E,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBACtB,CAAC;wBAAS,CAAC;oBACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;gBACvB,CAAC;gBACD,MAAM,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAClC,uFAAuF;gBACvF,IAAI,CAAC;oBACH,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;oBACnD,IAAI,CAAC;wBACH,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC;oBAC/B,CAAC;4BAAS,CAAC;wBACT,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC;oBAChC,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,oDAAoD;gBACtD,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACjD,CAAC;YACD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;gBAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9C,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,MAAM,SAAS,GAAG,KAA8C,CAAC;IACjE,IACE,CAAC,SAAS;QACV,OAAO,SAAS,CAAC,OAAO,KAAK,SAAS;QACtC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;QAC/B,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEjE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,KAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAClF,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;AACnE,CAAC"}
@@ -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;AAwRnE,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;AAqYD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAgEjC;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,mBAAmB,CAAC,CAyI9B"}
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';
@@ -59,7 +60,11 @@ async function findLiveWorktree(worktrees, absolutePath) {
59
60
  async function resolveWorktree(context, input) {
60
61
  const workspace = await requireWorkspace(context, input.workspaceId);
61
62
  if (isMainWorktreeId(input.worktreeId, input.workspaceId)) {
62
- return { main: true, workspaceRoot: workspace.rootPath };
63
+ // The imported Workspace can be nested, while committed Git paths are root-relative.
64
+ const repositoryRoot = context.git.resolveRepositoryRoot
65
+ ? await context.git.resolveRepositoryRoot(workspace.rootPath, { signal: context.signal })
66
+ : workspace.rootPath;
67
+ return { main: true, workspaceRoot: workspace.rootPath, repositoryRoot };
63
68
  }
64
69
  const snapshot = await context.sidecar.read(input.workspaceId);
65
70
  if (snapshot.pendingOperation !== undefined || (snapshot.recoveryIssues?.length ?? 0) > 0) {
@@ -81,22 +86,22 @@ async function resolveWorktree(context, input) {
81
86
  worktreeId: input.worktreeId,
82
87
  });
83
88
  }
84
- if (!(await isDirectory(record.absolutePath))) {
85
- 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)}`, {
86
91
  workspaceId: input.workspaceId,
87
92
  worktreeId: input.worktreeId,
88
- absolutePath: record.absolutePath,
93
+ absolutePath: gitWorktreeRoot(record),
89
94
  });
90
95
  }
91
96
  const repositoryRoot = context.git.resolveRepositoryRoot
92
97
  ? await context.git.resolveRepositoryRoot(workspace.rootPath, { signal: context.signal })
93
98
  : workspace.rootPath;
94
- 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));
95
100
  if (!live) {
96
- 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)}`, {
97
102
  workspaceId: input.workspaceId,
98
103
  worktreeId: input.worktreeId,
99
- absolutePath: record.absolutePath,
104
+ absolutePath: gitWorktreeRoot(record),
100
105
  });
101
106
  }
102
107
  return {
@@ -151,7 +156,7 @@ async function resolveLocalBranchCommit(context, resolved, baseBranch, options =
151
156
  return undefined;
152
157
  unavailable();
153
158
  }
154
- const commit = await resolveCommit(resolved.record.absolutePath, baseBranch, {
159
+ const commit = await resolveCommit(gitWorktreeRoot(resolved.record), baseBranch, {
155
160
  signal: context.signal,
156
161
  });
157
162
  if (!COMMIT_PATTERN.test(commit)) {
@@ -178,7 +183,7 @@ async function resolveSelectedBaseline(context, resolved, rawBranch) {
178
183
  const headCommit = await baselineHeadCommit(context, resolved);
179
184
  const findMergeBase = gitReadOptional(context, 'findMergeBase');
180
185
  const mergeBase = headCommit !== undefined && findMergeBase !== undefined
181
- ? await findMergeBase(resolved.record.absolutePath, commit, headCommit, { signal: context.signal })
186
+ ? await findMergeBase(gitWorktreeRoot(resolved.record), commit, headCommit, { signal: context.signal })
182
187
  : undefined;
183
188
  if (mergeBase !== undefined && !COMMIT_PATTERN.test(mergeBase)) {
184
189
  throw providerError('GIT_OPERATION_FAILED', 'Git returned an invalid selected branch merge base', {
@@ -280,7 +285,7 @@ async function resolveBaseline(context, resolved, requestedBaseBranch) {
280
285
  });
281
286
  }
282
287
  const commit = context.git.resolveCommit
283
- ? await context.git.resolveCommit(record.absolutePath, record.baseCommit, { signal: context.signal })
288
+ ? await context.git.resolveCommit(gitWorktreeRoot(record), record.baseCommit, { signal: context.signal })
284
289
  : record.baseCommit;
285
290
  return {
286
291
  baseline: {
@@ -301,7 +306,7 @@ async function resolveBaseline(context, resolved, requestedBaseBranch) {
301
306
  if (currentBranch === undefined || currentBranch === record.baseBranch || context.git.findMergeBase === undefined) {
302
307
  return undefined;
303
308
  }
304
- 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 });
305
310
  if (commit === undefined)
306
311
  return undefined;
307
312
  if (!COMMIT_PATTERN.test(commit)) {
@@ -332,7 +337,7 @@ async function baselineHeadCommit(context, resolved) {
332
337
  const resolveCommit = gitReadOptional(context, 'resolveCommit');
333
338
  return resolveCommit === undefined
334
339
  ? undefined
335
- : await resolveCommit(resolved.record.absolutePath, 'HEAD', { signal: context.signal });
340
+ : await resolveCommit(gitWorktreeRoot(resolved.record), 'HEAD', { signal: context.signal });
336
341
  }
337
342
  /** Count commits unique to each head for one resolved comparison boundary. */
338
343
  async function readCommitDivergence(context, resolved, comparison, head) {
@@ -341,7 +346,7 @@ async function readCommitDivergence(context, resolved, comparison, head) {
341
346
  return undefined;
342
347
  // Count each branch from its current tip. The tree boundary may be the
343
348
  // merge base, but ahead/behind must include commits unique to both heads.
344
- return getCommitDivergence(resolved.record.absolutePath, comparison.baseHeadCommit, head, { signal: context.signal });
349
+ return getCommitDivergence(gitWorktreeRoot(resolved.record), comparison.baseHeadCommit, head, { signal: context.signal });
345
350
  }
346
351
  /**
347
352
  * Authorize commit SHAs against one pinned comparison projection.
@@ -365,7 +370,7 @@ async function authorizeCommits(context, resolved, comparison, candidates) {
365
370
  return candidate;
366
371
  });
367
372
  const listCommits = gitRead(context, 'listCommits', worktreeId);
368
- const history = await listCommits(resolved.record.absolutePath, comparison.baseHeadCommit, {
373
+ const history = await listCommits(gitWorktreeRoot(resolved.record), comparison.baseHeadCommit, {
369
374
  signal: context.signal,
370
375
  });
371
376
  const members = new Set(history.commits.map((commit) => commit.sha));
@@ -489,10 +494,10 @@ export async function listWorktreeCommits(context, input) {
489
494
  const readWorkingTreePaths = gitReadOptional(context, 'listWorkingTreeChangedPaths')
490
495
  ?? gitReadOptional(context, 'listWorkingTreeFiles');
491
496
  const [history, workingTreeFiles] = await Promise.all([
492
- listCommits(resolved.value.record.absolutePath, baseline.baseHeadCommit, { signal: context.signal }),
497
+ listCommits(gitWorktreeRoot(resolved.value.record), baseline.baseHeadCommit, { signal: context.signal }),
493
498
  readWorkingTreePaths === undefined
494
499
  ? Promise.resolve({ files: [], truncated: false })
495
- : readWorkingTreePaths(resolved.value.record.absolutePath, { signal: context.signal }),
500
+ : readWorkingTreePaths(gitWorktreeRoot(resolved.value.record), { signal: context.signal }),
496
501
  ]);
497
502
  const divergence = await readCommitDivergence(context, resolved.value, baseline, history.headCommit);
498
503
  return {
@@ -605,7 +610,7 @@ async function authorizeLiveSummaryHead(context, resolved) {
605
610
  const resolveCommit = gitReadOptional(context, 'resolveCommit');
606
611
  if (resolveCommit === undefined)
607
612
  return;
608
- const currentHead = await resolveCommit(resolved.record.absolutePath, 'HEAD', { signal: context.signal });
613
+ const currentHead = await resolveCommit(gitWorktreeRoot(resolved.record), 'HEAD', { signal: context.signal });
609
614
  if (!COMMIT_PATTERN.test(currentHead)) {
610
615
  throw providerError('GIT_OPERATION_FAILED', 'Git returned an invalid live Worktree HEAD', {
611
616
  worktreeId: resolved.record.worktreeId,
@@ -616,19 +621,19 @@ async function listSummaryFiles(context, resolved, selection, baseCommit, headCo
616
621
  if (selection.includeWorkingTree === true) {
617
622
  const listWorkingTreeDiffFiles = gitRead(context, 'listWorkingTreeDiffFiles', resolved.record.worktreeId);
618
623
  await authorizeLiveSummaryHead(context, resolved);
619
- return listWorkingTreeDiffFiles(resolved.record.absolutePath, baseCommit, { signal: context.signal });
624
+ return listWorkingTreeDiffFiles(gitWorktreeRoot(resolved.record), baseCommit, { signal: context.signal });
620
625
  }
621
626
  const listDiffFiles = gitRead(context, 'listDiffFiles', resolved.record.worktreeId);
622
- return listDiffFiles(resolved.record.absolutePath, baseCommit, headCommit, { signal: context.signal });
627
+ return listDiffFiles(gitWorktreeRoot(resolved.record), baseCommit, headCommit, { signal: context.signal });
623
628
  }
624
629
  async function readSummaryFileDiff(context, resolved, selection, baseCommit, headCommit, filePath) {
625
630
  if (selection.includeWorkingTree === true) {
626
631
  const readWorkingTreeDiffFileDiff = gitRead(context, 'readWorkingTreeDiffFileDiff', resolved.record.worktreeId);
627
632
  await authorizeLiveSummaryHead(context, resolved);
628
- return readWorkingTreeDiffFileDiff(resolved.record.absolutePath, baseCommit, filePath, { signal: context.signal });
633
+ return readWorkingTreeDiffFileDiff(gitWorktreeRoot(resolved.record), baseCommit, filePath, { signal: context.signal });
629
634
  }
630
635
  const readDiffFileDiff = gitRead(context, 'readDiffFileDiff', resolved.record.worktreeId);
631
- return readDiffFileDiff(resolved.record.absolutePath, baseCommit, headCommit, filePath, { signal: context.signal });
636
+ return readDiffFileDiff(gitWorktreeRoot(resolved.record), baseCommit, headCommit, filePath, { signal: context.signal });
632
637
  }
633
638
  async function selectedAggregateFileDiff(context, absolutePath, worktreeId, selection, commits, requestedPath) {
634
639
  if (requestedPath.length === 0) {
@@ -667,18 +672,18 @@ async function selectedAggregateFileDiff(context, absolutePath, worktreeId, sele
667
672
  segments,
668
673
  };
669
674
  }
670
- async function aggregateMainFileDiff(context, workspaceRoot, worktreeId, selection, requestedPath) {
675
+ async function aggregateMainFileDiff(context, workspaceRoot, repositoryRoot, worktreeId, selection, requestedPath) {
671
676
  if (typeof requestedPath !== 'string' || requestedPath.length === 0) {
672
677
  throw providerError('WORKTREE_STATE_CONFLICT', 'A changed file path is required', {
673
678
  worktreeId,
674
679
  });
675
680
  }
676
681
  const authorized = await authorizeMainAggregate(context, workspaceRoot, worktreeId, selection);
677
- return selectedAggregateFileDiff(context, workspaceRoot, worktreeId, authorized.selection, authorized.commits, requestedPath);
682
+ return selectedAggregateFileDiff(context, repositoryRoot, worktreeId, authorized.selection, authorized.commits, requestedPath);
678
683
  }
679
- async function listMainAggregateFiles(context, workspaceRoot, worktreeId, selection) {
684
+ async function listMainAggregateFiles(context, workspaceRoot, repositoryRoot, worktreeId, selection) {
680
685
  const authorized = await authorizeMainAggregate(context, workspaceRoot, worktreeId, selection);
681
- const groups = await selectedCommitFiles(context, workspaceRoot, worktreeId, authorized.commits);
686
+ const groups = await selectedCommitFiles(context, repositoryRoot, worktreeId, authorized.commits);
682
687
  return {
683
688
  commit: authorized.commits[0],
684
689
  selection: authorized.selection,
@@ -697,7 +702,7 @@ async function listAggregateFiles(context, resolved, selection, requestedBaseBra
697
702
  ...(read.truncated ? { truncated: true } : {}),
698
703
  };
699
704
  }
700
- 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);
701
706
  return {
702
707
  commit: authorized.commits[0],
703
708
  selection: authorized.selection,
@@ -729,14 +734,14 @@ async function aggregateFileDiff(context, resolved, selection, requestedPath, re
729
734
  selection: authorized.selection,
730
735
  };
731
736
  }
732
- 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);
733
738
  }
734
739
  export async function listWorktreeCommitFiles(context, input) {
735
740
  const resolved = await resolveWorktree(context, input);
736
741
  const requested = requestedDiff(input, input.worktreeId);
737
742
  if (resolved.main) {
738
743
  if (requested.kind === 'aggregate') {
739
- return listMainAggregateFiles(context, resolved.workspaceRoot, input.worktreeId, requested.selection);
744
+ return listMainAggregateFiles(context, resolved.workspaceRoot, resolved.repositoryRoot, input.worktreeId, requested.selection);
740
745
  }
741
746
  if (requested.commit === WORKTREE_GIT_WORKING_TREE) {
742
747
  const listWorkingTreeFiles = gitRead(context, 'listWorkingTreeFiles', input.worktreeId);
@@ -749,7 +754,7 @@ export async function listWorktreeCommitFiles(context, input) {
749
754
  }
750
755
  const commit = await authorizeMainCommit(context, resolved.workspaceRoot, input.worktreeId, requested.commit);
751
756
  const listCommitFiles = gitRead(context, 'listCommitFiles', input.worktreeId);
752
- const read = await listCommitFiles(resolved.workspaceRoot, commit, { signal: context.signal });
757
+ const read = await listCommitFiles(resolved.repositoryRoot, commit, { signal: context.signal });
753
758
  return {
754
759
  commit,
755
760
  files: read.files,
@@ -763,7 +768,7 @@ export async function listWorktreeCommitFiles(context, input) {
763
768
  if (commit === WORKTREE_GIT_WORKING_TREE) {
764
769
  await authorizeWorkingTree(context, resolved.value, input.baseBranch);
765
770
  const listWorkingTreeFiles = gitRead(context, 'listWorkingTreeFiles', input.worktreeId);
766
- const read = await listWorkingTreeFiles(resolved.value.record.absolutePath, { signal: context.signal });
771
+ const read = await listWorkingTreeFiles(gitWorktreeRoot(resolved.value.record), { signal: context.signal });
767
772
  return {
768
773
  commit: WORKTREE_GIT_WORKING_TREE,
769
774
  files: read.files,
@@ -772,7 +777,7 @@ export async function listWorktreeCommitFiles(context, input) {
772
777
  }
773
778
  const authorized = await authorizeCommit(context, resolved.value, commit, input.baseBranch);
774
779
  const listCommitFiles = gitRead(context, 'listCommitFiles', input.worktreeId);
775
- 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 });
776
781
  return {
777
782
  commit: authorized.commit,
778
783
  files: read.files,
@@ -789,7 +794,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
789
794
  worktreeId: input.worktreeId,
790
795
  });
791
796
  }
792
- return aggregateMainFileDiff(context, resolved.workspaceRoot, input.worktreeId, requested.selection, input.path);
797
+ return aggregateMainFileDiff(context, resolved.workspaceRoot, resolved.repositoryRoot, input.worktreeId, requested.selection, input.path);
793
798
  }
794
799
  if (typeof input.path !== 'string' || input.path.length === 0) {
795
800
  throw providerError('WORKTREE_STATE_CONFLICT', 'A changed file path is required', {
@@ -814,7 +819,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
814
819
  }
815
820
  const commit = await authorizeMainCommit(context, resolved.workspaceRoot, input.worktreeId, requested.commit);
816
821
  const listCommitFiles = gitRead(context, 'listCommitFiles', input.worktreeId);
817
- const filesRead = await listCommitFiles(resolved.workspaceRoot, commit, { signal: context.signal });
822
+ const filesRead = await listCommitFiles(resolved.repositoryRoot, commit, { signal: context.signal });
818
823
  const changedFile = findChangedFile(filesRead.files, input.path);
819
824
  if (changedFile === undefined) {
820
825
  throw providerError('WORKTREE_STATE_CONFLICT', 'The requested path is not changed by this commit', {
@@ -824,7 +829,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
824
829
  });
825
830
  }
826
831
  const readCommitFileDiff = gitRead(context, 'readCommitFileDiff', input.worktreeId);
827
- const diff = await readCommitFileDiff(resolved.workspaceRoot, commit, changedFile.path, { signal: context.signal });
832
+ const diff = await readCommitFileDiff(resolved.repositoryRoot, commit, changedFile.path, { signal: context.signal });
828
833
  return { ...diff, commit, path: input.path };
829
834
  }
830
835
  if (requested.kind === 'aggregate') {
@@ -844,7 +849,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
844
849
  // untracked file on each file click.
845
850
  const readChangedPaths = gitReadOptional(context, 'listWorkingTreeChangedPaths')
846
851
  ?? gitRead(context, 'listWorkingTreeFiles', input.worktreeId);
847
- const readPaths = await readChangedPaths(resolved.value.record.absolutePath, { signal: context.signal });
852
+ const readPaths = await readChangedPaths(gitWorktreeRoot(resolved.value.record), { signal: context.signal });
848
853
  const changedFile = findChangedFile(readPaths.files, input.path);
849
854
  if (changedFile === undefined) {
850
855
  throw providerError('WORKTREE_STATE_CONFLICT', 'The requested path is not changed in the working tree', {
@@ -853,7 +858,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
853
858
  path: input.path,
854
859
  });
855
860
  }
856
- 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 });
857
862
  return {
858
863
  ...diff,
859
864
  commit: WORKTREE_GIT_WORKING_TREE,
@@ -865,7 +870,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
865
870
  const listCommitFiles = gitRead(context, 'listCommitFiles', input.worktreeId);
866
871
  // The changed-file projection is the authorization boundary for the path, so
867
872
  // the diff is only read for an exact member of that projection.
868
- 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 });
869
874
  const changedFile = findChangedFile(filesRead.files, input.path);
870
875
  if (changedFile === undefined) {
871
876
  throw providerError('WORKTREE_STATE_CONFLICT', 'The requested path is not changed by this commit', {
@@ -874,7 +879,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
874
879
  path: input.path,
875
880
  });
876
881
  }
877
- 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 });
878
883
  return {
879
884
  ...diff,
880
885
  commit: authorized.commit,