@cerbur/clutch-dsh-worktree 0.1.6 → 0.1.7
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 +107 -15
- package/README.zh.md +86 -10
- package/cordis.patch.yml +21 -0
- package/lib/client/WorktreeContext.d.ts.map +1 -1
- package/lib/client/WorktreeContext.js +2 -2
- package/lib/client/WorktreeContext.js.map +1 -1
- package/lib/client/WorktreeSurface.d.ts +2 -2
- package/lib/client/WorktreeSurface.d.ts.map +1 -1
- package/lib/client/WorktreeSurface.js +270 -65
- package/lib/client/WorktreeSurface.js.map +1 -1
- package/lib/client/entry.d.ts.map +1 -1
- package/lib/client/entry.js +84 -2
- package/lib/client/entry.js.map +1 -1
- package/lib/client/index.d.ts +3 -0
- package/lib/client/index.d.ts.map +1 -1
- package/lib/client/index.js +2 -0
- package/lib/client/index.js.map +1 -1
- package/lib/client/locales.d.ts +58 -0
- package/lib/client/locales.d.ts.map +1 -1
- package/lib/client/locales.js +58 -0
- package/lib/client/locales.js.map +1 -1
- package/lib/client/session-view.d.ts +34 -0
- package/lib/client/session-view.d.ts.map +1 -1
- package/lib/client/session-view.js +119 -1
- package/lib/client/session-view.js.map +1 -1
- package/lib/client/worktree-connection.d.ts +4 -2
- package/lib/client/worktree-connection.d.ts.map +1 -1
- package/lib/client/worktree-connection.js +4 -0
- package/lib/client/worktree-connection.js.map +1 -1
- package/lib/client/worktree-error-copy.d.ts +2 -0
- package/lib/client/worktree-error-copy.d.ts.map +1 -1
- package/lib/client/worktree-error-copy.js +16 -0
- package/lib/client/worktree-error-copy.js.map +1 -1
- package/lib/client/worktree-permission-icon.d.ts +7 -0
- package/lib/client/worktree-permission-icon.d.ts.map +1 -0
- package/lib/client/worktree-permission-icon.js +119 -0
- package/lib/client/worktree-permission-icon.js.map +1 -0
- package/lib/client/worktree-permission.d.ts +21 -0
- package/lib/client/worktree-permission.d.ts.map +1 -0
- package/lib/client/worktree-permission.js +70 -0
- package/lib/client/worktree-permission.js.map +1 -0
- package/lib/client/worktree-session-fork.d.ts +65 -0
- package/lib/client/worktree-session-fork.d.ts.map +1 -0
- package/lib/client/worktree-session-fork.js +174 -0
- package/lib/client/worktree-session-fork.js.map +1 -0
- package/lib/client/worktree-session-order.d.ts +36 -0
- package/lib/client/worktree-session-order.d.ts.map +1 -0
- package/lib/client/worktree-session-order.js +215 -0
- package/lib/client/worktree-session-order.js.map +1 -0
- package/lib/client/worktree-session.d.ts +34 -1
- package/lib/client/worktree-session.d.ts.map +1 -1
- package/lib/client/worktree-session.js +98 -2
- package/lib/client/worktree-session.js.map +1 -1
- package/lib/client/worktree-surface-rows.d.ts +4 -4
- package/lib/client/worktree-surface-rows.d.ts.map +1 -1
- package/lib/client/worktree-surface-rows.js +132 -47
- package/lib/client/worktree-surface-rows.js.map +1 -1
- package/lib/client/worktree-surface-selectors.d.ts +2 -0
- package/lib/client/worktree-surface-selectors.d.ts.map +1 -1
- package/lib/client/worktree-surface-selectors.js +8 -0
- package/lib/client/worktree-surface-selectors.js.map +1 -1
- package/lib/client/worktree-surface-types.d.ts +46 -3
- package/lib/client/worktree-surface-types.d.ts.map +1 -1
- package/lib/client/worktree-view-actions.d.ts +8 -3
- package/lib/client/worktree-view-actions.d.ts.map +1 -1
- package/lib/client/worktree-view-actions.js +28 -2
- package/lib/client/worktree-view-actions.js.map +1 -1
- package/lib/client/worktree-view-errors.d.ts +10 -0
- package/lib/client/worktree-view-errors.d.ts.map +1 -1
- package/lib/client/worktree-view-errors.js +22 -1
- package/lib/client/worktree-view-errors.js.map +1 -1
- package/lib/client.js +1473 -201
- package/lib/client.js.map +1 -1
- package/lib/contract/index.contract.js +2 -0
- package/lib/contract/index.contract.js.map +1 -1
- package/lib/contract/index.d.ts +6 -2
- package/lib/contract/index.d.ts.map +1 -1
- package/lib/contract/index.js +4 -0
- package/lib/contract/index.js.map +1 -1
- package/lib/contract/worktree-permission.d.ts +73 -0
- package/lib/contract/worktree-permission.d.ts.map +1 -0
- package/lib/contract/worktree-permission.js +32 -0
- package/lib/contract/worktree-permission.js.map +1 -0
- package/lib/host/index.d.ts +4 -0
- package/lib/host/index.d.ts.map +1 -1
- package/lib/host/index.js +2 -0
- package/lib/host/index.js.map +1 -1
- package/lib/host/remote.d.ts +2 -2
- package/lib/host/remote.d.ts.map +1 -1
- package/lib/host/remote.js +7 -1
- package/lib/host/remote.js.map +1 -1
- package/lib/host/service.d.ts +3 -1
- package/lib/host/service.d.ts.map +1 -1
- package/lib/host/service.js +36 -2
- package/lib/host/service.js.map +1 -1
- package/lib/host/worktree-permission-manager.d.ts +14 -0
- package/lib/host/worktree-permission-manager.d.ts.map +1 -0
- package/lib/host/worktree-permission-manager.js +111 -0
- package/lib/host/worktree-permission-manager.js.map +1 -0
- package/lib/host/worktree-permission.d.ts +38 -0
- package/lib/host/worktree-permission.d.ts.map +1 -0
- package/lib/host/worktree-permission.js +156 -0
- package/lib/host/worktree-permission.js.map +1 -0
- package/lib/index.d.ts +4 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -1
- package/lib/index.js.map +1 -1
- package/lib/manage/worktree-permission.d.ts +3 -0
- package/lib/manage/worktree-permission.d.ts.map +1 -0
- package/lib/manage/worktree-permission.js +3 -0
- package/lib/manage/worktree-permission.js.map +1 -0
- package/lib/typert.host.js +126 -27
- package/lib/typert.remote-client.d.ts +5 -1
- package/lib/typert.remote-client.d.ts.map +1 -1
- package/lib/typert.remote-client.js +126 -27
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { SessionBinding, WorktreeHealth, WorktreeManager, WorktreeStatus } from '../contract/index.js';
|
|
1
|
+
import type { SessionBinding, WorktreeHealth, WorktreeManager, WorktreePermissionManager, WorktreePermissionResult, WorktreeStatus } from '../contract/index.js';
|
|
2
2
|
import { type CreateSessionForWorktreeInput } from './worktree-view.js';
|
|
3
|
+
export { WorktreeSessionPermissionError } from './worktree-view-errors.js';
|
|
3
4
|
export interface WorktreeSessionSummary {
|
|
4
5
|
readonly blank?: boolean;
|
|
5
6
|
readonly cwd?: string;
|
|
@@ -59,6 +60,19 @@ export interface WorktreeSessionConnectorOptions {
|
|
|
59
60
|
}) => Promise<string>;
|
|
60
61
|
readonly ensureSessionWorkspace: (workspaceId: string, sessionId: string) => void;
|
|
61
62
|
readonly openSession: (sessionId: string) => void;
|
|
63
|
+
readonly permission?: Pick<WorktreePermissionManager, 'ensureWorktreePermission'>;
|
|
64
|
+
readonly confirmFullAccess?: (input: {
|
|
65
|
+
readonly workspaceId: string;
|
|
66
|
+
readonly worktreeId: string;
|
|
67
|
+
readonly sessionId: string;
|
|
68
|
+
readonly cwd: string;
|
|
69
|
+
}) => boolean | Promise<boolean>;
|
|
70
|
+
readonly onPermissionResult?: (input: {
|
|
71
|
+
readonly workspaceId: string;
|
|
72
|
+
readonly worktreeId: string;
|
|
73
|
+
readonly sessionId: string;
|
|
74
|
+
readonly cwd: string;
|
|
75
|
+
}, result: WorktreePermissionResult) => void;
|
|
62
76
|
}
|
|
63
77
|
export interface WorktreeSessionConnector {
|
|
64
78
|
create(input: CreateSessionForWorktreeInput): Promise<string>;
|
|
@@ -66,7 +80,23 @@ export interface WorktreeSessionConnector {
|
|
|
66
80
|
}
|
|
67
81
|
export interface PendingWorktreeSessionBinding extends CreateSessionForWorktreeInput {
|
|
68
82
|
readonly sessionId: string;
|
|
83
|
+
readonly permissionRequired?: boolean;
|
|
84
|
+
}
|
|
85
|
+
interface EnsureWorktreeSessionPermissionInput {
|
|
86
|
+
readonly permission?: Pick<WorktreePermissionManager, 'ensureWorktreePermission'>;
|
|
87
|
+
readonly confirmFullAccess?: WorktreeSessionConnectorOptions['confirmFullAccess'];
|
|
88
|
+
readonly onPermissionResult?: WorktreeSessionConnectorOptions['onPermissionResult'];
|
|
89
|
+
readonly sessionId: string;
|
|
90
|
+
readonly workspaceId: string;
|
|
91
|
+
readonly worktreeId: string;
|
|
92
|
+
readonly cwd: string;
|
|
93
|
+
readonly createdSession: boolean;
|
|
69
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Keep the confirmation and second permission call in one place for new,
|
|
97
|
+
* reused, and retried Sessions. The Host still validates the relation.
|
|
98
|
+
*/
|
|
99
|
+
export declare function ensureWorktreeSessionPermission(input: EnsureWorktreeSessionPermissionInput): Promise<void>;
|
|
70
100
|
export declare function resolveWorktreeSessionAction(input: ResolveWorktreeSessionActionInput): WorktreeSessionAction;
|
|
71
101
|
export declare function retryWorktreeSessionBinding(input: {
|
|
72
102
|
readonly manager: Pick<WorktreeManager, 'bindSession'>;
|
|
@@ -74,6 +104,9 @@ export declare function retryWorktreeSessionBinding(input: {
|
|
|
74
104
|
readonly archived: boolean;
|
|
75
105
|
readonly ensureSessionWorkspace: (workspaceId: string, sessionId: string) => void;
|
|
76
106
|
readonly openSession: (sessionId: string) => void;
|
|
107
|
+
readonly permission?: Pick<WorktreePermissionManager, 'ensureWorktreePermission'>;
|
|
108
|
+
readonly confirmFullAccess?: WorktreeSessionConnectorOptions['confirmFullAccess'];
|
|
109
|
+
readonly onPermissionResult?: WorktreeSessionConnectorOptions['onPermissionResult'];
|
|
77
110
|
}): Promise<string>;
|
|
78
111
|
/**
|
|
79
112
|
* Browser-only Worktree `+` connector. It owns the read/resolve/bind/create/open
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-session.d.ts","sourceRoot":"","sources":["../../src/client/worktree-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"worktree-session.d.ts","sourceRoot":"","sources":["../../src/client/worktree-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { createSessionForWorktree, WorktreeSessionBindingError, } from './worktree-view.js';
|
|
2
|
+
import { WorktreeSessionPermissionError } from './worktree-view-errors.js';
|
|
3
|
+
export { WorktreeSessionPermissionError } from './worktree-view-errors.js';
|
|
2
4
|
export class WorktreeSessionActionError extends Error {
|
|
3
5
|
code;
|
|
4
6
|
retryable;
|
|
@@ -11,6 +13,61 @@ export class WorktreeSessionActionError extends Error {
|
|
|
11
13
|
this.details = details;
|
|
12
14
|
}
|
|
13
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Keep the confirmation and second permission call in one place for new,
|
|
18
|
+
* reused, and retried Sessions. The Host still validates the relation.
|
|
19
|
+
*/
|
|
20
|
+
export async function ensureWorktreeSessionPermission(input) {
|
|
21
|
+
if (input.permission === undefined)
|
|
22
|
+
return;
|
|
23
|
+
const request = {
|
|
24
|
+
workspaceId: input.workspaceId,
|
|
25
|
+
worktreeId: input.worktreeId,
|
|
26
|
+
sessionId: input.sessionId,
|
|
27
|
+
binding: 'active',
|
|
28
|
+
};
|
|
29
|
+
let result;
|
|
30
|
+
try {
|
|
31
|
+
result = await input.permission.ensureWorktreePermission(request);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
throw new WorktreeSessionPermissionError(input.sessionId, input.createdSession, error);
|
|
35
|
+
}
|
|
36
|
+
if (result.status === 'confirmation-required') {
|
|
37
|
+
let confirmed;
|
|
38
|
+
try {
|
|
39
|
+
confirmed = input.confirmFullAccess === undefined
|
|
40
|
+
? false
|
|
41
|
+
: await input.confirmFullAccess({
|
|
42
|
+
workspaceId: input.workspaceId,
|
|
43
|
+
worktreeId: input.worktreeId,
|
|
44
|
+
sessionId: input.sessionId,
|
|
45
|
+
cwd: input.cwd,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
throw new WorktreeSessionPermissionError(input.sessionId, input.createdSession, error);
|
|
50
|
+
}
|
|
51
|
+
if (!confirmed) {
|
|
52
|
+
throw new WorktreeSessionPermissionError(input.sessionId, input.createdSession);
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
result = await input.permission.ensureWorktreePermission({ ...request, confirmed: true });
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
throw new WorktreeSessionPermissionError(input.sessionId, input.createdSession, error);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (result.status === 'confirmation-required') {
|
|
62
|
+
throw new WorktreeSessionPermissionError(input.sessionId, input.createdSession);
|
|
63
|
+
}
|
|
64
|
+
input.onPermissionResult?.({
|
|
65
|
+
workspaceId: input.workspaceId,
|
|
66
|
+
worktreeId: input.worktreeId,
|
|
67
|
+
sessionId: input.sessionId,
|
|
68
|
+
cwd: input.cwd,
|
|
69
|
+
}, result);
|
|
70
|
+
}
|
|
14
71
|
export function resolveWorktreeSessionAction(input) {
|
|
15
72
|
if (input.target.status !== 'active' || input.target.health === 'repair') {
|
|
16
73
|
return { kind: 'reject', reason: 'worktree-not-available' };
|
|
@@ -91,6 +148,16 @@ export async function retryWorktreeSessionBinding(input) {
|
|
|
91
148
|
catch (error) {
|
|
92
149
|
throw new WorktreeSessionBindingError(input.pending.sessionId, error);
|
|
93
150
|
}
|
|
151
|
+
await ensureWorktreeSessionPermission({
|
|
152
|
+
permission: input.permission,
|
|
153
|
+
confirmFullAccess: input.confirmFullAccess,
|
|
154
|
+
onPermissionResult: input.onPermissionResult,
|
|
155
|
+
sessionId: input.pending.sessionId,
|
|
156
|
+
workspaceId: input.pending.workspaceId,
|
|
157
|
+
worktreeId: input.pending.worktreeId,
|
|
158
|
+
cwd: input.pending.cwd,
|
|
159
|
+
createdSession: true,
|
|
160
|
+
});
|
|
94
161
|
input.ensureSessionWorkspace(input.pending.workspaceId, input.pending.sessionId);
|
|
95
162
|
input.openSession(input.pending.sessionId);
|
|
96
163
|
return input.pending.sessionId;
|
|
@@ -121,6 +188,16 @@ export function createWorktreeSessionConnector(options) {
|
|
|
121
188
|
bindings,
|
|
122
189
|
});
|
|
123
190
|
if (action.kind === 'open-bound') {
|
|
191
|
+
await ensureWorktreeSessionPermission({
|
|
192
|
+
permission: options.permission,
|
|
193
|
+
confirmFullAccess: options.confirmFullAccess,
|
|
194
|
+
onPermissionResult: options.onPermissionResult,
|
|
195
|
+
sessionId: action.sessionId,
|
|
196
|
+
workspaceId: input.workspaceId,
|
|
197
|
+
worktreeId: input.worktreeId,
|
|
198
|
+
cwd: input.cwd,
|
|
199
|
+
createdSession: false,
|
|
200
|
+
});
|
|
124
201
|
options.ensureSessionWorkspace(input.workspaceId, action.sessionId);
|
|
125
202
|
if (!disposed)
|
|
126
203
|
options.openSession(action.sessionId);
|
|
@@ -137,6 +214,16 @@ export function createWorktreeSessionConnector(options) {
|
|
|
137
214
|
catch (error) {
|
|
138
215
|
throw new WorktreeSessionBindingError(action.sessionId, error);
|
|
139
216
|
}
|
|
217
|
+
await ensureWorktreeSessionPermission({
|
|
218
|
+
permission: options.permission,
|
|
219
|
+
confirmFullAccess: options.confirmFullAccess,
|
|
220
|
+
onPermissionResult: options.onPermissionResult,
|
|
221
|
+
sessionId: action.sessionId,
|
|
222
|
+
workspaceId: input.workspaceId,
|
|
223
|
+
worktreeId: input.worktreeId,
|
|
224
|
+
cwd: input.cwd,
|
|
225
|
+
createdSession: false,
|
|
226
|
+
});
|
|
140
227
|
if (!disposed) {
|
|
141
228
|
options.ensureSessionWorkspace(input.workspaceId, action.sessionId);
|
|
142
229
|
if (!disposed)
|
|
@@ -152,10 +239,19 @@ export function createWorktreeSessionConnector(options) {
|
|
|
152
239
|
...input,
|
|
153
240
|
createSession: options.createSession,
|
|
154
241
|
manager: options.manager,
|
|
155
|
-
beforeOpen: (sessionId) => {
|
|
242
|
+
beforeOpen: async (sessionId) => {
|
|
156
243
|
if (disposed)
|
|
157
244
|
throw new WorktreeSessionActionError('CLIENT_DISPOSED', '', false);
|
|
158
|
-
|
|
245
|
+
await ensureWorktreeSessionPermission({
|
|
246
|
+
permission: options.permission,
|
|
247
|
+
confirmFullAccess: options.confirmFullAccess,
|
|
248
|
+
onPermissionResult: options.onPermissionResult,
|
|
249
|
+
sessionId,
|
|
250
|
+
workspaceId: input.workspaceId,
|
|
251
|
+
worktreeId: input.worktreeId,
|
|
252
|
+
cwd: input.cwd,
|
|
253
|
+
createdSession: true,
|
|
254
|
+
});
|
|
159
255
|
},
|
|
160
256
|
openSession: (sessionId) => {
|
|
161
257
|
if (!disposed)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-session.js","sourceRoot":"","sources":["../../src/client/worktree-session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worktree-session.js","sourceRoot":"","sources":["../../src/client/worktree-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { WorktreeGroupRowProps, WorktreeSessionGroupProps, WorktreeSessionRowProps, WorktreeWorkspaceRowProps } from './worktree-surface-types.js';
|
|
2
2
|
/** Workspace row using the native DSH menu, fixed action column, and drag contract. */
|
|
3
|
-
export declare function WorktreeWorkspaceRow({ t, workspace, expanded, actionPending, menuOpen, drag, onToggle, onCreateWorktree, onRename, onDelete, onMenuOpenChange, }: WorktreeWorkspaceRowProps): import("react").JSX.Element;
|
|
3
|
+
export declare function WorktreeWorkspaceRow({ t, workspace, expanded, hasOngoingSession, actionPending, menuOpen, drag, onToggle, onCreateWorktree, onRename, onDelete, onMenuOpenChange, }: WorktreeWorkspaceRowProps): import("react").JSX.Element;
|
|
4
4
|
/** Shared Main/Worktree group row with parameterized icon, state, and actions. */
|
|
5
|
-
export declare function WorktreeGroupRow({ t, kind, label, worktreeId, expanded, icon, workspaceTitle, state, stateLabel, onToggle, onCreateSession, menu, drag, }: WorktreeGroupRowProps): import("react").JSX.Element;
|
|
5
|
+
export declare function WorktreeGroupRow({ t, kind, label, worktreeId, expanded, hasOngoingSession, icon, workspaceTitle, state, stateLabel, onToggle, onCreateSession, menu, drag, }: WorktreeGroupRowProps): import("react").JSX.Element;
|
|
6
6
|
/** Worktree-mode Session row with the same trailing options menu as native DSH rows. */
|
|
7
|
-
export declare function WorktreeSessionRow({ t, sessionId, blank, current, label, drag, actionPending, onOpen, onRename, onFork, onArchive, }: WorktreeSessionRowProps): import("react").JSX.Element;
|
|
8
|
-
export declare function WorktreeSessionGroup({ t, groupKey, sessionIds, workspaceId, currentSessionId, expanded, actionPending, sessions, dragState, onToggleExpanded, onStartDrag, onHoverDrag, onClearDrag, onFinishDrag, onCommitDrag, onOpen, onRename, onFork, onArchive, }: WorktreeSessionGroupProps): import("react").JSX.Element;
|
|
7
|
+
export declare function WorktreeSessionRow({ t, sessionId, blank, current, label, drag, actionPending, onOpen, onRename, onFork, onArchive, presentation, }: WorktreeSessionRowProps): import("react").JSX.Element;
|
|
8
|
+
export declare function WorktreeSessionGroup({ t, groupKey, sessionIds, workspaceId, currentSessionId, expanded, actionPending, sessions, sessionPresentations, dragState, onToggleExpanded, onStartDrag, onHoverDrag, onClearDrag, onFinishDrag, onCommitDrag, onOpen, onRename, onFork, onArchive, }: WorktreeSessionGroupProps): import("react").JSX.Element;
|
|
9
9
|
//# sourceMappingURL=worktree-surface-rows.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-surface-rows.d.ts","sourceRoot":"","sources":["../../src/client/worktree-surface-rows.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worktree-surface-rows.d.ts","sourceRoot":"","sources":["../../src/client/worktree-surface-rows.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EACV,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EAC1B,MAAM,6BAA6B,CAAC;AAsHrC,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,EACnC,CAAC,EACD,SAAS,EACT,QAAQ,EACR,iBAAiB,EACjB,aAAa,EACb,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,gBAAgB,GACjB,EAAE,yBAAyB,+BA6H3B;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,EAC/B,CAAC,EACD,IAAI,EACJ,KAAK,EACL,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,IAAI,EACJ,cAAc,EACd,KAAK,EACL,UAAU,EACV,QAAQ,EACR,eAAe,EACf,IAAI,EACJ,IAAI,GACL,EAAE,qBAAqB,+BAwKvB;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,EACjC,CAAC,EACD,SAAS,EACT,KAAK,EACL,OAAO,EACP,KAAK,EACL,IAAI,EACJ,aAAa,EACb,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,YAAY,GACb,EAAE,uBAAuB,+BA8IzB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,CAAC,EACD,QAAQ,EACR,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,oBAAoB,EACpB,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,GACV,EAAE,yBAAyB,+BA6D3B"}
|
|
@@ -1,15 +1,79 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useState } from 'react';
|
|
3
|
-
import { HoverCard, IconArchiveOutline20, IconBranchOutline16, IconChevronDownOutline14, IconChevronRightOutline14, IconEditOutline16, IconEllipsisOutline16, IconFolderClose16, IconFolderOpen16, IconPlusOutline16, IconTrashOutline16, Menu, StateDot, } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
4
|
-
import { isBlankSession } from './session-view.js';
|
|
3
|
+
import { HoverCard, IconArchiveOutline20, IconBranchOutline16, IconChevronDownOutline14, IconChevronRightOutline14, IconCopyOutline16, IconEditOutline16, IconEllipsisOutline16, IconFolderClose16, IconFolderOpen16, IconPlusOutline16, IconTrashOutline16, Menu, StateDot, writeClipboard, } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
4
|
+
import { isBlankSession, relativeTime, } from './session-view.js';
|
|
5
5
|
import { sessionLabel } from './worktree-surface-selectors.js';
|
|
6
6
|
import styles from './worktree.css';
|
|
7
7
|
function rowHalf(event) {
|
|
8
8
|
const rect = event.currentTarget.getBoundingClientRect();
|
|
9
9
|
return event.clientY < rect.top + rect.height / 2 ? 'before' : 'after';
|
|
10
10
|
}
|
|
11
|
+
function sessionStatusLabel(t, status) {
|
|
12
|
+
switch (status.labelKey) {
|
|
13
|
+
case 'running':
|
|
14
|
+
return t('session.status.running');
|
|
15
|
+
case 'subagentsRunning':
|
|
16
|
+
return t(status.runningSubagentCount === 1
|
|
17
|
+
? 'session.status.subagentsRunning.one'
|
|
18
|
+
: 'session.status.subagentsRunning.other', { n: status.runningSubagentCount });
|
|
19
|
+
case 'idle':
|
|
20
|
+
return t('session.status.idle');
|
|
21
|
+
case 'waitingApproval':
|
|
22
|
+
return t('session.status.waitingApproval');
|
|
23
|
+
case 'planReview':
|
|
24
|
+
return t('session.status.planReview');
|
|
25
|
+
case 'waitingAnswer':
|
|
26
|
+
return t('session.status.waitingAnswer');
|
|
27
|
+
case 'completed':
|
|
28
|
+
return t('session.status.completed');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function sessionTimeLabel(t, value) {
|
|
32
|
+
switch (value.unit) {
|
|
33
|
+
case 'now':
|
|
34
|
+
return t('session.time.now');
|
|
35
|
+
case 'minutes':
|
|
36
|
+
return t('session.time.minutes', { n: value.n });
|
|
37
|
+
case 'hours':
|
|
38
|
+
return t('session.time.hours', { n: value.n });
|
|
39
|
+
case 'days':
|
|
40
|
+
return t('session.time.days', { n: value.n });
|
|
41
|
+
case 'months':
|
|
42
|
+
return t('session.time.months', { n: value.n });
|
|
43
|
+
case 'years':
|
|
44
|
+
return t('session.time.years', { n: value.n });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Native Workspace hover-card time copy, including the trailing "ago" marker. */
|
|
48
|
+
function sessionHoverTimeLabel(t, value) {
|
|
49
|
+
const label = sessionTimeLabel(t, value);
|
|
50
|
+
return value.unit === 'now' ? label : t('session.time.ago', { t: label });
|
|
51
|
+
}
|
|
52
|
+
/** Native Workspace hover-card status list, including a secondary subagent status when relevant. */
|
|
53
|
+
function sessionHoverStatuses(presentation) {
|
|
54
|
+
if (presentation.runningSubagentCount === 0 ||
|
|
55
|
+
presentation.status.labelKey === 'subagentsRunning') {
|
|
56
|
+
return [presentation.status];
|
|
57
|
+
}
|
|
58
|
+
return [
|
|
59
|
+
presentation.status,
|
|
60
|
+
{
|
|
61
|
+
state: 'ongoing',
|
|
62
|
+
labelKey: 'subagentsRunning',
|
|
63
|
+
runningSubagentCount: presentation.runningSubagentCount,
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
/** Native Workspace Session hover-card details, adapted to the Worktree row projection. */
|
|
68
|
+
function WorktreeSessionHoverContent({ label, blank, presentation, t, }) {
|
|
69
|
+
const statuses = presentation === undefined ? [] : sessionHoverStatuses(presentation);
|
|
70
|
+
const timeValue = !blank && presentation?.updatedAt !== undefined
|
|
71
|
+
? relativeTime(presentation.updatedAt, Date.now())
|
|
72
|
+
: undefined;
|
|
73
|
+
return (_jsxs("div", { className: styles.sessionHoverContent, children: [_jsx("div", { className: styles.sessionHoverTitle, children: label }), !blank && timeValue !== undefined && (_jsx("div", { className: styles.sessionHoverTime, children: sessionHoverTimeLabel(t, timeValue) })), statuses.map((status) => (_jsxs("div", { className: styles.sessionHoverStatus, children: [_jsx(StateDot, { state: status.state }), _jsx("span", { children: sessionStatusLabel(t, status) })] }, `${status.labelKey}-${status.runningSubagentCount}`)))] }));
|
|
74
|
+
}
|
|
11
75
|
/** Workspace row using the native DSH menu, fixed action column, and drag contract. */
|
|
12
|
-
export function WorktreeWorkspaceRow({ t, workspace, expanded, actionPending, menuOpen, drag, onToggle, onCreateWorktree, onRename, onDelete, onMenuOpenChange, }) {
|
|
76
|
+
export function WorktreeWorkspaceRow({ t, workspace, expanded, hasOngoingSession, actionPending, menuOpen, drag, onToggle, onCreateWorktree, onRename, onDelete, onMenuOpenChange, }) {
|
|
13
77
|
const workspaceMenuItems = [
|
|
14
78
|
{
|
|
15
79
|
id: 'rename',
|
|
@@ -25,12 +89,8 @@ export function WorktreeWorkspaceRow({ t, workspace, expanded, actionPending, me
|
|
|
25
89
|
disabled: actionPending,
|
|
26
90
|
},
|
|
27
91
|
];
|
|
28
|
-
const markerClass = drag.marker === 'before'
|
|
29
|
-
|
|
30
|
-
: drag.marker === 'after'
|
|
31
|
-
? styles.dropAfter
|
|
32
|
-
: '';
|
|
33
|
-
return (_jsxs("div", { className: `${styles.workspaceRow} ${markerClass}`, "data-workspace-drag": drag.active ? 'active' : undefined, "data-menu-open": menuOpen || undefined, draggable: true, onClick: () => {
|
|
92
|
+
const markerClass = drag.marker === 'before' ? styles.dropBefore : drag.marker === 'after' ? styles.dropAfter : '';
|
|
93
|
+
return (_jsxs("div", { className: `${styles.workspaceRow} ${markerClass}`, "data-workspace-drag": drag.active ? 'active' : undefined, "data-group-activity": hasOngoingSession && !expanded ? 'true' : undefined, "data-menu-open": menuOpen || undefined, draggable: true, onClick: () => {
|
|
34
94
|
onToggle();
|
|
35
95
|
}, onDragStart: (event) => {
|
|
36
96
|
event.dataTransfer.effectAllowed = 'move';
|
|
@@ -52,7 +112,7 @@ export function WorktreeWorkspaceRow({ t, workspace, expanded, actionPending, me
|
|
|
52
112
|
}), "aria-expanded": expanded, onClick: (event) => {
|
|
53
113
|
event.stopPropagation();
|
|
54
114
|
onToggle();
|
|
55
|
-
}, children: expanded ? (_jsx(IconChevronDownOutline14, { size: 18 })) : (_jsx(IconChevronRightOutline14, { size: 18 })) }), _jsx("span", { className: styles.workspaceIcon, "aria-hidden": "true", children: expanded ? _jsx(IconFolderOpen16, {}) : _jsx(IconFolderClose16, {}) }), _jsx("span", { className: styles.workspaceTitle, children: workspace.title }), _jsxs("span", { className: `${styles.treeActionSlot} ${styles.workspaceActions}`, children: [_jsx("span", { className: styles.menuAction, children: _jsx(Menu, { open: menuOpen, onClose: () => {
|
|
115
|
+
}, children: expanded ? (_jsx(IconChevronDownOutline14, { size: 18 })) : (_jsx(IconChevronRightOutline14, { size: 18 })) }), _jsx("span", { className: styles.workspaceIcon, "aria-hidden": "true", children: expanded ? _jsx(IconFolderOpen16, {}) : _jsx(IconFolderClose16, {}) }), _jsx("span", { className: styles.workspaceTitle, children: workspace.title }), _jsxs("span", { className: `${styles.treeActionSlot} ${styles.workspaceActions}`, children: [_jsx("span", { className: styles.groupActivity, "data-group-activity": hasOngoingSession && !expanded ? 'true' : undefined, role: hasOngoingSession && !expanded ? 'img' : undefined, "aria-label": hasOngoingSession && !expanded ? t('session.status.running') : undefined, title: hasOngoingSession && !expanded ? t('session.status.running') : undefined, children: hasOngoingSession && !expanded && _jsx(StateDot, { state: 'ongoing' }) }), _jsx("span", { className: styles.menuAction, children: _jsx(Menu, { open: menuOpen, onClose: () => {
|
|
56
116
|
onMenuOpenChange(false);
|
|
57
117
|
}, items: workspaceMenuItems, onSelect: (id) => {
|
|
58
118
|
onMenuOpenChange(false);
|
|
@@ -60,16 +120,16 @@ export function WorktreeWorkspaceRow({ t, workspace, expanded, actionPending, me
|
|
|
60
120
|
onRename();
|
|
61
121
|
if (id === 'delete')
|
|
62
122
|
onDelete();
|
|
63
|
-
}, portal: true, closeOnPointerLeave: true, anchor:
|
|
123
|
+
}, portal: true, closeOnPointerLeave: true, anchor: _jsx("button", { type: "button", className: styles.iconButton, "data-workspace-menu": true, "aria-label": t('workspace.options', { name: workspace.title }), onClick: (event) => {
|
|
64
124
|
event.stopPropagation();
|
|
65
125
|
onMenuOpenChange(!menuOpen);
|
|
66
|
-
}, children: _jsx(IconEllipsisOutline16, {}) })
|
|
126
|
+
}, children: _jsx(IconEllipsisOutline16, {}) }) }) }), _jsx("button", { type: "button", className: styles.iconButton, "data-add-worktree": true, "aria-label": t('workspace.addWorktree', { name: workspace.title }), onClick: (event) => {
|
|
67
127
|
event.stopPropagation();
|
|
68
128
|
onCreateWorktree();
|
|
69
129
|
}, children: _jsx(IconPlusOutline16, {}) })] })] }));
|
|
70
130
|
}
|
|
71
131
|
/** Shared Main/Worktree group row with parameterized icon, state, and actions. */
|
|
72
|
-
export function WorktreeGroupRow({ t, kind, label, worktreeId, expanded, icon, workspaceTitle, state, stateLabel, onToggle, onCreateSession, menu, drag, }) {
|
|
132
|
+
export function WorktreeGroupRow({ t, kind, label, worktreeId, expanded, hasOngoingSession, icon, workspaceTitle, state, stateLabel, onToggle, onCreateSession, menu, drag, }) {
|
|
73
133
|
const main = kind === 'main';
|
|
74
134
|
const markerClass = drag?.marker === 'before'
|
|
75
135
|
? styles.dropBefore
|
|
@@ -100,23 +160,43 @@ export function WorktreeGroupRow({ t, kind, label, worktreeId, expanded, icon, w
|
|
|
100
160
|
drag.drop(rowHalf(event));
|
|
101
161
|
},
|
|
102
162
|
};
|
|
103
|
-
const row = (_jsxs("div", { className: `${styles.worktreeRow} ${markerClass}`, "data-main-group": main ? 'true' : undefined, "data-main-expanded": main ? String(expanded) : undefined, "data-menu-open": menu?.open ? 'true' : undefined, "data-worktree-drag": drag?.active ? 'active' : undefined, ...dragProps, onClick: onToggle, children: [_jsx("button", { type: "button", className: `${styles.disclosureButton} ${styles.worktreeDisclosure}`, "aria-label": t(expanded ? 'worktree.collapse' : 'worktree.expand', { name: label }), "aria-expanded": expanded, onClick: (event) => {
|
|
163
|
+
const row = (_jsxs("div", { className: `${styles.worktreeRow} ${markerClass}`, "data-main-group": main ? 'true' : undefined, "data-main-expanded": main ? String(expanded) : undefined, "data-group-activity": hasOngoingSession && !expanded ? 'true' : undefined, "data-menu-open": menu?.open ? 'true' : undefined, "data-worktree-drag": drag?.active ? 'active' : undefined, ...dragProps, onClick: onToggle, children: [_jsx("button", { type: "button", className: `${styles.disclosureButton} ${styles.worktreeDisclosure}`, "aria-label": t(expanded ? 'worktree.collapse' : 'worktree.expand', { name: label }), "aria-expanded": expanded, onClick: (event) => {
|
|
104
164
|
event.stopPropagation();
|
|
105
165
|
onToggle();
|
|
106
|
-
}, children: expanded ? (_jsx(IconChevronDownOutline14, { size: 18 })) : (_jsx(IconChevronRightOutline14, { size: 18 })) }), _jsx("span", { className: styles.worktreeIcon, "aria-hidden": "true", children: icon }), state !== undefined && stateLabel !== undefined && (_jsx("span", { className: styles.worktreeState, role: "img", "aria-label": stateLabel, title: stateLabel, children: _jsx(StateDot, { state: state }) })), _jsx("span", { className: styles.worktreeLabel, children: label }), _jsxs("span", { className: styles.treeActionSlot, children: [menu !== undefined && (_jsx("span", { className: styles.menuAction, children: _jsx(Menu, { open: menu.open, onClose: () => {
|
|
166
|
+
}, children: expanded ? (_jsx(IconChevronDownOutline14, { size: 18 })) : (_jsx(IconChevronRightOutline14, { size: 18 })) }), _jsx("span", { className: styles.worktreeIcon, "aria-hidden": "true", children: icon }), state !== undefined && stateLabel !== undefined && (_jsx("span", { className: styles.worktreeState, role: "img", "aria-label": stateLabel, title: stateLabel, children: _jsx(StateDot, { state: state }) })), _jsx("span", { className: styles.worktreeLabel, children: label }), _jsxs("span", { className: styles.treeActionSlot, children: [_jsx("span", { className: styles.groupActivity, "data-group-activity": hasOngoingSession && !expanded ? 'true' : undefined, role: hasOngoingSession && !expanded ? 'img' : undefined, "aria-label": hasOngoingSession && !expanded ? t('session.status.running') : undefined, title: hasOngoingSession && !expanded ? t('session.status.running') : undefined, children: hasOngoingSession && !expanded && _jsx(StateDot, { state: 'ongoing' }) }), menu !== undefined && (_jsx("span", { className: styles.menuAction, children: _jsx(Menu, { open: menu.open, onClose: () => {
|
|
107
167
|
menu.onOpenChange(false);
|
|
108
168
|
}, items: [
|
|
169
|
+
...(menu.showCreate
|
|
170
|
+
? [{
|
|
171
|
+
id: 'create',
|
|
172
|
+
label: t('worktree.createNew'),
|
|
173
|
+
icon: _jsx(IconPlusOutline16, {}),
|
|
174
|
+
disabled: menu.disabled || menu.onCreateWorktree === undefined,
|
|
175
|
+
}]
|
|
176
|
+
: []),
|
|
109
177
|
{
|
|
110
|
-
id: '
|
|
111
|
-
label: t('worktree.
|
|
112
|
-
icon: _jsx(
|
|
113
|
-
danger: true,
|
|
178
|
+
id: 'copy-path',
|
|
179
|
+
label: t('worktree.copyPath'),
|
|
180
|
+
icon: _jsx(IconCopyOutline16, {}),
|
|
114
181
|
disabled: menu.disabled,
|
|
115
182
|
},
|
|
183
|
+
...(menu.showRemove
|
|
184
|
+
? [{
|
|
185
|
+
id: 'remove',
|
|
186
|
+
label: t('worktree.remove'),
|
|
187
|
+
icon: _jsx(IconTrashOutline16, {}),
|
|
188
|
+
danger: true,
|
|
189
|
+
disabled: menu.disabled || menu.onRemove === undefined,
|
|
190
|
+
}]
|
|
191
|
+
: []),
|
|
116
192
|
], onSelect: (id) => {
|
|
117
193
|
menu.onOpenChange(false);
|
|
118
|
-
if (id === '
|
|
119
|
-
menu.
|
|
194
|
+
if (id === 'create' && menu.showCreate)
|
|
195
|
+
menu.onCreateWorktree?.();
|
|
196
|
+
if (id === 'copy-path')
|
|
197
|
+
void writeClipboard(menu.copyPath);
|
|
198
|
+
if (id === 'remove' && menu.showRemove)
|
|
199
|
+
menu.onRemove?.();
|
|
120
200
|
}, portal: true, closeOnPointerLeave: true, anchor: _jsx("button", { type: "button", className: styles.iconButton, "data-worktree-menu": true, "aria-label": t('worktree.options', { name: menu.label }), onClick: (event) => {
|
|
121
201
|
event.stopPropagation();
|
|
122
202
|
menu.onOpenChange(!menu.open);
|
|
@@ -129,13 +209,9 @@ export function WorktreeGroupRow({ t, kind, label, worktreeId, expanded, icon, w
|
|
|
129
209
|
return (_jsx(HoverCard, { anchor: row, content: _jsx("div", { className: styles.worktreeHoverTitle, children: label }), openDelayMs: 500, disabled: menu?.open === true }));
|
|
130
210
|
}
|
|
131
211
|
/** Worktree-mode Session row with the same trailing options menu as native DSH rows. */
|
|
132
|
-
export function WorktreeSessionRow({ t, sessionId, blank, current, label, drag, actionPending, onOpen, onRename, onFork, onArchive, }) {
|
|
212
|
+
export function WorktreeSessionRow({ t, sessionId, blank, current, label, drag, actionPending, onOpen, onRename, onFork, onArchive, presentation, }) {
|
|
133
213
|
const [menuOpen, setMenuOpen] = useState(false);
|
|
134
|
-
const markerClass = drag.marker === 'before'
|
|
135
|
-
? styles.dropBefore
|
|
136
|
-
: drag.marker === 'after'
|
|
137
|
-
? styles.dropAfter
|
|
138
|
-
: '';
|
|
214
|
+
const markerClass = drag.marker === 'before' ? styles.dropBefore : drag.marker === 'after' ? styles.dropAfter : '';
|
|
139
215
|
const sessionMenuItems = [
|
|
140
216
|
{
|
|
141
217
|
id: 'rename',
|
|
@@ -156,7 +232,17 @@ export function WorktreeSessionRow({ t, sessionId, blank, current, label, drag,
|
|
|
156
232
|
disabled: onArchive === undefined || actionPending,
|
|
157
233
|
},
|
|
158
234
|
];
|
|
159
|
-
|
|
235
|
+
const statusLabel = presentation === undefined
|
|
236
|
+
? undefined
|
|
237
|
+
: sessionStatusLabel(t, presentation.status);
|
|
238
|
+
const showTrailingStatus = !blank &&
|
|
239
|
+
presentation !== undefined &&
|
|
240
|
+
(presentation.status.state !== 'done' || presentation.completed);
|
|
241
|
+
const timeValue = !blank && !showTrailingStatus && presentation?.updatedAt !== undefined
|
|
242
|
+
? relativeTime(presentation.updatedAt, Date.now())
|
|
243
|
+
: undefined;
|
|
244
|
+
const timeLabel = timeValue === undefined ? undefined : sessionTimeLabel(t, timeValue);
|
|
245
|
+
const row = (_jsxs("div", { className: `${styles.treeSessionRow} ${markerClass}`, "data-session-id": sessionId, "data-session-blank": blank ? 'true' : undefined, "data-session-current": current ? 'true' : undefined, "data-session-drag": drag.active ? 'active' : undefined, "data-menu-open": menuOpen || undefined, role: "treeitem", "aria-current": current ? 'true' : undefined, draggable: true, onDragStart: (event) => {
|
|
160
246
|
event.dataTransfer.effectAllowed = 'move';
|
|
161
247
|
event.dataTransfer.setData('text/plain', sessionId);
|
|
162
248
|
drag.start();
|
|
@@ -171,29 +257,28 @@ export function WorktreeSessionRow({ t, sessionId, blank, current, label, drag,
|
|
|
171
257
|
return;
|
|
172
258
|
event.preventDefault();
|
|
173
259
|
drag.drop(rowHalf(event));
|
|
174
|
-
}, children: [_jsx("button", { type: "button", className: styles.treeSessionContent, onClick: onOpen, children: _jsx("span", { className: styles.sessionLabel, children: label }) }), !blank && (_jsx("span", { className: styles.rowActions, children: _jsx(Menu, { open: menuOpen, onClose: () => {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
260
|
+
}, children: [_jsx("button", { type: "button", className: styles.treeSessionContent, onClick: onOpen, children: _jsx("span", { className: styles.sessionLabel, children: label }) }), !blank && (_jsxs("span", { className: styles.sessionTrailing, children: [_jsx("span", { className: styles.sessionMeta, children: showTrailingStatus && presentation !== undefined ? (_jsx("span", { className: styles.sessionStatus, "data-session-status": statusLabel, role: "img", "aria-label": statusLabel, title: statusLabel, children: _jsx(StateDot, { state: presentation.status.state }) })) : timeLabel !== undefined ? (_jsx("span", { className: styles.sessionTime, "data-session-time": true, children: timeLabel })) : null }), _jsx("span", { className: styles.rowActions, children: _jsx(Menu, { open: menuOpen, onClose: () => {
|
|
261
|
+
setMenuOpen(false);
|
|
262
|
+
}, items: sessionMenuItems, onSelect: (id) => {
|
|
263
|
+
setMenuOpen(false);
|
|
264
|
+
if (id === 'rename')
|
|
265
|
+
onRename?.(sessionId, label);
|
|
266
|
+
if (id === 'fork')
|
|
267
|
+
onFork?.(sessionId);
|
|
268
|
+
if (id === 'archive')
|
|
269
|
+
onArchive?.(sessionId);
|
|
270
|
+
}, portal: true, closeOnPointerLeave: true, anchor: _jsx("button", { type: "button", className: styles.iconButton, "data-session-menu": true, "aria-label": t('session.options', { name: label }), onClick: (event) => {
|
|
271
|
+
event.stopPropagation();
|
|
272
|
+
setMenuOpen((current) => !current);
|
|
273
|
+
}, children: _jsx(IconEllipsisOutline16, {}) }) }) })] }))] }));
|
|
274
|
+
return (_jsx(HoverCard, { anchor: row, content: (_jsx(WorktreeSessionHoverContent, { label: label, blank: blank, presentation: presentation, t: t })), openDelayMs: 500, disabled: menuOpen || drag.active, copyText: blank ? undefined : label, copyLabel: t('copy'), copiedLabel: t('hover.copied') }));
|
|
188
275
|
}
|
|
189
|
-
export function WorktreeSessionGroup({ t, groupKey, sessionIds, workspaceId, currentSessionId, expanded, actionPending, sessions, dragState, onToggleExpanded, onStartDrag, onHoverDrag, onClearDrag, onFinishDrag, onCommitDrag, onOpen, onRename, onFork, onArchive, }) {
|
|
276
|
+
export function WorktreeSessionGroup({ t, groupKey, sessionIds, workspaceId, currentSessionId, expanded, actionPending, sessions, sessionPresentations, dragState, onToggleExpanded, onStartDrag, onHoverDrag, onClearDrag, onFinishDrag, onCommitDrag, onOpen, onRename, onFork, onArchive, }) {
|
|
190
277
|
const visibleSessionIds = expanded ? sessionIds : sessionIds.slice(0, 5);
|
|
191
278
|
const sameGroupDrag = dragState?.groupKey === groupKey;
|
|
192
|
-
return (_jsxs(_Fragment, { children: [visibleSessionIds.map((sessionId) => (_jsx(WorktreeSessionRow, { t: t, sessionId: sessionId, blank: isBlankSession(sessionId, sessions), current: sessionId === currentSessionId, label: sessionLabel(sessionId, sessions, t), drag: {
|
|
279
|
+
return (_jsxs(_Fragment, { children: [visibleSessionIds.map((sessionId) => (_jsx(WorktreeSessionRow, { t: t, sessionId: sessionId, blank: isBlankSession(sessionId, sessions), current: sessionId === currentSessionId, label: sessionLabel(sessionId, sessions, t), presentation: sessionPresentations[sessionId], drag: {
|
|
193
280
|
active: sameGroupDrag,
|
|
194
|
-
marker: sameGroupDrag && dragState.over?.sessionId === sessionId
|
|
195
|
-
? dragState.over.half
|
|
196
|
-
: null,
|
|
281
|
+
marker: sameGroupDrag && dragState.over?.sessionId === sessionId ? dragState.over.half : null,
|
|
197
282
|
start: () => {
|
|
198
283
|
onStartDrag(groupKey, sessionId);
|
|
199
284
|
},
|