@cerbur/clutch-dsh-worktree 0.1.10 → 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.
- package/README.md +278 -498
- package/README.zh.md +231 -432
- package/assets/screenshots/screenshots-dashboard.png +0 -0
- package/assets/screenshots/screenshots-en.png +0 -0
- package/assets/screenshots/screenshots-git-reviewer.png +0 -0
- package/assets/screenshots/screenshots-import.png +0 -0
- package/assets/screenshots/screenshots-zh.png +0 -0
- package/lib/client/WorktreeSurface.d.ts +1 -1
- package/lib/client/WorktreeSurface.d.ts.map +1 -1
- package/lib/client/WorktreeSurface.js +268 -10
- package/lib/client/WorktreeSurface.js.map +1 -1
- package/lib/client/context/WorktreeHeroContext.d.ts +4 -3
- package/lib/client/context/WorktreeHeroContext.d.ts.map +1 -1
- package/lib/client/context/WorktreeHeroContext.js +29 -11
- package/lib/client/context/WorktreeHeroContext.js.map +1 -1
- package/lib/client/dashboard/DashboardHeaderAction.d.ts +20 -0
- package/lib/client/dashboard/DashboardHeaderAction.d.ts.map +1 -0
- package/lib/client/dashboard/DashboardHeaderAction.js +19 -0
- package/lib/client/dashboard/DashboardHeaderAction.js.map +1 -0
- package/lib/client/dashboard/OpenInAppButton.d.ts +9 -0
- package/lib/client/dashboard/OpenInAppButton.d.ts.map +1 -0
- package/lib/client/dashboard/OpenInAppButton.js +123 -0
- package/lib/client/dashboard/OpenInAppButton.js.map +1 -0
- package/lib/client/dashboard/WorktreeDashboard.d.ts +28 -0
- package/lib/client/dashboard/WorktreeDashboard.d.ts.map +1 -0
- package/lib/client/dashboard/WorktreeDashboard.js +362 -0
- package/lib/client/dashboard/WorktreeDashboard.js.map +1 -0
- package/lib/client/dashboard/WorktreeInstructions.d.ts +8 -0
- package/lib/client/dashboard/WorktreeInstructions.d.ts.map +1 -0
- package/lib/client/dashboard/WorktreeInstructions.js +53 -0
- package/lib/client/dashboard/WorktreeInstructions.js.map +1 -0
- package/lib/client/dashboard/dashboard-icon.d.ts +7 -0
- package/lib/client/dashboard/dashboard-icon.d.ts.map +1 -0
- package/lib/client/dashboard/dashboard-icon.js +6 -0
- package/lib/client/dashboard/dashboard-icon.js.map +1 -0
- package/lib/client/dashboard/dashboard-navigation.d.ts +35 -0
- package/lib/client/dashboard/dashboard-navigation.d.ts.map +1 -0
- package/lib/client/dashboard/dashboard-navigation.js +48 -0
- package/lib/client/dashboard/dashboard-navigation.js.map +1 -0
- package/lib/client/dashboard/dashboard-overlay.d.ts +16 -0
- package/lib/client/dashboard/dashboard-overlay.d.ts.map +1 -0
- package/lib/client/dashboard/dashboard-overlay.js +185 -0
- package/lib/client/dashboard/dashboard-overlay.js.map +1 -0
- package/lib/client/dashboard/dashboard-selection.d.ts +33 -0
- package/lib/client/dashboard/dashboard-selection.d.ts.map +1 -0
- package/lib/client/dashboard/dashboard-selection.js +31 -0
- package/lib/client/dashboard/dashboard-selection.js.map +1 -0
- package/lib/client/dashboard/dashboard-sessions.d.ts +6 -0
- package/lib/client/dashboard/dashboard-sessions.d.ts.map +1 -0
- package/lib/client/dashboard/dashboard-sessions.js +21 -0
- package/lib/client/dashboard/dashboard-sessions.js.map +1 -0
- package/lib/client/dashboard/git/GitChangedFiles.d.ts +11 -0
- package/lib/client/dashboard/git/GitChangedFiles.d.ts.map +1 -0
- package/lib/client/dashboard/git/GitChangedFiles.js +101 -0
- package/lib/client/dashboard/git/GitChangedFiles.js.map +1 -0
- package/lib/client/dashboard/git/GitCommitList.d.ts +15 -0
- package/lib/client/dashboard/git/GitCommitList.d.ts.map +1 -0
- package/lib/client/dashboard/git/GitCommitList.js +55 -0
- package/lib/client/dashboard/git/GitCommitList.js.map +1 -0
- package/lib/client/dashboard/git/GitDiffView.d.ts +10 -0
- package/lib/client/dashboard/git/GitDiffView.d.ts.map +1 -0
- package/lib/client/dashboard/git/GitDiffView.js +65 -0
- package/lib/client/dashboard/git/GitDiffView.js.map +1 -0
- package/lib/client/dashboard/git/GitFileTypeIcon.d.ts +8 -0
- package/lib/client/dashboard/git/GitFileTypeIcon.d.ts.map +1 -0
- package/lib/client/dashboard/git/GitFileTypeIcon.js +24 -0
- package/lib/client/dashboard/git/GitFileTypeIcon.js.map +1 -0
- package/lib/client/dashboard/git/GitLineStats.d.ts +10 -0
- package/lib/client/dashboard/git/GitLineStats.d.ts.map +1 -0
- package/lib/client/dashboard/git/GitLineStats.js +9 -0
- package/lib/client/dashboard/git/GitLineStats.js.map +1 -0
- package/lib/client/dashboard/git/WorktreeGitOverview.d.ts +31 -0
- package/lib/client/dashboard/git/WorktreeGitOverview.d.ts.map +1 -0
- package/lib/client/dashboard/git/WorktreeGitOverview.js +89 -0
- package/lib/client/dashboard/git/WorktreeGitOverview.js.map +1 -0
- package/lib/client/dashboard/git/WorktreeGitPanel.d.ts +16 -0
- package/lib/client/dashboard/git/WorktreeGitPanel.d.ts.map +1 -0
- package/lib/client/dashboard/git/WorktreeGitPanel.js +126 -0
- package/lib/client/dashboard/git/WorktreeGitPanel.js.map +1 -0
- package/lib/client/dashboard/git/file-address.d.ts +2 -0
- package/lib/client/dashboard/git/file-address.d.ts.map +1 -0
- package/lib/client/dashboard/git/file-address.js +16 -0
- package/lib/client/dashboard/git/file-address.js.map +1 -0
- package/lib/client/dashboard/git/git-column-split.d.ts +34 -0
- package/lib/client/dashboard/git/git-column-split.d.ts.map +1 -0
- package/lib/client/dashboard/git/git-column-split.js +41 -0
- package/lib/client/dashboard/git/git-column-split.js.map +1 -0
- package/lib/client/dashboard/git/git-diff-parser.d.ts +24 -0
- package/lib/client/dashboard/git/git-diff-parser.d.ts.map +1 -0
- package/lib/client/dashboard/git/git-diff-parser.js +56 -0
- package/lib/client/dashboard/git/git-diff-parser.js.map +1 -0
- package/lib/client/dashboard/git/git-facts.d.ts +18 -0
- package/lib/client/dashboard/git/git-facts.d.ts.map +1 -0
- package/lib/client/dashboard/git/git-facts.js +31 -0
- package/lib/client/dashboard/git/git-facts.js.map +1 -0
- package/lib/client/dashboard/git/git-file-tree.d.ts +16 -0
- package/lib/client/dashboard/git/git-file-tree.d.ts.map +1 -0
- package/lib/client/dashboard/git/git-file-tree.js +52 -0
- package/lib/client/dashboard/git/git-file-tree.js.map +1 -0
- package/lib/client/dashboard/git/git-state-cache.d.ts +49 -0
- package/lib/client/dashboard/git/git-state-cache.d.ts.map +1 -0
- package/lib/client/dashboard/git/git-state-cache.js +80 -0
- package/lib/client/dashboard/git/git-state-cache.js.map +1 -0
- package/lib/client/dashboard/git/useGitPaneSplit.d.ts +33 -0
- package/lib/client/dashboard/git/useGitPaneSplit.d.ts.map +1 -0
- package/lib/client/dashboard/git/useGitPaneSplit.js +119 -0
- package/lib/client/dashboard/git/useGitPaneSplit.js.map +1 -0
- package/lib/client/dashboard/git/useWorktreeGitState.d.ts +60 -0
- package/lib/client/dashboard/git/useWorktreeGitState.d.ts.map +1 -0
- package/lib/client/dashboard/git/useWorktreeGitState.js +654 -0
- package/lib/client/dashboard/git/useWorktreeGitState.js.map +1 -0
- package/lib/client/dashboard/open-in-app-controller.d.ts +30 -0
- package/lib/client/dashboard/open-in-app-controller.d.ts.map +1 -0
- package/lib/client/dashboard/open-in-app-controller.js +94 -0
- package/lib/client/dashboard/open-in-app-controller.js.map +1 -0
- package/lib/client/dashboard/vscode-url.d.ts +3 -0
- package/lib/client/dashboard/vscode-url.d.ts.map +1 -0
- package/lib/client/dashboard/vscode-url.js +9 -0
- package/lib/client/dashboard/vscode-url.js.map +1 -0
- package/lib/client/dashboard/worktree-acquisition-facts.d.ts +16 -0
- package/lib/client/dashboard/worktree-acquisition-facts.d.ts.map +1 -0
- package/lib/client/dashboard/worktree-acquisition-facts.js +14 -0
- package/lib/client/dashboard/worktree-acquisition-facts.js.map +1 -0
- package/lib/client/dsh-slot-contract.d.ts +5 -0
- package/lib/client/dsh-slot-contract.d.ts.map +1 -1
- package/lib/client/entry.d.ts.map +1 -1
- package/lib/client/entry.js +93 -0
- package/lib/client/entry.js.map +1 -1
- package/lib/client/locales.d.ts +296 -0
- package/lib/client/locales.d.ts.map +1 -1
- package/lib/client/locales.js +296 -0
- package/lib/client/locales.js.map +1 -1
- package/lib/client/session/session-labels.d.ts +9 -0
- package/lib/client/session/session-labels.d.ts.map +1 -0
- package/lib/client/session/session-labels.js +44 -0
- package/lib/client/session/session-labels.js.map +1 -0
- package/lib/client/session/session-view.d.ts +10 -0
- package/lib/client/session/session-view.d.ts.map +1 -1
- package/lib/client/session/session-view.js +57 -0
- package/lib/client/session/session-view.js.map +1 -1
- package/lib/client/session/worktree-session-order.d.ts +2 -5
- package/lib/client/session/worktree-session-order.d.ts.map +1 -1
- package/lib/client/session/worktree-session-order.js +35 -10
- package/lib/client/session/worktree-session-order.js.map +1 -1
- package/lib/client/session/worktree-session-position.d.ts +2 -1
- package/lib/client/session/worktree-session-position.d.ts.map +1 -1
- package/lib/client/session/worktree-session-position.js +10 -3
- package/lib/client/session/worktree-session-position.js.map +1 -1
- package/lib/client/surface/actions/useDragActions.d.ts +33 -2
- package/lib/client/surface/actions/useDragActions.d.ts.map +1 -1
- package/lib/client/surface/actions/useDragActions.js +66 -18
- package/lib/client/surface/actions/useDragActions.js.map +1 -1
- package/lib/client/surface/components/ActiveWorktree.d.ts +1 -1
- package/lib/client/surface/components/ActiveWorktree.d.ts.map +1 -1
- package/lib/client/surface/components/ActiveWorktree.js +4 -3
- package/lib/client/surface/components/ActiveWorktree.js.map +1 -1
- package/lib/client/surface/components/ArchivedWorktree.d.ts +1 -1
- package/lib/client/surface/components/ArchivedWorktree.d.ts.map +1 -1
- package/lib/client/surface/components/ArchivedWorktree.js +4 -3
- package/lib/client/surface/components/ArchivedWorktree.js.map +1 -1
- package/lib/client/surface/components/ArchivedWorktrees.d.ts +1 -1
- package/lib/client/surface/components/ArchivedWorktrees.d.ts.map +1 -1
- package/lib/client/surface/components/ArchivedWorktrees.js +2 -2
- package/lib/client/surface/components/ArchivedWorktrees.js.map +1 -1
- package/lib/client/surface/components/SurfaceContent.d.ts +2 -2
- package/lib/client/surface/components/SurfaceContent.d.ts.map +1 -1
- package/lib/client/surface/components/SurfaceContent.js +1 -1
- package/lib/client/surface/components/SurfaceContent.js.map +1 -1
- package/lib/client/surface/components/SurfaceHeader.d.ts +1 -1
- package/lib/client/surface/components/SurfaceHeader.d.ts.map +1 -1
- package/lib/client/surface/components/SurfaceHeader.js +12 -3
- package/lib/client/surface/components/SurfaceHeader.js.map +1 -1
- package/lib/client/surface/components/WorkspaceTree.d.ts +1 -1
- package/lib/client/surface/components/WorkspaceTree.d.ts.map +1 -1
- package/lib/client/surface/components/WorkspaceTree.js +9 -5
- package/lib/client/surface/components/WorkspaceTree.js.map +1 -1
- package/lib/client/surface/components/rows.d.ts +2 -2
- package/lib/client/surface/components/rows.d.ts.map +1 -1
- package/lib/client/surface/components/rows.js +111 -8
- package/lib/client/surface/components/rows.js.map +1 -1
- package/lib/client/surface/selectors.d.ts +10 -0
- package/lib/client/surface/selectors.d.ts.map +1 -1
- package/lib/client/surface/selectors.js +14 -0
- package/lib/client/surface/selectors.js.map +1 -1
- package/lib/client/surface/state/useSessionExpansion.d.ts +2 -1
- package/lib/client/surface/state/useSessionExpansion.d.ts.map +1 -1
- package/lib/client/surface/state/useSessionExpansion.js +26 -13
- package/lib/client/surface/state/useSessionExpansion.js.map +1 -1
- package/lib/client/surface/state/useSessionOrdering.d.ts +1 -1
- package/lib/client/surface/state/useSessionOrdering.d.ts.map +1 -1
- package/lib/client/surface/state/useSessionOrdering.js +23 -8
- package/lib/client/surface/state/useSessionOrdering.js.map +1 -1
- package/lib/client/surface/types.d.ts +23 -3
- package/lib/client/surface/types.d.ts.map +1 -1
- package/lib/client/view/WorktreeModeAction.d.ts.map +1 -1
- package/lib/client/view/WorktreeModeAction.js +8 -0
- package/lib/client/view/WorktreeModeAction.js.map +1 -1
- package/lib/client/view/view-mode-dispatch.d.ts +7 -0
- package/lib/client/view/view-mode-dispatch.d.ts.map +1 -0
- package/lib/client/view/view-mode-dispatch.js +11 -0
- package/lib/client/view/view-mode-dispatch.js.map +1 -0
- package/lib/client/view/worktree-expand-state.d.ts +1 -1
- package/lib/client/view/worktree-expand-state.d.ts.map +1 -1
- package/lib/client/view/worktree-expand-state.js +8 -1
- package/lib/client/view/worktree-expand-state.js.map +1 -1
- package/lib/client/worktree-connection.d.ts +5 -0
- package/lib/client/worktree-connection.d.ts.map +1 -1
- package/lib/client/worktree-connection.js +14 -0
- package/lib/client/worktree-connection.js.map +1 -1
- package/lib/client.js +4865 -158
- package/lib/client.js.map +1 -1
- package/lib/contract/index.contract.js +10 -0
- package/lib/contract/index.contract.js.map +1 -1
- package/lib/contract/index.d.ts +163 -1
- package/lib/contract/index.d.ts.map +1 -1
- package/lib/contract/index.js +19 -0
- package/lib/contract/index.js.map +1 -1
- package/lib/host/dsh-read-adapter.d.ts +3 -1
- package/lib/host/dsh-read-adapter.d.ts.map +1 -1
- package/lib/host/dsh-read-adapter.js +5 -2
- package/lib/host/dsh-read-adapter.js.map +1 -1
- package/lib/host/remote.d.ts.map +1 -1
- package/lib/host/remote.js +5 -0
- package/lib/host/remote.js.map +1 -1
- package/lib/host/service.d.ts +20 -1
- package/lib/host/service.d.ts.map +1 -1
- package/lib/host/service.js +32 -0
- package/lib/host/service.js.map +1 -1
- package/lib/host/worktree-instructions.d.ts +41 -0
- package/lib/host/worktree-instructions.d.ts.map +1 -0
- package/lib/host/worktree-instructions.js +65 -0
- package/lib/host/worktree-instructions.js.map +1 -0
- package/lib/index.d.ts +4 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -3
- package/lib/index.js.map +1 -1
- package/lib/manage/manager-git-history.d.ts +17 -0
- package/lib/manage/manager-git-history.d.ts.map +1 -0
- package/lib/manage/manager-git-history.js +717 -0
- package/lib/manage/manager-git-history.js.map +1 -0
- package/lib/manage/manager-worktrees.d.ts.map +1 -1
- package/lib/manage/manager-worktrees.js +27 -0
- package/lib/manage/manager-worktrees.js.map +1 -1
- package/lib/manage/manager.d.ts +21 -1
- package/lib/manage/manager.d.ts.map +1 -1
- package/lib/manage/manager.js +60 -0
- package/lib/manage/manager.js.map +1 -1
- package/lib/manage/types.d.ts +1 -0
- package/lib/manage/types.d.ts.map +1 -1
- package/lib/provider/git/adapter.d.ts +54 -1
- package/lib/provider/git/adapter.d.ts.map +1 -1
- package/lib/provider/git/adapter.js +820 -1
- package/lib/provider/git/adapter.js.map +1 -1
- package/lib/provider/index.d.ts +2 -2
- package/lib/provider/index.d.ts.map +1 -1
- package/lib/provider/index.js +1 -1
- package/lib/provider/index.js.map +1 -1
- package/lib/provider/mutation-token.d.ts +1 -1
- package/lib/provider/mutation-token.d.ts.map +1 -1
- package/lib/provider/mutation-token.js +1 -0
- package/lib/provider/mutation-token.js.map +1 -1
- package/lib/provider/sidecar/repository.d.ts +1 -1
- package/lib/provider/sidecar/repository.d.ts.map +1 -1
- package/lib/provider/sidecar/repository.js +7 -2
- package/lib/provider/sidecar/repository.js.map +1 -1
- package/lib/provider/sidecar/sidecar-schema.d.ts +16 -3
- package/lib/provider/sidecar/sidecar-schema.d.ts.map +1 -1
- package/lib/provider/sidecar/sidecar-schema.js +117 -28
- package/lib/provider/sidecar/sidecar-schema.js.map +1 -1
- package/lib/provider/transaction/operations/create.d.ts.map +1 -1
- package/lib/provider/transaction/operations/create.js +21 -6
- package/lib/provider/transaction/operations/create.js.map +1 -1
- package/lib/provider/transaction/operations/import.d.ts.map +1 -1
- package/lib/provider/transaction/operations/import.js +1 -0
- package/lib/provider/transaction/operations/import.js.map +1 -1
- package/lib/provider/transaction/recovery/failure-recovery.d.ts.map +1 -1
- package/lib/provider/transaction/recovery/failure-recovery.js +11 -4
- package/lib/provider/transaction/recovery/failure-recovery.js.map +1 -1
- package/lib/provider/transaction/recovery/recover.js +11 -11
- package/lib/provider/transaction/recovery/recover.js.map +1 -1
- package/lib/provider/transaction/support/inspection.d.ts +0 -2
- package/lib/provider/transaction/support/inspection.d.ts.map +1 -1
- package/lib/provider/transaction/support/inspection.js +0 -4
- package/lib/provider/transaction/support/inspection.js.map +1 -1
- package/lib/provider/transaction/support/journal.d.ts.map +1 -1
- package/lib/provider/transaction/support/journal.js +4 -0
- package/lib/provider/transaction/support/journal.js.map +1 -1
- package/lib/provider/transaction/types.d.ts +1 -0
- package/lib/provider/transaction/types.d.ts.map +1 -1
- package/lib/provider/types.d.ts +53 -5
- package/lib/provider/types.d.ts.map +1 -1
- package/lib/provider/types.js +1 -1
- package/lib/provider/types.js.map +1 -1
- package/lib/typert.host.js +349 -33
- package/lib/typert.remote-client.d.ts +11 -1
- package/lib/typert.remote-client.d.ts.map +1 -1
- package/lib/typert.remote-client.js +349 -33
- package/package.json +23 -20
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useRef } from 'react';
|
|
3
|
+
import { isMainWorktreeId, normalizeBaselineBranch, sumLineTotals } from './git-facts.js';
|
|
4
|
+
import { GitChangedFiles } from './GitChangedFiles.js';
|
|
5
|
+
import { GitLineStats } from './GitLineStats.js';
|
|
6
|
+
import { GitCommitList } from './GitCommitList.js';
|
|
7
|
+
import { GitDiffView } from './GitDiffView.js';
|
|
8
|
+
import { GIT_SPLIT_DEFAULT_COLUMN_PERCENT, GIT_SPLIT_DEFAULT_ROW_PERCENT, GIT_SPLIT_MIN_COLUMN_PX, GIT_SPLIT_MIN_ROW_PX, } from './git-column-split.js';
|
|
9
|
+
import { useGitPaneSplit } from './useGitPaneSplit.js';
|
|
10
|
+
import { useWorktreeGitState } from './useWorktreeGitState.js';
|
|
11
|
+
import styles from './worktree-git.css';
|
|
12
|
+
function shortCommit(commit) {
|
|
13
|
+
return commit === undefined ? '—' : commit.slice(0, 7);
|
|
14
|
+
}
|
|
15
|
+
function selectedCommit(history, sha) {
|
|
16
|
+
return history?.commits.find((commit) => commit.sha === sha);
|
|
17
|
+
}
|
|
18
|
+
function commitCountLabel(history, t) {
|
|
19
|
+
const committedCount = history.commits.filter((commit) => commit.kind !== 'working-tree').length;
|
|
20
|
+
return history.commits.some((commit) => commit.kind === 'working-tree')
|
|
21
|
+
? t('dashboard.git.commitCountWithWorkingTree', { commits: committedCount })
|
|
22
|
+
: t('dashboard.git.commitCount', { n: committedCount });
|
|
23
|
+
}
|
|
24
|
+
function commitLabel(commit, t) {
|
|
25
|
+
return commit.kind === 'working-tree'
|
|
26
|
+
? t('dashboard.git.workingTree')
|
|
27
|
+
: shortCommit(commit.sha);
|
|
28
|
+
}
|
|
29
|
+
function readyFiles(value) {
|
|
30
|
+
return value?.files ?? [];
|
|
31
|
+
}
|
|
32
|
+
/** Empty-state copy per honest unavailable reason; one definition for both blocks. */
|
|
33
|
+
const UNAVAILABLE_COPY = {
|
|
34
|
+
main: {
|
|
35
|
+
title: 'dashboard.git.mainUnavailableTitle',
|
|
36
|
+
description: 'dashboard.git.mainUnavailableDescription',
|
|
37
|
+
},
|
|
38
|
+
'baseline-unselected': {
|
|
39
|
+
title: 'dashboard.git.selectBaselineTitle',
|
|
40
|
+
description: 'dashboard.git.selectBaselineDescription',
|
|
41
|
+
},
|
|
42
|
+
'baseline-unknown': {
|
|
43
|
+
title: 'dashboard.git.baselineUnknownTitle',
|
|
44
|
+
description: 'dashboard.git.baselineUnknownDescription',
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
function UnavailableNotice({ reason, t, }) {
|
|
48
|
+
return (_jsxs("div", { className: styles.gitUnavailable, "data-dashboard-git-unavailable": true, children: [_jsx("strong", { children: t(UNAVAILABLE_COPY[reason].title) }), _jsx("p", { children: t(UNAVAILABLE_COPY[reason].description) })] }));
|
|
49
|
+
}
|
|
50
|
+
/** Git & Changes tab: read-only, on-demand history -> target files -> one-file diff. */
|
|
51
|
+
export function WorktreeGitPanel({ manager, workspaceId, worktreeId, defaultBaselineBranch, currentBranch, capturedBaseline, onOpenFile, t, }) {
|
|
52
|
+
const isMain = isMainWorktreeId(worktreeId);
|
|
53
|
+
const selectedDefaultBaseline = normalizeBaselineBranch(defaultBaselineBranch, currentBranch);
|
|
54
|
+
const state = useWorktreeGitState({
|
|
55
|
+
manager,
|
|
56
|
+
workspaceId,
|
|
57
|
+
worktreeId,
|
|
58
|
+
defaultBaselineBranch: isMain ? undefined : selectedDefaultBaseline,
|
|
59
|
+
capturedBaseline: isMain ? false : capturedBaseline,
|
|
60
|
+
});
|
|
61
|
+
const gridRef = useRef(null);
|
|
62
|
+
// Both dividers share the grid: one splits rows, one splits columns, in either layout.
|
|
63
|
+
const rows = useGitPaneSplit({
|
|
64
|
+
containerRef: gridRef,
|
|
65
|
+
orientation: 'horizontal',
|
|
66
|
+
property: '--git-rows-top',
|
|
67
|
+
minimum: GIT_SPLIT_MIN_ROW_PX,
|
|
68
|
+
fallback: GIT_SPLIT_DEFAULT_ROW_PERCENT,
|
|
69
|
+
});
|
|
70
|
+
const columns = useGitPaneSplit({
|
|
71
|
+
containerRef: gridRef,
|
|
72
|
+
orientation: 'vertical',
|
|
73
|
+
property: '--git-columns-left',
|
|
74
|
+
minimum: GIT_SPLIT_MIN_COLUMN_PX,
|
|
75
|
+
fallback: GIT_SPLIT_DEFAULT_COLUMN_PERCENT,
|
|
76
|
+
});
|
|
77
|
+
const historyValue = state.history.status === 'ready' ? state.history.value : undefined;
|
|
78
|
+
const commit = selectedCommit(historyValue, state.selectedCommit);
|
|
79
|
+
const files = state.files.status === 'ready' ? readyFiles(state.files.value) : [];
|
|
80
|
+
const diff = state.diff.status === 'ready' ? state.diff.value : undefined;
|
|
81
|
+
const refreshing = state.history.status === 'ready' && state.history.refreshing === true;
|
|
82
|
+
const unavailable = historyValue?.unavailableReason;
|
|
83
|
+
const branchOptions = (state.branches.status === 'ready' ? state.branches.value : [])
|
|
84
|
+
.filter((branch) => branch.name !== currentBranch);
|
|
85
|
+
const branchError = state.branches.status === 'error'
|
|
86
|
+
? state.branches.error
|
|
87
|
+
: state.branches.status === 'ready'
|
|
88
|
+
? state.branches.error
|
|
89
|
+
: undefined;
|
|
90
|
+
const baselineCommit = historyValue?.baseline?.commit;
|
|
91
|
+
const baselineRef = state.baselineBranch ?? historyValue?.baseline?.ref;
|
|
92
|
+
const targetLabel = state.view === 'summary'
|
|
93
|
+
? t('dashboard.git.baselineSummary')
|
|
94
|
+
: state.selectedCommits.length > 1
|
|
95
|
+
? t('dashboard.git.selectedCommitCount', { n: state.selectedCommits.length })
|
|
96
|
+
: commit === undefined
|
|
97
|
+
? undefined
|
|
98
|
+
: commitLabel(commit, t);
|
|
99
|
+
const hasTarget = state.view === 'summary' || commit !== undefined;
|
|
100
|
+
const lineTotals = state.files.status === 'ready' && hasTarget ? sumLineTotals(files) : undefined;
|
|
101
|
+
return (_jsxs("section", { className: styles.gitPanel, "data-dashboard-git-panel": true, children: [_jsxs("header", { className: styles.gitPanelHeader, children: [_jsxs("div", { className: styles.gitPanelHeading, children: [_jsx("h2", { children: t('dashboard.git.title') }), !isMain && (_jsxs("label", { className: styles.gitBaselineSelector, children: [_jsx("span", { children: t('dashboard.git.baselineSelector') }), _jsxs("select", { value: state.baselineBranch ?? '', "data-dashboard-git-baseline": true, disabled: state.branches.status === 'loading', onChange: (event) => state.selectBaselineBranch(event.currentTarget.value || undefined), children: [_jsx("option", { value: "", children: t('dashboard.git.selectBaseline') }), state.baselineBranch !== undefined && !branchOptions.some((branch) => branch.name === state.baselineBranch) && (_jsx("option", { value: state.baselineBranch, children: state.baselineBranch })), branchOptions.map((branch) => (_jsx("option", { value: branch.name, children: branch.name }, branch.name)))] })] })), baselineCommit !== undefined && (_jsxs("dl", { className: styles.gitBaselineFacts, children: [_jsxs("div", { children: [_jsx("dt", { children: t('dashboard.git.base') }), _jsxs("dd", { children: [baselineRef !== undefined ? (_jsxs(_Fragment, { children: [baselineRef, _jsxs("code", { children: ["@ ", shortCommit(baselineCommit)] })] })) : (_jsx("code", { children: shortCommit(baselineCommit) })), historyValue?.baseline?.source === 'derived' && (_jsx("span", { className: styles.gitDerived, children: t('dashboard.git.derived') }))] })] }), historyValue !== undefined && (_jsxs(_Fragment, { children: [_jsxs("div", { children: [_jsx("dt", { children: t('dashboard.git.head') }), _jsx("dd", { children: _jsx("code", { children: shortCommit(historyValue.headCommit) }) })] }), _jsxs("div", { children: [_jsx("dt", { children: t('dashboard.git.commits') }), _jsx("dd", { children: commitCountLabel(historyValue, t) })] }), historyValue.ahead !== undefined && historyValue.behind !== undefined && (_jsxs("div", { children: [_jsx("dt", { children: t('dashboard.aheadBehind') }), _jsx("dd", { children: _jsx(GitLineStats, { additions: historyValue.ahead, deletions: historyValue.behind, ariaLabel: t('dashboard.git.aheadBehindStats', {
|
|
102
|
+
ahead: historyValue.ahead,
|
|
103
|
+
behind: historyValue.behind,
|
|
104
|
+
}) }) })] }))] }))] }))] }), _jsx("button", { type: "button", className: styles.gitRefresh, "data-dashboard-git-refresh": true, disabled: isMain || refreshing || state.history.status === 'loading', "aria-busy": refreshing || state.history.status === 'loading', onClick: () => void state.refresh(), children: refreshing ? t('dashboard.git.refreshing') : t('dashboard.git.refresh') })] }), branchError !== undefined && (_jsxs("div", { className: styles.gitError, role: "alert", children: [_jsx("p", { children: t('dashboard.git.loadFailed', { reason: errorText(branchError, t) }) }), _jsx("button", { type: "button", onClick: () => void state.loadBranches(), children: t('dashboard.git.retry') })] })), isMain && _jsx(UnavailableNotice, { reason: "main", t: t }), !isMain && unavailable === 'baseline-unselected' && (_jsxs("div", { className: styles.gitBaselinePrompt, "data-dashboard-git-baseline-prompt": true, children: [_jsx("strong", { children: t('dashboard.git.selectBaselineTitle') }), _jsx("p", { children: t('dashboard.git.selectBaselineDescription') })] })), state.history.status === 'loading' && (_jsx("div", { className: styles.gitLoading, role: "status", children: t('dashboard.git.loading') })), state.history.status === 'error' && (_jsxs("div", { className: styles.gitError, role: "alert", children: [_jsx("p", { children: t('dashboard.git.loadFailed', { reason: errorText(state.history.error, t) }) }), _jsx("button", { type: "button", onClick: () => void state.refresh(), children: t('dashboard.git.retry') })] })), state.history.status === 'ready' && state.history.error !== undefined && (_jsxs("div", { className: styles.gitError, role: "alert", children: [_jsx("p", { children: t('dashboard.git.refreshFailed', { reason: errorText(state.history.error, t) }) }), _jsx("button", { type: "button", onClick: () => void state.refresh(), children: t('dashboard.git.retry') })] })), state.history.status === 'ready' && historyValue !== undefined && unavailable !== undefined && (_jsx(UnavailableNotice, { reason: unavailable, t: t })), state.history.status === 'ready' && historyValue !== undefined && unavailable === undefined && (_jsxs("div", { className: styles.gitColumns, ref: gridRef, children: [_jsxs("section", { className: styles.gitColumn, "data-dashboard-git-pane": "commits", "aria-label": t('dashboard.git.commits'), children: [_jsxs("div", { className: styles.gitColumnHeader, children: [_jsx("h3", { children: t('dashboard.git.commits') }), _jsxs("div", { className: styles.gitColumnHeaderControls, children: [historyValue.truncated && _jsx("span", { children: t('dashboard.git.truncatedHistory') }), _jsxs("label", { className: styles.gitCommitMultiSelect, title: t('dashboard.git.multiSelectCommitsDescription'), children: [_jsx("input", { type: "checkbox", role: "switch", "data-dashboard-git-multi-select": true, "aria-describedby": "dashboard-git-commit-selection-hint", checked: state.commitMultiSelect, onChange: (event) => state.setCommitMultiSelect(event.currentTarget.checked) }), _jsx("span", { className: styles.gitCommitMultiSelectTrack, "aria-hidden": "true", children: _jsx("span", { className: styles.gitCommitMultiSelectThumb }) }), _jsx("span", { className: styles.gitCommitMultiSelectLabel, children: t('dashboard.git.multiSelectCommits') })] })] })] }), _jsxs("button", { type: "button", className: styles.gitSummaryButton, "data-dashboard-git-summary": true, "aria-pressed": state.view === 'summary', onClick: state.selectSummary, children: [_jsx("span", { children: t('dashboard.git.baselineSummary') }), _jsx("small", { children: t('dashboard.git.baselineSummaryDescription') })] }), state.view === 'summary' && (_jsxs("label", { className: styles.gitSummaryToggle, "data-dashboard-git-include-working-tree": true, children: [_jsx("input", { type: "checkbox", checked: state.includeWorkingTree, disabled: state.files.status === 'loading', onChange: (event) => state.setIncludeWorkingTree(event.currentTarget.checked) }), _jsxs("span", { children: [_jsx("strong", { children: t('dashboard.git.includeWorkingTree') }), _jsx("small", { children: t('dashboard.git.includeWorkingTreeDescription') })] })] })), _jsx("span", { id: "dashboard-git-commit-selection-hint", className: styles.gitSrOnly, children: t('dashboard.git.commitSelectionHint') }), historyValue.commits.length === 0 && _jsx("div", { className: styles.gitEmpty, children: t('dashboard.git.noCommits') }), _jsx(GitCommitList, { commits: historyValue.commits, selectedCommit: state.selectedCommit, selectedCommits: state.selectedCommits, multiSelect: state.commitMultiSelect, onSelect: state.selectCommit, onToggle: state.toggleCommit, t: t })] }), _jsx(GitSplitter, { split: rows, orientation: "horizontal", axis: "rows", label: t('dashboard.git.resizeRows') }), _jsxs("section", { className: styles.gitColumn, "data-dashboard-git-pane": "changed-files", "aria-label": t('dashboard.git.changedFiles'), "aria-busy": state.files.status === 'loading', children: [_jsxs("div", { className: styles.gitColumnHeader, children: [_jsx("h3", { children: t('dashboard.git.changedFiles') }), _jsxs("div", { className: styles.gitColumnHeaderMeta, children: [targetLabel !== undefined && (state.selectedCommits.length > 1 || state.view === 'summary'
|
|
105
|
+
? _jsx("span", { children: targetLabel })
|
|
106
|
+
: _jsx("code", { children: targetLabel })), state.files.status === 'ready' && hasTarget && (lineTotals === undefined ? (_jsx("span", { className: styles.gitColumnHeaderUnknown, children: t('dashboard.unknown') })) : (_jsx(GitLineStats, { additions: lineTotals.additions, deletions: lineTotals.deletions, ariaLabel: t('dashboard.git.lineStats', {
|
|
107
|
+
additions: lineTotals.additions,
|
|
108
|
+
deletions: lineTotals.deletions,
|
|
109
|
+
}) })))] })] }), state.commitMultiSelect && state.selectedCommits.length > 0 && state.view === 'commits' && (_jsxs("div", { className: styles.gitSelectionToolbar, children: [_jsx("span", { children: t('dashboard.git.selectedCommitCount', { n: state.selectedCommits.length }) }), _jsx("button", { type: "button", onClick: state.clearCommitSelection, children: t('dashboard.git.clearCommitSelection') })] })), !hasTarget ? (_jsx("div", { className: styles.gitEmpty, children: t('dashboard.git.selectCommit') })) : state.files.status === 'loading' ? (_jsx("div", { className: styles.gitLoading, role: "status", children: state.view === 'summary' ? t('dashboard.git.loadingSummaryFiles') : t('dashboard.git.loadingFiles') })) : state.files.status === 'error' ? (_jsx("div", { className: styles.gitError, role: "alert", children: errorText(state.files.error, t) })) : (_jsxs(_Fragment, { children: [state.files.status === 'ready' && state.files.error !== undefined && (_jsx("div", { className: styles.gitError, role: "alert", children: errorText(state.files.error, t) })), state.files.status === 'ready' && state.files.value.truncated === true && (_jsx("div", { className: styles.gitEmpty, role: "status", "data-dashboard-git-files-truncated": true, children: t('dashboard.git.truncatedFiles') })), files.length === 0 && !(state.files.status === 'ready' && state.files.value.truncated === true) ? (_jsx("div", { className: styles.gitEmpty, children: state.view === 'summary'
|
|
110
|
+
? state.includeWorkingTree
|
|
111
|
+
? t('dashboard.git.noLiveBaselineChanges')
|
|
112
|
+
: t('dashboard.git.noBaselineChanges')
|
|
113
|
+
: t('dashboard.git.noFiles') })) : (_jsx(GitChangedFiles, { files: files, selectedPath: state.selectedPath, onSelect: state.selectPath, t: t }))] }))] }), _jsx(GitSplitter, { split: columns, orientation: "vertical", axis: "columns", label: t('dashboard.git.resizeColumns') }), _jsxs("section", { className: styles.gitColumn, "data-dashboard-git-pane": "diff", "aria-label": t('dashboard.git.diff'), "aria-busy": state.diff.status === 'loading', children: [_jsxs("div", { className: styles.gitColumnHeader, children: [_jsx("h3", { children: state.view === 'summary' ? t('dashboard.git.summaryDiff') : t('dashboard.git.diff') }), state.selectedPath !== undefined && _jsx("code", { title: state.selectedPath, children: state.selectedPath })] }), state.diff.status === 'loading' ? (_jsx("div", { className: styles.gitLoading, role: "status", children: state.view === 'summary' ? t('dashboard.git.loadingSummaryDiff') : t('dashboard.git.loadingDiff') })) : state.diff.status === 'error' ? (_jsx("div", { className: styles.gitError, role: "alert", children: errorText(state.diff.error, t) })) : (_jsx(GitDiffView, { diff: diff, onOpenFile: onOpenFile, t: t }))] })] }))] }));
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Draggable divider that resizes one axis of the Git grid. The wide layout puts
|
|
117
|
+
* the row divider inside the left column and the column divider beside it; the
|
|
118
|
+
* narrow layout keeps both, between the top panes and above the diff.
|
|
119
|
+
*/
|
|
120
|
+
function GitSplitter({ split, orientation, axis, label }) {
|
|
121
|
+
return (_jsx("div", { className: styles.gitColumnSplitter, "data-dashboard-git-splitter": axis, "data-dashboard-git-splitting": split.dragging ? 'true' : undefined, role: "separator", "aria-orientation": orientation, "aria-label": label, "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": Math.round(split.percent), title: label, tabIndex: 0, ref: split.splitterRef, onPointerDown: split.startDrag, onPointerMove: split.drag, onPointerUp: split.endDrag, onPointerCancel: split.endDrag, onLostPointerCapture: split.endDrag, onDoubleClick: split.reset, onKeyDown: split.onKeyDown }));
|
|
122
|
+
}
|
|
123
|
+
function errorText(error, t) {
|
|
124
|
+
return error.message || t('dashboard.unknownError');
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=WorktreeGitPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeGitPanel.js","sourceRoot":"","sources":["../../../../src/client/dashboard/git/WorktreeGitPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-address.d.ts","sourceRoot":"","sources":["../../../../src/client/dashboard/git/file-address.ts"],"names":[],"mappings":"AAaA,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG/E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical DSH session file address constructor.
|
|
3
|
+
* Equivalent to `sessionFileAddress` from `@deepseek-ai/dsh-util-workspace-path`.
|
|
4
|
+
* Address grammar: `dsh-resource://file/session/<sessionId>/<encodedPath>`
|
|
5
|
+
*/
|
|
6
|
+
function encodeSegment(segment) {
|
|
7
|
+
return encodeURIComponent(segment).replace(/%3A/gi, ':');
|
|
8
|
+
}
|
|
9
|
+
function encodePath(path) {
|
|
10
|
+
return path.split('/').map(encodeSegment).join('/');
|
|
11
|
+
}
|
|
12
|
+
export function buildSessionFileAddress(sessionId, path) {
|
|
13
|
+
const normalized = path.replace(/\\/g, '/').replace(/^(?:\.\/)+/, '');
|
|
14
|
+
return `dsh-resource://file/session/${encodeSegment(sessionId)}/${encodePath(normalized)}`;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=file-address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-address.js","sourceRoot":"","sources":["../../../../src/client/dashboard/git/file-address.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,SAAiB,EAAE,IAAY;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACtE,OAAO,+BAA+B,aAAa,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;AAC7F,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Geometry for the two draggable Git dividers. Each divider splits one grid axis
|
|
3
|
+
* of the panel into a leading pane, the divider itself, and a trailing pane.
|
|
4
|
+
* These helpers stay free of DOM and React APIs so the drag math is testable.
|
|
5
|
+
*/
|
|
6
|
+
/** Share of the stacked axis, in percent, given to the commits pane by default. */
|
|
7
|
+
export declare const GIT_SPLIT_DEFAULT_ROW_PERCENT = 45;
|
|
8
|
+
/** Share of the side-by-side axis, in percent, given to the left column by default. */
|
|
9
|
+
export declare const GIT_SPLIT_DEFAULT_COLUMN_PERCENT = 38;
|
|
10
|
+
/** Smallest rendered height, in CSS pixels, kept usable for a stacked pane. */
|
|
11
|
+
export declare const GIT_SPLIT_MIN_ROW_PX = 140;
|
|
12
|
+
/** Smallest rendered width, in CSS pixels, kept usable for a side-by-side pane. */
|
|
13
|
+
export declare const GIT_SPLIT_MIN_COLUMN_PX = 240;
|
|
14
|
+
/** Percentage points moved by one arrow-key press (Shift multiplies the step). */
|
|
15
|
+
export declare const GIT_SPLIT_KEY_STEP = 4;
|
|
16
|
+
/** Rendered box of the grid one divider splits, measured once per interaction. */
|
|
17
|
+
export interface GitSplitGeometry {
|
|
18
|
+
/** Viewport-relative leading edge: the top for row splits, the left for column splits. */
|
|
19
|
+
readonly start: number;
|
|
20
|
+
/** Rendered container size along the split axis, in CSS pixels. */
|
|
21
|
+
readonly size: number;
|
|
22
|
+
/** Rendered divider thickness, in CSS pixels. */
|
|
23
|
+
readonly divider: number;
|
|
24
|
+
/** Smallest pane size along the split axis, in CSS pixels. */
|
|
25
|
+
readonly minimum: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Clamp a leading-pane share to the range that keeps both panes usable, or
|
|
29
|
+
* undefined when the measured geometry cannot express a usable split at all.
|
|
30
|
+
*/
|
|
31
|
+
export declare function clampGitSplitPercent(percent: number, geometry: GitSplitGeometry): number | undefined;
|
|
32
|
+
/** Resolve the share that keeps the divider centered under a pointer. */
|
|
33
|
+
export declare function gitSplitPercentFromPointer(pointer: number, geometry: GitSplitGeometry): number | undefined;
|
|
34
|
+
//# sourceMappingURL=git-column-split.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-column-split.d.ts","sourceRoot":"","sources":["../../../../src/client/dashboard/git/git-column-split.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mFAAmF;AACnF,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAEhD,uFAAuF;AACvF,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD,+EAA+E;AAC/E,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,mFAAmF;AACnF,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,kFAAkF;AAClF,MAAM,WAAW,gBAAgB;IAC/B,0FAA0F;IAC1F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,gBAAgB,GACzB,MAAM,GAAG,SAAS,CAQpB;AAED,yEAAyE;AACzE,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,gBAAgB,GACzB,MAAM,GAAG,SAAS,CAIpB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Geometry for the two draggable Git dividers. Each divider splits one grid axis
|
|
3
|
+
* of the panel into a leading pane, the divider itself, and a trailing pane.
|
|
4
|
+
* These helpers stay free of DOM and React APIs so the drag math is testable.
|
|
5
|
+
*/
|
|
6
|
+
/** Share of the stacked axis, in percent, given to the commits pane by default. */
|
|
7
|
+
export const GIT_SPLIT_DEFAULT_ROW_PERCENT = 45;
|
|
8
|
+
/** Share of the side-by-side axis, in percent, given to the left column by default. */
|
|
9
|
+
export const GIT_SPLIT_DEFAULT_COLUMN_PERCENT = 38;
|
|
10
|
+
/** Smallest rendered height, in CSS pixels, kept usable for a stacked pane. */
|
|
11
|
+
export const GIT_SPLIT_MIN_ROW_PX = 140;
|
|
12
|
+
/** Smallest rendered width, in CSS pixels, kept usable for a side-by-side pane. */
|
|
13
|
+
export const GIT_SPLIT_MIN_COLUMN_PX = 240;
|
|
14
|
+
/** Percentage points moved by one arrow-key press (Shift multiplies the step). */
|
|
15
|
+
export const GIT_SPLIT_KEY_STEP = 4;
|
|
16
|
+
function roundPercent(percent) {
|
|
17
|
+
return Math.round(percent * 100) / 100;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Clamp a leading-pane share to the range that keeps both panes usable, or
|
|
21
|
+
* undefined when the measured geometry cannot express a usable split at all.
|
|
22
|
+
*/
|
|
23
|
+
export function clampGitSplitPercent(percent, geometry) {
|
|
24
|
+
if (!Number.isFinite(percent))
|
|
25
|
+
return undefined;
|
|
26
|
+
const { size, divider, minimum } = geometry;
|
|
27
|
+
if (!Number.isFinite(size) || size <= 0)
|
|
28
|
+
return undefined;
|
|
29
|
+
const lower = (minimum / size) * 100;
|
|
30
|
+
const upper = 100 - ((minimum + Math.max(divider, 0)) / size) * 100;
|
|
31
|
+
if (upper <= lower)
|
|
32
|
+
return undefined;
|
|
33
|
+
return roundPercent(Math.min(Math.max(percent, lower), upper));
|
|
34
|
+
}
|
|
35
|
+
/** Resolve the share that keeps the divider centered under a pointer. */
|
|
36
|
+
export function gitSplitPercentFromPointer(pointer, geometry) {
|
|
37
|
+
const halfDivider = Math.max(geometry.divider, 0) / 2;
|
|
38
|
+
const leadingPx = pointer - geometry.start - halfDivider;
|
|
39
|
+
return clampGitSplitPercent((leadingPx / geometry.size) * 100, geometry);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=git-column-split.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-column-split.js","sourceRoot":"","sources":["../../../../src/client/dashboard/git/git-column-split.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mFAAmF;AACnF,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAEhD,uFAAuF;AACvF,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,CAAC;AAEnD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAExC,mFAAmF;AACnF,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C,kFAAkF;AAClF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAcpC,SAAS,YAAY,CAAC,OAAe;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,QAA0B;IAE1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,KAAK,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IACrC,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IACpE,IAAI,KAAK,IAAI,KAAK;QAAE,OAAO,SAAS,CAAC;IACrC,OAAO,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,0BAA0B,CACxC,OAAe,EACf,QAA0B;IAE1B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC,KAAK,GAAG,WAAW,CAAC;IACzD,OAAO,oBAAoB,CAAC,CAAC,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface DiffHunk {
|
|
2
|
+
readonly oldStart: number;
|
|
3
|
+
readonly oldLines: number;
|
|
4
|
+
readonly newStart: number;
|
|
5
|
+
readonly newLines: number;
|
|
6
|
+
readonly lines: readonly DiffLine[];
|
|
7
|
+
}
|
|
8
|
+
export type DiffLine = {
|
|
9
|
+
readonly type: 'context';
|
|
10
|
+
readonly oldLine: number;
|
|
11
|
+
readonly newLine: number;
|
|
12
|
+
readonly text: string;
|
|
13
|
+
} | {
|
|
14
|
+
readonly type: 'add';
|
|
15
|
+
readonly newLine: number;
|
|
16
|
+
readonly text: string;
|
|
17
|
+
} | {
|
|
18
|
+
readonly type: 'delete';
|
|
19
|
+
readonly oldLine: number;
|
|
20
|
+
readonly text: string;
|
|
21
|
+
};
|
|
22
|
+
/** Parse only the small unified-diff subset needed by the V1 plain-text renderer. */
|
|
23
|
+
export declare function parseUnifiedDiff(patch: string): readonly DiffHunk[];
|
|
24
|
+
//# sourceMappingURL=git-diff-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-diff-parser.d.ts","sourceRoot":"","sources":["../../../../src/client/dashboard/git/git-diff-parser.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;CACrC;AAED,MAAM,MAAM,QAAQ,GAChB;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAIN,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,QAAQ,EAAE,CA0DnE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const HUNK_HEADER = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/u;
|
|
2
|
+
/** Parse only the small unified-diff subset needed by the V1 plain-text renderer. */
|
|
3
|
+
export function parseUnifiedDiff(patch) {
|
|
4
|
+
const hunks = [];
|
|
5
|
+
let current;
|
|
6
|
+
let oldLine = 0;
|
|
7
|
+
let newLine = 0;
|
|
8
|
+
const flush = () => {
|
|
9
|
+
if (current === undefined)
|
|
10
|
+
return;
|
|
11
|
+
hunks.push({
|
|
12
|
+
oldStart: current.oldStart,
|
|
13
|
+
oldLines: current.oldLines,
|
|
14
|
+
newStart: current.newStart,
|
|
15
|
+
newLines: current.newLines,
|
|
16
|
+
lines: current.lines,
|
|
17
|
+
});
|
|
18
|
+
current = undefined;
|
|
19
|
+
};
|
|
20
|
+
for (const rawLine of patch.split(/\r?\n/u)) {
|
|
21
|
+
const header = HUNK_HEADER.exec(rawLine);
|
|
22
|
+
if (header !== null) {
|
|
23
|
+
flush();
|
|
24
|
+
oldLine = Number(header[1]);
|
|
25
|
+
newLine = Number(header[3]);
|
|
26
|
+
current = {
|
|
27
|
+
oldStart: oldLine,
|
|
28
|
+
oldLines: Number(header[2] ?? '1'),
|
|
29
|
+
newStart: newLine,
|
|
30
|
+
newLines: Number(header[4] ?? '1'),
|
|
31
|
+
lines: [],
|
|
32
|
+
};
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (current === undefined || rawLine === '\')
|
|
36
|
+
continue;
|
|
37
|
+
const marker = rawLine[0];
|
|
38
|
+
const text = rawLine.slice(1);
|
|
39
|
+
if (marker === ' ') {
|
|
40
|
+
current.lines.push({ type: 'context', oldLine, newLine, text });
|
|
41
|
+
oldLine += 1;
|
|
42
|
+
newLine += 1;
|
|
43
|
+
}
|
|
44
|
+
else if (marker === '+') {
|
|
45
|
+
current.lines.push({ type: 'add', newLine, text });
|
|
46
|
+
newLine += 1;
|
|
47
|
+
}
|
|
48
|
+
else if (marker === '-') {
|
|
49
|
+
current.lines.push({ type: 'delete', oldLine, text });
|
|
50
|
+
oldLine += 1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
flush();
|
|
54
|
+
return hunks;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=git-diff-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-diff-parser.js","sourceRoot":"","sources":["../../../../src/client/dashboard/git/git-diff-parser.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,GAAG,8CAA8C,CAAC;AAEnE,qFAAqF;AACrF,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,IAAI,OAQS,CAAC;IACd,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO;QAClC,KAAK,CAAC,IAAI,CAAC;YACT,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QACH,OAAO,GAAG,SAAS,CAAC;IACtB,CAAC,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,KAAK,EAAE,CAAC;YACR,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,OAAO,GAAG;gBACR,QAAQ,EAAE,OAAO;gBACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;gBAClC,QAAQ,EAAE,OAAO;gBACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;gBAClC,KAAK,EAAE,EAAE;aACV,CAAC;YACF,SAAS;QACX,CAAC;QACD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,8BAA8B;YAAE,SAAS;QAClF,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC,CAAC;YACb,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;aAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;aAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IACD,KAAK,EAAE,CAAC;IACR,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { WorktreeGitChangedFile } from '../../../contract/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Shared Git-tab facts. These helpers stay free of React and DOM APIs so the
|
|
4
|
+
* Dashboard's branch, Main, and line-total rules have one definition.
|
|
5
|
+
*/
|
|
6
|
+
/** Main (Local) Worktree ids never carry a Worktree-relative Git comparison. */
|
|
7
|
+
export declare function isMainWorktreeId(worktreeId: string): boolean;
|
|
8
|
+
/** Trim a branch value and drop empty strings. */
|
|
9
|
+
export declare function normalizeBranch(branch: string | undefined): string | undefined;
|
|
10
|
+
/** A baseline equal to the current Worktree branch is not a usable default. */
|
|
11
|
+
export declare function normalizeBaselineBranch(value: string | undefined, currentBranch: string | undefined): string | undefined;
|
|
12
|
+
export interface GitLineTotals {
|
|
13
|
+
readonly additions: number;
|
|
14
|
+
readonly deletions: number;
|
|
15
|
+
}
|
|
16
|
+
/** Sum additions/deletions, or undefined when any file count is unknown. */
|
|
17
|
+
export declare function sumLineTotals(files: readonly WorktreeGitChangedFile[]): GitLineTotals | undefined;
|
|
18
|
+
//# sourceMappingURL=git-facts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-facts.d.ts","sourceRoot":"","sources":["../../../../src/client/dashboard/git/git-facts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE;;;GAGG;AAEH,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,kDAAkD;AAClD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAG9E;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,MAAM,GAAG,SAAS,CAGpB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,GAAG,aAAa,GAAG,SAAS,CASjG"}
|
|
@@ -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"}
|