@cerbur/clutch-dsh-worktree 0.1.12 → 0.1.13

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 (230) hide show
  1. package/README.md +290 -433
  2. package/README.zh.md +244 -348
  3. package/assets/screenshots/screenshots-dashboard.png +0 -0
  4. package/assets/screenshots/screenshots-git-reviewer.png +0 -0
  5. package/lib/client/WorktreeSurface.d.ts.map +1 -1
  6. package/lib/client/WorktreeSurface.js +139 -17
  7. package/lib/client/WorktreeSurface.js.map +1 -1
  8. package/lib/client/context/WorktreeHeroContext.d.ts +4 -3
  9. package/lib/client/context/WorktreeHeroContext.d.ts.map +1 -1
  10. package/lib/client/context/WorktreeHeroContext.js +29 -11
  11. package/lib/client/context/WorktreeHeroContext.js.map +1 -1
  12. package/lib/client/dashboard/WorktreeDashboard.d.ts +9 -2
  13. package/lib/client/dashboard/WorktreeDashboard.d.ts.map +1 -1
  14. package/lib/client/dashboard/WorktreeDashboard.js +165 -14
  15. package/lib/client/dashboard/WorktreeDashboard.js.map +1 -1
  16. package/lib/client/dashboard/dashboard-navigation.d.ts +35 -0
  17. package/lib/client/dashboard/dashboard-navigation.d.ts.map +1 -0
  18. package/lib/client/dashboard/dashboard-navigation.js +48 -0
  19. package/lib/client/dashboard/dashboard-navigation.js.map +1 -0
  20. package/lib/client/dashboard/dashboard-overlay.d.ts +7 -2
  21. package/lib/client/dashboard/dashboard-overlay.d.ts.map +1 -1
  22. package/lib/client/dashboard/dashboard-overlay.js +81 -16
  23. package/lib/client/dashboard/dashboard-overlay.js.map +1 -1
  24. package/lib/client/dashboard/dashboard-selection.d.ts +2 -1
  25. package/lib/client/dashboard/dashboard-selection.d.ts.map +1 -1
  26. package/lib/client/dashboard/dashboard-selection.js +1 -1
  27. package/lib/client/dashboard/dashboard-selection.js.map +1 -1
  28. package/lib/client/dashboard/git/GitChangedFiles.d.ts +11 -0
  29. package/lib/client/dashboard/git/GitChangedFiles.d.ts.map +1 -0
  30. package/lib/client/dashboard/git/GitChangedFiles.js +101 -0
  31. package/lib/client/dashboard/git/GitChangedFiles.js.map +1 -0
  32. package/lib/client/dashboard/git/GitCommitList.d.ts +15 -0
  33. package/lib/client/dashboard/git/GitCommitList.d.ts.map +1 -0
  34. package/lib/client/dashboard/git/GitCommitList.js +55 -0
  35. package/lib/client/dashboard/git/GitCommitList.js.map +1 -0
  36. package/lib/client/dashboard/git/GitDiffView.d.ts +10 -0
  37. package/lib/client/dashboard/git/GitDiffView.d.ts.map +1 -0
  38. package/lib/client/dashboard/git/GitDiffView.js +65 -0
  39. package/lib/client/dashboard/git/GitDiffView.js.map +1 -0
  40. package/lib/client/dashboard/git/GitFileTypeIcon.d.ts +8 -0
  41. package/lib/client/dashboard/git/GitFileTypeIcon.d.ts.map +1 -0
  42. package/lib/client/dashboard/git/GitFileTypeIcon.js +24 -0
  43. package/lib/client/dashboard/git/GitFileTypeIcon.js.map +1 -0
  44. package/lib/client/dashboard/git/GitLineStats.d.ts +10 -0
  45. package/lib/client/dashboard/git/GitLineStats.d.ts.map +1 -0
  46. package/lib/client/dashboard/git/GitLineStats.js +9 -0
  47. package/lib/client/dashboard/git/GitLineStats.js.map +1 -0
  48. package/lib/client/dashboard/git/WorktreeGitOverview.d.ts +31 -0
  49. package/lib/client/dashboard/git/WorktreeGitOverview.d.ts.map +1 -0
  50. package/lib/client/dashboard/git/WorktreeGitOverview.js +89 -0
  51. package/lib/client/dashboard/git/WorktreeGitOverview.js.map +1 -0
  52. package/lib/client/dashboard/git/WorktreeGitPanel.d.ts +16 -0
  53. package/lib/client/dashboard/git/WorktreeGitPanel.d.ts.map +1 -0
  54. package/lib/client/dashboard/git/WorktreeGitPanel.js +126 -0
  55. package/lib/client/dashboard/git/WorktreeGitPanel.js.map +1 -0
  56. package/lib/client/dashboard/git/file-address.d.ts +2 -0
  57. package/lib/client/dashboard/git/file-address.d.ts.map +1 -0
  58. package/lib/client/dashboard/git/file-address.js +16 -0
  59. package/lib/client/dashboard/git/file-address.js.map +1 -0
  60. package/lib/client/dashboard/git/git-column-split.d.ts +34 -0
  61. package/lib/client/dashboard/git/git-column-split.d.ts.map +1 -0
  62. package/lib/client/dashboard/git/git-column-split.js +41 -0
  63. package/lib/client/dashboard/git/git-column-split.js.map +1 -0
  64. package/lib/client/dashboard/git/git-diff-parser.d.ts +24 -0
  65. package/lib/client/dashboard/git/git-diff-parser.d.ts.map +1 -0
  66. package/lib/client/dashboard/git/git-diff-parser.js +56 -0
  67. package/lib/client/dashboard/git/git-diff-parser.js.map +1 -0
  68. package/lib/client/dashboard/git/git-facts.d.ts +18 -0
  69. package/lib/client/dashboard/git/git-facts.d.ts.map +1 -0
  70. package/lib/client/dashboard/git/git-facts.js +31 -0
  71. package/lib/client/dashboard/git/git-facts.js.map +1 -0
  72. package/lib/client/dashboard/git/git-file-tree.d.ts +16 -0
  73. package/lib/client/dashboard/git/git-file-tree.d.ts.map +1 -0
  74. package/lib/client/dashboard/git/git-file-tree.js +52 -0
  75. package/lib/client/dashboard/git/git-file-tree.js.map +1 -0
  76. package/lib/client/dashboard/git/git-state-cache.d.ts +49 -0
  77. package/lib/client/dashboard/git/git-state-cache.d.ts.map +1 -0
  78. package/lib/client/dashboard/git/git-state-cache.js +80 -0
  79. package/lib/client/dashboard/git/git-state-cache.js.map +1 -0
  80. package/lib/client/dashboard/git/useGitPaneSplit.d.ts +33 -0
  81. package/lib/client/dashboard/git/useGitPaneSplit.d.ts.map +1 -0
  82. package/lib/client/dashboard/git/useGitPaneSplit.js +119 -0
  83. package/lib/client/dashboard/git/useGitPaneSplit.js.map +1 -0
  84. package/lib/client/dashboard/git/useWorktreeGitState.d.ts +60 -0
  85. package/lib/client/dashboard/git/useWorktreeGitState.d.ts.map +1 -0
  86. package/lib/client/dashboard/git/useWorktreeGitState.js +654 -0
  87. package/lib/client/dashboard/git/useWorktreeGitState.js.map +1 -0
  88. package/lib/client/entry.d.ts.map +1 -1
  89. package/lib/client/entry.js +28 -0
  90. package/lib/client/entry.js.map +1 -1
  91. package/lib/client/locales.d.ts +158 -0
  92. package/lib/client/locales.d.ts.map +1 -1
  93. package/lib/client/locales.js +166 -8
  94. package/lib/client/locales.js.map +1 -1
  95. package/lib/client/session/session-view.d.ts +10 -0
  96. package/lib/client/session/session-view.d.ts.map +1 -1
  97. package/lib/client/session/session-view.js +57 -0
  98. package/lib/client/session/session-view.js.map +1 -1
  99. package/lib/client/session/worktree-session-order.d.ts +2 -5
  100. package/lib/client/session/worktree-session-order.d.ts.map +1 -1
  101. package/lib/client/session/worktree-session-order.js +35 -10
  102. package/lib/client/session/worktree-session-order.js.map +1 -1
  103. package/lib/client/session/worktree-session-position.d.ts +2 -1
  104. package/lib/client/session/worktree-session-position.d.ts.map +1 -1
  105. package/lib/client/session/worktree-session-position.js +10 -3
  106. package/lib/client/session/worktree-session-position.js.map +1 -1
  107. package/lib/client/surface/actions/useDragActions.d.ts +33 -2
  108. package/lib/client/surface/actions/useDragActions.d.ts.map +1 -1
  109. package/lib/client/surface/actions/useDragActions.js +66 -18
  110. package/lib/client/surface/actions/useDragActions.js.map +1 -1
  111. package/lib/client/surface/components/ActiveWorktree.js +2 -2
  112. package/lib/client/surface/components/ActiveWorktree.js.map +1 -1
  113. package/lib/client/surface/components/ArchivedWorktree.js +2 -2
  114. package/lib/client/surface/components/ArchivedWorktree.js.map +1 -1
  115. package/lib/client/surface/components/ArchivedWorktrees.js +2 -2
  116. package/lib/client/surface/components/ArchivedWorktrees.js.map +1 -1
  117. package/lib/client/surface/components/SurfaceContent.d.ts +1 -1
  118. package/lib/client/surface/components/SurfaceContent.d.ts.map +1 -1
  119. package/lib/client/surface/components/SurfaceContent.js +1 -1
  120. package/lib/client/surface/components/SurfaceContent.js.map +1 -1
  121. package/lib/client/surface/components/SurfaceHeader.d.ts +1 -1
  122. package/lib/client/surface/components/SurfaceHeader.d.ts.map +1 -1
  123. package/lib/client/surface/components/SurfaceHeader.js +12 -3
  124. package/lib/client/surface/components/SurfaceHeader.js.map +1 -1
  125. package/lib/client/surface/components/WorkspaceTree.js +4 -4
  126. package/lib/client/surface/components/WorkspaceTree.js.map +1 -1
  127. package/lib/client/surface/components/rows.d.ts +2 -2
  128. package/lib/client/surface/components/rows.d.ts.map +1 -1
  129. package/lib/client/surface/components/rows.js +14 -9
  130. package/lib/client/surface/components/rows.js.map +1 -1
  131. package/lib/client/surface/selectors.d.ts +10 -0
  132. package/lib/client/surface/selectors.d.ts.map +1 -1
  133. package/lib/client/surface/selectors.js +14 -0
  134. package/lib/client/surface/selectors.js.map +1 -1
  135. package/lib/client/surface/state/useSessionExpansion.d.ts +2 -1
  136. package/lib/client/surface/state/useSessionExpansion.d.ts.map +1 -1
  137. package/lib/client/surface/state/useSessionExpansion.js +26 -13
  138. package/lib/client/surface/state/useSessionExpansion.js.map +1 -1
  139. package/lib/client/surface/state/useSessionOrdering.d.ts +1 -1
  140. package/lib/client/surface/state/useSessionOrdering.d.ts.map +1 -1
  141. package/lib/client/surface/state/useSessionOrdering.js +23 -8
  142. package/lib/client/surface/state/useSessionOrdering.js.map +1 -1
  143. package/lib/client/surface/types.d.ts +15 -3
  144. package/lib/client/surface/types.d.ts.map +1 -1
  145. package/lib/client/view/worktree-expand-state.d.ts +1 -1
  146. package/lib/client/view/worktree-expand-state.d.ts.map +1 -1
  147. package/lib/client/view/worktree-expand-state.js +8 -1
  148. package/lib/client/view/worktree-expand-state.js.map +1 -1
  149. package/lib/client/worktree-connection.d.ts +4 -0
  150. package/lib/client/worktree-connection.d.ts.map +1 -1
  151. package/lib/client/worktree-connection.js +10 -0
  152. package/lib/client/worktree-connection.js.map +1 -1
  153. package/lib/client.js +3454 -307
  154. package/lib/client.js.map +1 -1
  155. package/lib/contract/index.contract.js +8 -0
  156. package/lib/contract/index.contract.js.map +1 -1
  157. package/lib/contract/index.d.ts +145 -1
  158. package/lib/contract/index.d.ts.map +1 -1
  159. package/lib/contract/index.js +18 -0
  160. package/lib/contract/index.js.map +1 -1
  161. package/lib/host/remote.d.ts.map +1 -1
  162. package/lib/host/remote.js +4 -0
  163. package/lib/host/remote.js.map +1 -1
  164. package/lib/host/service.d.ts +14 -1
  165. package/lib/host/service.d.ts.map +1 -1
  166. package/lib/host/service.js +24 -0
  167. package/lib/host/service.js.map +1 -1
  168. package/lib/index.d.ts +4 -4
  169. package/lib/index.d.ts.map +1 -1
  170. package/lib/index.js +3 -3
  171. package/lib/index.js.map +1 -1
  172. package/lib/manage/manager-git-history.d.ts +17 -0
  173. package/lib/manage/manager-git-history.d.ts.map +1 -0
  174. package/lib/manage/manager-git-history.js +717 -0
  175. package/lib/manage/manager-git-history.js.map +1 -0
  176. package/lib/manage/manager-worktrees.d.ts.map +1 -1
  177. package/lib/manage/manager-worktrees.js +24 -0
  178. package/lib/manage/manager-worktrees.js.map +1 -1
  179. package/lib/manage/manager.d.ts +14 -1
  180. package/lib/manage/manager.d.ts.map +1 -1
  181. package/lib/manage/manager.js +13 -0
  182. package/lib/manage/manager.js.map +1 -1
  183. package/lib/provider/git/adapter.d.ts +54 -1
  184. package/lib/provider/git/adapter.d.ts.map +1 -1
  185. package/lib/provider/git/adapter.js +820 -1
  186. package/lib/provider/git/adapter.js.map +1 -1
  187. package/lib/provider/index.d.ts +2 -2
  188. package/lib/provider/index.d.ts.map +1 -1
  189. package/lib/provider/index.js +1 -1
  190. package/lib/provider/index.js.map +1 -1
  191. package/lib/provider/mutation-token.d.ts +1 -1
  192. package/lib/provider/mutation-token.d.ts.map +1 -1
  193. package/lib/provider/mutation-token.js +1 -0
  194. package/lib/provider/mutation-token.js.map +1 -1
  195. package/lib/provider/sidecar/repository.d.ts +1 -1
  196. package/lib/provider/sidecar/repository.d.ts.map +1 -1
  197. package/lib/provider/sidecar/repository.js +3 -2
  198. package/lib/provider/sidecar/repository.js.map +1 -1
  199. package/lib/provider/sidecar/sidecar-schema.d.ts +16 -3
  200. package/lib/provider/sidecar/sidecar-schema.d.ts.map +1 -1
  201. package/lib/provider/sidecar/sidecar-schema.js +105 -23
  202. package/lib/provider/sidecar/sidecar-schema.js.map +1 -1
  203. package/lib/provider/transaction/operations/create.d.ts.map +1 -1
  204. package/lib/provider/transaction/operations/create.js +21 -6
  205. package/lib/provider/transaction/operations/create.js.map +1 -1
  206. package/lib/provider/transaction/recovery/failure-recovery.d.ts.map +1 -1
  207. package/lib/provider/transaction/recovery/failure-recovery.js +11 -4
  208. package/lib/provider/transaction/recovery/failure-recovery.js.map +1 -1
  209. package/lib/provider/transaction/recovery/recover.d.ts.map +1 -1
  210. package/lib/provider/transaction/recovery/recover.js +9 -11
  211. package/lib/provider/transaction/recovery/recover.js.map +1 -1
  212. package/lib/provider/transaction/support/inspection.d.ts +0 -2
  213. package/lib/provider/transaction/support/inspection.d.ts.map +1 -1
  214. package/lib/provider/transaction/support/inspection.js +0 -4
  215. package/lib/provider/transaction/support/inspection.js.map +1 -1
  216. package/lib/provider/transaction/support/journal.d.ts.map +1 -1
  217. package/lib/provider/transaction/support/journal.js +2 -0
  218. package/lib/provider/transaction/support/journal.js.map +1 -1
  219. package/lib/provider/transaction/types.d.ts +1 -0
  220. package/lib/provider/transaction/types.d.ts.map +1 -1
  221. package/lib/provider/types.d.ts +53 -5
  222. package/lib/provider/types.d.ts.map +1 -1
  223. package/lib/provider/types.js +1 -1
  224. package/lib/provider/types.js.map +1 -1
  225. package/lib/typert.host.js +295 -34
  226. package/lib/typert.remote-client.d.ts +9 -1
  227. package/lib/typert.remote-client.d.ts.map +1 -1
  228. package/lib/typert.remote-client.js +295 -34
  229. package/package.json +3 -1
  230. package/assets/screenshots/screenshots-dashboard.webp +0 -0
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Shared Git-tab facts. These helpers stay free of React and DOM APIs so the
3
+ * Dashboard's branch, Main, and line-total rules have one definition.
4
+ */
5
+ /** Main (Local) Worktree ids never carry a Worktree-relative Git comparison. */
6
+ export function isMainWorktreeId(worktreeId) {
7
+ return worktreeId === 'main' || worktreeId.startsWith('main:');
8
+ }
9
+ /** Trim a branch value and drop empty strings. */
10
+ export function normalizeBranch(branch) {
11
+ const normalized = branch?.trim();
12
+ return normalized === undefined || normalized.length === 0 ? undefined : normalized;
13
+ }
14
+ /** A baseline equal to the current Worktree branch is not a usable default. */
15
+ export function normalizeBaselineBranch(value, currentBranch) {
16
+ const baseline = normalizeBranch(value);
17
+ return baseline === undefined || baseline === currentBranch ? undefined : baseline;
18
+ }
19
+ /** Sum additions/deletions, or undefined when any file count is unknown. */
20
+ export function sumLineTotals(files) {
21
+ let additions = 0;
22
+ let deletions = 0;
23
+ for (const file of files) {
24
+ if (file.additions === undefined || file.deletions === undefined)
25
+ return undefined;
26
+ additions += file.additions;
27
+ deletions += file.deletions;
28
+ }
29
+ return { additions, deletions };
30
+ }
31
+ //# sourceMappingURL=git-facts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-facts.js","sourceRoot":"","sources":["../../../../src/client/dashboard/git/git-facts.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,OAAO,UAAU,KAAK,MAAM,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACjE,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,eAAe,CAAC,MAA0B;IACxD,MAAM,UAAU,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;IAClC,OAAO,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;AACtF,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,uBAAuB,CACrC,KAAyB,EACzB,aAAiC;IAEjC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrF,CAAC;AAOD,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,KAAwC;IACpE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACnF,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;QAC5B,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;IAC9B,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { WorktreeGitChangedFile } from '../../../contract/index.js';
2
+ export interface GitFileTreeFileNode {
3
+ readonly kind: 'file';
4
+ readonly name: string;
5
+ readonly file: WorktreeGitChangedFile;
6
+ }
7
+ export interface GitFileTreeFolderNode {
8
+ readonly kind: 'folder';
9
+ readonly name: string;
10
+ readonly path: string;
11
+ readonly children: readonly GitFileTreeNode[];
12
+ }
13
+ export type GitFileTreeNode = GitFileTreeFileNode | GitFileTreeFolderNode;
14
+ /** Build a stable, directory-first tree from Git's slash-separated relative paths. */
15
+ export declare function buildGitFileTree(files: readonly WorktreeGitChangedFile[]): readonly GitFileTreeNode[];
16
+ //# sourceMappingURL=git-file-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-file-tree.d.ts","sourceRoot":"","sources":["../../../../src/client/dashboard/git/git-file-tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;CACvC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;CAC/C;AAED,MAAM,MAAM,eAAe,GAAG,mBAAmB,GAAG,qBAAqB,CAAC;AA+B1E,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,GAAG,SAAS,eAAe,EAAE,CAmCrG"}
@@ -0,0 +1,52 @@
1
+ const byName = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });
2
+ function compareNodes(left, right) {
3
+ if (left.kind !== right.kind)
4
+ return left.kind === 'folder' ? -1 : 1;
5
+ return byName.compare(left.name, right.name);
6
+ }
7
+ function materialize(nodes) {
8
+ return [...nodes.values()].sort(compareNodes).map((node) => node.kind === 'folder'
9
+ ? {
10
+ kind: 'folder',
11
+ name: node.name,
12
+ path: node.path,
13
+ children: materialize(node.children),
14
+ }
15
+ : node);
16
+ }
17
+ /** Build a stable, directory-first tree from Git's slash-separated relative paths. */
18
+ export function buildGitFileTree(files) {
19
+ const roots = new Map();
20
+ for (const file of files) {
21
+ const segments = file.path.split('/').filter((segment) => segment.length > 0);
22
+ if (segments.length === 0) {
23
+ roots.set(file.path, { kind: 'file', name: file.path, file });
24
+ continue;
25
+ }
26
+ let nodes = roots;
27
+ let directoryPath = '';
28
+ for (let index = 0; index < segments.length - 1; index += 1) {
29
+ const segment = segments[index];
30
+ directoryPath = directoryPath.length === 0 ? segment : directoryPath + '/' + segment;
31
+ const folderKey = 'folder:' + segment;
32
+ const existing = nodes.get(folderKey);
33
+ if (existing?.kind === 'folder') {
34
+ nodes = existing.children;
35
+ continue;
36
+ }
37
+ const folder = {
38
+ kind: 'folder',
39
+ name: segment,
40
+ path: directoryPath,
41
+ children: new Map(),
42
+ };
43
+ nodes.set(folderKey, folder);
44
+ nodes = folder.children;
45
+ }
46
+ const name = segments[segments.length - 1];
47
+ const fileKey = 'file:' + name + ':' + file.path + ':' + (file.oldPath ?? '');
48
+ nodes.set(fileKey, { kind: 'file', name, file });
49
+ }
50
+ return materialize(roots);
51
+ }
52
+ //# sourceMappingURL=git-file-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-file-tree.js","sourceRoot":"","sources":["../../../../src/client/dashboard/git/git-file-tree.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;AAEpF,SAAS,YAAY,CAAC,IAAiB,EAAE,KAAkB;IACzD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW,CAAC,KAA+B;IAClD,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACzD,IAAI,CAAC,IAAI,KAAK,QAAQ;QACpB,CAAC,CAAC;YACE,IAAI,EAAE,QAAiB;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;SACrC;QACH,CAAC,CAAC,IAAI,CACT,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,gBAAgB,CAAC,KAAwC;IACvE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,SAAS;QACX,CAAC;QAED,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC5D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChC,aAAa,GAAG,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,GAAG,GAAG,GAAG,OAAO,CAAC;YACrF,MAAM,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;YACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACtC,IAAI,QAAQ,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAChC,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBAC1B,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAgB;gBAC1B,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,IAAI,GAAG,EAAE;aACpB,CAAC;YACF,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC7B,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC1B,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC9E,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { type WorktreeGitChangedFile, type WorktreeGitCommitFiles, type WorktreeGitDiffSelection, type WorktreeGitHistory } from '../../../contract/index.js';
2
+ /**
3
+ * Cache keys and target predicates for the Git tab state machine. Both the key
4
+ * builders and the "live target" predicate live here so they cannot drift: a
5
+ * key built here is the only thing retired or invalidated by the state machine.
6
+ */
7
+ export type GitLoadable<Value> = {
8
+ readonly status: 'idle';
9
+ } | {
10
+ readonly status: 'loading';
11
+ } | {
12
+ readonly status: 'ready';
13
+ readonly value: Value;
14
+ readonly refreshing?: boolean;
15
+ readonly error?: Error;
16
+ } | {
17
+ readonly status: 'error';
18
+ readonly error: Error;
19
+ readonly previous?: Value;
20
+ };
21
+ /** Which projection the Git tab currently reads. */
22
+ export type GitTarget = {
23
+ readonly kind: 'commit';
24
+ readonly commit: string;
25
+ } | {
26
+ readonly kind: 'selection';
27
+ readonly selection: WorktreeGitDiffSelection;
28
+ };
29
+ export declare const MAX_FILE_CACHE = 8;
30
+ export declare const MAX_DIFF_CACHE = 24;
31
+ /** The summary selection for one working-tree inclusion mode. */
32
+ export declare function summarySelection(includeWorkingTree: boolean): Extract<WorktreeGitDiffSelection, {
33
+ readonly kind: 'summary';
34
+ }>;
35
+ /** True when the target reads the live working tree and must not be cached. */
36
+ export declare function isLiveTarget(target: GitTarget): boolean;
37
+ /** True when a file or diff cache key belongs to a live working-tree read. */
38
+ export declare function isLiveCacheKey(key: string): boolean;
39
+ export declare function gitCacheKey(baseBranch: string | undefined, history: GitLoadable<WorktreeGitHistory>, target: GitTarget): string;
40
+ export declare function diffCacheKey(baseBranch: string | undefined, history: GitLoadable<WorktreeGitHistory>, target: GitTarget, filePath: string): string;
41
+ /** Compare two targets by projection identity rather than object identity. */
42
+ export declare function sameTarget(left: GitTarget, right: GitTarget): boolean;
43
+ /** Drop the oldest entries until the cache respects its bound. */
44
+ export declare function trimCache<Value>(cache: Map<string, Value>, maxSize: number): void;
45
+ /** Find the changed-file row for a new or previous path. */
46
+ export declare function fileForPath(files: WorktreeGitCommitFiles, selectedPath: string): WorktreeGitChangedFile | undefined;
47
+ /** Keep only SHAs that are still part of the current history projection. */
48
+ export declare function canonicalizeCommits(history: WorktreeGitHistory | undefined, commits: readonly string[]): readonly string[];
49
+ //# sourceMappingURL=git-state-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-state-cache.d.ts","sourceRoot":"","sources":["../../../../src/client/dashboard/git/git-state-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAC;AAEpC;;;;GAIG;AAEH,MAAM,MAAM,WAAW,CAAC,KAAK,IACzB;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAC9B;IACE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB,GACD;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAEnF,oDAAoD;AACpD,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAA;CAAE,CAAC;AAEjF,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,iEAAiE;AACjE,wBAAgB,gBAAgB,CAC9B,kBAAkB,EAAE,OAAO,GAC1B,OAAO,CAAC,wBAAwB,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAEjE;AAeD,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAIvD;AAWD,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAaD,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,WAAW,CAAC,kBAAkB,CAAC,EACxC,MAAM,EAAE,SAAS,GAChB,MAAM,CAER;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,WAAW,CAAC,kBAAkB,CAAC,EACxC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,GACf,MAAM,CAER;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAErE;AAED,kEAAkE;AAClE,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAMjF;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,CACzB,KAAK,EAAE,sBAAsB,EAC7B,YAAY,EAAE,MAAM,GACnB,sBAAsB,GAAG,SAAS,CAEpC;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,kBAAkB,GAAG,SAAS,EACvC,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,SAAS,MAAM,EAAE,CAMnB"}
@@ -0,0 +1,80 @@
1
+ import { WORKTREE_GIT_WORKING_TREE, isWorktreeGitCommit, } from '../../../contract/index.js';
2
+ export const MAX_FILE_CACHE = 8;
3
+ export const MAX_DIFF_CACHE = 24;
4
+ /** The summary selection for one working-tree inclusion mode. */
5
+ export function summarySelection(includeWorkingTree) {
6
+ return includeWorkingTree ? { kind: 'summary', includeWorkingTree: true } : { kind: 'summary' };
7
+ }
8
+ function targetKey(target) {
9
+ if (target.kind === 'commit')
10
+ return 'commit\u0000' + target.commit;
11
+ if (target.selection.kind === 'summary') {
12
+ return target.selection.includeWorkingTree === true ? 'summary\u0000working-tree' : 'summary';
13
+ }
14
+ return 'commits\u0000' + target.selection.commits.join('\u0000');
15
+ }
16
+ function historyProjectionKey(history) {
17
+ if (history.status !== 'ready')
18
+ return 'unknown';
19
+ return (history.value.baseline?.commit ?? 'unknown') + '\u0000' + (history.value.headCommit ?? 'unknown');
20
+ }
21
+ /** True when the target reads the live working tree and must not be cached. */
22
+ export function isLiveTarget(target) {
23
+ return target.kind === 'commit'
24
+ ? target.commit === WORKTREE_GIT_WORKING_TREE
25
+ : target.selection.kind === 'summary' && target.selection.includeWorkingTree === true;
26
+ }
27
+ /**
28
+ * Live-result markers complete a cache key. Matching on the marker rather than
29
+ * on a hand-written substring keeps key construction and invalidation aligned.
30
+ */
31
+ const LIVE_KEY_MARKERS = [
32
+ '\u0000' + targetKey({ kind: 'commit', commit: WORKTREE_GIT_WORKING_TREE }),
33
+ '\u0000' + targetKey({ kind: 'selection', selection: summarySelection(true) }),
34
+ ];
35
+ /** True when a file or diff cache key belongs to a live working-tree read. */
36
+ export function isLiveCacheKey(key) {
37
+ return LIVE_KEY_MARKERS.some((marker) => key.includes(marker));
38
+ }
39
+ /**
40
+ * Key token for a read that names no baseline branch and therefore asks the
41
+ * Manager to resolve the Worktree's captured acquisition commit. The leading NUL
42
+ * cannot appear in a local branch name, so the token can never collide with one.
43
+ */
44
+ const CAPTURED_BASELINE_KEY = '\u0000captured';
45
+ function baselineKey(baseBranch) {
46
+ return baseBranch ?? CAPTURED_BASELINE_KEY;
47
+ }
48
+ export function gitCacheKey(baseBranch, history, target) {
49
+ return baselineKey(baseBranch) + '\u0000' + historyProjectionKey(history) + '\u0000' + targetKey(target);
50
+ }
51
+ export function diffCacheKey(baseBranch, history, target, filePath) {
52
+ return gitCacheKey(baseBranch, history, target) + '\u0000' + filePath;
53
+ }
54
+ /** Compare two targets by projection identity rather than object identity. */
55
+ export function sameTarget(left, right) {
56
+ return targetKey(left) === targetKey(right);
57
+ }
58
+ /** Drop the oldest entries until the cache respects its bound. */
59
+ export function trimCache(cache, maxSize) {
60
+ while (cache.size > maxSize) {
61
+ const oldest = cache.keys().next().value;
62
+ if (oldest === undefined)
63
+ return;
64
+ cache.delete(oldest);
65
+ }
66
+ }
67
+ /** Find the changed-file row for a new or previous path. */
68
+ export function fileForPath(files, selectedPath) {
69
+ return files.files.find((file) => file.path === selectedPath || file.oldPath === selectedPath);
70
+ }
71
+ /** Keep only SHAs that are still part of the current history projection. */
72
+ export function canonicalizeCommits(history, commits) {
73
+ if (history === undefined)
74
+ return [];
75
+ const requested = new Set(commits.filter((commit) => isWorktreeGitCommit(commit)));
76
+ return history.commits
77
+ .filter((commit) => commit.sha !== WORKTREE_GIT_WORKING_TREE && requested.has(commit.sha))
78
+ .map((commit) => commit.sha);
79
+ }
80
+ //# sourceMappingURL=git-state-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-state-cache.js","sourceRoot":"","sources":["../../../../src/client/dashboard/git/git-state-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { KeyboardEvent as ReactKeyboardEvent, MutableRefObject, PointerEvent as ReactPointerEvent } from 'react';
2
+ export type GitSplitOrientation = 'horizontal' | 'vertical';
3
+ export interface GitPaneSplitOptions {
4
+ /** The grid that holds both panes and the divider. */
5
+ readonly containerRef: MutableRefObject<HTMLDivElement | null>;
6
+ /** `horizontal` splits rows by height, `vertical` splits columns by width. */
7
+ readonly orientation: GitSplitOrientation;
8
+ /** CSS custom property on the container that carries the leading-pane share. */
9
+ readonly property: string;
10
+ /** Smallest pane size along the axis, in CSS pixels. */
11
+ readonly minimum: number;
12
+ /** Default share used before the first drag. */
13
+ readonly fallback: number;
14
+ }
15
+ export interface GitPaneSplit {
16
+ /** Attach to the draggable divider between both panes. */
17
+ readonly splitterRef: MutableRefObject<HTMLDivElement | null>;
18
+ /** Leading-pane share along this axis, in percent. */
19
+ readonly percent: number;
20
+ readonly dragging: boolean;
21
+ readonly startDrag: (event: ReactPointerEvent<HTMLDivElement>) => void;
22
+ readonly drag: (event: ReactPointerEvent<HTMLDivElement>) => void;
23
+ readonly endDrag: (event: ReactPointerEvent<HTMLDivElement>) => void;
24
+ readonly onKeyDown: (event: ReactKeyboardEvent<HTMLDivElement>) => void;
25
+ readonly reset: () => void;
26
+ }
27
+ /**
28
+ * Resize one grid axis with a pointer or the keyboard. The dragging frame writes
29
+ * straight to the DOM custom property, so heavy commit and file lists never
30
+ * re-render per pointer move; React state commits once per gesture.
31
+ */
32
+ export declare function useGitPaneSplit(options: GitPaneSplitOptions): GitPaneSplit;
33
+ //# sourceMappingURL=useGitPaneSplit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGitPaneSplit.d.ts","sourceRoot":"","sources":["../../../../src/client/dashboard/git/useGitPaneSplit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,IAAI,kBAAkB,EACnC,gBAAgB,EAChB,YAAY,IAAI,iBAAiB,EAClC,MAAM,OAAO,CAAC;AAUf,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,UAAU,CAAC;AAQ5D,MAAM,WAAW,mBAAmB;IAClC,sDAAsD;IACtD,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC/D,8EAA8E;IAC9E,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC9D,sDAAsD;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACvE,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAClE,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACrE,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,kBAAkB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACxE,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAyH1E"}
@@ -0,0 +1,119 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { GIT_SPLIT_KEY_STEP, clampGitSplitPercent, gitSplitPercentFromPointer } from './git-column-split.js';
3
+ /**
4
+ * Remembers every divider position for the rest of the browser session, so
5
+ * closing and reopening the Git tab keeps the split the user dragged to.
6
+ */
7
+ const rememberedPercents = new Map();
8
+ /** Arrow keys that move a leading pane forward or backward along one axis. */
9
+ const KEY_DIRECTIONS = {
10
+ horizontal: { ArrowUp: -1, ArrowDown: 1 },
11
+ vertical: { ArrowLeft: -1, ArrowRight: 1 },
12
+ };
13
+ /**
14
+ * Resize one grid axis with a pointer or the keyboard. The dragging frame writes
15
+ * straight to the DOM custom property, so heavy commit and file lists never
16
+ * re-render per pointer move; React state commits once per gesture.
17
+ */
18
+ export function useGitPaneSplit(options) {
19
+ const { containerRef, orientation, property, minimum, fallback } = options;
20
+ const splitterRef = useRef(null);
21
+ const [percent, setPercent] = useState(() => rememberedPercents.get(property) ?? fallback);
22
+ const [dragging, setDragging] = useState(false);
23
+ const percentRef = useRef(percent);
24
+ const geometryRef = useRef(undefined);
25
+ const draggingRef = useRef(false);
26
+ const applyPercent = useCallback((next) => {
27
+ percentRef.current = next;
28
+ containerRef.current?.style.setProperty(property, next + '%');
29
+ splitterRef.current?.setAttribute('aria-valuenow', String(Math.round(next)));
30
+ }, [containerRef, property]);
31
+ const commitPercent = useCallback((next) => {
32
+ applyPercent(next);
33
+ rememberedPercents.set(property, next);
34
+ setPercent(next);
35
+ }, [applyPercent, property]);
36
+ useEffect(() => {
37
+ applyPercent(percent);
38
+ rememberedPercents.set(property, percent);
39
+ }, [applyPercent, percent, property]);
40
+ useEffect(() => {
41
+ if (!dragging)
42
+ return undefined;
43
+ // Keep the resize cursor and suppress selection while the pointer is captured.
44
+ const previousCursor = document.body.style.cursor;
45
+ const previousUserSelect = document.body.style.userSelect;
46
+ document.body.style.cursor = orientation === 'horizontal' ? 'row-resize' : 'col-resize';
47
+ document.body.style.userSelect = 'none';
48
+ return () => {
49
+ document.body.style.cursor = previousCursor;
50
+ document.body.style.userSelect = previousUserSelect;
51
+ };
52
+ }, [dragging, orientation]);
53
+ const measure = useCallback(() => {
54
+ const container = containerRef.current;
55
+ const splitter = splitterRef.current;
56
+ if (container === null || splitter === null)
57
+ return undefined;
58
+ const containerRect = container.getBoundingClientRect();
59
+ const splitterRect = splitter.getBoundingClientRect();
60
+ return orientation === 'horizontal'
61
+ ? { start: containerRect.top, size: containerRect.height, divider: splitterRect.height, minimum }
62
+ : { start: containerRect.left, size: containerRect.width, divider: splitterRect.width, minimum };
63
+ }, [containerRef, minimum, orientation]);
64
+ const startDrag = useCallback((event) => {
65
+ if (event.button !== 0)
66
+ return;
67
+ const geometry = measure();
68
+ if (geometry === undefined)
69
+ return;
70
+ geometryRef.current = geometry;
71
+ draggingRef.current = true;
72
+ setDragging(true);
73
+ event.currentTarget.setPointerCapture(event.pointerId);
74
+ event.preventDefault();
75
+ // preventDefault suppresses the default focus; keep the divider keyboard-reachable.
76
+ event.currentTarget.focus({ preventScroll: true });
77
+ }, [measure]);
78
+ const drag = useCallback((event) => {
79
+ const geometry = geometryRef.current;
80
+ if (!draggingRef.current || geometry === undefined)
81
+ return;
82
+ const pointer = orientation === 'horizontal' ? event.clientY : event.clientX;
83
+ const next = gitSplitPercentFromPointer(pointer, geometry);
84
+ if (next !== undefined)
85
+ applyPercent(next);
86
+ }, [applyPercent, orientation]);
87
+ const endDrag = useCallback((event) => {
88
+ if (!draggingRef.current)
89
+ return;
90
+ draggingRef.current = false;
91
+ geometryRef.current = undefined;
92
+ setDragging(false);
93
+ if (event.currentTarget.hasPointerCapture(event.pointerId)) {
94
+ event.currentTarget.releasePointerCapture(event.pointerId);
95
+ }
96
+ const geometry = measure();
97
+ commitPercent(geometry === undefined
98
+ ? percentRef.current
99
+ : clampGitSplitPercent(percentRef.current, geometry) ?? percentRef.current);
100
+ }, [commitPercent, measure]);
101
+ const onKeyDown = useCallback((event) => {
102
+ const direction = KEY_DIRECTIONS[orientation][event.key];
103
+ if (direction === undefined)
104
+ return;
105
+ const geometry = measure();
106
+ if (geometry === undefined)
107
+ return;
108
+ event.preventDefault();
109
+ const step = GIT_SPLIT_KEY_STEP * (event.shiftKey ? 4 : 1);
110
+ const next = clampGitSplitPercent(percentRef.current + direction * step, geometry);
111
+ if (next !== undefined)
112
+ commitPercent(next);
113
+ }, [commitPercent, measure, orientation]);
114
+ const reset = useCallback(() => {
115
+ commitPercent(fallback);
116
+ }, [commitPercent, fallback]);
117
+ return { splitterRef, percent, dragging, startDrag, drag, endDrag, onKeyDown, reset };
118
+ }
119
+ //# sourceMappingURL=useGitPaneSplit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGitPaneSplit.js","sourceRoot":"","sources":["../../../../src/client/dashboard/git/useGitPaneSplit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { BranchRecord, WorktreeGitCommitFiles, WorktreeGitFileDiff, WorktreeGitHistory, WorktreeManager } from '../../../contract/index.js';
2
+ import type { GitLoadable } from './git-state-cache.js';
3
+ export type { GitLoadable } from './git-state-cache.js';
4
+ export type WorktreeGitView = 'commits' | 'summary';
5
+ export interface WorktreeGitState {
6
+ readonly branches: GitLoadable<readonly BranchRecord[]>;
7
+ /** The currently selected local branch; undefined keeps the Git tab unselected. */
8
+ readonly baselineBranch?: string;
9
+ readonly history: GitLoadable<WorktreeGitHistory>;
10
+ readonly view: WorktreeGitView;
11
+ /** Whether the summary target includes the live working tree. */
12
+ readonly includeWorkingTree: boolean;
13
+ /** The focused/primary commit; aggregate selections are in selectedCommits. */
14
+ readonly selectedCommit?: string;
15
+ /** Selected committed SHAs; the live working tree is intentionally excluded. */
16
+ readonly selectedCommits: readonly string[];
17
+ /** Whether picking a commit adds to the selection instead of replacing it. */
18
+ readonly commitMultiSelect: boolean;
19
+ readonly files: GitLoadable<WorktreeGitCommitFiles>;
20
+ readonly selectedPath?: string;
21
+ readonly diff: GitLoadable<WorktreeGitFileDiff>;
22
+ }
23
+ export interface WorktreeGitStateController {
24
+ readonly getSnapshot: () => WorktreeGitState;
25
+ readonly subscribe: (listener: () => void) => () => void;
26
+ readonly loadBranches: () => Promise<void>;
27
+ readonly loadHistory: () => Promise<void>;
28
+ readonly refresh: () => Promise<void>;
29
+ readonly selectBaselineBranch: (branch: string | undefined) => void;
30
+ readonly selectView: (view: WorktreeGitView) => void;
31
+ readonly selectSummary: () => void;
32
+ readonly setIncludeWorkingTree: (include: boolean) => void;
33
+ readonly selectCommit: (commit: string) => void;
34
+ readonly toggleCommit: (commit: string) => void;
35
+ readonly setCommitMultiSelect: (enabled: boolean) => void;
36
+ readonly clearCommitSelection: () => void;
37
+ readonly selectPath: (path: string) => void;
38
+ readonly dispose: () => void;
39
+ }
40
+ interface ControllerInput {
41
+ readonly manager?: Pick<WorktreeManager, 'listBranches' | 'listWorktreeCommits' | 'listWorktreeCommitFiles' | 'getWorktreeCommitFileDiff'>;
42
+ readonly workspaceId: string;
43
+ readonly worktreeId: string;
44
+ readonly defaultBaselineBranch?: string;
45
+ /**
46
+ * True when the Worktree record carries a captured acquisition commit the
47
+ * Manager resolves as the implicit baseline. It lets the Git tab read the
48
+ * captured baseline instead of staying blank until a branch is picked.
49
+ */
50
+ readonly capturedBaseline?: boolean;
51
+ }
52
+ /**
53
+ * Create the browser-safe Git Dashboard state machine. Construction is inert;
54
+ * the caller explicitly starts history loading on first Git-tab activation.
55
+ */
56
+ export declare function createWorktreeGitStateController(input: ControllerInput): WorktreeGitStateController;
57
+ export type UseWorktreeGitStateInput = ControllerInput;
58
+ /** React adapter; the first Git history request starts in the mount effect. */
59
+ export declare function useWorktreeGitState(input: UseWorktreeGitStateInput): WorktreeGitState & Omit<WorktreeGitStateController, 'getSnapshot' | 'subscribe'>;
60
+ //# sourceMappingURL=useWorktreeGitState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useWorktreeGitState.d.ts","sourceRoot":"","sources":["../../../../src/client/dashboard/git/useWorktreeGitState.ts"],"names":[],"mappings":"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"}