@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.
Files changed (116) hide show
  1. package/README.md +107 -15
  2. package/README.zh.md +86 -10
  3. package/cordis.patch.yml +21 -0
  4. package/lib/client/WorktreeContext.d.ts.map +1 -1
  5. package/lib/client/WorktreeContext.js +2 -2
  6. package/lib/client/WorktreeContext.js.map +1 -1
  7. package/lib/client/WorktreeSurface.d.ts +2 -2
  8. package/lib/client/WorktreeSurface.d.ts.map +1 -1
  9. package/lib/client/WorktreeSurface.js +270 -65
  10. package/lib/client/WorktreeSurface.js.map +1 -1
  11. package/lib/client/entry.d.ts.map +1 -1
  12. package/lib/client/entry.js +84 -2
  13. package/lib/client/entry.js.map +1 -1
  14. package/lib/client/index.d.ts +3 -0
  15. package/lib/client/index.d.ts.map +1 -1
  16. package/lib/client/index.js +2 -0
  17. package/lib/client/index.js.map +1 -1
  18. package/lib/client/locales.d.ts +58 -0
  19. package/lib/client/locales.d.ts.map +1 -1
  20. package/lib/client/locales.js +58 -0
  21. package/lib/client/locales.js.map +1 -1
  22. package/lib/client/session-view.d.ts +34 -0
  23. package/lib/client/session-view.d.ts.map +1 -1
  24. package/lib/client/session-view.js +119 -1
  25. package/lib/client/session-view.js.map +1 -1
  26. package/lib/client/worktree-connection.d.ts +4 -2
  27. package/lib/client/worktree-connection.d.ts.map +1 -1
  28. package/lib/client/worktree-connection.js +4 -0
  29. package/lib/client/worktree-connection.js.map +1 -1
  30. package/lib/client/worktree-error-copy.d.ts +2 -0
  31. package/lib/client/worktree-error-copy.d.ts.map +1 -1
  32. package/lib/client/worktree-error-copy.js +16 -0
  33. package/lib/client/worktree-error-copy.js.map +1 -1
  34. package/lib/client/worktree-permission-icon.d.ts +7 -0
  35. package/lib/client/worktree-permission-icon.d.ts.map +1 -0
  36. package/lib/client/worktree-permission-icon.js +119 -0
  37. package/lib/client/worktree-permission-icon.js.map +1 -0
  38. package/lib/client/worktree-permission.d.ts +21 -0
  39. package/lib/client/worktree-permission.d.ts.map +1 -0
  40. package/lib/client/worktree-permission.js +70 -0
  41. package/lib/client/worktree-permission.js.map +1 -0
  42. package/lib/client/worktree-session-fork.d.ts +65 -0
  43. package/lib/client/worktree-session-fork.d.ts.map +1 -0
  44. package/lib/client/worktree-session-fork.js +174 -0
  45. package/lib/client/worktree-session-fork.js.map +1 -0
  46. package/lib/client/worktree-session-order.d.ts +36 -0
  47. package/lib/client/worktree-session-order.d.ts.map +1 -0
  48. package/lib/client/worktree-session-order.js +215 -0
  49. package/lib/client/worktree-session-order.js.map +1 -0
  50. package/lib/client/worktree-session.d.ts +34 -1
  51. package/lib/client/worktree-session.d.ts.map +1 -1
  52. package/lib/client/worktree-session.js +98 -2
  53. package/lib/client/worktree-session.js.map +1 -1
  54. package/lib/client/worktree-surface-rows.d.ts +4 -4
  55. package/lib/client/worktree-surface-rows.d.ts.map +1 -1
  56. package/lib/client/worktree-surface-rows.js +132 -47
  57. package/lib/client/worktree-surface-rows.js.map +1 -1
  58. package/lib/client/worktree-surface-selectors.d.ts +2 -0
  59. package/lib/client/worktree-surface-selectors.d.ts.map +1 -1
  60. package/lib/client/worktree-surface-selectors.js +8 -0
  61. package/lib/client/worktree-surface-selectors.js.map +1 -1
  62. package/lib/client/worktree-surface-types.d.ts +46 -3
  63. package/lib/client/worktree-surface-types.d.ts.map +1 -1
  64. package/lib/client/worktree-view-actions.d.ts +8 -3
  65. package/lib/client/worktree-view-actions.d.ts.map +1 -1
  66. package/lib/client/worktree-view-actions.js +28 -2
  67. package/lib/client/worktree-view-actions.js.map +1 -1
  68. package/lib/client/worktree-view-errors.d.ts +10 -0
  69. package/lib/client/worktree-view-errors.d.ts.map +1 -1
  70. package/lib/client/worktree-view-errors.js +22 -1
  71. package/lib/client/worktree-view-errors.js.map +1 -1
  72. package/lib/client.js +1473 -201
  73. package/lib/client.js.map +1 -1
  74. package/lib/contract/index.contract.js +2 -0
  75. package/lib/contract/index.contract.js.map +1 -1
  76. package/lib/contract/index.d.ts +6 -2
  77. package/lib/contract/index.d.ts.map +1 -1
  78. package/lib/contract/index.js +4 -0
  79. package/lib/contract/index.js.map +1 -1
  80. package/lib/contract/worktree-permission.d.ts +73 -0
  81. package/lib/contract/worktree-permission.d.ts.map +1 -0
  82. package/lib/contract/worktree-permission.js +32 -0
  83. package/lib/contract/worktree-permission.js.map +1 -0
  84. package/lib/host/index.d.ts +4 -0
  85. package/lib/host/index.d.ts.map +1 -1
  86. package/lib/host/index.js +2 -0
  87. package/lib/host/index.js.map +1 -1
  88. package/lib/host/remote.d.ts +2 -2
  89. package/lib/host/remote.d.ts.map +1 -1
  90. package/lib/host/remote.js +7 -1
  91. package/lib/host/remote.js.map +1 -1
  92. package/lib/host/service.d.ts +3 -1
  93. package/lib/host/service.d.ts.map +1 -1
  94. package/lib/host/service.js +36 -2
  95. package/lib/host/service.js.map +1 -1
  96. package/lib/host/worktree-permission-manager.d.ts +14 -0
  97. package/lib/host/worktree-permission-manager.d.ts.map +1 -0
  98. package/lib/host/worktree-permission-manager.js +111 -0
  99. package/lib/host/worktree-permission-manager.js.map +1 -0
  100. package/lib/host/worktree-permission.d.ts +38 -0
  101. package/lib/host/worktree-permission.d.ts.map +1 -0
  102. package/lib/host/worktree-permission.js +156 -0
  103. package/lib/host/worktree-permission.js.map +1 -0
  104. package/lib/index.d.ts +4 -3
  105. package/lib/index.d.ts.map +1 -1
  106. package/lib/index.js +2 -1
  107. package/lib/index.js.map +1 -1
  108. package/lib/manage/worktree-permission.d.ts +3 -0
  109. package/lib/manage/worktree-permission.d.ts.map +1 -0
  110. package/lib/manage/worktree-permission.js +3 -0
  111. package/lib/manage/worktree-permission.js.map +1 -0
  112. package/lib/typert.host.js +126 -27
  113. package/lib/typert.remote-client.d.ts +5 -1
  114. package/lib/typert.remote-client.d.ts.map +1 -1
  115. package/lib/typert.remote-client.js +126 -27
  116. 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":"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"}
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
- options.ensureSessionWorkspace(input.workspaceId, sessionId);
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":"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"}
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":"AAmBA,OAAO,KAAK,EACV,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EAC1B,MAAM,6BAA6B,CAAC;AAQrC,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,EACnC,CAAC,EACD,SAAS,EACT,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,gBAAgB,GACjB,EAAE,yBAAyB,+BAsH3B;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,EAC/B,CAAC,EACD,IAAI,EACJ,KAAK,EACL,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,cAAc,EACd,KAAK,EACL,UAAU,EACV,QAAQ,EACR,eAAe,EACf,IAAI,EACJ,IAAI,GACL,EAAE,qBAAqB,+BA0IvB;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,GACV,EAAE,uBAAuB,+BA+FzB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,CAAC,EACD,QAAQ,EACR,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,GACV,EAAE,yBAAyB,+BAmE3B"}
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
- ? styles.dropBefore
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: (_jsx("button", { type: "button", className: styles.iconButton, "data-workspace-menu": true, "aria-label": t('workspace.options', { name: workspace.title }), onClick: (event) => {
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, {}) })) }) }), _jsx("button", { type: "button", className: styles.iconButton, "data-add-worktree": true, "aria-label": t('workspace.addWorktree', { name: workspace.title }), onClick: (event) => {
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: 'remove',
111
- label: t('worktree.remove'),
112
- icon: _jsx(IconTrashOutline16, {}),
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 === 'remove')
119
- menu.onRemove();
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
- return (_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) => {
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
- setMenuOpen(false);
176
- }, items: sessionMenuItems, onSelect: (id) => {
177
- setMenuOpen(false);
178
- if (id === 'rename')
179
- onRename?.(sessionId, label);
180
- if (id === 'fork')
181
- onFork?.(sessionId);
182
- if (id === 'archive')
183
- onArchive?.(sessionId);
184
- }, 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) => {
185
- event.stopPropagation();
186
- setMenuOpen((current) => !current);
187
- }, children: _jsx(IconEllipsisOutline16, {}) })) }) }))] }));
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
  },