@cerbur/clutch-dsh-worktree 0.1.22 → 0.1.23
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 +10 -0
- package/README.zh.md +9 -0
- package/lib/client/WorktreeSurface.js +3 -5
- package/lib/client/WorktreeSurface.js.map +1 -1
- package/lib/client/dashboard/dashboard-sessions.d.ts +1 -1
- package/lib/client/dashboard/dashboard-sessions.d.ts.map +1 -1
- package/lib/client/dashboard/dashboard-sessions.js +3 -2
- package/lib/client/dashboard/dashboard-sessions.js.map +1 -1
- package/lib/client/entry.d.ts.map +1 -1
- package/lib/client/entry.js +11 -1
- package/lib/client/entry.js.map +1 -1
- package/lib/client/locales.d.ts +2 -0
- package/lib/client/locales.d.ts.map +1 -1
- package/lib/client/locales.js +2 -0
- package/lib/client/locales.js.map +1 -1
- package/lib/client/session/virtual-workspace-membership.d.ts +1 -0
- package/lib/client/session/virtual-workspace-membership.d.ts.map +1 -1
- package/lib/client/session/virtual-workspace-membership.js +4 -0
- package/lib/client/session/virtual-workspace-membership.js.map +1 -1
- package/lib/client/surface/components/SurfaceContent.js +2 -2
- package/lib/client/surface/components/SurfaceContent.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 +3 -2
- package/lib/client/surface/components/WorkspaceTree.js.map +1 -1
- package/lib/client/surface/selectors.d.ts +3 -1
- package/lib/client/surface/selectors.d.ts.map +1 -1
- package/lib/client/surface/selectors.js +15 -0
- package/lib/client/surface/selectors.js.map +1 -1
- package/lib/client/surface/state/useSessionOrdering.d.ts.map +1 -1
- package/lib/client/surface/state/useSessionOrdering.js +1 -1
- package/lib/client/surface/state/useSessionOrdering.js.map +1 -1
- package/lib/client/surface/state/useSurfaceRefresh.d.ts +2 -2
- package/lib/client/surface/state/useSurfaceRefresh.d.ts.map +1 -1
- package/lib/client/surface/state/useSurfaceRefresh.js +118 -95
- package/lib/client/surface/state/useSurfaceRefresh.js.map +1 -1
- package/lib/client/surface/state/useSurfaceSources.d.ts.map +1 -1
- package/lib/client/surface/state/useSurfaceSources.js +8 -1
- package/lib/client/surface/state/useSurfaceSources.js.map +1 -1
- package/lib/client/surface/types.d.ts +7 -5
- package/lib/client/surface/types.d.ts.map +1 -1
- package/lib/client/view/worktree-view-read.d.ts +9 -2
- package/lib/client/view/worktree-view-read.d.ts.map +1 -1
- package/lib/client/view/worktree-view-read.js +95 -5
- package/lib/client/view/worktree-view-read.js.map +1 -1
- package/lib/client/worktree-connection.d.ts +1 -0
- package/lib/client/worktree-connection.d.ts.map +1 -1
- package/lib/client/worktree-connection.js +18 -0
- package/lib/client/worktree-connection.js.map +1 -1
- package/lib/client.js +469 -282
- 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 +15 -1
- package/lib/contract/index.d.ts.map +1 -1
- package/lib/contract/index.js +1 -0
- package/lib/contract/index.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 +4 -1
- package/lib/host/service.d.ts.map +1 -1
- package/lib/host/service.js +6 -0
- package/lib/host/service.js.map +1 -1
- package/lib/manage/manager-navigation.d.ts +11 -0
- package/lib/manage/manager-navigation.d.ts.map +1 -0
- package/lib/manage/manager-navigation.js +88 -0
- package/lib/manage/manager-navigation.js.map +1 -0
- package/lib/manage/manager.d.ts +3 -0
- package/lib/manage/manager.d.ts.map +1 -1
- package/lib/manage/manager.js +6 -34
- package/lib/manage/manager.js.map +1 -1
- package/lib/typert.host.js +154 -50
- package/lib/typert.remote-client.d.ts +3 -1
- package/lib/typert.remote-client.d.ts.map +1 -1
- package/lib/typert.remote-client.js +154 -50
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -1061,9 +1061,28 @@ window.__ModuleLoader__.load({
|
|
|
1061
1061
|
};
|
|
1062
1062
|
}
|
|
1063
1063
|
/** Share complete Workspace reads without allowing stale generations to repopulate the cache. */
|
|
1064
|
-
function createWorktreeViewReader(manager) {
|
|
1064
|
+
function createWorktreeViewReader(manager, sessionIdsForWorkspace) {
|
|
1065
1065
|
const entries = /* @__PURE__ */ new Map();
|
|
1066
1066
|
let disposed = false;
|
|
1067
|
+
let active = 0;
|
|
1068
|
+
const queue = [];
|
|
1069
|
+
const schedule = (operation) => new Promise((resolve, reject) => {
|
|
1070
|
+
const start = () => {
|
|
1071
|
+
active += 1;
|
|
1072
|
+
let result;
|
|
1073
|
+
try {
|
|
1074
|
+
result = operation();
|
|
1075
|
+
} catch (error) {
|
|
1076
|
+
result = Promise.reject(error);
|
|
1077
|
+
}
|
|
1078
|
+
result.then(resolve, reject).finally(() => {
|
|
1079
|
+
active -= 1;
|
|
1080
|
+
queue.shift()?.();
|
|
1081
|
+
});
|
|
1082
|
+
};
|
|
1083
|
+
if (active < 3) start();
|
|
1084
|
+
else queue.push(start);
|
|
1085
|
+
});
|
|
1067
1086
|
const entryFor = (workspaceId) => {
|
|
1068
1087
|
const current = entries.get(workspaceId);
|
|
1069
1088
|
if (current !== void 0) return current;
|
|
@@ -1081,13 +1100,22 @@ window.__ModuleLoader__.load({
|
|
|
1081
1100
|
if (!entry.stale && entry.view !== void 0) return Promise.resolve(entry.view);
|
|
1082
1101
|
if (entry.inFlight?.generation === entry.generation) return entry.inFlight.promise;
|
|
1083
1102
|
const generation = entry.generation;
|
|
1084
|
-
|
|
1103
|
+
let knownSessionIds;
|
|
1104
|
+
const promise = schedule(() => {
|
|
1105
|
+
if (disposed) return Promise.reject(/* @__PURE__ */ new Error("Worktree view reader disposed"));
|
|
1106
|
+
const membership = sessionIdsForWorkspace?.(workspaceId);
|
|
1107
|
+
if (membership !== void 0) if ("sessionIds" in membership) knownSessionIds = membership.pending ? [.../* @__PURE__ */ new Set([...entry.knownSessionIds ?? [], ...membership.sessionIds])] : membership.sessionIds.slice();
|
|
1108
|
+
else knownSessionIds = membership.slice();
|
|
1109
|
+
return loadWorktreeView(manager, workspaceId);
|
|
1110
|
+
}).then((data) => {
|
|
1085
1111
|
const view = {
|
|
1086
1112
|
workspaceId,
|
|
1087
|
-
...data
|
|
1113
|
+
...data,
|
|
1114
|
+
...knownSessionIds === void 0 ? {} : { knownSessionIds }
|
|
1088
1115
|
};
|
|
1089
1116
|
if (!disposed && entries.get(workspaceId) === entry && entry.generation === generation) {
|
|
1090
1117
|
entry.view = view;
|
|
1118
|
+
entry.knownSessionIds = knownSessionIds;
|
|
1091
1119
|
entry.stale = false;
|
|
1092
1120
|
}
|
|
1093
1121
|
return view;
|
|
@@ -1158,7 +1186,26 @@ window.__ModuleLoader__.load({
|
|
|
1158
1186
|
entry.stale = true;
|
|
1159
1187
|
entry.view = void 0;
|
|
1160
1188
|
},
|
|
1161
|
-
read,
|
|
1189
|
+
read(workspaceId, options) {
|
|
1190
|
+
if (!options?.current) return read(workspaceId);
|
|
1191
|
+
const followCurrent = async () => {
|
|
1192
|
+
for (;;) {
|
|
1193
|
+
if (disposed) throw new Error("Worktree view reader disposed");
|
|
1194
|
+
const entry = entryFor(workspaceId);
|
|
1195
|
+
const generation = entry.generation;
|
|
1196
|
+
let view;
|
|
1197
|
+
try {
|
|
1198
|
+
view = await read(workspaceId);
|
|
1199
|
+
} catch (error) {
|
|
1200
|
+
if (disposed || generation === entry.generation) throw error;
|
|
1201
|
+
continue;
|
|
1202
|
+
}
|
|
1203
|
+
if (disposed) throw new Error("Worktree view reader disposed");
|
|
1204
|
+
if (!entry.stale && entry.view === view) return view;
|
|
1205
|
+
}
|
|
1206
|
+
};
|
|
1207
|
+
return followCurrent();
|
|
1208
|
+
},
|
|
1162
1209
|
readMany(workspaceIds) {
|
|
1163
1210
|
const uniqueIds = [...new Set(workspaceIds)];
|
|
1164
1211
|
return Promise.all(uniqueIds.map((workspaceId) => read(workspaceId)));
|
|
@@ -1172,6 +1219,34 @@ window.__ModuleLoader__.load({
|
|
|
1172
1219
|
}
|
|
1173
1220
|
/** Read Worktree, Git readiness/HEAD, binding, and Workspace-root Main projections. */
|
|
1174
1221
|
async function loadWorktreeView(manager, workspaceId) {
|
|
1222
|
+
if (manager.readWorkspaceNavigation) {
|
|
1223
|
+
let navigation;
|
|
1224
|
+
let unsupported = false;
|
|
1225
|
+
try {
|
|
1226
|
+
navigation = await manager.readWorkspaceNavigation({ workspaceId });
|
|
1227
|
+
} catch (error) {
|
|
1228
|
+
if (toWorktreeViewError(error).code !== "WORKTREE_NAVIGATION_UNSUPPORTED") throw error;
|
|
1229
|
+
unsupported = true;
|
|
1230
|
+
}
|
|
1231
|
+
if (!unsupported) {
|
|
1232
|
+
const { gitState, ...snapshot } = navigation;
|
|
1233
|
+
if (!gitState.ok) {
|
|
1234
|
+
const readiness = readinessFromBranchError(gitState.error);
|
|
1235
|
+
if (!readiness) throw gitState.error;
|
|
1236
|
+
return {
|
|
1237
|
+
...snapshot,
|
|
1238
|
+
branches: [],
|
|
1239
|
+
readiness
|
|
1240
|
+
};
|
|
1241
|
+
}
|
|
1242
|
+
return {
|
|
1243
|
+
...snapshot,
|
|
1244
|
+
branches: [],
|
|
1245
|
+
currentBranch: gitState.value.currentBranch,
|
|
1246
|
+
readiness: snapshot.checkout?.currentHead === void 0 ? { status: "noLocalBranch" } : { status: "ready" }
|
|
1247
|
+
};
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1175
1250
|
const [worktreesResult, branchesResult, bindingsResult, mainInstructionsResult, checkoutResult] = await Promise.allSettled([
|
|
1176
1251
|
manager.listWorktrees({ workspaceId }),
|
|
1177
1252
|
typeof manager.getWorkspaceGitState === "function" ? manager.getWorkspaceGitState({ workspaceId }) : manager.listBranches({ workspaceId }),
|
|
@@ -1216,7 +1291,7 @@ window.__ModuleLoader__.load({
|
|
|
1216
1291
|
return {
|
|
1217
1292
|
invalidate: guard.invalidate,
|
|
1218
1293
|
load(workspaceId, onSuccess, onError) {
|
|
1219
|
-
return guard.run(() => reader.read(workspaceId), onSuccess, (error) => onError(toWorktreeViewError(error)));
|
|
1294
|
+
return guard.run(() => reader.read(workspaceId, { current: true }), onSuccess, (error) => onError(toWorktreeViewError(error)));
|
|
1220
1295
|
}
|
|
1221
1296
|
};
|
|
1222
1297
|
}
|
|
@@ -1888,6 +1963,7 @@ window.__ModuleLoader__.load({
|
|
|
1888
1963
|
"action.retryBinding": "重试绑定",
|
|
1889
1964
|
"action.openCreatedSession": "打开已创建的 Session",
|
|
1890
1965
|
"status.loading": "正在加载工作区…",
|
|
1966
|
+
"status.workspaceFailed": "工作区加载失败,请在报错与修复中重试。",
|
|
1891
1967
|
"error.worktreeDataUnavailable": "暂时无法读取 Worktree 数据。请确认 DSH 服务已连接,再重试;已有列表会保留。",
|
|
1892
1968
|
"error.gitNotInstalled": "找不到 Git。请安装 Git 或将其加入 PATH,重启 DSH 后重试。",
|
|
1893
1969
|
"error.connectionDisposed": "Worktree 连接已关闭。请刷新页面或重启 DSH 后重试。",
|
|
@@ -2334,6 +2410,7 @@ window.__ModuleLoader__.load({
|
|
|
2334
2410
|
"action.retryBinding": "Retry Binding",
|
|
2335
2411
|
"action.openCreatedSession": "Open Created Session",
|
|
2336
2412
|
"status.loading": "Loading Workspaces…",
|
|
2413
|
+
"status.workspaceFailed": "Workspace loading failed. Retry in Errors & Repair.",
|
|
2337
2414
|
"error.worktreeDataUnavailable": "Worktree data could not be loaded. Check your connection to DSH, then retry. The existing list is preserved.",
|
|
2338
2415
|
"error.gitNotInstalled": "Git could not be found. Install Git or add it to PATH, restart DSH, then retry.",
|
|
2339
2416
|
"error.connectionDisposed": "The Worktree connection has closed. Refresh the page or restart DSH, then retry.",
|
|
@@ -2408,6 +2485,7 @@ window.__ModuleLoader__.load({
|
|
|
2408
2485
|
readWorktreeSessionState: "worktreeManager/readWorktreeSessionState",
|
|
2409
2486
|
syncWorktreeBaseline: "worktreeManager/syncWorktreeBaseline",
|
|
2410
2487
|
getWorkspaceGitState: "worktreeManager/getWorkspaceGitState",
|
|
2488
|
+
readWorkspaceNavigation: "worktreeManager/readWorkspaceNavigation",
|
|
2411
2489
|
getToolSettings: "worktreeManager/getToolSettings",
|
|
2412
2490
|
updateToolSettings: "worktreeManager/updateToolSettings",
|
|
2413
2491
|
watchToolChanges: "worktreeManager/watchToolChanges",
|
|
@@ -2546,6 +2624,20 @@ window.__ModuleLoader__.load({
|
|
|
2546
2624
|
probeHost: (signal) => call("listBindings", { workspaceId: "" }, signal),
|
|
2547
2625
|
listWorktrees: (input) => invoke("listWorktrees", input),
|
|
2548
2626
|
getWorkspaceGitState: (input) => invoke("getWorkspaceGitState", input),
|
|
2627
|
+
async readWorkspaceNavigation(input) {
|
|
2628
|
+
try {
|
|
2629
|
+
return await invoke("readWorkspaceNavigation", input);
|
|
2630
|
+
} catch (error) {
|
|
2631
|
+
const endpoint = WORKTREE_CONNECTION_ENDPOINTS.readWorkspaceNavigation;
|
|
2632
|
+
if (error instanceof WorktreeConnectionError && error.code === "CONNECTION_CALL_FAILED" && error.cause instanceof Error && error.cause.message === `transport failure for /api/${endpoint}: HTTP 404`) throw new WorktreeConnectionError({
|
|
2633
|
+
code: "WORKTREE_NAVIGATION_UNSUPPORTED",
|
|
2634
|
+
message: "",
|
|
2635
|
+
details: { endpoint },
|
|
2636
|
+
retryable: false
|
|
2637
|
+
});
|
|
2638
|
+
throw error;
|
|
2639
|
+
}
|
|
2640
|
+
},
|
|
2549
2641
|
listWorktreeCommits: (input) => invoke("listWorktreeCommits", input),
|
|
2550
2642
|
listWorktreeCommitFiles: (input) => invoke("listWorktreeCommitFiles", input),
|
|
2551
2643
|
getWorktreeCommitFileDiff: (input) => invoke("getWorktreeCommitFileDiff", input),
|
|
@@ -2771,7 +2863,7 @@ window.__ModuleLoader__.load({
|
|
|
2771
2863
|
const IconSearchOutline16 = createDshIconAlias(exports$1, "IconSearchOutline16", "IconSearchOutlineRegular");
|
|
2772
2864
|
const IconTrashOutline16 = createDshIconAlias(exports$1, "IconTrashOutline16", "IconTrashOutlineRegular");
|
|
2773
2865
|
//#endregion
|
|
2774
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
2866
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/context/worktree-context.css.mjs
|
|
2775
2867
|
const css$9 = ".-cerbur-clutch-dsh-worktree-headerContext {\n display: inline-flex;\n min-width: 0;\n height: 22px;\n align-items: center;\n gap: 4px;\n max-width: 180px;\n overflow: hidden;\n border-radius: 6px;\n padding: 0 2px 0 0;\n background: var(--dsw-alias-fill-tsp-secondary);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 22px;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-contextIcon {\n flex: none;\n opacity: 0.7;\n}\n\n.-cerbur-clutch-dsh-worktree-contextLabel {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-contextHoverTitle {\n max-width: 360px;\n color: var(--dsw-static-neutral-bluish-00);\n font-size: 14px;\n line-height: 20px;\n overflow-wrap: anywhere;\n white-space: normal;\n}\n\n.-cerbur-clutch-dsh-worktree-heroContextHost {\n position: absolute;\n z-index: 0;\n display: block;\n width: max-content;\n max-width: 260px;\n min-height: 22px;\n}\n\n.-cerbur-clutch-dsh-worktree-heroContext {\n display: inline-flex;\n box-sizing: border-box;\n max-width: 260px;\n min-height: 22px;\n align-items: center;\n overflow: hidden;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n padding: 0 8px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 20px;\n pointer-events: auto;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n";
|
|
2776
2868
|
const styleId$9 = "@cerbur/clutch-dsh-worktree/worktree-context.css";
|
|
2777
2869
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree-context.css\"]") === null) {
|
|
@@ -2835,7 +2927,7 @@ window.__ModuleLoader__.load({
|
|
|
2835
2927
|
globalSetViewMode?.(mode);
|
|
2836
2928
|
}
|
|
2837
2929
|
//#endregion
|
|
2838
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
2930
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/worktree.css.mjs
|
|
2839
2931
|
const css$8 = ".-cerbur-clutch-dsh-worktree-action {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 8px;\n width: calc(100% + 4px);\n height: 42px;\n margin: 4px -2px;\n box-sizing: border-box;\n border: 0;\n border-radius: 12px;\n padding: 0 10px 0 8px;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 22px;\n text-align: left;\n overflow: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-action:hover,\n.-cerbur-clutch-dsh-worktree-action[data-active='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-action[data-collapsed='true'] {\n width: 36px;\n height: 36px;\n margin: 8px 0 10px;\n justify-content: center;\n gap: 0;\n padding: 0;\n border-radius: 50%;\n}\n\n.-cerbur-clutch-dsh-worktree-actionLabel {\n display: inline-flex;\n min-width: 0;\n align-items: center;\n height: 22px;\n overflow: hidden;\n font-weight: 400;\n line-height: 22px;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-surface {\n position: absolute;\n top: 0;\n left: 0;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n min-width: 0;\n overflow: hidden;\n border-right: 1px solid var(--dsw-alias-border-l1);\n background: var(--dsw-specific-sidebar-fill);\n color: var(--dsw-alias-label-primary);\n pointer-events: auto;\n transition: width var(--ds-transition-duration-slow) var(--ds-ease-in-out);\n}\n\n/* Native macOS AppFrame already paints the tint over OS window vibrancy.\n Once the covered native rows are concealed, use that one material without\n adding another fill or backdrop root (menus keep their own native blur). */\n[data-platform='darwin'] .-cerbur-clutch-dsh-worktree-surface[data-native-sidebar-covered='true'] {\n background: transparent;\n border-right: none;\n}\n\n/* The shell overlay is outside the native column's clipping boundary.\n Follow the semantic collapse immediately, even during the track transition. */\n[data-sidebar-collapsed] [data-shell-overlay] .-cerbur-clutch-dsh-worktree-surface,\n.-cerbur-clutch-dsh-worktree-surface[data-collapsed='true'] {\n visibility: hidden;\n opacity: 0;\n pointer-events: none;\n}\n\n@media (prefers-reduced-transparency: reduce) {\n [data-platform='darwin'] .-cerbur-clutch-dsh-worktree-surface[data-native-sidebar-covered='true'] {\n background: color-mix(in srgb, var(--dsw-specific-sidebar-fill) 90%, transparent);\n }\n}\n\n.-cerbur-clutch-dsh-worktree-motionExits {\n position: absolute;\n inset: 0;\n contain: strict;\n overflow: clip;\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .-cerbur-clutch-dsh-worktree-surface {\n transition: none;\n }\n}\n\n.-cerbur-clutch-dsh-worktree-wideContent {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1;\n flex-direction: column;\n}\n\n.-cerbur-clutch-dsh-worktree-surface[data-collapsed='true'] .-cerbur-clutch-dsh-worktree-wideContent {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationDialog {\n width: min(440px, 100%);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody {\n display: grid;\n min-width: 0;\n gap: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody .-cerbur-clutch-dsh-worktree-modalField {\n min-width: 0;\n gap: 8px;\n line-height: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody .-cerbur-clutch-dsh-worktree-renameInput,\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody [data-single-select] > button {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n height: 40px;\n padding: 0 12px;\n border: 1px solid var(--dsw-alias-border-l3);\n font-size: 14px;\n line-height: 22px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody .-cerbur-clutch-dsh-worktree-renameInput:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTabs {\n display: flex;\n gap: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTab {\n border: 0;\n border-bottom: 2px solid transparent;\n padding: 4px 0 8px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 22px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTab[aria-selected='true'] {\n border-bottom-color: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeImportCandidates {\n display: grid;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeImportError {\n display: grid;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton {\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: inherit;\n cursor: pointer;\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-header {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: none;\n min-height: 44px;\n padding: 6px 10px;\n box-sizing: border-box;\n border-bottom: 1px solid var(--dsw-alias-border-l1);\n}\n\n.-cerbur-clutch-dsh-worktree-title {\n min-width: 0;\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n font-weight: 600;\n opacity: 1;\n visibility: visible;\n transition:\n opacity 120ms var(--ds-ease-in-out),\n transform 180ms var(--ds-ease-in-out),\n visibility 0s linear;\n}\n\n.-cerbur-clutch-dsh-worktree-titleHidden {\n flex: 0 0 0px;\n max-width: 0;\n opacity: 0;\n transform: translateX(-4px);\n visibility: hidden;\n pointer-events: none;\n transition-delay: 0s, 0s, 180ms;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 28px;\n height: 28px;\n border: 0;\n border-radius: 7px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 16px;\n line-height: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-modeButton[data-active='true'] {\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-workspacePicker {\n display: block;\n width: calc(100% - 20px);\n margin: 6px 10px 8px;\n padding: 6px 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 7px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceLabel {\n display: block;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollFrame {\n position: relative;\n min-height: 0;\n flex: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-content {\n height: 100%;\n box-sizing: border-box;\n overflow: auto;\n padding: 0 10px 12px;\n scrollbar-width: none;\n}\n\n.-cerbur-clutch-dsh-worktree-content::-webkit-scrollbar {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollContent {\n min-width: 0;\n display: flow-root;\n}\n\n/* The themed thumb floats in the existing right inset. Native scrolling\n stays on .-cerbur-clutch-dsh-worktree-content; OS scrollbar preferences cannot shift the rows. */\n.-cerbur-clutch-dsh-worktree-overlayScrollbar {\n position: absolute;\n top: 0;\n right: 2px;\n bottom: 0;\n width: 5px;\n touch-action: none;\n user-select: none;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollbarThumb {\n width: 100%;\n border-radius: 999px;\n background: var(--dsw-alias-scrollbar-bg-l2);\n opacity: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollFrame:hover .-cerbur-clutch-dsh-worktree-scrollbarThumb,\n.-cerbur-clutch-dsh-worktree-scrollFrame:focus-within .-cerbur-clutch-dsh-worktree-scrollbarThumb,\n.-cerbur-clutch-dsh-worktree-overlayScrollbar[data-dragging='true'] .-cerbur-clutch-dsh-worktree-scrollbarThumb {\n opacity: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollbarThumb:hover,\n.-cerbur-clutch-dsh-worktree-overlayScrollbar[data-dragging='true'] .-cerbur-clutch-dsh-worktree-scrollbarThumb {\n background: var(--dsw-alias-scrollbar-hover-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-content:focus-visible {\n outline: 2px solid var(--dsw-alias-border-l3);\n outline-offset: -2px;\n}\n\n.-cerbur-clutch-dsh-worktree-error {\n margin: 12px 0 0;\n padding: 8px;\n border: 1px solid var(--dsw-alias-state-error-primary);\n border-radius: 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-notice {\n margin: 12px 0 0;\n padding: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 7px;\n background: var(--dsw-alias-button-elevated-fill);\n}\n\n.-cerbur-clutch-dsh-worktree-retryButton,\n.-cerbur-clutch-dsh-worktree-actionButton {\n border: 0;\n border-radius: 6px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-retryButton,\n.-cerbur-clutch-dsh-worktree-actionButton {\n width: 100%;\n padding: 6px 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-recoveryActions {\n display: grid;\n gap: 6px;\n margin-top: 6px;\n}\n\n.-cerbur-clutch-dsh-worktree-retryButton:disabled,\n.-cerbur-clutch-dsh-worktree-actionButton:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.-cerbur-clutch-dsh-worktree-actions {\n display: grid;\n gap: 6px;\n margin-top: 10px;\n padding: 8px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-actionSelect {\n min-width: 0;\n padding: 5px 6px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-section {\n margin: 12px 0 0;\n}\n\n.-cerbur-clutch-dsh-worktree-sectionTitle {\n margin: 0 2px 4px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n text-transform: uppercase;\n}\n\n.-cerbur-clutch-dsh-worktree-empty,\n.-cerbur-clutch-dsh-worktree-message {\n margin: 0;\n padding: 8px 4px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 12px;\n line-height: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitReadiness {\n display: grid;\n gap: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-commandBlock {\n margin: 6px 0 0;\n padding: 8px;\n overflow-x: auto;\n border-radius: 6px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-secondary);\n font:\n 11px/16px ui-monospace,\n SFMono-Regular,\n Menlo,\n monospace;\n white-space: pre-wrap;\n}\n\n.-cerbur-clutch-dsh-worktree-message[data-error='true'] {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktree,\n.-cerbur-clutch-dsh-worktree-session {\n display: flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n border: 0;\n border-radius: 7px;\n padding: 6px 8px;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 12px;\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-worktree {\n cursor: default;\n}\n\n.-cerbur-clutch-dsh-worktree-session {\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-worktree:hover,\n.-cerbur-clutch-dsh-worktree-session:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel,\n.-cerbur-clutch-dsh-worktree-sessionLabel {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-status {\n flex: none;\n margin-left: auto;\n padding-left: 8px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-searchSlot {\n flex: none;\n max-width: 28px;\n min-width: 0;\n display: flex;\n align-items: center;\n margin-left: auto;\n box-sizing: border-box;\n transition:\n flex 180ms var(--ds-ease-in-out),\n max-width 180ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-searchSlotExpanded {\n flex: 1;\n max-width: 100%;\n}\n\n.-cerbur-clutch-dsh-worktree-headerActions {\n flex: none;\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: 0;\n opacity: 1;\n visibility: visible;\n transition:\n opacity 120ms var(--ds-ease-in-out),\n transform 180ms var(--ds-ease-in-out),\n visibility 0s linear;\n}\n\n.-cerbur-clutch-dsh-worktree-headerActionsHidden {\n flex: 0 0 0px;\n max-width: 0;\n margin-left: 0;\n opacity: 0;\n transform: translateX(4px);\n visibility: hidden;\n pointer-events: none;\n transition-delay: 0s, 0s, 180ms;\n}\n\n.-cerbur-clutch-dsh-worktree-search {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n height: 28px;\n box-sizing: border-box;\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n transition:\n background 180ms var(--ds-ease-in-out),\n box-shadow 180ms var(--ds-ease-in-out),\n color 180ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded {\n background: var(--dsw-alias-interactive-bg-subtle);\n box-shadow: inset 0 0 0 1px var(--dsw-alias-border-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded:focus-within {\n box-shadow: inset 0 0 0 1px #3b82f6;\n}\n\n.-cerbur-clutch-dsh-worktree-searchButton {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 50%;\n padding: 0;\n background: transparent;\n cursor: pointer;\n color: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-searchButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded .-cerbur-clutch-dsh-worktree-searchButton:hover {\n background: transparent;\n}\n\n.-cerbur-clutch-dsh-worktree-searchInput {\n flex: 1;\n width: 0;\n min-width: 0;\n box-sizing: border-box;\n border: none;\n outline: none;\n background: transparent;\n opacity: 0;\n pointer-events: none;\n font: inherit;\n font-size: 13px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n transition: opacity 120ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded .-cerbur-clutch-dsh-worktree-searchInput {\n margin-left: -2px;\n opacity: 1;\n pointer-events: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-searchInput::placeholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.-cerbur-clutch-dsh-worktree-clearButton {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n border-radius: 50%;\n padding: 0;\n background: transparent;\n cursor: pointer;\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-clearButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-actionSelect:focus {\n border-color: #3b82f6;\n}\n\n.-cerbur-clutch-dsh-worktree-iconButton {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 0;\n border-radius: 7px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 20px;\n line-height: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-iconButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityBell {\n display: inline-flex;\n position: relative;\n}\n\n.-cerbur-clutch-dsh-worktree-activityBadge {\n position: absolute;\n top: 4px;\n right: 4px;\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: var(--dsw-alias-brand-primary, #3b82f6);\n outline: 2px solid var(--dsw-specific-sidebar-fill);\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityPanel {\n position: fixed;\n z-index: 1000;\n box-sizing: border-box;\n width: min(360px, calc(100vw - 16px));\n max-height: min(440px, calc(100dvh - 72px));\n display: flex;\n flex-direction: column;\n padding: 6px;\n color: var(--dsw-alias-label-primary);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l1);\n box-shadow: var(--dsw-elevation-prominent);\n outline: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityHeading {\n flex: none;\n padding: 8px 10px;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityEmpty {\n margin: 0;\n padding: 26px 10px 32px;\n text-align: center;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityList {\n overflow: auto;\n min-height: 0;\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityEntry {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n box-sizing: border-box;\n width: 100%;\n height: auto;\n border: 0;\n border-radius: 7px;\n padding: 10px;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-activityEntry:hover,\n.-cerbur-clutch-dsh-worktree-activityEntry:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-activityEntry:focus-visible {\n outline: 1px solid var(--dsw-alias-label-secondary);\n outline-offset: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityIdentity {\n display: flex;\n flex-direction: column;\n min-width: 0;\n gap: 3px;\n flex: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-activityName,\n.-cerbur-clutch-dsh-worktree-activityContext {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-activityName {\n font-size: 13px;\n line-height: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityContext,\n.-cerbur-clutch-dsh-worktree-activityTime {\n color: var(--dsw-alias-label-secondary);\n font-size: 11px;\n line-height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityMetadata {\n display: flex;\n flex: none;\n flex-direction: column;\n align-items: flex-end;\n gap: 5px;\n padding-top: 2px;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceList {\n position: relative;\n min-width: 0;\n min-height: 0;\n display: grid;\n gap: 4px;\n overflow-x: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceGroup {\n min-width: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow,\n.-cerbur-clutch-dsh-worktree-worktreeRow {\n position: relative;\n display: flex;\n align-items: center;\n min-width: 0;\n min-height: 36px;\n box-sizing: border-box;\n border-radius: 8px;\n padding: 3px 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow .-cerbur-clutch-dsh-worktree-workspaceDisclosure {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover .-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-workspaceDisclosure {\n display: inline-flex;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover .-cerbur-clutch-dsh-worktree-workspaceIcon,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-workspaceIcon {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeDisclosure,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n display: inline-flex;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeIcon,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-worktreeIcon {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 28px;\n border: 0;\n border-radius: 6px;\n padding: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 17px;\n line-height: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton > svg {\n display: block;\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureArrow {\n transition: transform 150ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton[aria-expanded='true'] .-cerbur-clutch-dsh-worktree-disclosureArrow {\n transform: rotate(90deg);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n.-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n color: var(--dsw-alias-label-caption);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .-cerbur-clutch-dsh-worktree-disclosureArrow {\n transition: none;\n }\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceIcon,\n.-cerbur-clutch-dsh-worktree-worktreeIcon {\n flex: none;\n width: 24px;\n color: var(--dsw-alias-label-secondary);\n font-size: 20px;\n line-height: 1;\n text-align: center;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeIcon[data-worktree-state='done'] {\n color: var(--dsw-alias-state-success-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeIcon[data-worktree-state='warning'] {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeIcon[data-worktree-state='error'] {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeStateLabel {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n overflow: hidden;\n border: 0;\n padding: 0;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceIcon {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceIcon[data-workspace-active='true'] {\n color: var(--dsw-alias-state-business-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceTitle,\n.-cerbur-clutch-dsh-worktree-worktreeLabel {\n min-width: 0;\n overflow: hidden;\n flex: 1;\n padding: 0 6px;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-main-group='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel {\n font-weight: 600;\n}\n\n/* Native title reveal: the span clips its own text and scrolls only while\n hovered. Activity alone keeps the resting ellipsis. */\n@media (hover: hover) {\n .-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeLabel,\n .-cerbur-clutch-dsh-worktree-treeSessionRow:hover .-cerbur-clutch-dsh-worktree-sessionLabel {\n text-overflow: clip;\n }\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel[data-scrolled],\n.-cerbur-clutch-dsh-worktree-sessionLabel[data-scrolled] {\n mask-image: linear-gradient(to right, transparent, #000 12px);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel[data-clipped],\n.-cerbur-clutch-dsh-worktree-sessionLabel[data-clipped] {\n mask-image: linear-gradient(to left, transparent, #000 12px);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel[data-scrolled][data-clipped],\n.-cerbur-clutch-dsh-worktree-sessionLabel[data-scrolled][data-clipped] {\n mask-image: linear-gradient(\n to right,\n transparent,\n #000 12px,\n #000 calc(100% - 12px),\n transparent\n );\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeHoverTitle {\n color: var(--dsw-static-neutral-bluish-00);\n font-size: 14px;\n line-height: 20px;\n overflow-wrap: anywhere;\n}\n\n/* Native Session hover card: full title, relative time, and current status. */\n.-cerbur-clutch-dsh-worktree-sessionHoverContent {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionHoverTitle {\n color: #FFFFFF;\n font-size: 14px;\n line-height: 20px;\n overflow-wrap: break-word;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionHoverTime {\n color: #CFD3D6;\n font-size: 12px;\n line-height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionHoverStatus {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #ADB2B8;\n font-size: 12px;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeActionSlot,\n.-cerbur-clutch-dsh-worktree-workspaceActions {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n height: 28px;\n margin-left: auto;\n}\n\n/* Workspace rows retain the native fixed action column. */\n.-cerbur-clutch-dsh-worktree-workspaceActions {\n flex: 0 0 64px;\n width: 64px;\n}\n\n/* Group actions do not reserve space until their row needs to show them. */\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot {\n min-width: 0;\n flex: 0 0 0;\n width: 0;\n gap: 4px;\n}\n\n/* Keep the 28px activity indicator plus a 4px label gap while collapsed. */\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot {\n flex: 0 0 32px;\n width: 32px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot {\n flex: 0 0 auto;\n width: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceActions > .-cerbur-clutch-dsh-worktree-menuAction {\n position: absolute;\n top: 0;\n right: 32px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceActions > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n position: absolute;\n top: 0;\n right: 0;\n visibility: hidden;\n}\n\n/* Worktree actions flow naturally so the rail matches the controls that exist. */\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n position: static;\n opacity: 0;\n pointer-events: none;\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-groupActivity {\n position: absolute;\n top: 0;\n right: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n visibility: hidden;\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-groupActivity {\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'][data-menu-open='true'] .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'][data-menu-open='true'] .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-groupActivity {\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'][data-menu-open='true']\n .-cerbur-clutch-dsh-worktree-treeActionSlot\n > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'][data-menu-open='true']\n .-cerbur-clutch-dsh-worktree-treeActionSlot\n > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardAction {\n display: inline-flex;\n flex: 0 0 28px;\n width: 28px;\n height: 28px;\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-menuAction {\n display: inline-flex;\n flex: 0 0 28px;\n width: 28px;\n height: 28px;\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-workspaceRow:focus-within .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover [data-add-worktree],\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] [data-add-worktree],\n.-cerbur-clutch-dsh-worktree-workspaceRow:focus-within [data-add-worktree] {\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n opacity: 1;\n pointer-events: auto;\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropBefore::before,\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n position: absolute;\n right: 4px;\n left: 4px;\n height: 2px;\n border-radius: 2px;\n background: var(--dsw-alias-brand-primary);\n content: '';\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropBefore::before {\n top: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n bottom: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropBefore::before,\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n position: absolute;\n right: 4px;\n left: 4px;\n height: 2px;\n border-radius: 2px;\n background: var(--dsw-alias-brand-primary);\n content: '';\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropBefore::before {\n top: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n bottom: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeChildren {\n margin-left: 16px;\n padding: 2px 0 5px 12px;\n border-left: 1px solid var(--dsw-alias-border-l1);\n}\n\n.-cerbur-clutch-dsh-worktree-groupLabel {\n padding: 6px 8px 3px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n}\n\n.-cerbur-clutch-dsh-worktree-groupHeader {\n display: flex;\n align-items: center;\n min-height: 34px;\n padding-right: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-groupHeader .-cerbur-clutch-dsh-worktree-groupLabel {\n flex: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeGroup {\n margin-top: 2px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow {\n min-height: 34px;\n}\n\n/* Compact the Worktree leading slots to make room for its third action. */\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-worktreeIcon,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-disclosureButton {\n width: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow {\n position: relative;\n display: flex;\n align-items: center;\n width: calc(100% - 20px);\n margin-left: 20px;\n min-width: 0;\n min-height: 31px;\n box-sizing: border-box;\n border-radius: 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow:hover,\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-menu-open='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-session-current='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-session-current='true'] .-cerbur-clutch-dsh-worktree-treeSessionContent {\n font-weight: 600;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropBefore::before,\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n position: absolute;\n right: 4px;\n left: 4px;\n height: 2px;\n border-radius: 2px;\n background: var(--dsw-alias-brand-primary);\n content: '';\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropBefore::before {\n top: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n bottom: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionContent {\n display: flex;\n align-items: center;\n flex: 1;\n width: 0;\n min-width: 0;\n min-height: 31px;\n box-sizing: border-box;\n border: 0;\n border-radius: 7px;\n padding: 4px 4px;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionContent:hover {\n background: transparent;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionTrailing {\n position: relative;\n display: inline-flex;\n flex: 0 0 52px;\n align-items: center;\n justify-content: flex-end;\n width: 52px;\n height: 28px;\n margin-left: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionMeta,\n.-cerbur-clutch-dsh-worktree-rowActions {\n position: absolute;\n inset: 0;\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionMeta {\n color: var(--dsw-alias-label-tertiary);\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionStatus {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionTime {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-right: 4px;\n font-size: 12px;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionOverflowButton {\n display: block;\n width: calc(100% - 24px);\n margin: 2px 0 4px 24px;\n padding: 4px 8px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 12px;\n font-weight: 400;\n line-height: 20px;\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionOverflowButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-rowActions {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow:hover .-cerbur-clutch-dsh-worktree-sessionMeta,\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-sessionMeta,\n.-cerbur-clutch-dsh-worktree-sessionTrailing:focus-within .-cerbur-clutch-dsh-worktree-sessionMeta {\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow:hover .-cerbur-clutch-dsh-worktree-rowActions,\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-rowActions,\n.-cerbur-clutch-dsh-worktree-sessionTrailing:focus-within .-cerbur-clutch-dsh-worktree-rowActions {\n display: inline-flex;\n}\n\n.-cerbur-clutch-dsh-worktree-renameInput {\n width: 100%;\n}\n\n.-cerbur-clutch-dsh-worktree-renameError {\n margin: 8px 0 0;\n color: var(--dsw-alias-state-error-primary);\n font-size: 13px;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-emptyNested {\n margin: 0;\n padding: 4px 8px 5px 28px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-archivedGroup {\n margin-top: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-modalField {\n display: grid;\n gap: 5px;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-worktreeHoverDetails {\n max-width: 360px;\n white-space: normal;\n overflow-wrap: anywhere;\n line-height: 1.5;\n}\n";
|
|
2840
2932
|
const styleId$8 = "@cerbur/clutch-dsh-worktree/worktree.css";
|
|
2841
2933
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree.css\"]") === null) {
|
|
@@ -3028,7 +3120,7 @@ window.__ModuleLoader__.load({
|
|
|
3028
3120
|
});
|
|
3029
3121
|
}
|
|
3030
3122
|
//#endregion
|
|
3031
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
3123
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/dashboard/dashboard-header-action.css.mjs
|
|
3032
3124
|
const css$7 = "/* Match the native 28px circular Session-header utility controls. */\n.-cerbur-clutch-dsh-worktree-headerDashboardButton {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 6px;\n color: var(--dsw-alias-label-secondary);\n background: transparent;\n border: none;\n border-radius: 28px;\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-headerDashboardButton svg {\n width: 16px;\n height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-headerDashboardButton:hover,\n.-cerbur-clutch-dsh-worktree-headerDashboardButton:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n";
|
|
3033
3125
|
const styleId$7 = "@cerbur/clutch-dsh-worktree/dashboard-header-action.css";
|
|
3034
3126
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard-header-action.css\"]") === null) {
|
|
@@ -3247,6 +3339,7 @@ window.__ModuleLoader__.load({
|
|
|
3247
3339
|
return record.gitRootPath ?? record.absolutePath;
|
|
3248
3340
|
}
|
|
3249
3341
|
Object.freeze([
|
|
3342
|
+
"readWorkspaceNavigation",
|
|
3250
3343
|
"canReuseLocalSession",
|
|
3251
3344
|
"createWorktreeSession",
|
|
3252
3345
|
"readWorktreeSessionState",
|
|
@@ -3596,7 +3689,7 @@ window.__ModuleLoader__.load({
|
|
|
3596
3689
|
}, current.key);
|
|
3597
3690
|
}
|
|
3598
3691
|
//#endregion
|
|
3599
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
3692
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/select/single-select.css.mjs
|
|
3600
3693
|
const css$6 = ".-cerbur-clutch-dsh-worktree-singleSelectRoot { min-width: 0; width: 100%; }\n.-cerbur-clutch-dsh-worktree-singleSelectTrigger {\n display: flex; align-items: center; gap: 8px; width: 100%; min-width: 0;\n min-height: 36px; padding: 6px 10px; border-radius: var(--dsw-radius-md, 8px);\n border: 1px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-base); color: var(--dsw-alias-label-primary);\n font: inherit; text-align: start; cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-singleSelectRoot[data-size='compact'] { width: min(280px, 45vw); }\n.-cerbur-clutch-dsh-worktree-singleSelectRoot[data-size='compact'] .-cerbur-clutch-dsh-worktree-singleSelectTrigger { min-height: 28px; padding: 3px 8px; font-size: 12px; }\n.-cerbur-clutch-dsh-worktree-singleSelectTrigger:disabled, .-cerbur-clutch-dsh-worktree-singleSelectOption:disabled { opacity: .4; cursor: default; }\n.-cerbur-clutch-dsh-worktree-singleSelectTrigger:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: 2px; }\n.-cerbur-clutch-dsh-worktree-singleSelectPopup {\n position: fixed; z-index: 1100; padding: 8px; box-sizing: border-box;\n border: 0; border-radius: var(--dsw-radius-lg, 12px);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l1);\n box-shadow: var(--dsw-elevation-prominent);\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}\n.-cerbur-clutch-dsh-worktree-singleSelectPicker { display: flex; flex-direction: column; gap: 8px; min-width: 0; }\n.-cerbur-clutch-dsh-worktree-singleSelectSearch { box-sizing: border-box; width: 100%; min-width: 0; }\n.-cerbur-clutch-dsh-worktree-singleSelectLoading { display: flex; align-items: center; justify-content: center; gap: 8px; min-height: 80px; color: var(--dsw-alias-label-secondary); font-size: 12px; }\n.-cerbur-clutch-dsh-worktree-singleSelectLoading svg { width: 16px; height: 16px; animation: singleSelectSpin 1s linear infinite; }\n@keyframes singleSelectSpin { to { transform: rotate(360deg); } }\n@media (prefers-reduced-motion: reduce) { .-cerbur-clutch-dsh-worktree-singleSelectLoading svg { animation: none; } }\n.-cerbur-clutch-dsh-worktree-singleSelectFilters { display: flex; flex-wrap: wrap; gap: 4px; }\n.-cerbur-clutch-dsh-worktree-singleSelectFilters button {\n border: 0; border-radius: var(--dsw-radius-md, 8px); padding: 4px 8px; background: transparent;\n color: var(--dsw-alias-label-secondary); font: inherit; font-size: 11px; cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-singleSelectFilters button[aria-pressed='true'], .-cerbur-clutch-dsh-worktree-singleSelectFilters button:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-primary); }\n.-cerbur-clutch-dsh-worktree-singleSelectViewport {\n height: clamp(120px, calc(100dvh - 160px), 300px); overflow-y: auto; overscroll-behavior: contain;\n padding: 4px; box-sizing: border-box; min-height: 0;\n}\n.-cerbur-clutch-dsh-worktree-singleSelectPopup .-cerbur-clutch-dsh-worktree-singleSelectViewport { height: auto; max-height: var(--single-select-viewport-height, 220px); }\n.-cerbur-clutch-dsh-worktree-singleSelectPopup .-cerbur-clutch-dsh-worktree-singleSelectEmpty { min-height: 80px; }\n.-cerbur-clutch-dsh-worktree-singleSelectGroup { display: flex; align-items: center; justify-content: space-between; gap: 8px; height: 36px; box-sizing: border-box; padding: 6px 8px; color: var(--dsw-alias-label-tertiary); font-size: 11px; line-height: 15px; }\n.-cerbur-clutch-dsh-worktree-singleSelectOption {\n box-sizing: border-box;\n display: flex; align-items: center; gap: 6px; width: 100%; min-height: 34px;\n padding: 6px 8px; border: 0; border-radius: var(--dsw-radius-md, 8px); background: transparent;\n color: var(--dsw-alias-label-primary); font: inherit; font-size: 13px; line-height: 20px; text-align: start; cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-singleSelectOption:hover:not(:disabled), .-cerbur-clutch-dsh-worktree-singleSelectOption[data-highlighted='true']:not(:disabled), .-cerbur-clutch-dsh-worktree-singleSelectOption:focus-visible:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover); outline: none; }\n.-cerbur-clutch-dsh-worktree-singleSelectOption[data-description='true'] { min-height: 48px; }\n.-cerbur-clutch-dsh-worktree-singleSelectText { display: flex; flex-direction: column; flex: 1; min-width: 0; }\n.-cerbur-clutch-dsh-worktree-singleSelectName { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.-cerbur-clutch-dsh-worktree-singleSelectDescription { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--dsw-alias-label-tertiary); font-size: 11px; line-height: 16px; }\n.-cerbur-clutch-dsh-worktree-singleSelectBadge { flex: none; color: var(--dsw-alias-label-tertiary); font-size: 11px; }\n.-cerbur-clutch-dsh-worktree-singleSelectTrigger > svg, .-cerbur-clutch-dsh-worktree-singleSelectOption > svg { width: 14px; height: 14px; flex: none; }\n.-cerbur-clutch-dsh-worktree-singleSelectEmpty { display: grid; place-items: center; height: 100%; color: var(--dsw-alias-label-tertiary); font-size: 13px; }\n";
|
|
3601
3694
|
const styleId$6 = "@cerbur/clutch-dsh-worktree/single-select.css";
|
|
3602
3695
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/single-select.css\"]") === null) {
|
|
@@ -3997,7 +4090,7 @@ window.__ModuleLoader__.load({
|
|
|
3997
4090
|
});
|
|
3998
4091
|
}
|
|
3999
4092
|
//#endregion
|
|
4000
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
4093
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/branch/git-branch.css.mjs
|
|
4001
4094
|
const css$5 = ".-cerbur-clutch-dsh-worktree-branchFetch { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; padding: 4px; border: 0; border-radius: var(--dsw-radius-sm); background: transparent; color: var(--dsw-alias-label-secondary); cursor: pointer; }\n.-cerbur-clutch-dsh-worktree-branchFetch:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover); }\n.-cerbur-clutch-dsh-worktree-branchFetch:disabled { opacity: .4; cursor: default; }\n.-cerbur-clutch-dsh-worktree-branchFetch svg { width: 16px; height: 16px; }\n.-cerbur-clutch-dsh-worktree-branchFetch[aria-busy='true'] svg { animation: branchFetchSpin 1s linear infinite; }\n@keyframes branchFetchSpin { to { transform: rotate(360deg); } }\n@media (prefers-reduced-motion: reduce) { .-cerbur-clutch-dsh-worktree-branchFetch[aria-busy='true'] svg { animation: none; } }\n.-cerbur-clutch-dsh-worktree-branchFetch[data-fetch-status='success'], .-cerbur-clutch-dsh-worktree-branchFetch[data-fetch-status='error'] { width: auto; padding-inline: 6px; white-space: nowrap; font-size: 12px; line-height: 18px; }\n.-cerbur-clutch-dsh-worktree-branchFetch[data-fetch-status='success']:disabled { opacity: 1; }\n.-cerbur-clutch-dsh-worktree-branchFetch[data-fetch-status='error'] { color: var(--dsw-alias-state-error-primary); }\n";
|
|
4002
4095
|
const styleId$5 = "@cerbur/clutch-dsh-worktree/git-branch.css";
|
|
4003
4096
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/git-branch.css\"]") === null) {
|
|
@@ -4429,6 +4522,24 @@ window.__ModuleLoader__.load({
|
|
|
4429
4522
|
}
|
|
4430
4523
|
//#endregion
|
|
4431
4524
|
//#region lib/client/surface/selectors.js
|
|
4525
|
+
/** Pending native replay is incomplete evidence, not removal of ready rows. */
|
|
4526
|
+
function retainPendingWorkspaces(previous, next) {
|
|
4527
|
+
if (!previous || !isPendingListPhase(next.phase)) return next;
|
|
4528
|
+
const updates = new Map(next.items.map((item) => [item.workspaceId, item]));
|
|
4529
|
+
const items = previous.items.map((item) => {
|
|
4530
|
+
const update = updates.get(item.workspaceId);
|
|
4531
|
+
updates.delete(item.workspaceId);
|
|
4532
|
+
return update ? {
|
|
4533
|
+
...update,
|
|
4534
|
+
sessionIds: [.../* @__PURE__ */ new Set([...item.sessionIds, ...update.sessionIds])]
|
|
4535
|
+
} : item;
|
|
4536
|
+
});
|
|
4537
|
+
return {
|
|
4538
|
+
...next,
|
|
4539
|
+
items: [...items, ...updates.values()],
|
|
4540
|
+
archivedSessionIds: [.../* @__PURE__ */ new Set([...previous.archivedSessionIds ?? [], ...next.archivedSessionIds ?? []])]
|
|
4541
|
+
};
|
|
4542
|
+
}
|
|
4432
4543
|
/** Native activity changes invalidate only the archived Worktrees' owning reads. */
|
|
4433
4544
|
function worktreeActivityRefreshWorkspaceIds(views, previous, next) {
|
|
4434
4545
|
return views.filter((view) => view.bindings.some((binding) => previous[binding.sessionId]?.ongoing !== next[binding.sessionId]?.ongoing && view.worktrees.some((record) => record.worktreeId === binding.worktreeId && record.status === "removed"))).map((view) => view.workspaceId);
|
|
@@ -4481,12 +4592,15 @@ window.__ModuleLoader__.load({
|
|
|
4481
4592
|
const view = views.find((candidate) => candidate.workspaceId === workspace.workspaceId);
|
|
4482
4593
|
if (view === void 0) return void 0;
|
|
4483
4594
|
const binding = view.bindings.find((candidate) => candidate.sessionId === currentSessionId);
|
|
4484
|
-
if (binding === void 0)
|
|
4485
|
-
|
|
4486
|
-
|
|
4487
|
-
|
|
4488
|
-
|
|
4489
|
-
|
|
4595
|
+
if (binding === void 0) {
|
|
4596
|
+
if (view.knownSessionIds !== void 0 && !view.knownSessionIds.includes(currentSessionId)) return void 0;
|
|
4597
|
+
return {
|
|
4598
|
+
sessionId: currentSessionId,
|
|
4599
|
+
workspaceId: workspace.workspaceId,
|
|
4600
|
+
groupKey: "main:" + workspace.workspaceId,
|
|
4601
|
+
kind: "main"
|
|
4602
|
+
};
|
|
4603
|
+
}
|
|
4490
4604
|
const worktree = view.worktrees.find((candidate) => candidate.worktreeId === binding.worktreeId && candidate.workspaceId === workspace.workspaceId);
|
|
4491
4605
|
if (worktree === void 0) return void 0;
|
|
4492
4606
|
return {
|
|
@@ -6838,7 +6952,7 @@ window.__ModuleLoader__.load({
|
|
|
6838
6952
|
const allWorkspaceSessionIds = filterArchivedSessionIds(workspaceSessionIds(workspaces, workspace.workspaceId, sessions.ids), archivedSessionIds);
|
|
6839
6953
|
const workspaceGroupActivityStatus = aggregateSessionStatus(filterVisibleSessionIds(allWorkspaceSessionIds, sessions), sessionPresentations);
|
|
6840
6954
|
const bindings = view?.bindings ?? [];
|
|
6841
|
-
const mainSessionIds = filterVisibleSessionIds(unboundSessionIds(allWorkspaceSessionIds, [...new Set(bindings.map((binding) => binding.sessionId))]), sessions);
|
|
6955
|
+
const mainSessionIds = filterVisibleSessionIds(unboundSessionIds(allWorkspaceSessionIds, [...new Set(bindings.map((binding) => binding.sessionId))]).filter((id) => view?.knownSessionIds === void 0 || view.knownSessionIds.includes(id)), sessions);
|
|
6842
6956
|
const mainGroupKey = `main:${workspace.workspaceId}`;
|
|
6843
6957
|
const orderedMainSessionIds = orderedSessionIdsByAccount.get(mainGroupKey) ?? mainSessionIds;
|
|
6844
6958
|
const visibleMainSessionIds = mainSessionIds.filter((sessionId) => workspaceMatchesQuery || sessionMatchesQuery(sessionId, sessions, query));
|
|
@@ -6855,189 +6969,197 @@ window.__ModuleLoader__.load({
|
|
|
6855
6969
|
return (0, react_jsx_runtime.jsxs)("section", {
|
|
6856
6970
|
className: worktree_css_default.workspaceGroup,
|
|
6857
6971
|
"data-workspace-id": workspace.workspaceId,
|
|
6858
|
-
children: [
|
|
6859
|
-
|
|
6860
|
-
|
|
6861
|
-
|
|
6862
|
-
|
|
6863
|
-
|
|
6864
|
-
|
|
6865
|
-
|
|
6866
|
-
|
|
6867
|
-
|
|
6868
|
-
|
|
6869
|
-
|
|
6870
|
-
|
|
6871
|
-
|
|
6872
|
-
|
|
6873
|
-
over: null
|
|
6874
|
-
});
|
|
6875
|
-
},
|
|
6876
|
-
hover: (half) => {
|
|
6877
|
-
setWorkspaceDrag((current) => current === void 0 ? current : {
|
|
6878
|
-
...current,
|
|
6879
|
-
over: {
|
|
6972
|
+
children: [
|
|
6973
|
+
(0, react_jsx_runtime.jsx)(WorktreeWorkspaceRow, {
|
|
6974
|
+
t,
|
|
6975
|
+
workspace,
|
|
6976
|
+
expanded,
|
|
6977
|
+
containsCurrentSession: currentSessionId !== void 0 && allWorkspaceSessionIds.includes(currentSessionId),
|
|
6978
|
+
groupActivityStatus: workspaceGroupActivityStatus,
|
|
6979
|
+
actionPending,
|
|
6980
|
+
menuOpen: openWorkspaceMenuId === workspace.workspaceId,
|
|
6981
|
+
drag: {
|
|
6982
|
+
active: workspaceDrag !== void 0,
|
|
6983
|
+
marker: workspaceDrag?.over?.workspaceId === workspace.workspaceId ? workspaceDrag.over.half : null,
|
|
6984
|
+
start: () => {
|
|
6985
|
+
workspaceDropCommitted.current = false;
|
|
6986
|
+
setWorkspaceDrag({
|
|
6880
6987
|
workspaceId: workspace.workspaceId,
|
|
6881
|
-
half
|
|
6882
|
-
}
|
|
6883
|
-
});
|
|
6884
|
-
},
|
|
6885
|
-
drop: (half) => {
|
|
6886
|
-
if (workspaceDrag === void 0) return;
|
|
6887
|
-
commitWorkspaceDrag(workspaceDrag, {
|
|
6888
|
-
workspaceId: workspace.workspaceId,
|
|
6889
|
-
half
|
|
6890
|
-
});
|
|
6891
|
-
},
|
|
6892
|
-
end: () => {
|
|
6893
|
-
if (workspaceDrag?.over !== null && workspaceDrag?.over !== void 0) commitWorkspaceDrag(workspaceDrag, workspaceDrag.over);
|
|
6894
|
-
else setWorkspaceDrag(void 0);
|
|
6895
|
-
workspaceDropCommitted.current = false;
|
|
6896
|
-
}
|
|
6897
|
-
},
|
|
6898
|
-
onToggle: () => {
|
|
6899
|
-
toggleWorkspace(workspace.workspaceId);
|
|
6900
|
-
},
|
|
6901
|
-
onCreateWorktree: () => {
|
|
6902
|
-
openWorktreeCreator(workspace);
|
|
6903
|
-
},
|
|
6904
|
-
onRename: () => {
|
|
6905
|
-
openWorkspaceRename(workspace);
|
|
6906
|
-
},
|
|
6907
|
-
onDelete: () => {
|
|
6908
|
-
openWorkspaceDelete(workspace);
|
|
6909
|
-
},
|
|
6910
|
-
onMenuOpenChange: (open) => {
|
|
6911
|
-
setOpenWorkspaceMenuId(open ? workspace.workspaceId : void 0);
|
|
6912
|
-
}
|
|
6913
|
-
}), expanded && (0, react_jsx_runtime.jsxs)("div", {
|
|
6914
|
-
className: worktree_css_default.treeChildren,
|
|
6915
|
-
children: [
|
|
6916
|
-
(0, react_jsx_runtime.jsx)(WorktreeGroupRow, {
|
|
6917
|
-
t,
|
|
6918
|
-
kind: "main",
|
|
6919
|
-
label: mainLabel,
|
|
6920
|
-
expanded: mainExpanded,
|
|
6921
|
-
groupActivityStatus: aggregateSessionStatus(mainSessionIds, sessionPresentations),
|
|
6922
|
-
icon: (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
|
|
6923
|
-
workspaceTitle: workspace.title,
|
|
6924
|
-
onToggle: () => {
|
|
6925
|
-
toggleMain(workspace.workspaceId);
|
|
6926
|
-
},
|
|
6927
|
-
showDashboardAction: props.openDashboard !== void 0,
|
|
6928
|
-
menu: {
|
|
6929
|
-
onDashboard: props.openDashboard === void 0 ? void 0 : () => props.openDashboard?.(createMainWorktreeRecord(workspace, currentBranch, view?.mainInstructions, view?.checkout)),
|
|
6930
|
-
open: openMainMenuId === workspace.workspaceId,
|
|
6931
|
-
label: mainLabel,
|
|
6932
|
-
copyPath: workspace.path,
|
|
6933
|
-
showCreate: mainRef !== void 0,
|
|
6934
|
-
showRemove: false,
|
|
6935
|
-
disabled: actionPending,
|
|
6936
|
-
onOpenChange: (open) => {
|
|
6937
|
-
setOpenMainMenuId(open ? workspace.workspaceId : void 0);
|
|
6938
|
-
},
|
|
6939
|
-
onCreateWorktree: mainRef === void 0 ? void 0 : () => {
|
|
6940
|
-
openWorktreeCreator(workspace, {
|
|
6941
|
-
baseBranch: currentHead?.kind !== "branch" && currentHead !== void 0 ? "HEAD" : currentBranch,
|
|
6942
|
-
newBranch: createNumberedWorktreeName(mainRef, workspaceWorktreeNames)
|
|
6943
|
-
});
|
|
6944
|
-
}
|
|
6945
|
-
},
|
|
6946
|
-
onCreateSession: createMainSession === void 0 ? void 0 : () => {
|
|
6947
|
-
createMainSession(workspace.workspaceId);
|
|
6948
|
-
}
|
|
6949
|
-
}),
|
|
6950
|
-
mainExpanded && (0, react_jsx_runtime.jsx)(WorktreeSessionGroup, {
|
|
6951
|
-
t,
|
|
6952
|
-
groupKey: mainGroupKey,
|
|
6953
|
-
sessionIds,
|
|
6954
|
-
workspaceId: workspace.workspaceId,
|
|
6955
|
-
currentSessionId,
|
|
6956
|
-
expanded: mainSessionGroupExpanded,
|
|
6957
|
-
actionPending,
|
|
6958
|
-
sessions,
|
|
6959
|
-
sessionPresentations,
|
|
6960
|
-
dragState: sessionDrag,
|
|
6961
|
-
onToggleExpanded: () => {
|
|
6962
|
-
toggleSessionGroup(mainGroupKey, mainSessionGroupAutoExpanded);
|
|
6963
|
-
},
|
|
6964
|
-
onStartDrag: (groupKey, sessionId) => {
|
|
6965
|
-
sessionDropCommitted.current = false;
|
|
6966
|
-
setSessionDrag({
|
|
6967
|
-
groupKey,
|
|
6968
|
-
sessionId,
|
|
6969
6988
|
over: null
|
|
6970
6989
|
});
|
|
6971
6990
|
},
|
|
6972
|
-
|
|
6973
|
-
|
|
6991
|
+
hover: (half) => {
|
|
6992
|
+
setWorkspaceDrag((current) => current === void 0 ? current : {
|
|
6974
6993
|
...current,
|
|
6975
6994
|
over: {
|
|
6976
|
-
|
|
6995
|
+
workspaceId: workspace.workspaceId,
|
|
6977
6996
|
half
|
|
6978
6997
|
}
|
|
6979
6998
|
});
|
|
6980
6999
|
},
|
|
6981
|
-
|
|
6982
|
-
|
|
6983
|
-
|
|
6984
|
-
|
|
6985
|
-
|
|
6986
|
-
|
|
6987
|
-
onCommitDrag: commitSessionDrag,
|
|
6988
|
-
onOpen: (sessionId) => {
|
|
6989
|
-
openWorktreeSession$1({ open: openSession }, sessionId);
|
|
7000
|
+
drop: (half) => {
|
|
7001
|
+
if (workspaceDrag === void 0) return;
|
|
7002
|
+
commitWorkspaceDrag(workspaceDrag, {
|
|
7003
|
+
workspaceId: workspace.workspaceId,
|
|
7004
|
+
half
|
|
7005
|
+
});
|
|
6990
7006
|
},
|
|
6991
|
-
|
|
6992
|
-
|
|
6993
|
-
|
|
6994
|
-
|
|
6995
|
-
|
|
6996
|
-
|
|
6997
|
-
|
|
6998
|
-
|
|
6999
|
-
|
|
7000
|
-
|
|
7001
|
-
|
|
7002
|
-
|
|
7003
|
-
|
|
7004
|
-
|
|
7005
|
-
|
|
7006
|
-
|
|
7007
|
-
|
|
7008
|
-
|
|
7009
|
-
|
|
7010
|
-
|
|
7011
|
-
|
|
7012
|
-
|
|
7013
|
-
|
|
7014
|
-
|
|
7015
|
-
|
|
7016
|
-
|
|
7017
|
-
|
|
7018
|
-
|
|
7019
|
-
|
|
7020
|
-
|
|
7021
|
-
|
|
7022
|
-
|
|
7023
|
-
|
|
7024
|
-
|
|
7025
|
-
|
|
7026
|
-
|
|
7027
|
-
|
|
7028
|
-
|
|
7029
|
-
|
|
7030
|
-
|
|
7031
|
-
|
|
7032
|
-
|
|
7033
|
-
|
|
7034
|
-
|
|
7035
|
-
|
|
7036
|
-
|
|
7037
|
-
|
|
7038
|
-
|
|
7039
|
-
|
|
7040
|
-
|
|
7007
|
+
end: () => {
|
|
7008
|
+
if (workspaceDrag?.over !== null && workspaceDrag?.over !== void 0) commitWorkspaceDrag(workspaceDrag, workspaceDrag.over);
|
|
7009
|
+
else setWorkspaceDrag(void 0);
|
|
7010
|
+
workspaceDropCommitted.current = false;
|
|
7011
|
+
}
|
|
7012
|
+
},
|
|
7013
|
+
onToggle: () => {
|
|
7014
|
+
toggleWorkspace(workspace.workspaceId);
|
|
7015
|
+
},
|
|
7016
|
+
onCreateWorktree: () => {
|
|
7017
|
+
openWorktreeCreator(workspace);
|
|
7018
|
+
},
|
|
7019
|
+
onRename: () => {
|
|
7020
|
+
openWorkspaceRename(workspace);
|
|
7021
|
+
},
|
|
7022
|
+
onDelete: () => {
|
|
7023
|
+
openWorkspaceDelete(workspace);
|
|
7024
|
+
},
|
|
7025
|
+
onMenuOpenChange: (open) => {
|
|
7026
|
+
setOpenWorkspaceMenuId(open ? workspace.workspaceId : void 0);
|
|
7027
|
+
}
|
|
7028
|
+
}),
|
|
7029
|
+
expanded && view === void 0 && (0, react_jsx_runtime.jsx)("p", {
|
|
7030
|
+
className: worktree_css_default.message,
|
|
7031
|
+
"data-workspace-read": workspace.workspaceId,
|
|
7032
|
+
children: read.readState.targetErrors?.[workspace.workspaceId] ? t("status.workspaceFailed") : t("status.loading")
|
|
7033
|
+
}),
|
|
7034
|
+
expanded && view !== void 0 && (0, react_jsx_runtime.jsxs)("div", {
|
|
7035
|
+
className: worktree_css_default.treeChildren,
|
|
7036
|
+
children: [
|
|
7037
|
+
(0, react_jsx_runtime.jsx)(WorktreeGroupRow, {
|
|
7038
|
+
t,
|
|
7039
|
+
kind: "main",
|
|
7040
|
+
label: mainLabel,
|
|
7041
|
+
expanded: mainExpanded,
|
|
7042
|
+
groupActivityStatus: aggregateSessionStatus(mainSessionIds, sessionPresentations),
|
|
7043
|
+
icon: (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
|
|
7044
|
+
workspaceTitle: workspace.title,
|
|
7045
|
+
onToggle: () => {
|
|
7046
|
+
toggleMain(workspace.workspaceId);
|
|
7047
|
+
},
|
|
7048
|
+
showDashboardAction: props.openDashboard !== void 0,
|
|
7049
|
+
menu: {
|
|
7050
|
+
onDashboard: props.openDashboard === void 0 ? void 0 : () => props.openDashboard?.(createMainWorktreeRecord(workspace, currentBranch, view?.mainInstructions, view?.checkout)),
|
|
7051
|
+
open: openMainMenuId === workspace.workspaceId,
|
|
7052
|
+
label: mainLabel,
|
|
7053
|
+
copyPath: workspace.path,
|
|
7054
|
+
showCreate: mainRef !== void 0,
|
|
7055
|
+
showRemove: false,
|
|
7056
|
+
disabled: actionPending,
|
|
7057
|
+
onOpenChange: (open) => {
|
|
7058
|
+
setOpenMainMenuId(open ? workspace.workspaceId : void 0);
|
|
7059
|
+
},
|
|
7060
|
+
onCreateWorktree: mainRef === void 0 ? void 0 : () => {
|
|
7061
|
+
openWorktreeCreator(workspace, {
|
|
7062
|
+
baseBranch: currentHead?.kind !== "branch" && currentHead !== void 0 ? "HEAD" : currentBranch,
|
|
7063
|
+
newBranch: createNumberedWorktreeName(mainRef, workspaceWorktreeNames)
|
|
7064
|
+
});
|
|
7065
|
+
}
|
|
7066
|
+
},
|
|
7067
|
+
onCreateSession: createMainSession === void 0 ? void 0 : () => {
|
|
7068
|
+
createMainSession(workspace.workspaceId);
|
|
7069
|
+
}
|
|
7070
|
+
}),
|
|
7071
|
+
mainExpanded && (0, react_jsx_runtime.jsx)(WorktreeSessionGroup, {
|
|
7072
|
+
t,
|
|
7073
|
+
groupKey: mainGroupKey,
|
|
7074
|
+
sessionIds,
|
|
7075
|
+
workspaceId: workspace.workspaceId,
|
|
7076
|
+
currentSessionId,
|
|
7077
|
+
expanded: mainSessionGroupExpanded,
|
|
7078
|
+
actionPending,
|
|
7079
|
+
sessions,
|
|
7080
|
+
sessionPresentations,
|
|
7081
|
+
dragState: sessionDrag,
|
|
7082
|
+
onToggleExpanded: () => {
|
|
7083
|
+
toggleSessionGroup(mainGroupKey, mainSessionGroupAutoExpanded);
|
|
7084
|
+
},
|
|
7085
|
+
onStartDrag: (groupKey, sessionId) => {
|
|
7086
|
+
sessionDropCommitted.current = false;
|
|
7087
|
+
setSessionDrag({
|
|
7088
|
+
groupKey,
|
|
7089
|
+
sessionId,
|
|
7090
|
+
over: null
|
|
7091
|
+
});
|
|
7092
|
+
},
|
|
7093
|
+
onHoverDrag: (sessionId, half) => {
|
|
7094
|
+
setSessionDrag((current) => current === void 0 ? current : {
|
|
7095
|
+
...current,
|
|
7096
|
+
over: {
|
|
7097
|
+
sessionId,
|
|
7098
|
+
half
|
|
7099
|
+
}
|
|
7100
|
+
});
|
|
7101
|
+
},
|
|
7102
|
+
onClearDrag: () => {
|
|
7103
|
+
setSessionDrag(void 0);
|
|
7104
|
+
},
|
|
7105
|
+
onFinishDrag: () => {
|
|
7106
|
+
sessionDropCommitted.current = false;
|
|
7107
|
+
},
|
|
7108
|
+
onCommitDrag: commitSessionDrag,
|
|
7109
|
+
onOpen: (sessionId) => {
|
|
7110
|
+
openWorktreeSession$1({ open: openSession }, sessionId);
|
|
7111
|
+
},
|
|
7112
|
+
onRename: renameSession === void 0 ? void 0 : openSessionRename,
|
|
7113
|
+
onFork: forkSession,
|
|
7114
|
+
onArchive: archiveSession === void 0 ? void 0 : archiveWorktreeSession
|
|
7115
|
+
}),
|
|
7116
|
+
activeWorktrees.length === 0 && archivedWorktrees.length === 0 && (0, react_jsx_runtime.jsx)("p", {
|
|
7117
|
+
className: worktree_css_default.emptyNested,
|
|
7118
|
+
children: t("worktree.noWorktrees")
|
|
7119
|
+
}),
|
|
7120
|
+
activeWorktrees.map((record) => (0, react_jsx_runtime.jsx)(ActiveWorktree, {
|
|
7121
|
+
record,
|
|
7122
|
+
source,
|
|
7123
|
+
expansion,
|
|
7124
|
+
ordering,
|
|
7125
|
+
props,
|
|
7126
|
+
lifecycle,
|
|
7127
|
+
session,
|
|
7128
|
+
menus,
|
|
7129
|
+
mutation,
|
|
7130
|
+
read,
|
|
7131
|
+
registration,
|
|
7132
|
+
lifecycleState,
|
|
7133
|
+
drag,
|
|
7134
|
+
native,
|
|
7135
|
+
bindings,
|
|
7136
|
+
workspaceMatchesQuery,
|
|
7137
|
+
workspace,
|
|
7138
|
+
workspaceWorktreeNames,
|
|
7139
|
+
sameWorkspaceWorktreeDrag,
|
|
7140
|
+
activeWorktrees
|
|
7141
|
+
}, record.worktreeId)),
|
|
7142
|
+
archivedWorktrees.length > 0 && (0, react_jsx_runtime.jsx)(ArchivedWorktrees, {
|
|
7143
|
+
expansion,
|
|
7144
|
+
props,
|
|
7145
|
+
source,
|
|
7146
|
+
ordering,
|
|
7147
|
+
lifecycle,
|
|
7148
|
+
mutation,
|
|
7149
|
+
menus,
|
|
7150
|
+
read,
|
|
7151
|
+
lifecycleState,
|
|
7152
|
+
drag,
|
|
7153
|
+
session,
|
|
7154
|
+
native,
|
|
7155
|
+
workspace,
|
|
7156
|
+
archivedWorktrees,
|
|
7157
|
+
bindings,
|
|
7158
|
+
workspaceMatchesQuery
|
|
7159
|
+
})
|
|
7160
|
+
]
|
|
7161
|
+
})
|
|
7162
|
+
]
|
|
7041
7163
|
}, workspace.workspaceId);
|
|
7042
7164
|
})
|
|
7043
7165
|
}) });
|
|
@@ -7255,8 +7377,8 @@ window.__ModuleLoader__.load({
|
|
|
7255
7377
|
}]
|
|
7256
7378
|
});
|
|
7257
7379
|
}
|
|
7258
|
-
|
|
7259
|
-
const
|
|
7380
|
+
for (const [workspaceId, error] of Object.entries(readState.targetErrors ?? {})) {
|
|
7381
|
+
const workspaceIds = [workspaceId];
|
|
7260
7382
|
notices.push({
|
|
7261
7383
|
key: "target:" + JSON.stringify([
|
|
7262
7384
|
workspaceIds,
|
|
@@ -8887,7 +9009,7 @@ window.__ModuleLoader__.load({
|
|
|
8887
9009
|
if (view === void 0) continue;
|
|
8888
9010
|
const allWorkspaceSessionIds = filterArchivedSessionIds(workspaceSessionIds(workspaces, workspace.workspaceId, sessions.ids), archivedSessionIds);
|
|
8889
9011
|
const bindings = view.bindings;
|
|
8890
|
-
const mainSessionIds = filterVisibleSessionIds(unboundSessionIds(allWorkspaceSessionIds, [...new Set(bindings.map((binding) => binding.sessionId))]), sessions);
|
|
9012
|
+
const mainSessionIds = filterVisibleSessionIds(unboundSessionIds(allWorkspaceSessionIds, [...new Set(bindings.map((binding) => binding.sessionId))]).filter((id) => view.knownSessionIds === void 0 || view.knownSessionIds.includes(id)), sessions);
|
|
8891
9013
|
inputs.push({
|
|
8892
9014
|
accountKey: `main:${workspace.workspaceId}`,
|
|
8893
9015
|
sessionIds: mainSessionIds,
|
|
@@ -8984,12 +9106,23 @@ window.__ModuleLoader__.load({
|
|
|
8984
9106
|
//#endregion
|
|
8985
9107
|
//#region lib/client/surface/state/useSurfaceRefresh.js
|
|
8986
9108
|
function useSurfaceRefresh({ source, props, registrationState }) {
|
|
8987
|
-
const { forkRecoverySnapshot,
|
|
9109
|
+
const { forkRecoverySnapshot, mode, workspaceIds, sessionPresentations } = source;
|
|
9110
|
+
const workspaceIdsRef = (0, react.useRef)(workspaceIds);
|
|
9111
|
+
workspaceIdsRef.current = isPendingListPhase(source.workspaces.phase) ? [.../* @__PURE__ */ new Set([...workspaceIdsRef.current, ...workspaceIds])] : workspaceIds;
|
|
9112
|
+
const workspacesRef = (0, react.useRef)(source.workspaces);
|
|
9113
|
+
workspacesRef.current = source.workspaces;
|
|
8988
9114
|
const { manager, viewReader, invalidateWorktreeContext, syncSessionWorkspaces } = props;
|
|
9115
|
+
const syncedMembershipViews = (0, react.useRef)(/* @__PURE__ */ new Map());
|
|
8989
9116
|
const { modalReadViewRef, setModalReadError, setModalReadLoading, modalReadLoader, setWorktreeModalWorkspaceId } = registrationState;
|
|
8990
9117
|
const [readState, setReadState] = (0, react.useState)(EMPTY_READ_STATE);
|
|
8991
9118
|
const readStateRef = (0, react.useRef)(readState);
|
|
8992
9119
|
readStateRef.current = readState;
|
|
9120
|
+
const priorityIdsRef = (0, react.useRef)(workspaceIds);
|
|
9121
|
+
const currentWorkspaceId = source.workspaces.items.find((workspace) => workspace.sessionIds.includes(source.currentSessionId ?? ""))?.workspaceId;
|
|
9122
|
+
priorityIdsRef.current = [...workspaceIds].sort((a, b) => {
|
|
9123
|
+
const priority = (id) => id === currentWorkspaceId ? 0 : source.expandSnapshot.collapsedWorkspaceIds[id] ? 2 : 1;
|
|
9124
|
+
return priority(a) - priority(b);
|
|
9125
|
+
});
|
|
8993
9126
|
const refreshGuard = (0, react.useRef)(createWorktreeRefreshGuard());
|
|
8994
9127
|
const targetRefreshGuards = (0, react.useRef)(/* @__PURE__ */ new Map());
|
|
8995
9128
|
const targetReads = (0, react.useRef)(/* @__PURE__ */ new Map());
|
|
@@ -9011,38 +9144,12 @@ window.__ModuleLoader__.load({
|
|
|
9011
9144
|
return;
|
|
9012
9145
|
}
|
|
9013
9146
|
const scope = options.scope ?? { kind: "global" };
|
|
9014
|
-
const preserveCurrent = options.preserveCurrent === true;
|
|
9015
9147
|
const currentWorkspaceIds = workspaceIdsRef.current;
|
|
9016
|
-
if (scope.kind === "global") {
|
|
9017
|
-
|
|
9018
|
-
|
|
9019
|
-
|
|
9020
|
-
|
|
9021
|
-
const selectedWorkspaceIds = [...currentWorkspaceIds];
|
|
9022
|
-
for (const workspaceId of selectedWorkspaceIds) viewReader.invalidate(workspaceId);
|
|
9023
|
-
const contextRefresh = options.invalidateContext === false ? void 0 : invalidateWorktreeContext?.(void 0, { alreadyInvalidated: true });
|
|
9024
|
-
await refreshGuard.current.run(async () => {
|
|
9025
|
-
const [views] = await Promise.all([viewReader.readMany(selectedWorkspaceIds), contextRefresh ?? Promise.resolve()]);
|
|
9026
|
-
return views;
|
|
9027
|
-
}, (views) => {
|
|
9028
|
-
setReadState((current) => {
|
|
9029
|
-
const merged = mergeWorktreeViews(current.views, workspaceIdsRef.current, views);
|
|
9030
|
-
return {
|
|
9031
|
-
status: "ready",
|
|
9032
|
-
views: modalReadViewRef.current === void 0 ? merged : mergeWorktreeView(merged, modalReadViewRef.current)
|
|
9033
|
-
};
|
|
9034
|
-
});
|
|
9035
|
-
}, (error) => {
|
|
9036
|
-
if (preserveCurrent) throw error;
|
|
9037
|
-
setReadState({
|
|
9038
|
-
status: "error",
|
|
9039
|
-
views: modalReadViewRef.current === void 0 ? [] : [modalReadViewRef.current],
|
|
9040
|
-
error: toWorktreeViewError(error)
|
|
9041
|
-
});
|
|
9042
|
-
});
|
|
9043
|
-
return;
|
|
9044
|
-
}
|
|
9045
|
-
const requestedWorkspaceIds = scope.kind === "workspace" ? [scope.workspaceId] : scope.workspaceIds;
|
|
9148
|
+
if (scope.kind === "global") setReadState((current) => ({
|
|
9149
|
+
...current,
|
|
9150
|
+
status: "ready"
|
|
9151
|
+
}));
|
|
9152
|
+
const requestedWorkspaceIds = scope.kind === "global" ? priorityIdsRef.current : scope.kind === "workspace" ? [scope.workspaceId] : scope.workspaceIds;
|
|
9046
9153
|
const selectedWorkspaceIds = [...new Set(requestedWorkspaceIds)].filter((workspaceId) => currentWorkspaceIds.includes(workspaceId));
|
|
9047
9154
|
if (selectedWorkspaceIds.length === 0) {
|
|
9048
9155
|
if (options.openingSession) throw new WorktreeSessionActionError("WORKTREE_SESSION_REPAIR_REQUIRED", "workspace projection unavailable", true);
|
|
@@ -9050,14 +9157,16 @@ window.__ModuleLoader__.load({
|
|
|
9050
9157
|
}
|
|
9051
9158
|
const results = await Promise.allSettled(selectedWorkspaceIds.map(async (workspaceId) => {
|
|
9052
9159
|
const guard = guardFor(workspaceId);
|
|
9053
|
-
if (!options.alreadyInvalidated) viewReader.invalidate(workspaceId, {
|
|
9160
|
+
if (!options.alreadyInvalidated && !options.ensureLoaded) viewReader.invalidate(workspaceId, {
|
|
9054
9161
|
reuseInFlight: options.reuseInFlight,
|
|
9055
9162
|
changeId: options.changeId
|
|
9056
9163
|
});
|
|
9057
|
-
|
|
9164
|
+
options.invalidateContext === false || invalidateWorktreeContext?.(workspaceId, { alreadyInvalidated: true })?.catch(() => void 0);
|
|
9058
9165
|
let request = {
|
|
9059
9166
|
generation: guard.begin(),
|
|
9060
|
-
promise: viewReader.read(workspaceId)
|
|
9167
|
+
promise: viewReader.read(workspaceId, { current: true }),
|
|
9168
|
+
pending: true,
|
|
9169
|
+
sessionIds: workspacesRef.current.items.find((item) => item.workspaceId === workspaceId)?.sessionIds ?? []
|
|
9061
9170
|
};
|
|
9062
9171
|
targetReads.current.set(workspaceId, request);
|
|
9063
9172
|
try {
|
|
@@ -9075,28 +9184,24 @@ window.__ModuleLoader__.load({
|
|
|
9075
9184
|
request = latest;
|
|
9076
9185
|
}
|
|
9077
9186
|
if (!view) throw new WorktreeSessionActionError("WORKTREE_VIEW_FAILED", "workspace projection unavailable", true);
|
|
9187
|
+
view = view.knownSessionIds === void 0 ? {
|
|
9188
|
+
...view,
|
|
9189
|
+
knownSessionIds: request.sessionIds
|
|
9190
|
+
} : view;
|
|
9078
9191
|
if (opening && (!workspaceIdsRef.current.includes(workspaceId) || !view.worktrees.some((record) => record.worktreeId === opening.worktreeId) || !view.bindings.some((binding) => binding.sessionId === opening.sessionId && binding.worktreeId === opening.worktreeId && binding.status === "active"))) throw new WorktreeSessionActionError("WORKTREE_SESSION_REPAIR_REQUIRED", "binding projection not ready", true);
|
|
9079
9192
|
if (!guard.isCurrent(request.generation)) return;
|
|
9193
|
+
if (targetRefreshGuards.current.get(workspaceId) !== guard) return;
|
|
9080
9194
|
if (!workspaceIdsRef.current.includes(workspaceId)) return;
|
|
9195
|
+
request.pending = false;
|
|
9081
9196
|
const publish = () => setReadState((current) => {
|
|
9082
|
-
const
|
|
9083
|
-
|
|
9197
|
+
const targetErrors = { ...current.targetErrors };
|
|
9198
|
+
delete targetErrors[workspaceId];
|
|
9199
|
+
return {
|
|
9084
9200
|
...current,
|
|
9085
9201
|
status: "ready",
|
|
9086
9202
|
views: mergeWorktreeViews(current.views, workspaceIdsRef.current, [view]),
|
|
9087
|
-
error: void 0
|
|
9088
|
-
|
|
9089
|
-
if (remainingTargetError.length === 0) {
|
|
9090
|
-
const withoutTargetError = { ...next };
|
|
9091
|
-
delete withoutTargetError.targetError;
|
|
9092
|
-
return withoutTargetError;
|
|
9093
|
-
}
|
|
9094
|
-
return {
|
|
9095
|
-
...next,
|
|
9096
|
-
targetError: {
|
|
9097
|
-
workspaceIds: remainingTargetError,
|
|
9098
|
-
error: current.targetError.error
|
|
9099
|
-
}
|
|
9203
|
+
error: void 0,
|
|
9204
|
+
targetErrors
|
|
9100
9205
|
};
|
|
9101
9206
|
});
|
|
9102
9207
|
if (options.openingSession) (0, react_dom.flushSync)(publish);
|
|
@@ -9104,17 +9209,17 @@ window.__ModuleLoader__.load({
|
|
|
9104
9209
|
} catch (error) {
|
|
9105
9210
|
if (options.openingSession) throw error;
|
|
9106
9211
|
if (!guard.isCurrent(request.generation)) return;
|
|
9212
|
+
if (targetRefreshGuards.current.get(workspaceId) !== guard) return;
|
|
9107
9213
|
if (!workspaceIdsRef.current.includes(workspaceId)) return;
|
|
9108
9214
|
setReadState((current) => {
|
|
9109
|
-
const previousIds = current.targetError?.workspaceIds ?? [];
|
|
9110
9215
|
return {
|
|
9111
9216
|
...current,
|
|
9112
9217
|
status: "ready",
|
|
9113
9218
|
views: mergeWorktreeViews(current.views, workspaceIdsRef.current, []),
|
|
9114
9219
|
error: void 0,
|
|
9115
|
-
|
|
9116
|
-
|
|
9117
|
-
|
|
9220
|
+
targetErrors: {
|
|
9221
|
+
...current.targetErrors,
|
|
9222
|
+
[workspaceId]: {
|
|
9118
9223
|
...toWorktreeViewError(error),
|
|
9119
9224
|
retryable: true
|
|
9120
9225
|
}
|
|
@@ -9122,7 +9227,7 @@ window.__ModuleLoader__.load({
|
|
|
9122
9227
|
};
|
|
9123
9228
|
});
|
|
9124
9229
|
} finally {
|
|
9125
|
-
|
|
9230
|
+
request.pending = false;
|
|
9126
9231
|
}
|
|
9127
9232
|
}));
|
|
9128
9233
|
if (options.openingSession) {
|
|
@@ -9162,7 +9267,12 @@ window.__ModuleLoader__.load({
|
|
|
9162
9267
|
});
|
|
9163
9268
|
return;
|
|
9164
9269
|
}
|
|
9165
|
-
|
|
9270
|
+
const sessionIds = workspacesRef.current.items.find((item) => item.workspaceId === workspaceId)?.sessionIds ?? [];
|
|
9271
|
+
modalReadLoader.current.load(workspaceId, (data) => {
|
|
9272
|
+
const view = data.knownSessionIds === void 0 ? {
|
|
9273
|
+
...data,
|
|
9274
|
+
knownSessionIds: sessionIds
|
|
9275
|
+
} : data;
|
|
9166
9276
|
modalReadViewRef.current = view;
|
|
9167
9277
|
setModalReadLoading(false);
|
|
9168
9278
|
setReadState((current) => ({
|
|
@@ -9174,8 +9284,58 @@ window.__ModuleLoader__.load({
|
|
|
9174
9284
|
setModalReadError(toWorktreeViewError(error));
|
|
9175
9285
|
});
|
|
9176
9286
|
}, [manager, viewReader]);
|
|
9287
|
+
const previousNativeSessions = (0, react.useRef)(new Map(source.workspaces.items.map((item) => [item.workspaceId, item.sessionIds])));
|
|
9288
|
+
(0, react.useEffect)(() => {
|
|
9289
|
+
if (isPendingListPhase(source.workspaces.phase)) return;
|
|
9290
|
+
const previous = previousNativeSessions.current;
|
|
9291
|
+
previousNativeSessions.current = new Map(source.workspaces.items.map((item) => [item.workspaceId, item.sessionIds]));
|
|
9292
|
+
for (const workspace of source.workspaces.items) {
|
|
9293
|
+
const ids = previous.get(workspace.workspaceId);
|
|
9294
|
+
if (!ids) continue;
|
|
9295
|
+
const view = readStateRef.current.views.find((item) => item.workspaceId === workspace.workspaceId);
|
|
9296
|
+
if (!workspace.sessionIds.some((id) => !ids.includes(id) && !view?.bindings.some((binding) => binding.sessionId === id))) continue;
|
|
9297
|
+
viewReader.invalidate(workspace.workspaceId);
|
|
9298
|
+
guardFor(workspace.workspaceId).invalidate();
|
|
9299
|
+
if (mode === "worktree") refresh({
|
|
9300
|
+
scope: {
|
|
9301
|
+
kind: "workspace",
|
|
9302
|
+
workspaceId: workspace.workspaceId
|
|
9303
|
+
},
|
|
9304
|
+
alreadyInvalidated: true
|
|
9305
|
+
});
|
|
9306
|
+
}
|
|
9307
|
+
}, [
|
|
9308
|
+
source.workspaces.items,
|
|
9309
|
+
source.workspaces.phase,
|
|
9310
|
+
mode,
|
|
9311
|
+
refresh,
|
|
9312
|
+
viewReader
|
|
9313
|
+
]);
|
|
9314
|
+
(0, react.useEffect)(() => {
|
|
9315
|
+
if (mode !== "worktree" || isPendingListPhase(source.workspaces.phase)) return;
|
|
9316
|
+
for (const view of readState.views) {
|
|
9317
|
+
if (view.knownSessionIds === void 0 || readState.targetErrors?.[view.workspaceId]) continue;
|
|
9318
|
+
const unknown = (source.workspaces.items.find((item) => item.workspaceId === view.workspaceId)?.sessionIds ?? []).filter((id) => !view.knownSessionIds.includes(id) && !view.bindings.some((binding) => binding.sessionId === id));
|
|
9319
|
+
const pending = targetReads.current.get(view.workspaceId);
|
|
9320
|
+
if (!unknown.length || pending?.pending && unknown.every((id) => pending.sessionIds.includes(id))) continue;
|
|
9321
|
+
refresh({ scope: {
|
|
9322
|
+
kind: "workspace",
|
|
9323
|
+
workspaceId: view.workspaceId
|
|
9324
|
+
} });
|
|
9325
|
+
}
|
|
9326
|
+
}, [
|
|
9327
|
+
readState.views,
|
|
9328
|
+
readState.targetErrors,
|
|
9329
|
+
source.workspaces.items,
|
|
9330
|
+
source.workspaces.phase,
|
|
9331
|
+
mode,
|
|
9332
|
+
refresh
|
|
9333
|
+
]);
|
|
9177
9334
|
(0, react.useEffect)(() => {
|
|
9178
|
-
if (mode === "worktree") refresh({
|
|
9335
|
+
if (mode === "worktree") refresh({
|
|
9336
|
+
preserveCurrent: true,
|
|
9337
|
+
reuseInFlight: true
|
|
9338
|
+
});
|
|
9179
9339
|
else {
|
|
9180
9340
|
refreshGuard.current.invalidate();
|
|
9181
9341
|
for (const guard of targetRefreshGuards.current.values()) guard.invalidate();
|
|
@@ -9185,51 +9345,47 @@ window.__ModuleLoader__.load({
|
|
|
9185
9345
|
setWorktreeModalWorkspaceId(void 0);
|
|
9186
9346
|
setModalReadError(void 0);
|
|
9187
9347
|
setModalReadLoading(false);
|
|
9188
|
-
setReadState(EMPTY_READ_STATE);
|
|
9189
9348
|
}
|
|
9190
9349
|
}, [mode, refresh]);
|
|
9191
9350
|
const previousWorkspaceIdsRef = (0, react.useRef)(workspaceIds);
|
|
9192
9351
|
(0, react.useEffect)(() => {
|
|
9352
|
+
if (isPendingListPhase(source.workspaces.phase)) return;
|
|
9193
9353
|
const previousWorkspaceIds = previousWorkspaceIdsRef.current;
|
|
9194
9354
|
previousWorkspaceIdsRef.current = workspaceIds;
|
|
9195
|
-
if (mode !== "worktree") return;
|
|
9196
9355
|
const addedWorkspaceIds = workspaceIds.filter((workspaceId) => !previousWorkspaceIds.includes(workspaceId));
|
|
9197
9356
|
const removedWorkspaceIds = previousWorkspaceIds.filter((workspaceId) => !workspaceIds.includes(workspaceId));
|
|
9198
9357
|
for (const workspaceId of removedWorkspaceIds) {
|
|
9358
|
+
targetRefreshGuards.current.get(workspaceId)?.invalidate();
|
|
9199
9359
|
targetRefreshGuards.current.delete(workspaceId);
|
|
9200
9360
|
targetReads.current.delete(workspaceId);
|
|
9361
|
+
viewReader.invalidate(workspaceId);
|
|
9362
|
+
syncedMembershipViews.current.delete(workspaceId);
|
|
9363
|
+
props.syncWorkspaceSessions?.(workspaceId, []);
|
|
9201
9364
|
}
|
|
9202
9365
|
setReadState((current) => {
|
|
9203
9366
|
const views = mergeWorktreeViews(current.views, workspaceIds, []);
|
|
9204
|
-
const
|
|
9205
|
-
const next = {
|
|
9206
|
-
...current,
|
|
9207
|
-
views
|
|
9208
|
-
};
|
|
9209
|
-
if (remainingTargetError.length === 0) {
|
|
9210
|
-
const withoutTargetError = { ...next };
|
|
9211
|
-
delete withoutTargetError.targetError;
|
|
9212
|
-
return withoutTargetError;
|
|
9213
|
-
}
|
|
9367
|
+
const targetErrors = Object.fromEntries(Object.entries(current.targetErrors ?? {}).filter(([workspaceId]) => workspaceIds.includes(workspaceId)));
|
|
9214
9368
|
return {
|
|
9215
|
-
...
|
|
9216
|
-
|
|
9217
|
-
|
|
9218
|
-
error: current.targetError.error
|
|
9219
|
-
}
|
|
9369
|
+
...current,
|
|
9370
|
+
views,
|
|
9371
|
+
targetErrors
|
|
9220
9372
|
};
|
|
9221
9373
|
});
|
|
9374
|
+
if (mode !== "worktree") return;
|
|
9222
9375
|
for (const workspaceId of addedWorkspaceIds) refresh({
|
|
9223
9376
|
scope: {
|
|
9224
9377
|
kind: "workspace",
|
|
9225
9378
|
workspaceId
|
|
9226
9379
|
},
|
|
9227
|
-
preserveCurrent: true
|
|
9380
|
+
preserveCurrent: true,
|
|
9381
|
+
ensureLoaded: true
|
|
9228
9382
|
}).catch(() => {});
|
|
9229
9383
|
}, [
|
|
9230
9384
|
mode,
|
|
9231
9385
|
refresh,
|
|
9232
|
-
workspaceIds
|
|
9386
|
+
workspaceIds,
|
|
9387
|
+
source.workspaces.phase,
|
|
9388
|
+
viewReader
|
|
9233
9389
|
]);
|
|
9234
9390
|
(0, react.useEffect)(() => {
|
|
9235
9391
|
if (forkRecoveryRevisionRef.current === forkRecoverySnapshot.revision) return;
|
|
@@ -9251,7 +9407,16 @@ window.__ModuleLoader__.load({
|
|
|
9251
9407
|
refresh
|
|
9252
9408
|
]);
|
|
9253
9409
|
(0, react.useEffect)(() => {
|
|
9254
|
-
if (readState.status !== "ready" ||
|
|
9410
|
+
if (readState.status !== "ready" || isPendingListPhase(source.workspaces.phase)) return;
|
|
9411
|
+
if (props.syncWorkspaceSessions) {
|
|
9412
|
+
for (const view of readState.views) {
|
|
9413
|
+
if (syncedMembershipViews.current.get(view.workspaceId) === view || targetReads.current.get(view.workspaceId)?.pending) continue;
|
|
9414
|
+
syncedMembershipViews.current.set(view.workspaceId, view);
|
|
9415
|
+
props.syncWorkspaceSessions(view.workspaceId, view.bindings);
|
|
9416
|
+
}
|
|
9417
|
+
return;
|
|
9418
|
+
}
|
|
9419
|
+
if (syncSessionWorkspaces === void 0 || [...targetReads.current.values()].some((request) => request.pending) || !isCompleteWorktreeWorkspaceSnapshot(workspaceIds, readState.views)) return;
|
|
9255
9420
|
syncSessionWorkspaces(readState.views.flatMap((view) => view.bindings.map((binding) => ({
|
|
9256
9421
|
workspaceId: binding.workspaceId,
|
|
9257
9422
|
sessionId: binding.sessionId
|
|
@@ -9259,7 +9424,10 @@ window.__ModuleLoader__.load({
|
|
|
9259
9424
|
}, [
|
|
9260
9425
|
readState.status,
|
|
9261
9426
|
readState.views,
|
|
9262
|
-
syncSessionWorkspaces
|
|
9427
|
+
syncSessionWorkspaces,
|
|
9428
|
+
props.syncWorkspaceSessions,
|
|
9429
|
+
workspaceIds,
|
|
9430
|
+
source.workspaces.phase
|
|
9263
9431
|
]);
|
|
9264
9432
|
const viewByWorkspace = (0, react.useMemo)(() => new Map(readState.views.map((view) => [view.workspaceId, view])), [readState.views]);
|
|
9265
9433
|
const previousActivityRef = (0, react.useRef)(sessionPresentations);
|
|
@@ -9739,7 +9907,13 @@ window.__ModuleLoader__.load({
|
|
|
9739
9907
|
const mode = effectiveViewMode(preferredMode, available && manager !== void 0);
|
|
9740
9908
|
const sessions = useSessions((state) => state);
|
|
9741
9909
|
const sessionStatuses = useSessionStatus?.((state) => state);
|
|
9742
|
-
const
|
|
9910
|
+
const nativeWorkspaces = useWorkspaces((state) => state);
|
|
9911
|
+
const retainedWorkspaces = (0, react.useRef)();
|
|
9912
|
+
const workspaces = (0, react.useMemo)(() => {
|
|
9913
|
+
const next = retainPendingWorkspaces(retainedWorkspaces.current, nativeWorkspaces);
|
|
9914
|
+
retainedWorkspaces.current = next;
|
|
9915
|
+
return next;
|
|
9916
|
+
}, [nativeWorkspaces]);
|
|
9743
9917
|
const forkRecoveryStore = forkRecovery ?? EMPTY_FORK_RECOVERY_STORE;
|
|
9744
9918
|
const forkRecoverySnapshot = (0, react.useSyncExternalStore)(forkRecoveryStore.subscribe, forkRecoveryStore.getSnapshot, forkRecoveryStore.getSnapshot);
|
|
9745
9919
|
const currentSessionId = currentSessionIdFromList(sessions);
|
|
@@ -10049,7 +10223,7 @@ window.__ModuleLoader__.load({
|
|
|
10049
10223
|
};
|
|
10050
10224
|
const defaultOpenInAppController = new OpenInAppController();
|
|
10051
10225
|
//#endregion
|
|
10052
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
10226
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/dashboard/open-in-app.css.mjs
|
|
10053
10227
|
const css$4 = ".-cerbur-clutch-dsh-worktree-control {\n display: inline-flex;\n align-self: flex-end;\n}\n\n.-cerbur-clutch-dsh-worktree-split {\n display: inline-flex;\n align-items: stretch;\n box-sizing: border-box;\n height: 28px;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: 14px;\n overflow: hidden;\n font-family: var(--dsw-font-family);\n}\n\n.-cerbur-clutch-dsh-worktree-split .-cerbur-clutch-dsh-worktree-main,\n.-cerbur-clutch-dsh-worktree-split .-cerbur-clutch-dsh-worktree-chevron {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n border: 0;\n background: none;\n color: var(--dsw-alias-label-primary);\n font-size: 11px;\n font-weight: 400;\n line-height: 16px;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-main {\n padding: 5px 6px 5px 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-main:hover:not(:disabled),\n.-cerbur-clutch-dsh-worktree-main:focus-visible,\n.-cerbur-clutch-dsh-worktree-chevron:hover,\n.-cerbur-clutch-dsh-worktree-chevron:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-main:disabled {\n color: var(--dsw-alias-label-dimmed);\n cursor: wait;\n}\n\n.-cerbur-clutch-dsh-worktree-main[data-state='error'] {\n color: var(--dsw-alias-state-error-primary, #e03e3e);\n box-shadow: inset 0 0 0 1px var(--dsw-alias-state-error-primary, #e03e3e);\n}\n\n.-cerbur-clutch-dsh-worktree-split .-cerbur-clutch-dsh-worktree-chevron {\n padding: 5px 6px 5px 4px;\n border-left: 0.5px solid var(--dsw-alias-border-l4);\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-icon {\n flex: none;\n}\n\n.-cerbur-clutch-dsh-worktree-split .-cerbur-clutch-dsh-worktree-icon {\n width: 16px;\n height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-split .-cerbur-clutch-dsh-worktree-chevron svg {\n width: 12px;\n height: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-fallback {\n text-decoration: none;\n align-self: flex-end;\n}\n\nimg.-cerbur-clutch-dsh-worktree-icon {\n display: block;\n object-fit: contain;\n user-select: none;\n}\n";
|
|
10054
10228
|
const styleId$4 = "@cerbur/clutch-dsh-worktree/open-in-app.css";
|
|
10055
10229
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/open-in-app.css\"]") === null) {
|
|
@@ -10260,7 +10434,7 @@ window.__ModuleLoader__.load({
|
|
|
10260
10434
|
};
|
|
10261
10435
|
}
|
|
10262
10436
|
//#endregion
|
|
10263
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
10437
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/dashboard/dashboard.css.mjs
|
|
10264
10438
|
const css$3 = ".-cerbur-clutch-dsh-worktree-dashboardSurface {\n position: absolute;\n box-sizing: border-box;\n z-index: 2;\n overflow: auto;\n overscroll-behavior: contain;\n pointer-events: auto;\n container-type: inline-size;\n background: var(--dsw-alias-bg-base, #fff);\n color: var(--dsw-alias-label-primary, #19212f);\n font-family: inherit;\n font-size: 14px;\n line-height: 1.5;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardSurface *,\n.-cerbur-clutch-dsh-worktree-dashboardSurface *::before,\n.-cerbur-clutch-dsh-worktree-dashboardSurface *::after {\n box-sizing: border-box;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface button:not(.-cerbur-clutch-dsh-worktree-dashboardRefButton) {\n font: inherit;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface svg {\n width: 18px;\n height: 18px;\n flex: none;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface code {\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface button:focus-visible,\n.-cerbur-clutch-dsh-worktree-dashboardSurface a:focus-visible,\n.-cerbur-clutch-dsh-worktree-dashboardPanel:focus-visible {\n outline: 2px solid #497cd4;\n outline-offset: 3px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface h1:focus {\n outline: none;\n}\n.-cerbur-clutch-dsh-worktree-dashboardPage {\n max-width: 1240px;\n margin: 0 auto;\n padding: 24px 30px 28px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessions {\n list-style: none;\n padding: 0;\n margin: 12px 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessions button {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 12px 8px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessionLabel {\n flex: 1;\n min-width: 0;\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessionMeta {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: flex-end;\n min-width: 28px;\n color: var(--dsw-alias-label-tertiary, #858e9d);\n}\n.-cerbur-clutch-dsh-worktree-dashboardChildPath {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #788191);\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardChildState {\n display: flex;\n flex: none;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardManageToolbar {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 12px;\n margin-top: 20px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageToolbar label,\n.-cerbur-clutch-dsh-worktree-dashboardManageStopped {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageHint {\n color: var(--dsw-alias-label-secondary, #788191);\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageList,\n.-cerbur-clutch-dsh-worktree-dashboardManageResults,\n.-cerbur-clutch-dsh-worktree-dashboardManageConfirmList {\n list-style: none;\n padding: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageList label {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 8px;\n border-radius: 6px;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageList label:hover,\n.-cerbur-clutch-dsh-worktree-dashboardManageList label:has(input:checked) {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageList label:has(input:focus-visible) {\n outline: 2px solid #497cd4;\n outline-offset: 2px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageList input,\n.-cerbur-clutch-dsh-worktree-dashboardManageToolbar input,\n.-cerbur-clutch-dsh-worktree-dashboardManageStopped input {\n flex: none;\n accent-color: var(--dsw-alias-brand-primary, #497cd4);\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageResults li,\n.-cerbur-clutch-dsh-worktree-dashboardManageConfirmList li {\n padding: 8px 0;\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageConfirmList {\n max-height: 260px;\n overflow: auto;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageConfirmList code {\n display: block;\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageResults [data-batch-result='failed'] {\n color: var(--dsw-alias-label-error, #d34b4b);\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessionStatus {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessionTime {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12px;\n line-height: 20px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessions button:hover,\n.-cerbur-clutch-dsh-worktree-dashboardSessions button[aria-current] {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface a {\n text-decoration: none;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions button:not(:disabled) {\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTopline {\n position: sticky;\n top: 0;\n z-index: 3;\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: space-between;\n gap: 8px 20px;\n min-height: 50px;\n padding: 10px 20px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n background: var(--dsw-alias-bg-base, #fff);\n color: var(--dsw-alias-label-secondary, #677080);\n font-size: 13px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTopline > span {\n flex: 1 1 120px;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTopline > span > span {\n margin: 0 8px;\n opacity: 0.5;\n}\n.-cerbur-clutch-dsh-worktree-dashboardToplineActions {\n display: inline-flex;\n flex-wrap: nowrap;\n flex-shrink: 0;\n align-items: center;\n gap: 8px;\n margin-inline-start: auto;\n max-width: 100%;\n -webkit-app-region: no-drag;\n}\n/* AppFrame's native reopen/New Session seat follows shell.-cerbur-clutch-dsh-worktree-overlay in DOM order.\n Keep its existing actions above the Dashboard, with its published clearance\n reserved in the title. This rule disappears as soon as the Dashboard closes. */\nhtml[data-platform='darwin']\n [data-sidebar-collapsed]:has([data-worktree-dashboard], [data-worktree-dashboard-request])\n > [data-shell-leading] {\n z-index: 21;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSidebarButton {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 6px;\n border: 0;\n border-radius: 28px;\n background: transparent;\n color: var(--dsw-alias-label-secondary, #677080);\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSidebarButton:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n.-cerbur-clutch-dsh-worktree-dashboardSidebarButton svg {\n width: 15px;\n height: 15px;\n transform: scaleX(-1);\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeader {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(260px, 0.45fr);\n gap: 32px;\n margin-bottom: 15px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardIdentity {\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow > svg {\n width: 24px;\n height: 24px;\n color: #3e73ca;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow h1 {\n font-size: 25px;\n letter-spacing: -0.6px;\n line-height: 1.3;\n font-weight: 650;\n margin: 0;\n flex: 0 1 auto;\n overflow: hidden;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardRefButton {\n display: block;\n max-width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHealth,\n.-cerbur-clutch-dsh-worktree-dashboardSoon {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n white-space: nowrap;\n border-radius: 6px;\n padding: 3px 7px;\n font-size: 11px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary, #687182);\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n.-cerbur-clutch-dsh-worktree-dashboardHealth[data-health='ready'] {\n background: color-mix(in srgb, #1eab78 13%, transparent);\n color: #21976f;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHealth[data-health='repair'],\n.-cerbur-clutch-dsh-worktree-dashboardHealth[data-health='recovery-needed'],\n.-cerbur-clutch-dsh-worktree-dashboardHealth[data-health='branch-drift'] {\n background: color-mix(in srgb, #e7a839 14%, transparent);\n color: #b27a1e;\n}\n.-cerbur-clutch-dsh-worktree-dashboardPath {\n display: flex;\n align-items: flex-start;\n gap: 9px;\n margin-top: 12px;\n color: var(--dsw-alias-label-secondary, #697283);\n}\n.-cerbur-clutch-dsh-worktree-dashboardPath code {\n padding-top: 4px;\n overflow-wrap: anywhere;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFieldLabel {\n font-size: 10px;\n border: 1px solid var(--dsw-alias-border-l3, #e5e7ed);\n border-radius: 4px;\n padding: 2px 5px;\n margin-top: 2px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardIconButton {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 29px;\n height: 29px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: inherit;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardIconButton:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n.-cerbur-clutch-dsh-worktree-dashboardCopyStatus {\n font-size: 12px;\n margin: 4px 0 0;\n min-height: 18px;\n color: #21976f;\n}\n.-cerbur-clutch-dsh-worktree-dashboardCopyStatus[role='alert'] {\n color: #bd5d43;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderAside {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 8px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderAside > button,\n.-cerbur-clutch-dsh-worktree-dashboardHeaderAside > a {\n align-self: flex-end;\n}\n.-cerbur-clutch-dsh-worktree-dashboardButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 7px;\n padding: 6px 11px;\n border: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 6px;\n background: var(--dsw-alias-bg-base, #fff);\n color: inherit;\n white-space: nowrap;\n cursor: pointer;\n font-size: 12px !important;\n line-height: 1.5;\n}\n.-cerbur-clutch-dsh-worktree-dashboardButton:disabled {\n color: var(--dsw-alias-label-secondary, #737e8e);\n cursor: not-allowed;\n}\n.-cerbur-clutch-dsh-worktree-dashboardButton:not(:disabled):hover {\n background: var(--dsw-alias-interactive-bg-hover, #f4f6f9);\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabs {\n display: flex;\n gap: 22px;\n overflow-x: auto;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #e1e5ed);\n margin-bottom: 24px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabs button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n gap: 8px;\n padding: 12px 2px;\n border: 0;\n border-bottom: 2px solid transparent;\n background: transparent;\n color: var(--dsw-alias-label-secondary, #6c7480);\n cursor: pointer;\n font-size: 13px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabs button[aria-selected='true'] {\n color: #4276c8;\n border-bottom-color: #4276c8;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabs svg {\n width: 16px;\n height: 16px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardPanel {\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardGrid {\n display: grid;\n grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr);\n gap: 20px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardColumn {\n display: flex;\n flex-direction: column;\n gap: 20px;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardCard,\n.-cerbur-clutch-dsh-worktree-dashboardStart {\n padding: 20px;\n border: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n border-radius: 11px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardCard h2,\n.-cerbur-clutch-dsh-worktree-dashboardStart h2 {\n display: flex;\n align-items: center;\n gap: 9px;\n font-size: 16px;\n font-weight: 620;\n line-height: 1.4;\n margin: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardCard p,\n.-cerbur-clutch-dsh-worktree-dashboardStart > p {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #7b8290);\n margin: 8px 0 15px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardCardHeading {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 10px;\n margin-bottom: 7px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStart {\n background: linear-gradient(\n 115deg,\n color-mix(in srgb, #6b9eff 9%, transparent),\n color-mix(in srgb, #6b9eff 3%, transparent)\n );\n}\n.-cerbur-clutch-dsh-worktree-dashboardStart h2 > svg {\n color: #477bc6;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 13px;\n margin-top: 23px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions button {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 18px 14px;\n text-align: left;\n border: 1px solid color-mix(in srgb, #7299e7 28%, transparent);\n border-radius: 8px;\n background: color-mix(in srgb, #6b9eff 5%, transparent);\n color: #4673bc;\n cursor: not-allowed;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions button:nth-child(2) {\n color: #38846e;\n border-color: color-mix(in srgb, #4fba9a 25%, transparent);\n background: color-mix(in srgb, #4fba9a 5%, transparent);\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions svg {\n width: 23px;\n height: 23px;\n margin-top: 3px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions strong {\n display: block;\n font-size: 14px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions small {\n display: block;\n margin-top: 6px;\n line-height: 1.6;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #69788a);\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions em {\n display: block;\n font-size: 10px;\n font-style: normal;\n margin-top: 10px;\n opacity: 0.75;\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionPlaceholder {\n padding: 26px 20px;\n min-height: 177px;\n border: 1px dashed var(--dsw-alias-border-l3, #dfe4ed);\n border-radius: 7px;\n background: var(--dsw-alias-interactive-bg-hover, #f7f8fa);\n text-align: center;\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionPlaceholder > svg {\n display: block;\n margin: 0 auto 10px;\n width: 25px;\n height: 25px;\n color: #929cac;\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionPlaceholder strong {\n font-size: 13px;\n font-weight: 500;\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionPlaceholder p {\n max-width: 310px;\n margin: 7px auto 12px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardEmpty {\n display: flex;\n flex-direction: column;\n gap: 8px;\n align-items: center;\n justify-content: center;\n min-height: 78px;\n padding: 10px 8px;\n text-align: center;\n}\n.-cerbur-clutch-dsh-worktree-dashboardEmpty p {\n max-width: 300px;\n margin: 0;\n line-height: 1.7;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts {\n margin: 8px 0 14px;\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts > div {\n display: grid;\n grid-template-columns: minmax(70px, 0.65fr) minmax(0, 1fr);\n gap: 12px;\n align-items: center;\n padding: 11px 0;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #eef0f5);\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts > div:last-child {\n border: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts dt {\n grid-column: 1;\n min-width: 0;\n color: var(--dsw-alias-label-secondary, #788191);\n /* Prefer normal break points (including trailing `/` and `-`) first. */\n overflow-wrap: break-word;\n word-break: normal;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts dd {\n grid-column: 2;\n min-width: 0;\n margin: 0;\n text-align: right;\n /* Only split an unbreakable value after natural opportunities are exhausted. */\n overflow-wrap: break-word;\n word-break: normal;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts > div:has(.-cerbur-clutch-dsh-worktree-dashboardFactAction > *) {\n grid-template-columns: minmax(70px, 0.65fr) minmax(0, 1fr) 29px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts dd > span {\n max-width: 100%;\n flex-wrap: wrap;\n justify-content: flex-end;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFactAction {\n display: flex;\n grid-column: 3;\n align-items: center;\n justify-content: flex-end;\n min-width: 29px;\n min-height: 29px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFactAction:empty { display: none; }\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts {\n width: 100%;\n margin: 0;\n padding: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts > div,\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts > div:has(.-cerbur-clutch-dsh-worktree-dashboardFactAction > *) {\n grid-template-columns: minmax(60px, 0.55fr) minmax(0, 1fr) 26px;\n gap: 8px;\n min-height: 34px;\n padding: 3px 0;\n border: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts time {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-secondary, #687182);\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts .-cerbur-clutch-dsh-worktree-dashboardFactAction {\n min-width: 26px;\n min-height: 26px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts .-cerbur-clutch-dsh-worktree-dashboardIconButton {\n width: 26px;\n height: 26px;\n border-radius: 6px;\n color: var(--dsw-alias-label-tertiary, #858e9d);\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts .-cerbur-clutch-dsh-worktree-dashboardIconButton:hover,\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts .-cerbur-clutch-dsh-worktree-dashboardIconButton:focus-visible {\n background: transparent;\n color: var(--dsw-alias-label-primary, #19212f);\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts .-cerbur-clutch-dsh-worktree-dashboardIconButton svg {\n width: 14px;\n height: 14px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHistorical {\n color: var(--dsw-alias-label-secondary, #788191);\n}\n.-cerbur-clutch-dsh-worktree-dashboardSyncOptions {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSyncOptions p {\n margin: 0;\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSyncOptions label {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSyncOptions input {\n margin-top: 4px;\n accent-color: var(--dsw-alias-text-link, #3e73ca);\n}\n.-cerbur-clutch-dsh-worktree-dashboardSyncOptions small {\n display: block;\n margin-top: 4px;\n color: var(--dsw-alias-label-secondary, #788191);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n max-width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-primary, #19212f);\n text-align: left;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink > span {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink svg {\n width: 14px;\n height: 14px;\n color: var(--dsw-alias-label-tertiary, #858e9d);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink:hover,\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink:focus-visible {\n color: var(--dsw-alias-text-link, #3e73ca);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink:hover svg,\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink:focus-visible svg {\n color: inherit;\n}\n.-cerbur-clutch-dsh-worktree-dashboardIconButton:disabled {\n color: var(--dsw-alias-label-secondary, #788191);\n cursor: not-allowed;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineModal {\n box-sizing: border-box;\n width: min(440px, calc(100vw - 48px));\n max-height: calc(100vh - 48px);\n max-height: calc(100dvh - 48px);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineModalContent {\n box-sizing: border-box;\n min-height: 0;\n overflow-y: auto;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselinePicker {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 100%;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardLink {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n width: 100%;\n background: transparent;\n border: 1px solid var(--dsw-alias-border-l3, #e2e6ed);\n border-radius: 6px;\n padding: 7px 10px;\n font-size: 12px !important;\n color: inherit;\n cursor: pointer;\n margin-top: 8px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardLink:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f5f7fa);\n}\n.-cerbur-clutch-dsh-worktree-dashboardQuickActions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 16px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardQuickActions .-cerbur-clutch-dsh-worktree-dashboardButton {\n justify-content: flex-start;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 390px;\n padding: 40px 24px;\n text-align: center;\n border: 1px dashed var(--dsw-alias-border-l3, #dde3ec);\n border-radius: 11px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder > svg {\n width: 36px;\n height: 36px;\n color: #7c9bcf;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder h2 {\n font-size: 20px;\n font-weight: 600;\n margin: 16px 0 4px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder p {\n max-width: 420px;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary, #7b8596);\n margin: 8px 0 18px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFooter {\n margin: 23px 0 0;\n text-align: center;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary, #8a92a0);\n}\n\n@container (max-width: 820px) {\n .-cerbur-clutch-dsh-worktree-dashboardPage {\n padding: 20px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardHeader {\n grid-template-columns: minmax(0, 1fr);\n gap: 12px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardHeaderAside {\n display: flex;\n }\n .-cerbur-clutch-dsh-worktree-dashboardGrid {\n grid-template-columns: minmax(0, 1fr);\n }\n .-cerbur-clutch-dsh-worktree-dashboardTabs {\n gap: 18px;\n }\n}\n\n@container (max-width: 440px) {\n .-cerbur-clutch-dsh-worktree-dashboardManageList label {\n display: grid;\n grid-template-columns: auto auto minmax(0, 1fr);\n gap: 8px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardManageList .-cerbur-clutch-dsh-worktree-dashboardChildState {\n grid-column: 3;\n align-items: flex-start;\n flex-direction: row;\n flex-wrap: wrap;\n min-width: 0;\n }\n .-cerbur-clutch-dsh-worktree-dashboardManageList .-cerbur-clutch-dsh-worktree-dashboardHealth {\n white-space: normal;\n }\n .-cerbur-clutch-dsh-worktree-dashboardPage {\n padding: 16px 12px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardTitleRow h1 {\n font-size: 22px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardStartActions {\n grid-template-columns: minmax(0, 1fr);\n }\n .-cerbur-clutch-dsh-worktree-dashboardCard,\n .-cerbur-clutch-dsh-worktree-dashboardStart {\n padding: 16px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardTopline {\n gap: 10px;\n }\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionsText {\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n max-height: 240px;\n overflow: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardInstructionsInput {\n box-sizing: border-box;\n width: 100%;\n resize: vertical;\n padding: 10px;\n border: 1px solid var(--dsw-alias-border-l4);\n border-radius: 8px;\n background: var(--dsw-alias-bg-base);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardInstructionActions {\n display: flex;\n gap: 8px;\n margin-top: 8px;\n}\n";
|
|
10265
10439
|
const styleId$3 = "@cerbur/clutch-dsh-worktree/dashboard.css";
|
|
10266
10440
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard.css\"]") === null) {
|
|
@@ -10572,7 +10746,7 @@ window.__ModuleLoader__.load({
|
|
|
10572
10746
|
});
|
|
10573
10747
|
}
|
|
10574
10748
|
//#endregion
|
|
10575
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
10749
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/dashboard/git/worktree-git.css.mjs
|
|
10576
10750
|
const css$2 = ".-cerbur-clutch-dsh-worktree-gitPanel {\n min-width: 0;\n min-height: 0;\n}\n.-cerbur-clutch-dsh-worktree-gitCommitStats {\n display: inline-flex;\n gap: 8px;\n color: var(--dsw-alias-label-secondary, #677080);\n font-variant-numeric: tabular-nums;\n}\n.-cerbur-clutch-dsh-worktree-gitFileRow {\n display: flex;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-gitFileRow > button:first-child { flex: 1; min-width: 0; }\n.-cerbur-clutch-dsh-worktree-gitFileRow > .-cerbur-clutch-dsh-worktree-gitFileOpen { width: 28px; min-width: 28px; flex: none; padding: 4px; opacity: 0; }\n.-cerbur-clutch-dsh-worktree-gitFileRow > .-cerbur-clutch-dsh-worktree-gitFileOpen svg { width: 14px; height: 14px; }\n.-cerbur-clutch-dsh-worktree-gitFileRow:hover > .-cerbur-clutch-dsh-worktree-gitFileOpen,\n.-cerbur-clutch-dsh-worktree-gitFileRow:focus-within > .-cerbur-clutch-dsh-worktree-gitFileOpen { opacity: 1; }\n\n.-cerbur-clutch-dsh-worktree-gitPanelHeader {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 20px;\n margin-bottom: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitPanelHeader h2 {\n margin: 0;\n font-size: 18px;\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitPanelHeading {\n min-width: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineSelector {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n margin-top: 10px;\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselinePrompt {\n padding: 22px;\n border: 1px dashed var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 10px;\n background: var(--dsw-alias-bg-base, #fff);\n color: var(--dsw-alias-label-secondary, #6f7887);\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselinePrompt strong {\n display: block;\n margin-bottom: 6px;\n color: var(--dsw-alias-label-primary, #273142);\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselinePrompt p {\n margin: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineFacts {\n display: flex;\n flex-wrap: wrap;\n gap: 8px 20px;\n margin: 10px 0 0;\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineFacts > div {\n display: flex;\n gap: 6px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineFacts dt::after {\n content: ':';\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineFacts dd {\n margin: 0;\n color: var(--dsw-alias-label-primary, #273142);\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineFacts code {\n margin-left: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDerived {\n margin-left: 7px;\n color: var(--dsw-alias-state-warn-label, #9a6e22);\n}\n\n.-cerbur-clutch-dsh-worktree-gitRefresh {\n flex: none;\n padding: 6px 11px;\n border: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 6px;\n background: var(--dsw-alias-bg-base, #fff);\n color: inherit;\n cursor: pointer;\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitRefresh:disabled {\n color: var(--dsw-alias-label-secondary, #7d8795);\n cursor: wait;\n}\n\n/*\n * One 3x3 grid carries both layouts: commit and changed-file panes sit around a\n * row divider, the diff sits beside them across a column divider. Wide layouts\n * place the stack in the left column, narrow layouts place all three panes on\n * three rows. Both shares are custom properties the dividers drag, and both are\n * clamped so each pane keeps a usable size.\n */\n.-cerbur-clutch-dsh-worktree-gitColumns {\n /* Keep the Git surface bounded by the viewport, never by its data volume. */\n --git-columns-height: clamp(360px, calc(100vh - 300px), 560px);\n --git-columns-height: clamp(360px, calc(100dvh - 300px), 560px);\n /* Leading-pane shares: the row divider and the column divider drag these. */\n --git-rows-top: 45%;\n --git-columns-left: 38%;\n display: grid;\n grid-template-columns:\n minmax(240px, min(var(--git-columns-left), calc(100% - 247px)))\n 7px\n minmax(240px, 1fr);\n grid-template-rows:\n minmax(140px, min(var(--git-rows-top), calc(100% - 147px)))\n 7px\n minmax(140px, 1fr);\n height: var(--git-columns-height);\n min-height: 0;\n border: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n border-radius: 10px;\n overflow: hidden;\n resize: none;\n}\n\n/* Wide: commits over changed files in the left column, diff down the right column. */\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='commits'] {\n grid-area: 1 / 1;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='rows'] {\n grid-area: 2 / 1;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='changed-files'] {\n grid-area: 3 / 1;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='columns'] {\n grid-area: 1 / 2 / -1 / 3;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='diff'] {\n grid-area: 1 / 3 / -1 / -1;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--dsw-alias-bg-base, #fff);\n touch-action: none;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter::before {\n content: '';\n border-radius: 999px;\n background: var(--dsw-alias-border-l2, #cbd2dc);\n transition: background 0.15s ease;\n}\n\n/* Widen the grab area without moving the visible divider line. */\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter::after {\n content: '';\n position: absolute;\n}\n\n/* Both divider panes draw a full border box, so the pane above and the pane below\n (or the pane left and the pane right) are each closed by their own edge. */\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='rows'] {\n box-sizing: border-box;\n height: 7px;\n cursor: row-resize;\n border-top: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n border-bottom: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='rows']::before {\n width: 30px;\n height: 2px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='rows']::after {\n inset: -3px 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='columns'] {\n box-sizing: border-box;\n width: 7px;\n cursor: col-resize;\n border-left: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n border-right: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='columns']::before {\n width: 2px;\n height: 30px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='columns']::after {\n inset: 0 -3px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter:hover::before,\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter:focus-visible::before,\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter[data-dashboard-git-splitting='true']::before {\n background: var(--dsw-alias-state-business-primary, #467bc8);\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter:focus-visible {\n outline: 2px solid #497cd4;\n outline-offset: -2px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumn {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n background: var(--dsw-alias-bg-base, #fff);\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeader {\n display: flex;\n flex: none;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n min-height: 43px;\n padding: 12px 13px 9px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #edf0f4);\n color: var(--dsw-alias-label-secondary, #6f7887);\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeader h3 {\n margin: 0;\n color: var(--dsw-alias-label-primary, #273142);\n font-size: 12px;\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeader span,\n.-cerbur-clutch-dsh-worktree-gitColumnHeader code {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeaderMeta {\n display: flex;\n min-width: 0;\n align-items: baseline;\n justify-content: flex-end;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeader .-cerbur-clutch-dsh-worktree-gitLineStats,\n.-cerbur-clutch-dsh-worktree-gitColumnHeader .-cerbur-clutch-dsh-worktree-gitLineStats > span {\n overflow: visible;\n text-overflow: clip;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeaderUnknown {\n color: var(--dsw-alias-label-tertiary, #8a94a3);\n}\n\n/* Right side of the commits header: the truncation note and the multi-select switch. */\n.-cerbur-clutch-dsh-worktree-gitColumnHeaderControls {\n display: flex;\n min-width: 0;\n align-self: center;\n align-items: center;\n justify-content: flex-end;\n gap: 10px;\n}\n\n/*\n * A native checkbox owns the state, focus and keyboard behavior; the track and\n * thumb below are presentational and follow :checked through the sibling selector.\n */\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelect {\n position: relative;\n display: inline-flex;\n flex: none;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n user-select: none;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelect input {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip-path: inset(50%);\n border: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelectTrack {\n position: relative;\n display: block;\n flex: none;\n width: 24px;\n height: 14px;\n border-radius: 999px;\n background: var(--dsw-alias-border-l2, #cbd2dc);\n transition: background 0.15s ease;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelectThumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: var(--dsw-alias-bg-base, #fff);\n box-shadow: 0 1px 2px rgb(15 23 42 / 25%);\n transition: transform 0.15s ease;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelect input:checked + .-cerbur-clutch-dsh-worktree-gitCommitMultiSelectTrack {\n background: var(--dsw-alias-state-business-primary, #467bc8);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelect input:checked + .-cerbur-clutch-dsh-worktree-gitCommitMultiSelectTrack .-cerbur-clutch-dsh-worktree-gitCommitMultiSelectThumb {\n transform: translateX(10px);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelect input:focus-visible + .-cerbur-clutch-dsh-worktree-gitCommitMultiSelectTrack {\n outline: 2px solid #497cd4;\n outline-offset: 2px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryButton {\n display: flex;\n width: calc(100% - 10px);\n flex-direction: column;\n gap: 3px;\n margin: 5px;\n padding: 8px;\n border: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 6px;\n background: var(--dsw-alias-bg-base, #fff);\n color: var(--dsw-alias-label-primary, #273142);\n text-align: left;\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryButton:hover,\n.-cerbur-clutch-dsh-worktree-gitSummaryButton[aria-pressed='true'] {\n border-color: var(--dsw-alias-state-business-primary, #467bc8);\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryButton span {\n font-size: 12px;\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryButton small {\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle {\n display: flex;\n align-items: flex-start;\n gap: 7px;\n width: calc(100% - 20px);\n margin: 3px 10px 8px;\n color: var(--dsw-alias-label-primary, #273142);\n cursor: pointer;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle input {\n flex: none;\n margin: 2px 0 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle span {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 2px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle strong {\n font-weight: 560;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle small {\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle input:disabled,\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle:has(input:disabled) {\n cursor: wait;\n opacity: 0.65;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSelectionToolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 5px 10px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #edf0f4);\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSelectionToolbar button {\n border: 0;\n background: transparent;\n color: var(--dsw-alias-state-business-primary, #467bc8);\n cursor: pointer;\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList {\n display: block;\n flex: 1 1 auto;\n min-height: 0;\n overflow-x: hidden;\n overflow-y: auto;\n overscroll-behavior: contain;\n scrollbar-gutter: stable;\n list-style: none;\n padding: 5px;\n margin: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList {\n overflow-x: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList > li,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitFolderChildren,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitFolderChildren > li {\n width: max-content;\n min-width: 100%;\n}\n\n.-cerbur-clutch-dsh-worktree-gitFolderChildren {\n list-style: none;\n padding: 0 0 0 12px;\n margin: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitFolderButton {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 8px;\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 11px;\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitFolderButton:hover,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitFolderButton:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n color: var(--dsw-alias-label-primary, #273142);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFolderIcon {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n color: var(--dsw-alias-label-secondary, #6f7887);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFolderIcon > svg {\n width: 16px;\n height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitFolderName {\n min-width: max-content;\n overflow: visible;\n text-overflow: clip;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList button {\n display: block;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button {\n display: grid;\n width: 100%;\n grid-template-columns: 15px minmax(0, 1fr);\n padding: 9px 8px;\n}\n\n/* Without the multi-select marks a row has a single column, so the subject and meta align with it. */\n.-cerbur-clutch-dsh-worktree-gitCommitList[data-dashboard-git-commit-multiselect='off'] button {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList[data-dashboard-git-commit-multiselect='off'] .-cerbur-clutch-dsh-worktree-gitCommitSubject,\n.-cerbur-clutch-dsh-worktree-gitCommitList[data-dashboard-git-commit-multiselect='off'] .-cerbur-clutch-dsh-worktree-gitCommitMeta {\n grid-column: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitSelectionMark {\n grid-row: 1 / span 2;\n color: var(--dsw-alias-state-business-primary, #467bc8);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button:hover,\n.-cerbur-clutch-dsh-worktree-gitCommitList button[aria-selected='true'],\n.-cerbur-clutch-dsh-worktree-gitChangedFileList button:hover,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList button[aria-selected='true'] {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button[aria-selected='true'] {\n box-shadow: inset 2px 0 var(--dsw-alias-state-business-primary, #467bc8);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button[data-dashboard-git-commit-kind='working-tree'] {\n background: var(--dsw-alias-state-warn-tertiary, #f8f5ed);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button[data-dashboard-git-commit-kind='working-tree'][aria-selected='true'] {\n box-shadow: inset 2px 0 var(--dsw-alias-state-warn-primary, #b18435);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitSubject {\n grid-column: 2;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMeta {\n grid-column: 2;\n display: flex;\n gap: 7px;\n margin-top: 4px;\n overflow: hidden;\n color: var(--dsw-alias-label-secondary, #7c8594);\n font-size: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMeta span,\n.-cerbur-clutch-dsh-worktree-gitCommitMeta time {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMeta time {\n margin-left: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitWorkingTree {\n color: var(--dsw-alias-state-warn-label, #8a6728);\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList button {\n display: flex;\n width: max-content;\n min-width: 100%;\n box-sizing: border-box;\n align-items: flex-start;\n gap: 7px;\n padding: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitFileIcon {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n color: var(--dsw-alias-label-secondary, #6f7887);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFileIconGlyph {\n width: 16px;\n height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitFilePath {\n min-width: max-content;\n flex: 0 0 auto;\n overflow: visible;\n text-overflow: clip;\n white-space: nowrap;\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='added'] {\n color: var(--dsw-alias-state-success-primary, #23845f);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='deleted'] {\n color: var(--dsw-alias-state-error-secondary, #bd5d55);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='modified'],\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='renamed'],\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='copied'],\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='type-changed'] {\n color: var(--dsw-alias-state-business-primary, #467bc8);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFileContributors {\n flex: none;\n max-width: 9em;\n overflow: hidden;\n color: var(--dsw-alias-label-tertiary, #65758d);\n font-size: 9px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-gitLineStats {\n display: inline-flex;\n flex: none;\n gap: 6px;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitLineStats {\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitLineAdded {\n color: var(--dsw-alias-state-success-primary, #23845f);\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitLineRemoved {\n color: var(--dsw-alias-state-error-secondary, #bd5d55);\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffContainer {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffToolbar {\n display: flex;\n flex: none;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 6px 12px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #edf0f4);\n background: var(--dsw-alias-bg-base, #ffffff);\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffPath {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n color: var(--dsw-alias-label-primary, #263342);\n font-weight: 560;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffOpenInSidebar {\n display: inline-flex;\n flex: none;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n border: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 4px;\n background: var(--dsw-alias-bg-base, #ffffff);\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 11px;\n line-height: 16px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n/* The square 16px arrow keeps its aspect ratio; pin the box so it centers on the label. */\n.-cerbur-clutch-dsh-worktree-gitDiffOpenIcon {\n flex: none;\n width: 14px;\n height: 14px;\n color: var(--dsw-alias-label-tertiary, #8a94a3);\n transition: color 0.15s ease;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffOpenInSidebar:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n color: var(--dsw-alias-label-primary, #263342);\n border-color: var(--dsw-alias-border-l2, #cbd2dc);\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffOpenInSidebar:hover .-cerbur-clutch-dsh-worktree-gitDiffOpenIcon {\n color: var(--dsw-alias-label-primary, #263342);\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiff {\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n padding: 7px 0 12px;\n background: var(--dsw-alias-markdown-code-block, #fafbfc);\n color: var(--dsw-alias-label-primary, #263342);\n font: 11px/1.65 ui-monospace, SFMono-Regular, Consolas, monospace;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffSegment {\n margin-bottom: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffSegmentHeader {\n padding: 5px 12px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 10px;\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffSegmentHeader code {\n color: var(--dsw-alias-label-primary, #273142);\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffHunk {\n margin-bottom: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffHunkHeader {\n padding: 3px 12px;\n background: var(--dsw-alias-markdown-code-block-banner, #edf3fb);\n color: var(--dsw-alias-state-business-primary, #4a70a1);\n box-shadow: inset 0 1px 0 var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.04)), inset 0 -1px 0 var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.04));\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffLine {\n display: grid;\n grid-template-columns: 44px 44px minmax(0, 1fr);\n min-width: max-content;\n padding-right: 12px;\n white-space: pre;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffLineadd {\n background: color-mix(\n in srgb,\n var(--dsw-alias-state-success-primary, #23845f) 18%,\n var(--dsw-alias-markdown-code-block, #fafbfc)\n );\n box-shadow: inset 2px 0 var(--dsw-alias-state-success-primary, #23845f);\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffLinedelete {\n background: color-mix(\n in srgb,\n var(--dsw-alias-state-error-secondary, #bd5d55) 18%,\n var(--dsw-alias-markdown-code-block, #fafbfc)\n );\n box-shadow: inset 2px 0 var(--dsw-alias-state-error-secondary, #bd5d55);\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffLineNumber {\n padding-right: 8px;\n color: var(--dsw-alias-label-tertiary, #9aa3af);\n text-align: right;\n user-select: none;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffLine code {\n min-width: 0;\n color: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSrOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffEmpty,\n.-cerbur-clutch-dsh-worktree-gitDiffMessage,\n.-cerbur-clutch-dsh-worktree-gitEmpty,\n.-cerbur-clutch-dsh-worktree-gitLoading,\n.-cerbur-clutch-dsh-worktree-gitUnavailable,\n.-cerbur-clutch-dsh-worktree-gitError {\n padding: 24px 16px;\n color: var(--dsw-alias-label-secondary, #727d8d);\n font-size: 12px;\n text-align: center;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffMessage,\n.-cerbur-clutch-dsh-worktree-gitUnavailable {\n min-height: 150px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitUnavailable strong {\n display: block;\n margin-bottom: 7px;\n color: var(--dsw-alias-label-primary, #273142);\n font-size: 14px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitUnavailable p {\n max-width: 500px;\n margin: 0 auto;\n line-height: 1.7;\n}\n\n.-cerbur-clutch-dsh-worktree-gitError {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 9px 12px;\n color: var(--dsw-alias-state-error-primary, #ae5c4c);\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-gitError p {\n margin: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitError button {\n flex: none;\n border: 1px solid currentColor;\n border-radius: 5px;\n background: transparent;\n color: inherit;\n cursor: pointer;\n font-size: 11px;\n padding: 3px 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffFolded {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 12px;\n border-top: 1px dashed var(--dsw-alias-border-l3, #dfe3ea);\n background: var(--dsw-alias-bg-base, #fff);\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffShowAll {\n padding: 2px 8px;\n border: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-primary, #273142);\n cursor: pointer;\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-gitRawDiff {\n display: block;\n flex: 1 1 auto;\n min-height: 0;\n max-height: none;\n overflow: auto;\n padding: 12px;\n margin: 0;\n white-space: pre;\n background: var(--dsw-alias-markdown-code-block, #fafbfc);\n color: var(--dsw-alias-label-primary, #263342);\n font: 11px/1.65 ui-monospace, SFMono-Regular, Consolas, monospace;\n}\n\n@container (min-width: 901px) {\n .-cerbur-clutch-dsh-worktree-gitColumns {\n /* Two stacked panes need more vertical room than three side-by-side panes. */\n --git-columns-height: clamp(440px, calc(100vh - 300px), 720px);\n --git-columns-height: clamp(440px, calc(100dvh - 300px), 720px);\n }\n}\n\n@container (max-width: 900px) {\n /* Narrow layout keeps the two-row arrangement: commits and changed files side by\n side on the first row, with the summary diff across the second row. Both\n dividers move with the panes, so either axis stays adjustable. */\n .-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='commits'] {\n grid-area: 1 / 1;\n }\n .-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='columns'] {\n grid-area: 1 / 2;\n }\n .-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='changed-files'] {\n grid-area: 1 / 3;\n }\n .-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='rows'] {\n grid-area: 2 / 1 / 3 / -1;\n }\n .-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='diff'] {\n grid-area: 3 / 1 / -1 / -1;\n }\n}\n\n@container (max-width: 520px) {\n .-cerbur-clutch-dsh-worktree-gitPanelHeader {\n flex-direction: column;\n gap: 10px;\n }\n .-cerbur-clutch-dsh-worktree-gitRefresh {\n align-self: flex-end;\n }\n .-cerbur-clutch-dsh-worktree-gitColumns {\n display: block;\n height: auto;\n min-height: 0;\n }\n .-cerbur-clutch-dsh-worktree-gitColumnSplitter {\n display: none;\n }\n .-cerbur-clutch-dsh-worktree-gitColumn {\n height: clamp(260px, calc(100vh - 360px), 360px);\n height: clamp(260px, calc(100dvh - 360px), 360px);\n min-height: 260px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n }\n .-cerbur-clutch-dsh-worktree-gitColumn:has(> .-cerbur-clutch-dsh-worktree-gitEmpty),\n .-cerbur-clutch-dsh-worktree-gitColumn:has(.-cerbur-clutch-dsh-worktree-gitDiffEmpty) { height: auto; min-height: 100px; }\n .-cerbur-clutch-dsh-worktree-gitColumns > .-cerbur-clutch-dsh-worktree-gitColumn:last-child {\n border-bottom: 0;\n }\n}\n";
|
|
10577
10751
|
const styleId$2 = "@cerbur/clutch-dsh-worktree/worktree-git.css";
|
|
10578
10752
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree-git.css\"]") === null) {
|
|
@@ -12749,7 +12923,7 @@ window.__ModuleLoader__.load({
|
|
|
12749
12923
|
});
|
|
12750
12924
|
}
|
|
12751
12925
|
//#endregion
|
|
12752
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
12926
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/settings/settings.css.mjs
|
|
12753
12927
|
const css$1 = ".-cerbur-clutch-dsh-worktree-settings {\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n min-width: 0;\n max-width: 720px;\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsh-content-font-size, 14px);\n line-height: calc(var(--dsh-content-font-size, 14px) + 8px);\n}\n\n[data-worktree-settings-nav-icon] > svg:not(.-cerbur-clutch-dsh-worktree-settingsNavIcon) {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsNavIcon {\n order: -1;\n flex: 0 0 auto;\n width: 16px;\n height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-toolSettings {\n display: flex;\n flex-direction: column;\n gap: 20px;\n min-width: 0;\n padding: 20px;\n border: 0.5px solid var(--dsw-alias-settings-card-stroke, var(--dsw-alias-border-l4));\n border-radius: var(--dsw-radius-xl, 16px);\n background: var(--dsw-alias-settings-card-fill, var(--dsw-alias-bg-layer-2));\n}\n\n.-cerbur-clutch-dsh-worktree-toolHeader,\n.-cerbur-clutch-dsh-worktree-toolRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 24px;\n}\n\n.-cerbur-clutch-dsh-worktree-toolHeader > div,\n.-cerbur-clutch-dsh-worktree-toolRow > div {\n min-width: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-toolTitle {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-toolHeader h3 {\n margin: 0;\n font-size: calc(var(--dsh-content-font-size, 14px) + 2px);\n font-weight: 600;\n}\n\n.-cerbur-clutch-dsh-worktree-toolHeader p,\n.-cerbur-clutch-dsh-worktree-toolOptionsHeading p,\n.-cerbur-clutch-dsh-worktree-toolRow p {\n margin: 0;\n color: var(--dsw-alias-label-tertiary);\n font-size: var(--dsh-content-font-size-secondary, calc(var(--dsh-content-font-size, 14px) - 1px));\n line-height: 1.5;\n overflow-wrap: anywhere;\n}\n\n.-cerbur-clutch-dsh-worktree-toolOptions {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding-top: 20px;\n border-top: 0.5px solid var(--dsw-alias-settings-card-stroke, var(--dsw-alias-border-l4));\n}\n\n.-cerbur-clutch-dsh-worktree-toolOptionsHeading h4 {\n margin: 0 0 6px;\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsh-content-font-size, 14px);\n font-weight: 500;\n}\n\n.-cerbur-clutch-dsh-worktree-toolList {\n padding-left: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-toolRow {\n padding: 12px 0;\n}\n\n.-cerbur-clutch-dsh-worktree-toolRow + .-cerbur-clutch-dsh-worktree-toolRow {\n border-top: 0.5px solid var(--dsw-alias-border-l4);\n}\n\n.-cerbur-clutch-dsh-worktree-toolRow h5 {\n margin: 0 0 6px;\n font-size: var(--dsh-content-font-size, 14px);\n font-weight: 500;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsTitle {\n margin: 0;\n font-size: calc(var(--dsh-content-font-size, 14px) + 2px);\n line-height: calc(var(--dsh-content-font-size, 14px) + 10px);\n font-weight: 500;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsTabs {\n width: 100%;\n box-sizing: border-box;\n}\n\n/* Native controls keep their palette and keyboard behavior; text and control\n height follow the body's font-size preference even on older DSH themes. */\n.-cerbur-clutch-dsh-worktree-settings .-cerbur-clutch-dsh-worktree-settingsTabs [role='tab'] {\n height: auto;\n min-height: 34px;\n padding-block: 6px;\n font-size: inherit;\n line-height: calc(var(--dsh-content-font-size, 14px) + 6px);\n white-space: normal;\n overflow-wrap: anywhere;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsPanel,\n.-cerbur-clutch-dsh-worktree-issueList {\n display: flex;\n flex-direction: column;\n min-width: 0;\n gap: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-issueList {\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsDescription,\n.-cerbur-clutch-dsh-worktree-settingsHint,\n.-cerbur-clutch-dsh-worktree-settingsEmpty,\n.-cerbur-clutch-dsh-worktree-issueMessage {\n margin: 0;\n overflow-wrap: anywhere;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsDescription,\n.-cerbur-clutch-dsh-worktree-settingsHint,\n.-cerbur-clutch-dsh-worktree-settingsEmpty {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.-cerbur-clutch-dsh-worktree-settingsHint {\n font-size: var(--dsh-content-font-size-secondary, calc(var(--dsh-content-font-size, 14px) - 1px));\n line-height: 1.5;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsToolbar {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: 12px;\n padding: 16px 0;\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-settingsToolbar > .-cerbur-clutch-dsh-worktree-settingsHint {\n flex: 1 1 240px;\n min-width: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsEmpty {\n padding-block: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-issue {\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n padding: 12px 14px;\n border: 0.5px solid var(--dsw-alias-settings-card-stroke, var(--dsw-alias-border-l4));\n border-radius: var(--dsw-radius-xl, 16px);\n background: var(--dsw-alias-settings-card-fill, var(--dsw-alias-bg-layer-2));\n}\n\n.-cerbur-clutch-dsh-worktree-issueHeader {\n display: flex;\n align-items: baseline;\n flex-wrap: wrap;\n gap: 6px 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-issueTitle {\n flex: 1 1 240px;\n min-width: 0;\n margin: 0;\n font-size: inherit;\n line-height: inherit;\n font-weight: 500;\n overflow-wrap: anywhere;\n}\n\n.-cerbur-clutch-dsh-worktree-settings .-cerbur-clutch-dsh-worktree-issueStatus,\n.-cerbur-clutch-dsh-worktree-settings .-cerbur-clutch-dsh-worktree-settingsAction {\n font-size: calc(var(--dsh-content-font-size, 14px) - 2px);\n line-height: calc(var(--dsh-content-font-size, 14px) + 4px);\n}\n\n.-cerbur-clutch-dsh-worktree-settings .-cerbur-clutch-dsh-worktree-settingsAction {\n flex: none;\n height: auto;\n min-height: 28px;\n padding-block: 4px;\n font-family: inherit;\n white-space: normal;\n overflow-wrap: anywhere;\n max-width: 100%;\n}\n\n.-cerbur-clutch-dsh-worktree-issueActions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-issueDiagnostics {\n min-width: 0;\n padding-top: 10px;\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-issueDiagnostics summary {\n width: fit-content;\n max-width: 100%;\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsh-content-font-size-secondary, calc(var(--dsh-content-font-size, 14px) - 1px));\n line-height: 1.5;\n cursor: pointer;\n overflow-wrap: anywhere;\n}\n\n.-cerbur-clutch-dsh-worktree-issueDiagnostics summary:focus-visible,\n.-cerbur-clutch-dsh-worktree-settings .-cerbur-clutch-dsh-worktree-settingsAction:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n border-radius: var(--dsw-radius-xs, 4px);\n}\n\n.-cerbur-clutch-dsh-worktree-issueDiagnostics pre {\n box-sizing: border-box;\n max-width: 100%;\n max-height: 320px;\n overflow: auto;\n margin: 10px 0 0;\n padding: 10px 12px;\n border-radius: var(--dsw-radius-md, 12px);\n background: var(--dsw-alias-bg-module-platform);\n color: var(--dsw-alias-label-secondary);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsh-content-font-size-secondary, calc(var(--dsh-content-font-size, 14px) - 1px));\n line-height: 1.5;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n user-select: text;\n}\n";
|
|
12754
12928
|
const styleId$1 = "@cerbur/clutch-dsh-worktree/settings.css";
|
|
12755
12929
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/settings.css\"]") === null) {
|
|
@@ -14249,10 +14423,10 @@ window.__ModuleLoader__.load({
|
|
|
14249
14423
|
//#endregion
|
|
14250
14424
|
//#region lib/client/dashboard/dashboard-sessions.js
|
|
14251
14425
|
/** Join retained snapshots without reading, mutating, or applying Sidebar search. */
|
|
14252
|
-
function dashboardSessionIds(record, sessions, bindings, archivedSessionIds, orderedIds = [], workspaceSessionIds = []) {
|
|
14426
|
+
function dashboardSessionIds(record, sessions, bindings, archivedSessionIds, orderedIds = [], workspaceSessionIds = [], knownSessionIds) {
|
|
14253
14427
|
if (isMainWorktreeId$1(record.worktreeId)) {
|
|
14254
14428
|
const boundSessionIds = new Set(bindings.filter((binding) => binding.workspaceId === record.workspaceId && binding.status !== "detached").map((binding) => binding.sessionId));
|
|
14255
|
-
const visible = filterVisibleSessionIds(filterArchivedSessionIds(workspaceSessionIds.filter((sessionId) => !boundSessionIds.has(sessionId)), archivedSessionIds), sessions);
|
|
14429
|
+
const visible = filterVisibleSessionIds(filterArchivedSessionIds(workspaceSessionIds.filter((sessionId) => !boundSessionIds.has(sessionId) && (knownSessionIds === void 0 || knownSessionIds.includes(sessionId))), archivedSessionIds), sessions);
|
|
14256
14430
|
const visibleIds = new Set(visible);
|
|
14257
14431
|
return [.../* @__PURE__ */ new Set([...orderedIds, ...visible])].filter((id) => visibleIds.has(id));
|
|
14258
14432
|
}
|
|
@@ -14477,7 +14651,7 @@ window.__ModuleLoader__.load({
|
|
|
14477
14651
|
const openDashboard = (0, react.useCallback)((record) => {
|
|
14478
14652
|
const workspace = source.workspaces.items.find((candidate) => candidate.workspaceId === record.workspaceId);
|
|
14479
14653
|
const view = read.viewByWorkspace.get(record.workspaceId);
|
|
14480
|
-
const navigation = prepareDashboardNavigation(record, dashboardSessionIds(record, source.sessions, view?.bindings ?? [], source.archivedSessionIds, isMainWorktreeId$1(record.worktreeId) ? ordering.orderedSessionIdsByAccount.get(`main:${record.workspaceId}`) : ordering.orderedSessionIdsByAccount.get(`worktree:${record.worktreeId}`), workspace === void 0 ? [] : workspaceSessionIds(source.workspaces, workspace.workspaceId, source.sessions.ids)), source.currentSessionId, source.sessions.phase ?? "ready");
|
|
14654
|
+
const navigation = prepareDashboardNavigation(record, dashboardSessionIds(record, source.sessions, view?.bindings ?? [], source.archivedSessionIds, isMainWorktreeId$1(record.worktreeId) ? ordering.orderedSessionIdsByAccount.get(`main:${record.workspaceId}`) : ordering.orderedSessionIdsByAccount.get(`worktree:${record.worktreeId}`), workspace === void 0 ? [] : workspaceSessionIds(source.workspaces, workspace.workspaceId, source.sessions.ids), view?.knownSessionIds ?? []), source.currentSessionId, source.sessions.phase ?? "ready");
|
|
14481
14655
|
if (navigation.waitForSessionList === true) {
|
|
14482
14656
|
pendingDashboard.current = void 0;
|
|
14483
14657
|
pendingDashboardRecord.current = record;
|
|
@@ -14689,7 +14863,7 @@ window.__ModuleLoader__.load({
|
|
|
14689
14863
|
dashboard !== void 0 && dashboardRecord === void 0 && dashboard.sessionId === source.currentSessionId && source.workspaceIds.includes(dashboard.workspaceId) && targetView === void 0 && (0, react_jsx_runtime.jsx)(DashboardRequest, {
|
|
14690
14864
|
context: targetWorkspace === void 0 ? dashboard.workspaceId : targetWorkspace.title + " · " + targetWorkspace.path,
|
|
14691
14865
|
t,
|
|
14692
|
-
error: read.readState.error ??
|
|
14866
|
+
error: read.readState.error ?? read.readState.targetErrors?.[dashboard.workspaceId],
|
|
14693
14867
|
onClose: closeDashboard,
|
|
14694
14868
|
onRetry: () => {
|
|
14695
14869
|
read.refresh({
|
|
@@ -14763,7 +14937,7 @@ window.__ModuleLoader__.load({
|
|
|
14763
14937
|
workspaceTitle: dashboardWorkspace?.title ?? "",
|
|
14764
14938
|
sessions: source.sessions,
|
|
14765
14939
|
sessionPresentations: source.sessionPresentations,
|
|
14766
|
-
sessionIds: dashboardSessionIds(dashboardRecord, source.sessions, dashboardView?.bindings ?? [], source.archivedSessionIds, isMainWorktreeId$1(dashboardRecord.worktreeId) ? ordering.orderedSessionIdsByAccount.get(`main:${dashboardRecord.workspaceId}`) : ordering.orderedSessionIdsByAccount.get(`worktree:${dashboardRecord.worktreeId}`), dashboardWorkspace === void 0 ? [] : workspaceSessionIds(source.workspaces, dashboardWorkspace.workspaceId, source.sessions.ids)),
|
|
14940
|
+
sessionIds: dashboardSessionIds(dashboardRecord, source.sessions, dashboardView?.bindings ?? [], source.archivedSessionIds, isMainWorktreeId$1(dashboardRecord.worktreeId) ? ordering.orderedSessionIdsByAccount.get(`main:${dashboardRecord.workspaceId}`) : ordering.orderedSessionIdsByAccount.get(`worktree:${dashboardRecord.worktreeId}`), dashboardWorkspace === void 0 ? [] : workspaceSessionIds(source.workspaces, dashboardWorkspace.workspaceId, source.sessions.ids), dashboardView?.knownSessionIds ?? []),
|
|
14767
14941
|
actionPending: mutation.actionPending,
|
|
14768
14942
|
onSyncBaseline: props.manager?.syncWorktreeBaseline !== void 0 && dashboardManagedRecord !== void 0 && dashboardCanCreate && (dashboardRecord.health === void 0 || dashboardRecord.health === "ready") ? async (strategy, baseBranch, requestId) => {
|
|
14769
14943
|
let completed = false;
|
|
@@ -15210,7 +15384,7 @@ window.__ModuleLoader__.load({
|
|
|
15210
15384
|
}, "clutch-dsh-worktree: steer activity");
|
|
15211
15385
|
}
|
|
15212
15386
|
//#endregion
|
|
15213
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
15387
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/steer/steer.css.mjs
|
|
15214
15388
|
const css = ".-cerbur-clutch-dsh-worktree-strip {\n box-sizing: border-box;\n flex: none;\n min-width: 0;\n width: calc(100% - var(--dsh-composer-side-clearance, 16px) - var(--dsh-composer-side-clearance, 16px));\n max-width: var(--dsh-composer-card-max-width, 760px);\n margin: 0 auto;\n padding: 8px 12px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 12px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-title { font-weight: 600; margin-bottom: 4px; }\n.-cerbur-clutch-dsh-worktree-items { max-height: 200px; overflow: auto; }\n.-cerbur-clutch-dsh-worktree-item summary { display: flex; align-items: baseline; gap: 8px; cursor: pointer; padding: 4px 0; }\n.-cerbur-clutch-dsh-worktree-item summary::before { content: '›'; flex: none; }\n.-cerbur-clutch-dsh-worktree-item[open] summary::before { transform: rotate(90deg); }\n.-cerbur-clutch-dsh-worktree-status { flex: none; }\n.-cerbur-clutch-dsh-worktree-preview { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.-cerbur-clutch-dsh-worktree-body { padding: 4px 0 8px; overflow-wrap: anywhere; }\n.-cerbur-clutch-dsh-worktree-body p { margin: 6px 0; white-space: pre-wrap; }\n.-cerbur-clutch-dsh-worktree-sender { font-family: monospace; }\n";
|
|
15215
15389
|
const styleId = "@cerbur/clutch-dsh-worktree/steer.css";
|
|
15216
15390
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/steer.css\"]") === null) {
|
|
@@ -15659,6 +15833,9 @@ window.__ModuleLoader__.load({
|
|
|
15659
15833
|
sync([...bindings.filter((current) => current.sessionId !== binding.sessionId), binding]);
|
|
15660
15834
|
},
|
|
15661
15835
|
sync,
|
|
15836
|
+
syncWorkspace(workspaceId, nextBindings) {
|
|
15837
|
+
sync([...bindings.filter((binding) => binding.workspaceId !== workspaceId), ...nextBindings.filter((binding) => binding.workspaceId === workspaceId)]);
|
|
15838
|
+
},
|
|
15662
15839
|
removeSession(sessionId) {
|
|
15663
15840
|
sync(bindings.filter((binding) => binding.sessionId !== sessionId));
|
|
15664
15841
|
},
|
|
@@ -16012,7 +16189,13 @@ window.__ModuleLoader__.load({
|
|
|
16012
16189
|
en
|
|
16013
16190
|
}), "clutch-dsh-worktree: locale dictionaries");
|
|
16014
16191
|
const manager = createWorktreeConnectionAdapter(ctx.connection.rpc);
|
|
16015
|
-
const viewReader = createWorktreeViewReader(manager)
|
|
16192
|
+
const viewReader = createWorktreeViewReader(manager, (workspaceId) => {
|
|
16193
|
+
const snapshot = ctx.workspaces.list.getSnapshot();
|
|
16194
|
+
return {
|
|
16195
|
+
sessionIds: snapshot.items.find((item) => item.workspaceId === workspaceId)?.sessionIds ?? [],
|
|
16196
|
+
pending: snapshot.phase !== void 0 && snapshot.phase !== "ready"
|
|
16197
|
+
};
|
|
16198
|
+
});
|
|
16016
16199
|
const restartNotice = new RestartNotice((signal) => manager.probeHost(signal));
|
|
16017
16200
|
const dashboardStore = createSnapshotStore(void 0);
|
|
16018
16201
|
const sessions = ctx.sessions;
|
|
@@ -16099,6 +16282,9 @@ window.__ModuleLoader__.load({
|
|
|
16099
16282
|
const syncSessionWorkspaces = (bindings) => {
|
|
16100
16283
|
virtualWorkspaceMembership.sync(bindings);
|
|
16101
16284
|
};
|
|
16285
|
+
const syncWorkspaceSessions = (workspaceId, bindings) => {
|
|
16286
|
+
virtualWorkspaceMembership.syncWorkspace(workspaceId, bindings);
|
|
16287
|
+
};
|
|
16102
16288
|
const forkableSessions = ctx.sessions;
|
|
16103
16289
|
const nativeFork = forkableSessions.fork;
|
|
16104
16290
|
const workspaceBindingReads = /* @__PURE__ */ new Map();
|
|
@@ -16338,6 +16524,7 @@ window.__ModuleLoader__.load({
|
|
|
16338
16524
|
archiveSession: (sessionId) => ctx.workspaces.archiveSession(sessionId),
|
|
16339
16525
|
ensureSessionWorkspace,
|
|
16340
16526
|
syncSessionWorkspaces,
|
|
16527
|
+
syncWorkspaceSessions,
|
|
16341
16528
|
forkRecovery: forkCoordinator?.recovery,
|
|
16342
16529
|
retryForkSession: forkCoordinator === void 0 ? void 0 : async (key) => {
|
|
16343
16530
|
await forkCoordinator.retry(key);
|