@cerbur/clutch-dsh-worktree 0.1.14 → 0.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/README.md +34 -12
  2. package/README.zh.md +32 -12
  3. package/lib/client/WorktreeSurface.d.ts.map +1 -1
  4. package/lib/client/WorktreeSurface.js +32 -9
  5. package/lib/client/WorktreeSurface.js.map +1 -1
  6. package/lib/client/context/WorktreeContext.d.ts.map +1 -1
  7. package/lib/client/context/WorktreeContext.js +3 -2
  8. package/lib/client/context/WorktreeContext.js.map +1 -1
  9. package/lib/client/context/worktree-context-store.d.ts +3 -2
  10. package/lib/client/context/worktree-context-store.d.ts.map +1 -1
  11. package/lib/client/context/worktree-context-store.js +2 -1
  12. package/lib/client/context/worktree-context-store.js.map +1 -1
  13. package/lib/client/dashboard/DashboardRequest.d.ts +10 -0
  14. package/lib/client/dashboard/DashboardRequest.d.ts.map +1 -0
  15. package/lib/client/dashboard/DashboardRequest.js +38 -0
  16. package/lib/client/dashboard/DashboardRequest.js.map +1 -0
  17. package/lib/client/dashboard/OpenInAppButton.d.ts.map +1 -1
  18. package/lib/client/dashboard/OpenInAppButton.js +2 -1
  19. package/lib/client/dashboard/OpenInAppButton.js.map +1 -1
  20. package/lib/client/dashboard/WorktreeDashboard.d.ts.map +1 -1
  21. package/lib/client/dashboard/WorktreeDashboard.js +62 -54
  22. package/lib/client/dashboard/WorktreeDashboard.js.map +1 -1
  23. package/lib/client/dashboard/dashboard-overlay.d.ts.map +1 -1
  24. package/lib/client/dashboard/dashboard-overlay.js +12 -2
  25. package/lib/client/dashboard/dashboard-overlay.js.map +1 -1
  26. package/lib/client/dashboard/git/GitChangedFiles.js +1 -1
  27. package/lib/client/dashboard/git/GitChangedFiles.js.map +1 -1
  28. package/lib/client/dashboard/git/GitDiffView.js +1 -1
  29. package/lib/client/dashboard/git/GitDiffView.js.map +1 -1
  30. package/lib/client/dsh-icon-compat.d.ts +11 -0
  31. package/lib/client/dsh-icon-compat.d.ts.map +1 -0
  32. package/lib/client/dsh-icon-compat.js +12 -0
  33. package/lib/client/dsh-icon-compat.js.map +1 -0
  34. package/lib/client/dsh-icons.d.ts +20 -0
  35. package/lib/client/dsh-icons.d.ts.map +1 -0
  36. package/lib/client/dsh-icons.js +23 -0
  37. package/lib/client/dsh-icons.js.map +1 -0
  38. package/lib/client/entry.d.ts.map +1 -1
  39. package/lib/client/entry.js +25 -15
  40. package/lib/client/entry.js.map +1 -1
  41. package/lib/client/locales.d.ts +6 -0
  42. package/lib/client/locales.d.ts.map +1 -1
  43. package/lib/client/locales.js +6 -0
  44. package/lib/client/locales.js.map +1 -1
  45. package/lib/client/overlay/sidebar-overlay-geometry.d.ts +4 -0
  46. package/lib/client/overlay/sidebar-overlay-geometry.d.ts.map +1 -1
  47. package/lib/client/overlay/sidebar-overlay-geometry.js +102 -14
  48. package/lib/client/overlay/sidebar-overlay-geometry.js.map +1 -1
  49. package/lib/client/restart-notice.d.ts +18 -0
  50. package/lib/client/restart-notice.d.ts.map +1 -0
  51. package/lib/client/restart-notice.js +64 -0
  52. package/lib/client/restart-notice.js.map +1 -0
  53. package/lib/client/session/session-navigation.d.ts +8 -0
  54. package/lib/client/session/session-navigation.d.ts.map +1 -0
  55. package/lib/client/session/session-navigation.js +15 -0
  56. package/lib/client/session/session-navigation.js.map +1 -0
  57. package/lib/client/session/session-rename.d.ts +7 -0
  58. package/lib/client/session/session-rename.d.ts.map +1 -0
  59. package/lib/client/session/session-rename.js +18 -0
  60. package/lib/client/session/session-rename.js.map +1 -0
  61. package/lib/client/session/session-selection.d.ts +12 -0
  62. package/lib/client/session/session-selection.d.ts.map +1 -0
  63. package/lib/client/session/session-selection.js +8 -0
  64. package/lib/client/session/session-selection.js.map +1 -0
  65. package/lib/client/session/session-view.d.ts +3 -0
  66. package/lib/client/session/session-view.d.ts.map +1 -1
  67. package/lib/client/session/session-view.js +2 -1
  68. package/lib/client/session/session-view.js.map +1 -1
  69. package/lib/client/surface/components/ActiveWorktree.js +1 -1
  70. package/lib/client/surface/components/ActiveWorktree.js.map +1 -1
  71. package/lib/client/surface/components/AnimatedTree.d.ts +32 -0
  72. package/lib/client/surface/components/AnimatedTree.d.ts.map +1 -0
  73. package/lib/client/surface/components/AnimatedTree.js +139 -0
  74. package/lib/client/surface/components/AnimatedTree.js.map +1 -0
  75. package/lib/client/surface/components/ArchivedWorktree.js +1 -1
  76. package/lib/client/surface/components/ArchivedWorktree.js.map +1 -1
  77. package/lib/client/surface/components/ArchivedWorktrees.js +1 -1
  78. package/lib/client/surface/components/ArchivedWorktrees.js.map +1 -1
  79. package/lib/client/surface/components/RestartToast.d.ts +6 -0
  80. package/lib/client/surface/components/RestartToast.d.ts.map +1 -0
  81. package/lib/client/surface/components/RestartToast.js +10 -0
  82. package/lib/client/surface/components/RestartToast.js.map +1 -0
  83. package/lib/client/surface/components/SurfaceContent.d.ts.map +1 -1
  84. package/lib/client/surface/components/SurfaceContent.js +1 -1
  85. package/lib/client/surface/components/SurfaceContent.js.map +1 -1
  86. package/lib/client/surface/components/SurfaceHeader.js +2 -1
  87. package/lib/client/surface/components/SurfaceHeader.js.map +1 -1
  88. package/lib/client/surface/components/WorkspaceTree.d.ts.map +1 -1
  89. package/lib/client/surface/components/WorkspaceTree.js +6 -2
  90. package/lib/client/surface/components/WorkspaceTree.js.map +1 -1
  91. package/lib/client/surface/components/dialogs.d.ts.map +1 -1
  92. package/lib/client/surface/components/dialogs.js +2 -0
  93. package/lib/client/surface/components/dialogs.js.map +1 -1
  94. package/lib/client/surface/components/rows.d.ts.map +1 -1
  95. package/lib/client/surface/components/rows.js +14 -8
  96. package/lib/client/surface/components/rows.js.map +1 -1
  97. package/lib/client/surface/state/useSurfaceSources.d.ts +1 -0
  98. package/lib/client/surface/state/useSurfaceSources.d.ts.map +1 -1
  99. package/lib/client/surface/state/useSurfaceSources.js +5 -4
  100. package/lib/client/surface/state/useSurfaceSources.js.map +1 -1
  101. package/lib/client/view/WorktreeModeAction.js +1 -1
  102. package/lib/client/view/WorktreeModeAction.js.map +1 -1
  103. package/lib/client/view/view-mode.d.ts +4 -1
  104. package/lib/client/view/view-mode.d.ts.map +1 -1
  105. package/lib/client/view/view-mode.js +2 -1
  106. package/lib/client/view/view-mode.js.map +1 -1
  107. package/lib/client/view/worktree-error-copy.d.ts.map +1 -1
  108. package/lib/client/view/worktree-error-copy.js +6 -0
  109. package/lib/client/view/worktree-error-copy.js.map +1 -1
  110. package/lib/client/view/worktree-view-read.d.ts +3 -0
  111. package/lib/client/view/worktree-view-read.d.ts.map +1 -1
  112. package/lib/client/view/worktree-view-read.js +9 -0
  113. package/lib/client/view/worktree-view-read.js.map +1 -1
  114. package/lib/client/worktree-connection.d.ts +8 -0
  115. package/lib/client/worktree-connection.d.ts.map +1 -1
  116. package/lib/client/worktree-connection.js +14 -2
  117. package/lib/client/worktree-connection.js.map +1 -1
  118. package/lib/client.js +899 -420
  119. package/lib/client.js.map +1 -1
  120. package/lib/contract/index.d.ts +1 -1
  121. package/lib/contract/index.d.ts.map +1 -1
  122. package/lib/contract/index.js +1 -0
  123. package/lib/contract/index.js.map +1 -1
  124. package/lib/host/worktree-instructions.d.ts.map +1 -1
  125. package/lib/host/worktree-instructions.js +10 -2
  126. package/lib/host/worktree-instructions.js.map +1 -1
  127. package/lib/manage/manager-git-history.d.ts.map +1 -1
  128. package/lib/manage/manager-git-history.js +14 -10
  129. package/lib/manage/manager-git-history.js.map +1 -1
  130. package/lib/manage/manager-sessions.js +2 -2
  131. package/lib/manage/manager-sessions.js.map +1 -1
  132. package/lib/manage/manager-support.d.ts +7 -1
  133. package/lib/manage/manager-support.d.ts.map +1 -1
  134. package/lib/manage/manager-support.js +73 -14
  135. package/lib/manage/manager-support.js.map +1 -1
  136. package/lib/manage/manager-worktrees.d.ts.map +1 -1
  137. package/lib/manage/manager-worktrees.js +6 -4
  138. package/lib/manage/manager-worktrees.js.map +1 -1
  139. package/lib/manage/manager.js +2 -2
  140. package/lib/manage/manager.js.map +1 -1
  141. package/lib/typert.host.js +264 -198
  142. package/lib/typert.remote-client.js +264 -198
  143. package/package.json +45 -44
package/lib/client.js CHANGED
@@ -614,7 +614,7 @@ window.__ModuleLoader__.load({
614
614
  }
615
615
  var produce = new Immer2().produce;
616
616
  //#endregion
617
- //#region ../../node_modules/.pnpm/@deepseek-ai+dsh-client-store@0.1.2-rc.1_@deepseek-ai+cordis@4.0.1_@types+react@18.3.31_react@18.3.1/node_modules/@deepseek-ai/dsh-client-store/lib/index.js
617
+ //#region ../../node_modules/.pnpm/@deepseek-ai+dsh-client-store@0.2.0-rc.1_@deepseek-ai+cordis@4.0.4/node_modules/@deepseek-ai/dsh-client-store/lib/index.js
618
618
  /**
619
619
  * React-free snapshot store engine (zustand vanilla + immer + subscribeWithSelector +
620
620
  * rafFlush middleware + opt-in persist + dev freeze) plus the declarative
@@ -780,6 +780,7 @@ window.__ModuleLoader__.load({
780
780
  //#region lib/client/locales.js
781
781
  const WORKTREE_NS = "worktree";
782
782
  const zh = {
783
+ restartRequired: "Worktree 插件已安装。请重启 DSH Desktop,或重启 DSH Web 服务后刷新页面,以启用插件。",
783
784
  "dashboard.title": "Dashboard",
784
785
  "dashboard.preview": "Dashboard 预览",
785
786
  "dashboard.open": "打开 Dashboard",
@@ -1002,6 +1003,7 @@ window.__ModuleLoader__.load({
1002
1003
  "worktree.baseBranch": "Worktree 基线分支",
1003
1004
  "worktree.noLocalBranch": "没有本地分支",
1004
1005
  "worktree.noBranches": "此工作区中没有找到本地分支。",
1006
+ "worktree.setup.workspaceMissing": "此 Workspace 的本地目录已不存在。请恢复该目录,或在 DSH 中移除该 Workspace 后重试。",
1005
1007
  "worktree.setup.gitNotInstalled": "Git 未安装或不在 PATH 中。请先安装 Git,然后重启 DSH 再重试。",
1006
1008
  "worktree.setup.noRepository": "此 Workspace 不是 Git 仓库。请在 Workspace 目录执行以下命令:",
1007
1009
  "worktree.setup.noInitialCommit": "此 Git 仓库还没有首次 commit。请先执行以下命令:",
@@ -1084,6 +1086,7 @@ window.__ModuleLoader__.load({
1084
1086
  "error.worktreeRegistrationSessionUnavailable": "Worktree 已注册,但 Session 创建不可用,请重新连接后重试。",
1085
1087
  "error.workspaceRenameUnavailable": "工作区重命名不可用,请重新连接后重试。",
1086
1088
  "error.workspaceDeleteUnavailable": "工作区删除不可用,请重新连接后重试。",
1089
+ "error.workspaceRootMissing": "Workspace 目录不存在:{rootPath}",
1087
1090
  "error.sessionRenameUnavailable": "会话重命名不可用,请重新连接后重试。",
1088
1091
  "error.sessionBindingFailed": "Session {sessionId} 已创建,但 Worktree 绑定失败:{reason}",
1089
1092
  "error.sessionAlreadyBound": "Session 已绑定到其他 Worktree,未创建新的 Session。",
@@ -1098,6 +1101,7 @@ window.__ModuleLoader__.load({
1098
1101
  "branch.checkedOut": "(已检出)"
1099
1102
  };
1100
1103
  const en = {
1104
+ restartRequired: "Worktree is installed. Restart DSH Desktop, or restart the DSH Web server and refresh this page, to enable it.",
1101
1105
  "dashboard.title": "Dashboard",
1102
1106
  "dashboard.preview": "Dashboard preview",
1103
1107
  "dashboard.open": "Open Dashboard",
@@ -1320,6 +1324,7 @@ window.__ModuleLoader__.load({
1320
1324
  "worktree.baseBranch": "Worktree base branch",
1321
1325
  "worktree.noLocalBranch": "No local branch",
1322
1326
  "worktree.noBranches": "No local branches found in this Workspace.",
1327
+ "worktree.setup.workspaceMissing": "The local directory for this Workspace no longer exists. Restore it, or remove the Workspace in DSH and retry.",
1323
1328
  "worktree.setup.gitNotInstalled": "Git is not installed or is not available on PATH. Install Git, restart DSH, and retry.",
1324
1329
  "worktree.setup.noRepository": "This Workspace is not a Git repository. Run these commands in the Workspace directory:",
1325
1330
  "worktree.setup.noInitialCommit": "This Git repository has no initial commit. Run these commands first:",
@@ -1402,6 +1407,7 @@ window.__ModuleLoader__.load({
1402
1407
  "error.worktreeRegistrationSessionUnavailable": "The Worktree was registered, but Session creation is unavailable; retry after reconnecting.",
1403
1408
  "error.workspaceRenameUnavailable": "Workspace rename is unavailable; retry after reconnecting.",
1404
1409
  "error.workspaceDeleteUnavailable": "Workspace delete is unavailable; retry after reconnecting.",
1410
+ "error.workspaceRootMissing": "Workspace directory is missing: {rootPath}",
1405
1411
  "error.sessionRenameUnavailable": "Session rename is unavailable; retry after reconnecting.",
1406
1412
  "error.sessionBindingFailed": "Session {sessionId} was created, but Worktree binding failed: {reason}",
1407
1413
  "error.sessionAlreadyBound": "The Session is already bound to another Worktree; no new Session was created.",
@@ -1525,9 +1531,12 @@ window.__ModuleLoader__.load({
1525
1531
  function createWorktreeConnectionAdapter(rpc) {
1526
1532
  const inFlight = /* @__PURE__ */ new Set();
1527
1533
  let disposed = false;
1528
- async function invoke(method, input) {
1534
+ async function call(method, input, signal) {
1529
1535
  if (disposed) throw disposedError();
1530
1536
  const controller = new AbortController();
1537
+ const abort = () => controller.abort();
1538
+ if (signal?.aborted) controller.abort();
1539
+ else signal?.addEventListener("abort", abort, { once: true });
1531
1540
  inFlight.add(controller);
1532
1541
  const endpoint = WORKTREE_CONNECTION_ENDPOINTS[method];
1533
1542
  try {
@@ -1538,12 +1547,17 @@ window.__ModuleLoader__.load({
1538
1547
  if (disposed && controller.signal.aborted) throw disposedError();
1539
1548
  throw connectionFailure(endpoint, error);
1540
1549
  }
1541
- return unwrap(endpoint, result);
1550
+ return result;
1542
1551
  } finally {
1552
+ signal?.removeEventListener("abort", abort);
1543
1553
  inFlight.delete(controller);
1544
1554
  }
1545
1555
  }
1556
+ async function invoke(method, input) {
1557
+ return unwrap(WORKTREE_CONNECTION_ENDPOINTS[method], await call(method, input));
1558
+ }
1546
1559
  return {
1560
+ probeHost: (signal) => call("listBindings", { workspaceId: "" }, signal),
1547
1561
  listWorktrees: (input) => invoke("listWorktrees", input),
1548
1562
  listWorktreeCommits: (input) => invoke("listWorktreeCommits", input),
1549
1563
  listWorktreeCommitFiles: (input) => invoke("listWorktreeCommitFiles", input),
@@ -1595,7 +1609,103 @@ window.__ModuleLoader__.load({
1595
1609
  };
1596
1610
  }
1597
1611
  //#endregion
1598
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_f7c3c8176e38/packages/clutch-dsh-worktree/src/client/context/worktree-context.css.mjs
1612
+ //#region lib/client/restart-notice.js
1613
+ const MISSING_HOST_CODES = /* @__PURE__ */ new Set([
1614
+ "gateway/service-unavailable",
1615
+ "gateway/definition-unavailable",
1616
+ "gateway/invocation-unavailable"
1617
+ ]);
1618
+ /** A transient reminder owned by one Client fiber, independent of ready view content. */
1619
+ var RestartNotice = class {
1620
+ probe;
1621
+ visible = false;
1622
+ notified = false;
1623
+ disposed = false;
1624
+ pending;
1625
+ listeners = /* @__PURE__ */ new Set();
1626
+ constructor(probe) {
1627
+ this.probe = probe;
1628
+ }
1629
+ getSnapshot = () => this.visible;
1630
+ subscribe = (listener) => {
1631
+ this.listeners.add(listener);
1632
+ return () => this.listeners.delete(listener);
1633
+ };
1634
+ dismiss = () => this.setVisible(false);
1635
+ async check() {
1636
+ if (this.disposed) return;
1637
+ this.pending?.abort();
1638
+ const controller = new AbortController();
1639
+ this.pending = controller;
1640
+ const timer = setTimeout(() => controller.abort(), 5e3);
1641
+ try {
1642
+ const result = await this.probe(controller.signal);
1643
+ if (this.disposed || controller.signal.aborted || this.pending !== controller) return;
1644
+ if (result.ok) this.dismiss();
1645
+ else if (!this.notified && MISSING_HOST_CODES.has(result.error?.code ?? "")) {
1646
+ this.notified = true;
1647
+ this.setVisible(true);
1648
+ }
1649
+ } catch {} finally {
1650
+ clearTimeout(timer);
1651
+ if (this.pending === controller) this.pending = void 0;
1652
+ }
1653
+ }
1654
+ dispose() {
1655
+ this.disposed = true;
1656
+ this.pending?.abort();
1657
+ this.listeners.clear();
1658
+ }
1659
+ setVisible(visible) {
1660
+ if (this.visible === visible || this.disposed) return;
1661
+ this.visible = visible;
1662
+ for (const listener of this.listeners) listener();
1663
+ }
1664
+ };
1665
+ //#endregion
1666
+ //#region lib/client/surface/components/RestartToast.js
1667
+ function RestartToast({ notice, t }) {
1668
+ if (!(0, react.useSyncExternalStore)(notice.subscribe, notice.getSnapshot, notice.getSnapshot)) return null;
1669
+ return (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
1670
+ text: t("restartRequired"),
1671
+ holdMs: 8e3,
1672
+ onDone: notice.dismiss
1673
+ });
1674
+ }
1675
+ //#endregion
1676
+ //#region lib/client/dsh-icon-compat.js
1677
+ /** Resolve a legacy size-named export or the equivalent DSH 1.7 weighted export. */
1678
+ function createDshIconAlias(exports, legacyName, currentName) {
1679
+ return function DshIconAlias(props) {
1680
+ const candidate = exports[legacyName] ?? exports[currentName];
1681
+ if (typeof candidate !== "function") throw new Error(`Missing DSH icon export: ${legacyName} or ${currentName}`);
1682
+ return (0, react.createElement)(candidate, props);
1683
+ };
1684
+ }
1685
+ //#endregion
1686
+ //#region lib/client/dsh-icons.js
1687
+ const exports$1 = _deepseek_ai_dsh_client_ui_primitives;
1688
+ const IconArchiveOutline20 = createDshIconAlias(exports$1, "IconArchiveOutline20", "IconArchiveOutlineRegular");
1689
+ const IconBranchOutline16 = createDshIconAlias(exports$1, "IconBranchOutline16", "IconBranchOutlineRegular");
1690
+ const IconChevronDownOutline14 = createDshIconAlias(exports$1, "IconChevronDownOutline14", "IconChevronDownOutlineRegular");
1691
+ const IconChevronRightOutline14 = createDshIconAlias(exports$1, "IconChevronRightOutline14", "IconChevronRightOutlineRegular");
1692
+ const IconCheckOutline16 = createDshIconAlias(exports$1, "IconCheckOutline16", "IconCheckOutlineRegular");
1693
+ const IconCloseFill14 = createDshIconAlias(exports$1, "IconCloseFill14", "IconCloseFillRegular");
1694
+ const IconCloseOutline16 = createDshIconAlias(exports$1, "IconCloseOutline16", "IconCloseOutlineRegular");
1695
+ const IconCopyOutline16 = createDshIconAlias(exports$1, "IconCopyOutline16", "IconCopyOutlineRegular");
1696
+ const IconEditOutline16 = createDshIconAlias(exports$1, "IconEditOutline16", "IconEditOutlineRegular");
1697
+ const IconEllipsisOutline16 = createDshIconAlias(exports$1, "IconEllipsisOutline16", "IconEllipsisOutlineRegular");
1698
+ const IconFolderClose16 = createDshIconAlias(exports$1, "IconFolderClose16", "IconFolderCloseRegular");
1699
+ const IconFolderOpen16 = createDshIconAlias(exports$1, "IconFolderOpen16", "IconFolderOpenRegular");
1700
+ const IconPanelLeftOutline16 = createDshIconAlias(exports$1, "IconPanelLeftOutline16", "IconPanelLeftOutlineRegular");
1701
+ const IconPlusOutline16 = createDshIconAlias(exports$1, "IconPlusOutline16", "IconPlusOutlineRegular");
1702
+ const IconProjectAddOutline16 = createDshIconAlias(exports$1, "IconProjectAddOutline16", "IconProjectAddOutlineRegular");
1703
+ const IconRefreshOutline16 = createDshIconAlias(exports$1, "IconRefreshOutline16", "IconRefreshOutlineRegular");
1704
+ const IconRightUpOutline16 = createDshIconAlias(exports$1, "IconRightUpOutline16", "IconRightUpOutlineRegular");
1705
+ const IconSearchOutline16 = createDshIconAlias(exports$1, "IconSearchOutline16", "IconSearchOutlineRegular");
1706
+ const IconTrashOutline16 = createDshIconAlias(exports$1, "IconTrashOutline16", "IconTrashOutlineRegular");
1707
+ //#endregion
1708
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_63cf54e5ec74/packages/clutch-dsh-worktree/src/client/context/worktree-context.css.mjs
1599
1709
  const css$5 = ".-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";
1600
1710
  const styleId$5 = "@cerbur/clutch-dsh-worktree/worktree-context.css";
1601
1711
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree-context.css\"]") === null) {
@@ -1623,10 +1733,9 @@ window.__ModuleLoader__.load({
1623
1733
  className: worktree_context_css_default.headerContext,
1624
1734
  title: value.label,
1625
1735
  "aria-label": ariaLabel,
1626
- children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {
1736
+ children: [(0, react_jsx_runtime.jsx)(IconBranchOutline16, {
1627
1737
  size: 14,
1628
- className: worktree_context_css_default.contextIcon,
1629
- "aria-hidden": "true"
1738
+ className: worktree_context_css_default.contextIcon
1630
1739
  }), (0, react_jsx_runtime.jsx)("span", {
1631
1740
  className: worktree_context_css_default.contextLabel,
1632
1741
  children: value.label
@@ -1660,8 +1769,8 @@ window.__ModuleLoader__.load({
1660
1769
  globalSetViewMode?.(mode);
1661
1770
  }
1662
1771
  //#endregion
1663
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_f7c3c8176e38/packages/clutch-dsh-worktree/src/client/worktree.css.mjs
1664
- const css$4 = ".-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: 56px;\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@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-worktreeModalTabs {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTab {\n border: 0;\n border-bottom: 2px solid transparent;\n padding: 4px 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\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-worktreeImportSelect {\n width: 100%;\n min-width: 0;\n padding: 7px 8px;\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: 13px;\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-content {\n min-height: 0;\n flex: 1;\n overflow: auto;\n padding: 0 10px 12px;\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.-cerbur-clutch-dsh-worktree-worktreeImportSelect: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-workspaceList {\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-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-brand-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/* A collapsed running row keeps one shared scroll container for its label. */\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel,\n/* Once the action rail is revealed, allow long branch labels to scroll inline. */\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeLabel,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-worktreeLabel {\n overflow-x: auto;\n overflow-y: hidden;\n text-overflow: clip;\n scrollbar-width: none;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar {\n display: none;\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}\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 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\n.-cerbur-clutch-dsh-worktree-notificationDetails > summary {\n cursor: pointer;\n padding: 8px;\n font-size: 12px;\n}\n";
1772
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_63cf54e5ec74/packages/clutch-dsh-worktree/src/client/worktree.css.mjs
1773
+ const css$4 = ".-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-worktreeModalTabs {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTab {\n border: 0;\n border-bottom: 2px solid transparent;\n padding: 4px 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\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-worktreeImportSelect {\n width: 100%;\n min-width: 0;\n padding: 7px 8px;\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: 13px;\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-content {\n min-height: 0;\n flex: 1;\n overflow: auto;\n padding: 0 10px 12px;\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.-cerbur-clutch-dsh-worktree-worktreeImportSelect: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-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-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-brand-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/* A collapsed running row keeps one shared scroll container for its label. */\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel,\n/* Once the action rail is revealed, allow long branch labels to scroll inline. */\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeLabel,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-worktreeLabel {\n overflow-x: auto;\n overflow-y: hidden;\n text-overflow: clip;\n scrollbar-width: none;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar {\n display: none;\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}\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 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\n.-cerbur-clutch-dsh-worktree-notificationDetails > summary {\n cursor: pointer;\n padding: 8px;\n font-size: 12px;\n}\n";
1665
1774
  const styleId$4 = "@cerbur/clutch-dsh-worktree/worktree.css";
1666
1775
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree.css\"]") === null) {
1667
1776
  const tag = document.createElement("style");
@@ -1674,6 +1783,7 @@ window.__ModuleLoader__.load({
1674
1783
  "action": "-cerbur-clutch-dsh-worktree-action",
1675
1784
  "actionLabel": "-cerbur-clutch-dsh-worktree-actionLabel",
1676
1785
  "surface": "-cerbur-clutch-dsh-worktree-surface",
1786
+ "motionExits": "-cerbur-clutch-dsh-worktree-motionExits",
1677
1787
  "wideContent": "-cerbur-clutch-dsh-worktree-wideContent",
1678
1788
  "worktreeModalTabs": "-cerbur-clutch-dsh-worktree-worktreeModalTabs",
1679
1789
  "worktreeModalTab": "-cerbur-clutch-dsh-worktree-worktreeModalTab",
@@ -1783,7 +1893,7 @@ window.__ModuleLoader__.load({
1783
1893
  onClick: () => {
1784
1894
  actions.setViewMode(active ? "workspace-session" : "worktree");
1785
1895
  },
1786
- children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, { size: wide ? 16 : 18 }), wide && (0, react_jsx_runtime.jsx)("span", {
1896
+ children: [(0, react_jsx_runtime.jsx)(IconBranchOutline16, { size: wide ? 16 : 18 }), wide && (0, react_jsx_runtime.jsx)("span", {
1787
1897
  className: worktree_css_default.actionLabel,
1788
1898
  children: t("mode.label")
1789
1899
  })]
@@ -1835,7 +1945,7 @@ window.__ModuleLoader__.load({
1835
1945
  });
1836
1946
  }
1837
1947
  //#endregion
1838
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_f7c3c8176e38/packages/clutch-dsh-worktree/src/client/dashboard/dashboard-header-action.css.mjs
1948
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_63cf54e5ec74/packages/clutch-dsh-worktree/src/client/dashboard/dashboard-header-action.css.mjs
1839
1949
  const css$3 = "/* 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";
1840
1950
  const styleId$3 = "@cerbur/clutch-dsh-worktree/dashboard-header-action.css";
1841
1951
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard-header-action.css\"]") === null) {
@@ -2065,6 +2175,7 @@ window.__ModuleLoader__.load({
2065
2175
  case "WORKTREE_REGISTRATION_SESSION_UNAVAILABLE": return t("error.worktreeRegistrationSessionUnavailable");
2066
2176
  case "WORKSPACE_RENAME_UNAVAILABLE": return t("error.workspaceRenameUnavailable");
2067
2177
  case "WORKSPACE_DELETE_UNAVAILABLE": return t("error.workspaceDeleteUnavailable");
2178
+ case "WORKSPACE_ROOT_MISSING": return t("error.workspaceRootMissing", { rootPath: detail(error, "rootPath") });
2068
2179
  case "SESSION_RENAME_UNAVAILABLE": return t("error.sessionRenameUnavailable");
2069
2180
  case "SESSION_BINDING_FAILED": return t("error.sessionBindingFailed", {
2070
2181
  sessionId: detail(error, "sessionId"),
@@ -2308,6 +2419,7 @@ window.__ModuleLoader__.load({
2308
2419
  /** Return copyable, read-only setup commands for a Git readiness state. */
2309
2420
  function worktreeSetupCommands(status) {
2310
2421
  switch (status) {
2422
+ case "workspaceMissing": return [];
2311
2423
  case "gitNotInstalled": return [];
2312
2424
  case "noRepository": return [
2313
2425
  "git init",
@@ -2326,6 +2438,10 @@ window.__ModuleLoader__.load({
2326
2438
  }
2327
2439
  function readinessFromBranchError(error) {
2328
2440
  const viewError = toWorktreeViewError(error);
2441
+ if (viewError.code === "WORKSPACE_ROOT_MISSING") return {
2442
+ status: "workspaceMissing",
2443
+ error: viewError
2444
+ };
2329
2445
  if (viewError.code === "GIT_NOT_INSTALLED") return {
2330
2446
  status: "gitNotInstalled",
2331
2447
  error: viewError
@@ -2447,6 +2563,13 @@ window.__ModuleLoader__.load({
2447
2563
  return sessionIds.filter((sessionId) => !archivedSessionIds.includes(sessionId));
2448
2564
  }
2449
2565
  //#endregion
2566
+ //#region lib/client/session/session-selection.js
2567
+ /** Prefer the legacy selected-id field; DSH 1.7 represents selection by mainView retention. */
2568
+ function currentSessionIdFromList(sessions) {
2569
+ if (sessions.current !== void 0) return sessions.current;
2570
+ return Object.keys(sessions.byId).find((sessionId) => (sessions.byId[sessionId]?.retainedBy?.mainView ?? 0) > 0);
2571
+ }
2572
+ //#endregion
2450
2573
  //#region lib/client/session/session-view.js
2451
2574
  function isPendingInteractionStatus(value) {
2452
2575
  return value === "approval" || value === "plan-review" || value === "question";
@@ -2621,7 +2744,7 @@ window.__ModuleLoader__.load({
2621
2744
  }
2622
2745
  /** Native tree visibility: ordinary rows plus the currently selected blank row. */
2623
2746
  function isVisibleSession(sessionId, sessions) {
2624
- return !isBlankSession(sessionId, sessions) || sessions.current === sessionId;
2747
+ return !isBlankSession(sessionId, sessions) || currentSessionIdFromList(sessions) === sessionId;
2625
2748
  }
2626
2749
  /** Filter a group without mutating its source order. */
2627
2750
  function filterVisibleSessionIds(sessionIds, sessions) {
@@ -2774,6 +2897,7 @@ window.__ModuleLoader__.load({
2774
2897
  }
2775
2898
  function worktreeSetupMessage(status, t) {
2776
2899
  switch (status) {
2900
+ case "workspaceMissing": return t("worktree.setup.workspaceMissing");
2777
2901
  case "gitNotInstalled": return t("worktree.setup.gitNotInstalled");
2778
2902
  case "noRepository": return t("worktree.setup.noRepository");
2779
2903
  case "noInitialCommit": return t("worktree.setup.noInitialCommit");
@@ -3607,7 +3731,7 @@ window.__ModuleLoader__.load({
3607
3731
  //#endregion
3608
3732
  //#region lib/client/view/navigation.js
3609
3733
  /** Open an existing Session through DSH without touching the peer view mode. */
3610
- function openWorktreeSession(opener, sessionId) {
3734
+ function openWorktreeSession$1(opener, sessionId) {
3611
3735
  opener.open(sessionId);
3612
3736
  }
3613
3737
  //#endregion
@@ -3879,12 +4003,12 @@ window.__ModuleLoader__.load({
3879
4003
  const workspaceMenuItems = [{
3880
4004
  id: "rename",
3881
4005
  label: t("workspace.rename"),
3882
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconEditOutline16, {}),
4006
+ icon: (0, react_jsx_runtime.jsx)(IconEditOutline16, {}),
3883
4007
  disabled: actionPending
3884
4008
  }, {
3885
4009
  id: "delete",
3886
4010
  label: t("workspace.delete"),
3887
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutline16, {}),
4011
+ icon: (0, react_jsx_runtime.jsx)(IconTrashOutline16, {}),
3888
4012
  danger: true,
3889
4013
  disabled: actionPending
3890
4014
  }];
@@ -3893,6 +4017,7 @@ window.__ModuleLoader__.load({
3893
4017
  const groupActivityLabel = groupActivityStatus === void 0 ? void 0 : sessionStatusLabel$1(t, groupActivityStatus);
3894
4018
  return (0, react_jsx_runtime.jsxs)("div", {
3895
4019
  className: `${worktree_css_default.workspaceRow} ${markerClass}`,
4020
+ "data-worktree-motion-key": `workspace:${workspace.workspaceId}`,
3896
4021
  "data-workspace-drag": drag.active ? "active" : void 0,
3897
4022
  "data-group-activity": groupActivityVisible ? "true" : void 0,
3898
4023
  "data-menu-open": menuOpen || void 0,
@@ -3927,12 +4052,12 @@ window.__ModuleLoader__.load({
3927
4052
  event.stopPropagation();
3928
4053
  onToggle();
3929
4054
  },
3930
- children: expanded ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { size: 18 }) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutline14, { size: 18 })
4055
+ children: expanded ? (0, react_jsx_runtime.jsx)(IconChevronDownOutline14, { size: 18 }) : (0, react_jsx_runtime.jsx)(IconChevronRightOutline14, { size: 18 })
3931
4056
  }),
3932
4057
  (0, react_jsx_runtime.jsx)("span", {
3933
4058
  className: worktree_css_default.workspaceIcon,
3934
4059
  "aria-hidden": "true",
3935
- children: expanded ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconFolderOpen16, {}) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconFolderClose16, {})
4060
+ children: expanded ? (0, react_jsx_runtime.jsx)(IconFolderOpen16, {}) : (0, react_jsx_runtime.jsx)(IconFolderClose16, {})
3936
4061
  }),
3937
4062
  (0, react_jsx_runtime.jsx)("span", {
3938
4063
  className: worktree_css_default.workspaceTitle,
@@ -3973,7 +4098,7 @@ window.__ModuleLoader__.load({
3973
4098
  event.stopPropagation();
3974
4099
  onMenuOpenChange(!menuOpen);
3975
4100
  },
3976
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconEllipsisOutline16, {})
4101
+ children: (0, react_jsx_runtime.jsx)(IconEllipsisOutline16, {})
3977
4102
  })
3978
4103
  })
3979
4104
  }),
@@ -3986,7 +4111,7 @@ window.__ModuleLoader__.load({
3986
4111
  event.stopPropagation();
3987
4112
  onCreateWorktree();
3988
4113
  },
3989
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutline16, {})
4114
+ children: (0, react_jsx_runtime.jsx)(IconPlusOutline16, {})
3990
4115
  })
3991
4116
  ]
3992
4117
  })
@@ -4070,6 +4195,7 @@ window.__ModuleLoader__.load({
4070
4195
  };
4071
4196
  const row = (0, react_jsx_runtime.jsxs)("div", {
4072
4197
  className: `${worktree_css_default.worktreeRow} ${markerClass}`,
4198
+ "data-worktree-motion-key": `group:${kind}:${menu?.copyPath ?? ""}`,
4073
4199
  "data-main-group": main ? "true" : void 0,
4074
4200
  "data-main-expanded": main ? String(expanded) : void 0,
4075
4201
  "data-group-activity": groupActivityVisible ? "true" : void 0,
@@ -4095,7 +4221,7 @@ window.__ModuleLoader__.load({
4095
4221
  event.stopPropagation();
4096
4222
  onToggle();
4097
4223
  },
4098
- children: expanded ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { size: 18 }) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutline14, { size: 18 })
4224
+ children: expanded ? (0, react_jsx_runtime.jsx)(IconChevronDownOutline14, { size: 18 }) : (0, react_jsx_runtime.jsx)(IconChevronRightOutline14, { size: 18 })
4099
4225
  }),
4100
4226
  (0, react_jsx_runtime.jsx)("span", {
4101
4227
  className: worktree_css_default.worktreeIcon,
@@ -4153,19 +4279,19 @@ window.__ModuleLoader__.load({
4153
4279
  ...menu.showCreate ? [{
4154
4280
  id: "create",
4155
4281
  label: t("worktree.createNew"),
4156
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutline16, {}),
4282
+ icon: (0, react_jsx_runtime.jsx)(IconPlusOutline16, {}),
4157
4283
  disabled: menu.disabled || menu.onCreateWorktree === void 0
4158
4284
  }] : [],
4159
4285
  {
4160
4286
  id: "copy-path",
4161
4287
  label: t("worktree.copyPath"),
4162
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCopyOutline16, {}),
4288
+ icon: (0, react_jsx_runtime.jsx)(IconCopyOutline16, {}),
4163
4289
  disabled: menu.disabled
4164
4290
  },
4165
4291
  ...menu.showRemove ? [{
4166
4292
  id: "remove",
4167
4293
  label: t("worktree.archive"),
4168
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconArchiveOutline20, { size: 16 }),
4294
+ icon: (0, react_jsx_runtime.jsx)(IconArchiveOutline20, { size: 16 }),
4169
4295
  danger: true,
4170
4296
  disabled: menu.disabled || menu.onRemove === void 0
4171
4297
  }] : [],
@@ -4182,20 +4308,20 @@ window.__ModuleLoader__.load({
4182
4308
  ...menu.showUnarchive ? [{
4183
4309
  id: "unarchive",
4184
4310
  label: menu.unarchiveDisabledReason ? `${t("worktree.unarchive")} (${menu.unarchiveDisabledReason})` : t("worktree.unarchive"),
4185
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutline16, {}),
4311
+ icon: (0, react_jsx_runtime.jsx)(IconRefreshOutline16, {}),
4186
4312
  disabled: menu.disabled || menu.unarchiveDisabled || menu.onUnarchive === void 0
4187
4313
  }] : [],
4188
4314
  ...menu.showCleanDisk ? [{
4189
4315
  id: "clean-disk",
4190
4316
  label: menu.cleanDiskDisabledReason ? `${t("worktree.cleanDisk")} (${menu.cleanDiskDisabledReason})` : t("worktree.cleanDisk"),
4191
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutline16, {}),
4317
+ icon: (0, react_jsx_runtime.jsx)(IconTrashOutline16, {}),
4192
4318
  danger: true,
4193
4319
  disabled: menu.disabled || menu.cleanDiskDisabled || menu.onCleanDisk === void 0
4194
4320
  }] : [],
4195
4321
  ...menu.showForget ? [{
4196
4322
  id: "forget",
4197
4323
  label: menu.forgetDisabledReason ? `${t("worktree.forget")} (${menu.forgetDisabledReason})` : t("worktree.forget"),
4198
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutline16, {}),
4324
+ icon: (0, react_jsx_runtime.jsx)(IconTrashOutline16, {}),
4199
4325
  danger: true,
4200
4326
  disabled: menu.disabled || menu.forgetDisabled || menu.onForget === void 0
4201
4327
  }] : []
@@ -4223,7 +4349,7 @@ window.__ModuleLoader__.load({
4223
4349
  event.stopPropagation();
4224
4350
  menu.onOpenChange(!menu.open);
4225
4351
  },
4226
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconEllipsisOutline16, {})
4352
+ children: (0, react_jsx_runtime.jsx)(IconEllipsisOutline16, {})
4227
4353
  })
4228
4354
  })
4229
4355
  }),
@@ -4237,7 +4363,7 @@ window.__ModuleLoader__.load({
4237
4363
  event.stopPropagation();
4238
4364
  onCreateSession();
4239
4365
  },
4240
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutline16, {})
4366
+ children: (0, react_jsx_runtime.jsx)(IconPlusOutline16, {})
4241
4367
  })
4242
4368
  ]
4243
4369
  })
@@ -4280,25 +4406,25 @@ window.__ModuleLoader__.load({
4280
4406
  {
4281
4407
  id: "rename",
4282
4408
  label: t("session.rename"),
4283
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconEditOutline16, {}),
4409
+ icon: (0, react_jsx_runtime.jsx)(IconEditOutline16, {}),
4284
4410
  disabled: onRename === void 0 || actionPending
4285
4411
  },
4286
4412
  {
4287
4413
  id: "fork",
4288
4414
  label: t("session.fork"),
4289
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}),
4415
+ icon: (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
4290
4416
  disabled: onFork === void 0 || actionPending
4291
4417
  },
4292
4418
  {
4293
4419
  id: "archive",
4294
4420
  label: t("session.archive"),
4295
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconArchiveOutline20, { size: 16 }),
4421
+ icon: (0, react_jsx_runtime.jsx)(IconArchiveOutline20, { size: 16 }),
4296
4422
  disabled: onArchive === void 0 || actionPending
4297
4423
  },
4298
4424
  {
4299
4425
  id: "copy-session-id",
4300
4426
  label: t("session.copyId"),
4301
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCopyOutline16, {})
4427
+ icon: (0, react_jsx_runtime.jsx)(IconCopyOutline16, {})
4302
4428
  }
4303
4429
  ];
4304
4430
  const statusLabel = presentation === void 0 ? void 0 : sessionStatusLabel$1(t, presentation.status);
@@ -4309,6 +4435,7 @@ window.__ModuleLoader__.load({
4309
4435
  anchor: (0, react_jsx_runtime.jsxs)("div", {
4310
4436
  className: `${worktree_css_default.treeSessionRow} ${markerClass}`,
4311
4437
  "data-session-id": sessionId,
4438
+ "data-worktree-motion-key": `session:${sessionId}`,
4312
4439
  "data-session-blank": blank ? "true" : void 0,
4313
4440
  "data-session-current": current ? "true" : void 0,
4314
4441
  "data-session-drag": drag.active ? "active" : void 0,
@@ -4383,7 +4510,7 @@ window.__ModuleLoader__.load({
4383
4510
  event.stopPropagation();
4384
4511
  setMenuOpen((current) => !current);
4385
4512
  },
4386
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconEllipsisOutline16, {})
4513
+ children: (0, react_jsx_runtime.jsx)(IconEllipsisOutline16, {})
4387
4514
  })
4388
4515
  })
4389
4516
  })]
@@ -4487,7 +4614,7 @@ window.__ModuleLoader__.load({
4487
4614
  worktreeId: record.worktreeId,
4488
4615
  expanded: worktreeExpanded,
4489
4616
  groupActivityStatus: aggregateSessionStatus(worktreeSessionIds, sessionPresentations),
4490
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}),
4617
+ icon: (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
4491
4618
  workspaceTitle: workspace.title,
4492
4619
  state,
4493
4620
  stateLabel,
@@ -4651,7 +4778,7 @@ window.__ModuleLoader__.load({
4651
4778
  worktreeId: record.worktreeId,
4652
4779
  expanded: worktreeExpanded,
4653
4780
  groupActivityStatus: aggregateSessionStatus(worktreeSessionIds, sessionPresentations),
4654
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}),
4781
+ icon: (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
4655
4782
  workspaceTitle: workspace.title,
4656
4783
  state,
4657
4784
  stateLabel,
@@ -4797,7 +4924,7 @@ window.__ModuleLoader__.load({
4797
4924
  label: `${t("worktree.archivedGroup")} (${archivedWorktrees.length})`,
4798
4925
  expanded: isArchivedExpanded,
4799
4926
  groupActivityStatus: aggregateSessionStatus(filterArchivedSessionIds(archivedWorktrees.flatMap((record) => bindingIdsFor(bindings, record.worktreeId).filter((sessionId) => sessions.ids.includes(sessionId))), archivedSessionIds), sessionPresentations),
4800
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconArchiveOutline20, { size: 16 }),
4927
+ icon: (0, react_jsx_runtime.jsx)(IconArchiveOutline20, { size: 16 }),
4801
4928
  workspaceTitle: workspace.title,
4802
4929
  onToggle: () => {
4803
4930
  toggleArchivedWorkspace(workspace.workspaceId);
@@ -4826,6 +4953,145 @@ window.__ModuleLoader__.load({
4826
4953
  });
4827
4954
  }
4828
4955
  //#endregion
4956
+ //#region lib/client/surface/components/AnimatedTree.js
4957
+ /** Plugin-owned equivalent of native keyed-row fades and movement, without importing DSH internals. */
4958
+ var AnimatedTree = class extends react.Component {
4959
+ armed = false;
4960
+ list = (0, react.createRef)();
4961
+ exits = (0, react.createRef)();
4962
+ movements = /* @__PURE__ */ new Map();
4963
+ removed = /* @__PURE__ */ new Map();
4964
+ getSnapshotBeforeUpdate(previous) {
4965
+ if (!this.armed || !previous.ready || !this.props.ready || previous.resetKey !== this.props.resetKey || !this.list.current || typeof this.list.current.animate !== "function" || window.matchMedia("(prefers-reduced-motion: reduce)").matches) return null;
4966
+ return this.positions();
4967
+ }
4968
+ componentDidUpdate(_previous, _state, snapshot) {
4969
+ if (!snapshot) {
4970
+ this.clear();
4971
+ return;
4972
+ }
4973
+ const next = this.positions();
4974
+ const keys = [...snapshot.keys()];
4975
+ const nextKeys = [...next.keys()];
4976
+ if (keys.length === next.size && keys.every((key, index) => key === nextKeys[index])) return;
4977
+ this.cancelMovements();
4978
+ const list = this.list.current;
4979
+ const viewport = (list.closest("[data-worktree-scrollport]") ?? list).getBoundingClientRect();
4980
+ const visible = (rect) => rect.bottom > viewport.top && rect.top < viewport.bottom;
4981
+ for (const [key, row] of next) {
4982
+ this.removeExit(key);
4983
+ const old = snapshot.get(key);
4984
+ if (!visible(row.rect) && (!old || !visible(old.rect))) continue;
4985
+ if (!old) {
4986
+ this.move(row.element, [{ opacity: 0 }, { opacity: 1 }], 100);
4987
+ continue;
4988
+ }
4989
+ const dx = old.rect.left - row.rect.left;
4990
+ const dy = old.rect.top - row.rect.top;
4991
+ if (dx === 0 && dy === 0 && old.opacity === 1) continue;
4992
+ this.move(row.element, [{
4993
+ transform: `translate(${dx}px, ${dy}px)`,
4994
+ opacity: old.opacity
4995
+ }, {
4996
+ transform: "translate(0, 0)",
4997
+ opacity: 1
4998
+ }], 200);
4999
+ }
5000
+ const overlay = this.exits.current;
5001
+ const origin = overlay.getBoundingClientRect();
5002
+ for (const [key, row] of snapshot) {
5003
+ if (next.has(key) || !visible(row.rect)) continue;
5004
+ this.removeExit(key);
5005
+ const clone = row.element.cloneNode(true);
5006
+ clone.removeAttribute("data-worktree-motion-key");
5007
+ clone.removeAttribute("id");
5008
+ clone.inert = true;
5009
+ Object.assign(clone.style, {
5010
+ position: "absolute",
5011
+ margin: "0",
5012
+ transform: "none",
5013
+ boxSizing: "border-box",
5014
+ left: `${row.rect.left - origin.left}px`,
5015
+ top: `${row.rect.top - origin.top}px`,
5016
+ width: `${row.rect.width}px`,
5017
+ height: `${row.rect.height}px`
5018
+ });
5019
+ overlay.append(clone);
5020
+ const animation = clone.animate([{ opacity: row.opacity }, { opacity: 0 }], {
5021
+ duration: 100,
5022
+ easing: "ease-out",
5023
+ fill: "forwards"
5024
+ });
5025
+ this.removed.set(key, {
5026
+ element: clone,
5027
+ animation
5028
+ });
5029
+ animation.onfinish = () => this.removeExit(key);
5030
+ }
5031
+ }
5032
+ componentWillUnmount() {
5033
+ this.clear();
5034
+ }
5035
+ positions() {
5036
+ const rows = this.list.current.querySelectorAll("[data-worktree-motion-key]");
5037
+ return new Map(Array.from(rows, (element) => {
5038
+ const workspace = element.closest("[data-workspace-id]")?.dataset.workspaceId ?? "";
5039
+ return [JSON.stringify([workspace, element.dataset.worktreeMotionKey]), {
5040
+ element,
5041
+ rect: element.getBoundingClientRect(),
5042
+ opacity: this.movements.has(element) ? Number(getComputedStyle(element).opacity) : 1
5043
+ }];
5044
+ }));
5045
+ }
5046
+ move(element, frames, duration) {
5047
+ const animation = element.animate(frames, {
5048
+ duration,
5049
+ easing: "ease-out"
5050
+ });
5051
+ this.movements.set(element, animation);
5052
+ animation.onfinish = () => {
5053
+ this.movements.delete(element);
5054
+ animation.cancel();
5055
+ };
5056
+ }
5057
+ cancelMovements() {
5058
+ for (const animation of this.movements.values()) {
5059
+ animation.onfinish = null;
5060
+ animation.cancel();
5061
+ }
5062
+ this.movements.clear();
5063
+ }
5064
+ removeExit(key) {
5065
+ const exit = this.removed.get(key);
5066
+ if (!exit) return;
5067
+ exit.animation.onfinish = null;
5068
+ exit.animation.cancel();
5069
+ exit.element.remove();
5070
+ this.removed.delete(key);
5071
+ }
5072
+ clear() {
5073
+ this.cancelMovements();
5074
+ for (const key of this.removed.keys()) this.removeExit(key);
5075
+ }
5076
+ render() {
5077
+ return (0, react_jsx_runtime.jsxs)("div", {
5078
+ ref: this.list,
5079
+ className: this.props.className,
5080
+ onPointerDownCapture: () => {
5081
+ this.armed = true;
5082
+ },
5083
+ onKeyDownCapture: () => {
5084
+ this.armed = true;
5085
+ },
5086
+ children: [this.props.children, (0, react_jsx_runtime.jsx)("div", {
5087
+ ref: this.exits,
5088
+ className: worktree_css_default.motionExits,
5089
+ "aria-hidden": "true"
5090
+ })]
5091
+ });
5092
+ }
5093
+ };
5094
+ //#endregion
4829
5095
  //#region lib/client/surface/components/WorkspaceTree.js
4830
5096
  function WorkspaceTree({ props, read, source, expansion, ordering, drag, mutation, menus, registration, native, lifecycle, session, lifecycleState }) {
4831
5097
  const { t, createMainSession, openSession, renameSession, forkSession, archiveSession } = props;
@@ -4839,8 +5105,10 @@ window.__ModuleLoader__.load({
4839
5105
  const { openWorktreeCreator } = registration;
4840
5106
  const { openWorkspaceRename, openWorkspaceDelete, openSessionRename, archiveWorktreeSession } = native;
4841
5107
  const visibleWorkspaces = workspaces.items.filter((workspace) => workspaceMatches(workspace, viewByWorkspace.get(workspace.workspaceId), sessions, query));
4842
- return (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: (0, react_jsx_runtime.jsx)("div", {
5108
+ return (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: (0, react_jsx_runtime.jsx)(AnimatedTree, {
4843
5109
  className: worktree_css_default.workspaceList,
5110
+ ready: sessions.phase !== "pending" && workspaceDrag === void 0 && worktreeDrag === void 0 && sessionDrag === void 0,
5111
+ resetKey: query,
4844
5112
  children: visibleWorkspaces.length === 0 ? (0, react_jsx_runtime.jsx)("p", {
4845
5113
  className: worktree_css_default.empty,
4846
5114
  children: t("workspace.noMatches")
@@ -4933,7 +5201,7 @@ window.__ModuleLoader__.load({
4933
5201
  label: mainLabel,
4934
5202
  expanded: mainExpanded,
4935
5203
  groupActivityStatus: aggregateSessionStatus(mainSessionIds, sessionPresentations),
4936
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}),
5204
+ icon: (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
4937
5205
  workspaceTitle: workspace.title,
4938
5206
  onToggle: () => {
4939
5207
  toggleMain(workspace.workspaceId);
@@ -5000,7 +5268,7 @@ window.__ModuleLoader__.load({
5000
5268
  },
5001
5269
  onCommitDrag: commitSessionDrag,
5002
5270
  onOpen: (sessionId) => {
5003
- openWorktreeSession({ open: openSession }, sessionId);
5271
+ openWorktreeSession$1({ open: openSession }, sessionId);
5004
5272
  },
5005
5273
  onRename: renameSession === void 0 ? void 0 : openSessionRename,
5006
5274
  onFork: forkSession,
@@ -5123,6 +5391,7 @@ window.__ModuleLoader__.load({
5123
5391
  ref: expansion.contentRef,
5124
5392
  className: worktree_css_default.content,
5125
5393
  tabIndex: 0,
5394
+ "data-worktree-scrollport": true,
5126
5395
  children: [
5127
5396
  (0, react_jsx_runtime.jsx)(NotificationToasts, {
5128
5397
  notices,
@@ -5346,7 +5615,7 @@ window.__ModuleLoader__.load({
5346
5615
  setSearchExpanded(true);
5347
5616
  searchInput.current?.focus();
5348
5617
  },
5349
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutline16, { size: searchExpanded ? 12 : 14 })
5618
+ children: (0, react_jsx_runtime.jsx)(IconSearchOutline16, { size: searchExpanded ? 12 : 14 })
5350
5619
  })
5351
5620
  }),
5352
5621
  (0, react_jsx_runtime.jsx)("input", {
@@ -5376,7 +5645,7 @@ window.__ModuleLoader__.load({
5376
5645
  setSearchQuery("");
5377
5646
  setSearchExpanded(false);
5378
5647
  },
5379
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseFill14, {})
5648
+ children: (0, react_jsx_runtime.jsx)(IconCloseFill14, {})
5380
5649
  })
5381
5650
  ]
5382
5651
  })
@@ -5412,7 +5681,7 @@ window.__ModuleLoader__.load({
5412
5681
  onClick: () => {
5413
5682
  if (createWorkspace !== void 0) runMutation(createWorkspace);
5414
5683
  },
5415
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconProjectAddOutline16, {})
5684
+ children: (0, react_jsx_runtime.jsx)(IconProjectAddOutline16, {})
5416
5685
  })
5417
5686
  }),
5418
5687
  (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
@@ -5426,7 +5695,7 @@ window.__ModuleLoader__.load({
5426
5695
  onClick: () => {
5427
5696
  actions.setViewMode("workspace-session");
5428
5697
  },
5429
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseOutline16, {})
5698
+ children: (0, react_jsx_runtime.jsx)(IconCloseOutline16, {})
5430
5699
  })
5431
5700
  })
5432
5701
  ]
@@ -6528,7 +6797,7 @@ window.__ModuleLoader__.load({
6528
6797
  };
6529
6798
  const openWorkspaceSession = (workspaceId, sessionId) => {
6530
6799
  ensureSessionWorkspace?.(workspaceId, sessionId);
6531
- openWorktreeSession({ open: openSession }, sessionId);
6800
+ openWorktreeSession$1({ open: openSession }, sessionId);
6532
6801
  };
6533
6802
  return {
6534
6803
  pendingSessionBinding,
@@ -7151,6 +7420,156 @@ window.__ModuleLoader__.load({
7151
7420
  };
7152
7421
  }
7153
7422
  //#endregion
7423
+ //#region lib/client/dashboard/dashboard-overlay.js
7424
+ const SIDEBAR_RESIZE_HANDLE_HALF_WIDTH = 4;
7425
+ /** Reversible presentation only: leave the native React tree and Session alive. */
7426
+ function concealDashboardBackground(element) {
7427
+ const visibility = element.style.getPropertyValue("visibility");
7428
+ const priority = element.style.getPropertyPriority("visibility");
7429
+ const inert = element.getAttribute("inert");
7430
+ const hidden = element.getAttribute("aria-hidden");
7431
+ element.style.setProperty("visibility", "hidden");
7432
+ element.setAttribute("inert", "");
7433
+ element.setAttribute("aria-hidden", "true");
7434
+ return () => {
7435
+ if (element.style.getPropertyValue("visibility") === "hidden") if (visibility) element.style.setProperty("visibility", visibility, priority);
7436
+ else element.style.removeProperty("visibility");
7437
+ for (const [name, value] of [["inert", inert], ["aria-hidden", hidden]]) if (value === null) element.removeAttribute(name);
7438
+ else element.setAttribute(name, value);
7439
+ };
7440
+ }
7441
+ function isRightSidebarOpenFromDom(frame, rightbar) {
7442
+ if (typeof frame.querySelector === "function") {
7443
+ if (frame.querySelector("[data-sidebar-right-open]") !== null) return true;
7444
+ if (frame.hasAttribute("data-rightbar-collapsed")) return false;
7445
+ }
7446
+ if (frame.getAttribute?.("data-rightbar-collapsed") !== null) return false;
7447
+ if (rightbar instanceof HTMLElement) {
7448
+ if (rightbar.getAttribute?.("data-sidebar-right-open") !== null) return true;
7449
+ }
7450
+ return false;
7451
+ }
7452
+ /** Layout seam shared with the existing Sidebar overlay; fail closed on frame/center loss. */
7453
+ function mountDashboardOverlay(surface, onPlacement, options) {
7454
+ const overlay = surface.closest("[data-shell-overlay]");
7455
+ const frame = overlay?.parentElement;
7456
+ if (!overlay || !frame) {
7457
+ onPlacement(void 0);
7458
+ options?.onRightSidebarChange?.(false);
7459
+ return () => {};
7460
+ }
7461
+ const hidden = /* @__PURE__ */ new Map();
7462
+ let observed = [];
7463
+ let scheduled;
7464
+ let disposed = false;
7465
+ let lastRightSidebarOpen;
7466
+ const restore = () => {
7467
+ for (const cleanup of hidden.values()) cleanup();
7468
+ hidden.clear();
7469
+ };
7470
+ const schedule = () => {
7471
+ if (disposed || scheduled !== void 0) return;
7472
+ scheduled = requestAnimationFrame(() => {
7473
+ scheduled = void 0;
7474
+ update();
7475
+ });
7476
+ };
7477
+ const resize = typeof ResizeObserver === "undefined" ? void 0 : new ResizeObserver(schedule);
7478
+ const update = () => {
7479
+ if (disposed) return;
7480
+ const sidebar = frame.firstElementChild;
7481
+ const center = sidebar?.nextElementSibling;
7482
+ const rightbar = center?.nextElementSibling;
7483
+ const hasRightbar = rightbar instanceof HTMLElement && rightbar !== overlay && rightbar.nextElementSibling === overlay;
7484
+ const hasNoRightbar = rightbar === overlay;
7485
+ const valid = overlay.isConnected && overlay.parentElement === frame && sidebar instanceof HTMLElement && center instanceof HTMLElement && (hasRightbar || hasNoRightbar);
7486
+ const nextObserved = valid ? hasRightbar ? [
7487
+ overlay,
7488
+ sidebar,
7489
+ center,
7490
+ rightbar
7491
+ ] : [
7492
+ overlay,
7493
+ sidebar,
7494
+ center
7495
+ ] : [frame];
7496
+ for (const old of observed) if (!nextObserved.includes(old)) resize?.unobserve(old);
7497
+ for (const next of nextObserved) if (!observed.includes(next)) resize?.observe(next);
7498
+ observed = nextObserved;
7499
+ if (!valid) {
7500
+ restore();
7501
+ onPlacement(void 0);
7502
+ if (lastRightSidebarOpen) {
7503
+ lastRightSidebarOpen = false;
7504
+ options?.onRightSidebarChange?.(false);
7505
+ }
7506
+ return;
7507
+ }
7508
+ const box = overlay.getBoundingClientRect();
7509
+ const boundary = sidebar.getBoundingClientRect();
7510
+ const rightBoundary = hasRightbar && rightbar instanceof HTMLElement ? rightbar.getBoundingClientRect().left : box.right;
7511
+ const left = Math.max(0, boundary.right - box.left + SIDEBAR_RESIZE_HANDLE_HALF_WIDTH);
7512
+ const width = Math.min(box.right, rightBoundary) - box.left - left;
7513
+ if (width <= 0 || box.height <= 0) {
7514
+ restore();
7515
+ onPlacement(void 0);
7516
+ return;
7517
+ }
7518
+ for (const [element, cleanup] of hidden) if (element !== center) {
7519
+ cleanup();
7520
+ hidden.delete(element);
7521
+ }
7522
+ if (!hidden.has(center)) hidden.set(center, concealDashboardBackground(center));
7523
+ const top = Math.max(0, (center.getBoundingClientRect().top ?? 0) - (box.top ?? 0));
7524
+ if (top >= box.height) {
7525
+ restore();
7526
+ onPlacement(void 0);
7527
+ return;
7528
+ }
7529
+ onPlacement({
7530
+ left,
7531
+ top,
7532
+ width,
7533
+ height: box.height - top
7534
+ });
7535
+ const isRightSidebarOpen = options?.isRightSidebarExpanded !== void 0 ? options.isRightSidebarExpanded() : isRightSidebarOpenFromDom(frame, hasRightbar ? rightbar : void 0);
7536
+ if (lastRightSidebarOpen !== isRightSidebarOpen) {
7537
+ lastRightSidebarOpen = isRightSidebarOpen;
7538
+ options?.onRightSidebarChange?.(isRightSidebarOpen);
7539
+ }
7540
+ };
7541
+ const mutation = typeof MutationObserver === "undefined" ? void 0 : new MutationObserver(schedule);
7542
+ try {
7543
+ mutation?.observe(frame, {
7544
+ childList: true,
7545
+ attributes: true,
7546
+ subtree: true,
7547
+ attributeFilter: [
7548
+ "data-rightbar-collapsed",
7549
+ "data-sidebar-right-open",
7550
+ "data-sidebar-right-panel"
7551
+ ]
7552
+ });
7553
+ } catch {
7554
+ mutation?.observe(frame, { childList: true });
7555
+ }
7556
+ if (frame.parentElement) try {
7557
+ mutation?.observe(frame.parentElement, { childList: true });
7558
+ } catch {}
7559
+ update();
7560
+ return () => {
7561
+ disposed = true;
7562
+ resize?.disconnect();
7563
+ mutation?.disconnect();
7564
+ if (scheduled !== void 0) cancelAnimationFrame(scheduled);
7565
+ restore();
7566
+ if (lastRightSidebarOpen) {
7567
+ lastRightSidebarOpen = false;
7568
+ options?.onRightSidebarChange?.(false);
7569
+ }
7570
+ };
7571
+ }
7572
+ //#endregion
7154
7573
  //#region lib/client/overlay/sidebar-overlay-geometry.js
7155
7574
  const EMPTY_BOUNDS = {
7156
7575
  ready: false,
@@ -7185,7 +7604,14 @@ window.__ModuleLoader__.load({
7185
7604
  "新会话",
7186
7605
  "New Session"
7187
7606
  ];
7188
- const buttons = Array.from(root.querySelectorAll("button"));
7607
+ const buttons = Array.from(root.querySelectorAll("button")).filter((button) => {
7608
+ let parent = button.parentElement;
7609
+ while (parent && parent !== root) {
7610
+ if (parent.hasAttribute("data-window-drag")) return false;
7611
+ parent = parent.parentElement;
7612
+ }
7613
+ return true;
7614
+ });
7189
7615
  const visibleLabel = buttons.find((button) => {
7190
7616
  const text = button.textContent?.trim();
7191
7617
  return text === "新会话" || text === "New Session";
@@ -7196,17 +7622,43 @@ window.__ModuleLoader__.load({
7196
7622
  if (button !== void 0) return button;
7197
7623
  }
7198
7624
  }
7625
+ /** Hide only the native content covered by the plugin, keeping chrome and footer alive. */
7626
+ function coveredSidebarChildren(root, newSession, footer) {
7627
+ if (!newSession || !footer) return [];
7628
+ let first = newSession;
7629
+ while (first.parentElement && first.parentElement !== root) first = first.parentElement;
7630
+ const children = Array.from(root.children ?? []);
7631
+ const start = children.indexOf(first);
7632
+ const end = children.indexOf(footer);
7633
+ if (start < 0 || end <= start) return [];
7634
+ return children.slice(start, end).filter((element) => element instanceof HTMLElement);
7635
+ }
7636
+ function concealSidebarContent(element) {
7637
+ const restore = concealDashboardBackground(element);
7638
+ const opacity = element.style.getPropertyValue("opacity");
7639
+ const priority = element.style.getPropertyPriority("opacity");
7640
+ element.style.setProperty("opacity", "0");
7641
+ return () => {
7642
+ restore();
7643
+ if (element.style.getPropertyValue("opacity") !== "0") return;
7644
+ if (opacity) element.style.setProperty("opacity", opacity, priority);
7645
+ else element.style.removeProperty("opacity");
7646
+ };
7647
+ }
7199
7648
  function useSidebarOverlayGeometry(active) {
7200
7649
  const ref = (0, react.useRef)(null);
7201
7650
  const [width, setWidth] = (0, react.useState)(280);
7202
7651
  const [bounds, setBounds] = (0, react.useState)(EMPTY_BOUNDS);
7652
+ const [collapsed, setCollapsed] = (0, react.useState)(false);
7653
+ const [nativeCovered, setNativeCovered] = (0, react.useState)(false);
7203
7654
  (0, react.useLayoutEffect)(() => {
7204
7655
  if (!active) {
7205
7656
  setBounds(EMPTY_BOUNDS);
7206
7657
  return;
7207
7658
  }
7208
7659
  const overlay = ref.current?.closest("[data-shell-overlay]");
7209
- const sidebar = (overlay?.parentElement)?.firstElementChild;
7660
+ const frame = overlay?.parentElement;
7661
+ const sidebar = frame?.firstElementChild;
7210
7662
  const nativeRoot = sidebar === null || sidebar === void 0 ? void 0 : resolveNativeSidebarRoot(sidebar);
7211
7663
  if (!(overlay instanceof HTMLElement) || !(sidebar instanceof HTMLElement) || !(nativeRoot instanceof HTMLElement)) {
7212
7664
  setBounds(EMPTY_BOUNDS);
@@ -7218,14 +7670,38 @@ window.__ModuleLoader__.load({
7218
7670
  let frameHandle;
7219
7671
  let observedNewSession;
7220
7672
  let observedFooter;
7673
+ let observedRoot;
7674
+ const hidden = /* @__PURE__ */ new Map();
7675
+ function restore() {
7676
+ for (const cleanup of hidden.values()) cleanup();
7677
+ hidden.clear();
7678
+ }
7221
7679
  function update() {
7222
- const newSession = findNewSessionAnchor(nativeRootElement);
7223
- const footer = nativeRootElement.lastElementChild;
7680
+ const currentRoot = resolveNativeSidebarRoot(sidebarElement);
7681
+ if (!(currentRoot instanceof HTMLElement) || overlayElement.isConnected === false || frame?.firstElementChild !== sidebarElement) {
7682
+ restore();
7683
+ setNativeCovered(false);
7684
+ setBounds(EMPTY_BOUNDS);
7685
+ return;
7686
+ }
7687
+ observedRoot = syncObservedElement(resizeObserver, observedRoot, currentRoot);
7688
+ const newSession = findNewSessionAnchor(currentRoot);
7689
+ const footer = currentRoot.lastElementChild;
7224
7690
  observedNewSession = syncObservedElement(resizeObserver, observedNewSession, newSession);
7225
7691
  observedFooter = syncObservedElement(resizeObserver, observedFooter, footer);
7226
7692
  const nextWidth = sidebarElement.getBoundingClientRect().width;
7227
- if (nextWidth > 0) setWidth(nextWidth);
7228
- setBounds(computeOverlayBounds(asRect(overlayElement), newSession === void 0 ? void 0 : asRect(newSession), footer === null ? void 0 : asRect(footer)));
7693
+ setWidth(Math.max(0, nextWidth));
7694
+ const nextCollapsed = frame?.hasAttribute("data-sidebar-collapsed") === true || nextWidth <= 64;
7695
+ setCollapsed(nextCollapsed);
7696
+ const nextBounds = computeOverlayBounds(asRect(overlayElement), newSession === void 0 ? void 0 : asRect(newSession), footer === null ? void 0 : asRect(footer));
7697
+ setBounds(nextCollapsed ? EMPTY_BOUNDS : nextBounds);
7698
+ const covered = !nextCollapsed && nextBounds.ready && nextBounds.height > 0 ? coveredSidebarChildren(currentRoot, newSession, footer) : [];
7699
+ for (const [element, cleanup] of hidden) if (!covered.includes(element)) {
7700
+ cleanup();
7701
+ hidden.delete(element);
7702
+ }
7703
+ for (const element of covered) if (!hidden.has(element)) hidden.set(element, concealSidebarContent(element));
7704
+ setNativeCovered(covered.length > 0);
7229
7705
  }
7230
7706
  function scheduleUpdate() {
7231
7707
  if (frameHandle !== void 0) return;
@@ -7242,20 +7718,26 @@ window.__ModuleLoader__.load({
7242
7718
  ]) resizeObserver?.observe(element);
7243
7719
  update();
7244
7720
  const mutationObserver = typeof MutationObserver === "function" ? new MutationObserver(scheduleUpdate) : void 0;
7245
- mutationObserver?.observe(nativeRootElement, {
7721
+ mutationObserver?.observe(frame, {
7246
7722
  childList: true,
7247
- subtree: true
7723
+ subtree: true,
7724
+ attributes: true,
7725
+ attributeFilter: ["data-sidebar-collapsed"]
7248
7726
  });
7727
+ if (frame?.parentElement) mutationObserver?.observe(frame.parentElement, { childList: true });
7249
7728
  return () => {
7250
7729
  resizeObserver?.disconnect();
7251
7730
  mutationObserver?.disconnect();
7252
7731
  if (frameHandle !== void 0) cancelAnimationFrame(frameHandle);
7732
+ restore();
7253
7733
  };
7254
7734
  }, [active]);
7255
7735
  return {
7256
7736
  ref,
7257
7737
  width,
7258
- bounds
7738
+ bounds,
7739
+ collapsed,
7740
+ nativeCovered
7259
7741
  };
7260
7742
  }
7261
7743
  //#endregion
@@ -7268,7 +7750,7 @@ window.__ModuleLoader__.load({
7268
7750
  const workspaces = useWorkspaces((state) => state);
7269
7751
  const forkRecoveryStore = forkRecovery ?? EMPTY_FORK_RECOVERY_STORE;
7270
7752
  const forkRecoverySnapshot = (0, react.useSyncExternalStore)(forkRecoveryStore.subscribe, forkRecoveryStore.getSnapshot, forkRecoveryStore.getSnapshot);
7271
- const currentSessionId = sessions.current;
7753
+ const currentSessionId = currentSessionIdFromList(sessions);
7272
7754
  const workspaceIds = useStableWorkspaceIds(workspaces.items);
7273
7755
  const workspaceIdsRef = (0, react.useRef)(workspaceIds);
7274
7756
  workspaceIdsRef.current = workspaceIds;
@@ -7287,7 +7769,7 @@ window.__ModuleLoader__.load({
7287
7769
  }, [fullAccessConfirmationKey]);
7288
7770
  const sessionOrderSnapshot = (0, react.useSyncExternalStore)(sessionOrder.subscribe, sessionOrder.getSnapshot, sessionOrder.getSnapshot);
7289
7771
  const sessionPresentations = (0, react.useMemo)(() => deriveSessionPresentationIndex(sessions), [sessions.byId]);
7290
- const { ref, width, bounds } = useSidebarOverlayGeometry(mode === "worktree");
7772
+ const { ref, width, bounds, collapsed, nativeCovered } = useSidebarOverlayGeometry(mode === "worktree");
7291
7773
  return {
7292
7774
  preferredMode,
7293
7775
  mode,
@@ -7309,7 +7791,8 @@ window.__ModuleLoader__.load({
7309
7791
  ref,
7310
7792
  width,
7311
7793
  bounds,
7312
- collapsed: width <= 64,
7794
+ collapsed,
7795
+ nativeCovered,
7313
7796
  archivedSessionIds: workspaces.archivedSessionIds ?? []
7314
7797
  };
7315
7798
  }
@@ -7595,7 +8078,7 @@ window.__ModuleLoader__.load({
7595
8078
  };
7596
8079
  const defaultOpenInAppController = new OpenInAppController();
7597
8080
  //#endregion
7598
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_f7c3c8176e38/packages/clutch-dsh-worktree/src/client/dashboard/open-in-app.css.mjs
8081
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_63cf54e5ec74/packages/clutch-dsh-worktree/src/client/dashboard/open-in-app.css.mjs
7599
8082
  const css$2 = ".-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";
7600
8083
  const styleId$2 = "@cerbur/clutch-dsh-worktree/open-in-app.css";
7601
8084
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/open-in-app.css\"]") === null) {
@@ -7790,175 +8273,31 @@ window.__ModuleLoader__.load({
7790
8273
  onClick: () => {
7791
8274
  setOpen((prev) => !prev);
7792
8275
  },
7793
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { size: 12 })
8276
+ children: (0, react_jsx_runtime.jsx)(IconChevronDownOutline14, { size: 12 })
7794
8277
  })]
7795
8278
  })
7796
8279
  })
7797
8280
  });
7798
8281
  }
7799
8282
  //#endregion
7800
- //#region lib/client/dashboard/dashboard-overlay.js
7801
- const SIDEBAR_RESIZE_HANDLE_HALF_WIDTH = 4;
7802
- /** Reversible presentation only: leave the native React tree and Session alive. */
7803
- function concealDashboardBackground(element) {
7804
- const visibility = element.style.getPropertyValue("visibility");
7805
- const priority = element.style.getPropertyPriority("visibility");
7806
- const inert = element.getAttribute("inert");
7807
- const hidden = element.getAttribute("aria-hidden");
7808
- element.style.setProperty("visibility", "hidden");
7809
- element.setAttribute("inert", "");
7810
- element.setAttribute("aria-hidden", "true");
7811
- return () => {
7812
- if (element.style.getPropertyValue("visibility") === "hidden") if (visibility) element.style.setProperty("visibility", visibility, priority);
7813
- else element.style.removeProperty("visibility");
7814
- for (const [name, value] of [["inert", inert], ["aria-hidden", hidden]]) if (value === null) element.removeAttribute(name);
7815
- else element.setAttribute(name, value);
8283
+ //#region lib/client/dashboard/worktree-acquisition-facts.js
8284
+ function selectWorktreeAcquisitionFacts(record) {
8285
+ return {
8286
+ timestampKind: record.source === "external" ? "imported" : "created",
8287
+ ...record.source === "external" ? record.importedAt === void 0 ? {} : { timestamp: record.importedAt } : record.createdAt === void 0 ? {} : { timestamp: record.createdAt },
8288
+ ...record.baseBranch === void 0 ? {} : { baseBranch: record.baseBranch }
7816
8289
  };
7817
8290
  }
7818
- function isRightSidebarOpenFromDom(frame, rightbar) {
7819
- if (typeof frame.querySelector === "function") {
7820
- if (frame.querySelector("[data-sidebar-right-open]") !== null) return true;
7821
- if (frame.hasAttribute("data-rightbar-collapsed")) return false;
7822
- }
7823
- if (frame.getAttribute?.("data-rightbar-collapsed") !== null) return false;
7824
- if (rightbar instanceof HTMLElement) {
7825
- if (rightbar.getAttribute?.("data-sidebar-right-open") !== null) return true;
7826
- }
7827
- return false;
7828
- }
7829
- /** Layout seam shared with the existing Sidebar overlay; fail closed on frame/center loss. */
7830
- function mountDashboardOverlay(surface, onPlacement, options) {
7831
- const overlay = surface.closest("[data-shell-overlay]");
7832
- const frame = overlay?.parentElement;
7833
- if (!overlay || !frame) {
7834
- onPlacement(void 0);
7835
- options?.onRightSidebarChange?.(false);
7836
- return () => {};
7837
- }
7838
- const hidden = /* @__PURE__ */ new Map();
7839
- let observed = [];
7840
- let scheduled;
7841
- let disposed = false;
7842
- let lastRightSidebarOpen;
7843
- const restore = () => {
7844
- for (const cleanup of hidden.values()) cleanup();
7845
- hidden.clear();
7846
- };
7847
- const schedule = () => {
7848
- if (disposed || scheduled !== void 0) return;
7849
- scheduled = requestAnimationFrame(() => {
7850
- scheduled = void 0;
7851
- update();
7852
- });
7853
- };
7854
- const resize = typeof ResizeObserver === "undefined" ? void 0 : new ResizeObserver(schedule);
7855
- const update = () => {
7856
- if (disposed) return;
7857
- const sidebar = frame.firstElementChild;
7858
- const center = sidebar?.nextElementSibling;
7859
- const rightbar = center?.nextElementSibling;
7860
- const hasRightbar = rightbar instanceof HTMLElement && rightbar !== overlay && rightbar.nextElementSibling === overlay;
7861
- const hasNoRightbar = rightbar === overlay;
7862
- const valid = overlay.isConnected && overlay.parentElement === frame && sidebar instanceof HTMLElement && center instanceof HTMLElement && (hasRightbar || hasNoRightbar);
7863
- const nextObserved = valid ? hasRightbar ? [
7864
- overlay,
7865
- sidebar,
7866
- center,
7867
- rightbar
7868
- ] : [
7869
- overlay,
7870
- sidebar,
7871
- center
7872
- ] : [frame];
7873
- for (const old of observed) if (!nextObserved.includes(old)) resize?.unobserve(old);
7874
- for (const next of nextObserved) if (!observed.includes(next)) resize?.observe(next);
7875
- observed = nextObserved;
7876
- if (!valid) {
7877
- restore();
7878
- onPlacement(void 0);
7879
- if (lastRightSidebarOpen) {
7880
- lastRightSidebarOpen = false;
7881
- options?.onRightSidebarChange?.(false);
7882
- }
7883
- return;
7884
- }
7885
- const box = overlay.getBoundingClientRect();
7886
- const boundary = sidebar.getBoundingClientRect();
7887
- const rightBoundary = hasRightbar && rightbar instanceof HTMLElement ? rightbar.getBoundingClientRect().left : box.right;
7888
- const left = Math.max(0, boundary.right - box.left + SIDEBAR_RESIZE_HANDLE_HALF_WIDTH);
7889
- const width = Math.min(box.right, rightBoundary) - box.left - left;
7890
- if (width <= 0 || box.height <= 0) {
7891
- restore();
7892
- onPlacement(void 0);
7893
- return;
7894
- }
7895
- for (const [element, cleanup] of hidden) if (element !== center) {
7896
- cleanup();
7897
- hidden.delete(element);
7898
- }
7899
- if (!hidden.has(center)) hidden.set(center, concealDashboardBackground(center));
7900
- onPlacement({
7901
- left,
7902
- top: 0,
7903
- width,
7904
- height: box.height
7905
- });
7906
- const isRightSidebarOpen = options?.isRightSidebarExpanded !== void 0 ? options.isRightSidebarExpanded() : isRightSidebarOpenFromDom(frame, hasRightbar ? rightbar : void 0);
7907
- if (lastRightSidebarOpen !== isRightSidebarOpen) {
7908
- lastRightSidebarOpen = isRightSidebarOpen;
7909
- options?.onRightSidebarChange?.(isRightSidebarOpen);
7910
- }
7911
- };
7912
- const mutation = typeof MutationObserver === "undefined" ? void 0 : new MutationObserver(schedule);
7913
- try {
7914
- mutation?.observe(frame, {
7915
- childList: true,
7916
- attributes: true,
7917
- subtree: true,
7918
- attributeFilter: [
7919
- "data-rightbar-collapsed",
7920
- "data-sidebar-right-open",
7921
- "data-sidebar-right-panel"
7922
- ]
7923
- });
7924
- } catch {
7925
- mutation?.observe(frame, { childList: true });
7926
- }
7927
- if (frame.parentElement) try {
7928
- mutation?.observe(frame.parentElement, { childList: true });
7929
- } catch {}
7930
- update();
7931
- return () => {
7932
- disposed = true;
7933
- resize?.disconnect();
7934
- mutation?.disconnect();
7935
- if (scheduled !== void 0) cancelAnimationFrame(scheduled);
7936
- restore();
7937
- if (lastRightSidebarOpen) {
7938
- lastRightSidebarOpen = false;
7939
- options?.onRightSidebarChange?.(false);
7940
- }
7941
- };
7942
- }
7943
- //#endregion
7944
- //#region lib/client/dashboard/worktree-acquisition-facts.js
7945
- function selectWorktreeAcquisitionFacts(record) {
7946
- return {
7947
- timestampKind: record.source === "external" ? "imported" : "created",
7948
- ...record.source === "external" ? record.importedAt === void 0 ? {} : { timestamp: record.importedAt } : record.createdAt === void 0 ? {} : { timestamp: record.createdAt },
7949
- ...record.baseBranch === void 0 ? {} : { baseBranch: record.baseBranch }
7950
- };
7951
- }
7952
- //#endregion
7953
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_f7c3c8176e38/packages/clutch-dsh-worktree/src/client/dashboard/dashboard.css.mjs
7954
- const css$1 = ".-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 {\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-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 display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 20px;\n margin-bottom: 28px;\n color: var(--dsw-alias-label-secondary, #677080);\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTopline > span {\n overflow-wrap: anywhere;\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 align-items: center;\n gap: 8px;\n flex: none;\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) 225px;\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 overflow-wrap: anywhere;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow[role='button'] {\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow[role='button']:focus-visible {\n outline: 2px solid #497cd4;\n outline-offset: 3px;\n border-radius: 4px;\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 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(90px, 0.85fr) minmax(0, 1fr) 29px;\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-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-dashboardHeaderAside .-cerbur-clutch-dsh-worktree-dashboardFacts > div {\n padding: 4px 0;\n border: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHistorical {\n color: var(--dsw-alias-label-secondary, #788191);\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-dashboardBaselineSearch {\n box-sizing: border-box;\n flex: none;\n display: flex;\n width: 100%;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOptions {\n box-sizing: border-box;\n display: flex;\n flex: none;\n flex-direction: column;\n width: 100%;\n min-width: min(220px, 100%);\n max-width: min(420px, calc(100vw - 32px));\n /* Constant frame: six rows on compact windows, seven on normal ones. Search\n swaps the rows inside this fixed box, so the modal never resizes. */\n height: clamp(258px, 48vh, 300px);\n height: clamp(258px, 48dvh, 300px);\n padding: 4px;\n overflow-y: auto;\n overscroll-behavior: contain;\n border: 0;\n border-radius: 20px;\n background: var(--dsw-specific-menu, var(--dsw-alias-bg-layer-3, #fff));\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l1);\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n box-shadow: var(--dsw-elevation-prominent, 0 8px 24px rgb(25 33 47 / 12%));\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineList {\n display: flex;\n flex-direction: column;\n gap: 2px;\n width: 100%;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-height: 40px;\n padding: 8px 10px;\n border: 0;\n border-radius: 10px;\n outline: none;\n background: transparent;\n color: var(--dsw-alias-label-primary, #19212f);\n text-align: left;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption:hover,\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption[data-highlighted='true'],\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption[aria-selected='true'] {\n background: var(--dsw-alias-interactive-bg-hover, #f0f3f8);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption:focus-visible {\n outline: 2px solid #497cd4;\n outline-offset: -2px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption > svg {\n width: 16px;\n height: 16px;\n color: var(--dsw-alias-label-secondary, #788191);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption[aria-selected='true'] > svg:last-child {\n color: var(--dsw-alias-label-primary, #19212f);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOptionLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineEmpty {\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n padding: 8px 10px;\n color: var(--dsw-alias-label-secondary, #788191);\n text-align: center;\n}\n/* Zero-height anchor: the save error floats over the list instead of growing\n the modal, so the frame keeps its size in every state. */\n.-cerbur-clutch-dsh-worktree-dashboardBaselineStatus {\n position: relative;\n box-sizing: border-box;\n min-height: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineError {\n position: absolute;\n right: 4px;\n bottom: 12px;\n left: 4px;\n z-index: 1;\n box-sizing: border-box;\n padding: 6px 10px;\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-2, #fff);\n background: color-mix(\n in srgb,\n var(--dsw-alias-state-error-label, #bd5d43) 10%,\n var(--dsw-alias-bg-layer-2, #fff)\n );\n box-shadow:\n inset 0 0 0 1px color-mix(in srgb, var(--dsw-alias-state-error-label, #bd5d43) 32%, transparent),\n var(--dsw-elevation-prominent, 0 8px 24px rgb(25 33 47 / 12%));\n color: var(--dsw-alias-state-error-label, #bd5d43);\n font-size: 12px;\n line-height: 16px;\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-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 align-items: flex-start;\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";
7955
- const styleId$1 = "@cerbur/clutch-dsh-worktree/dashboard.css";
7956
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard.css\"]") === null) {
7957
- const tag = document.createElement("style");
7958
- tag.dataset.plugin = "@cerbur/clutch-dsh-worktree";
7959
- tag.dataset.pluginCss = styleId$1;
7960
- tag.textContent = css$1;
7961
- document.head.appendChild(tag);
8291
+ //#endregion
8292
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_63cf54e5ec74/packages/clutch-dsh-worktree/src/client/dashboard/dashboard.css.mjs
8293
+ const css$1 = ".-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 {\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-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: wrap;\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: wrap;\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) 225px;\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 overflow-wrap: anywhere;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow[role='button'] {\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow[role='button']:focus-visible {\n outline: 2px solid #497cd4;\n outline-offset: 3px;\n border-radius: 4px;\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 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(90px, 0.85fr) minmax(0, 1fr) 29px;\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-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-dashboardHeaderAside .-cerbur-clutch-dsh-worktree-dashboardFacts > div {\n padding: 4px 0;\n border: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHistorical {\n color: var(--dsw-alias-label-secondary, #788191);\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-dashboardBaselineSearch {\n box-sizing: border-box;\n flex: none;\n display: flex;\n width: 100%;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOptions {\n box-sizing: border-box;\n display: flex;\n flex: none;\n flex-direction: column;\n width: 100%;\n min-width: min(220px, 100%);\n max-width: min(420px, calc(100vw - 32px));\n /* Constant frame: six rows on compact windows, seven on normal ones. Search\n swaps the rows inside this fixed box, so the modal never resizes. */\n height: clamp(258px, 48vh, 300px);\n height: clamp(258px, 48dvh, 300px);\n padding: 4px;\n overflow-y: auto;\n overscroll-behavior: contain;\n border: 0;\n border-radius: 20px;\n background: var(--dsw-specific-menu, var(--dsw-alias-bg-layer-3, #fff));\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l1);\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n box-shadow: var(--dsw-elevation-prominent, 0 8px 24px rgb(25 33 47 / 12%));\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineList {\n display: flex;\n flex-direction: column;\n gap: 2px;\n width: 100%;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-height: 40px;\n padding: 8px 10px;\n border: 0;\n border-radius: 10px;\n outline: none;\n background: transparent;\n color: var(--dsw-alias-label-primary, #19212f);\n text-align: left;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption:hover,\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption[data-highlighted='true'],\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption[aria-selected='true'] {\n background: var(--dsw-alias-interactive-bg-hover, #f0f3f8);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption:focus-visible {\n outline: 2px solid #497cd4;\n outline-offset: -2px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption > svg {\n width: 16px;\n height: 16px;\n color: var(--dsw-alias-label-secondary, #788191);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption[aria-selected='true'] > svg:last-child {\n color: var(--dsw-alias-label-primary, #19212f);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOptionLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineEmpty {\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n padding: 8px 10px;\n color: var(--dsw-alias-label-secondary, #788191);\n text-align: center;\n}\n/* Zero-height anchor: the save error floats over the list instead of growing\n the modal, so the frame keeps its size in every state. */\n.-cerbur-clutch-dsh-worktree-dashboardBaselineStatus {\n position: relative;\n box-sizing: border-box;\n min-height: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineError {\n position: absolute;\n right: 4px;\n bottom: 12px;\n left: 4px;\n z-index: 1;\n box-sizing: border-box;\n padding: 6px 10px;\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-2, #fff);\n background: color-mix(\n in srgb,\n var(--dsw-alias-state-error-label, #bd5d43) 10%,\n var(--dsw-alias-bg-layer-2, #fff)\n );\n box-shadow:\n inset 0 0 0 1px color-mix(in srgb, var(--dsw-alias-state-error-label, #bd5d43) 32%, transparent),\n var(--dsw-elevation-prominent, 0 8px 24px rgb(25 33 47 / 12%));\n color: var(--dsw-alias-state-error-label, #bd5d43);\n font-size: 12px;\n line-height: 16px;\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-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";
8294
+ const styleId$1 = "@cerbur/clutch-dsh-worktree/dashboard.css";
8295
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard.css\"]") === null) {
8296
+ const tag = document.createElement("style");
8297
+ tag.dataset.plugin = "@cerbur/clutch-dsh-worktree";
8298
+ tag.dataset.pluginCss = styleId$1;
8299
+ tag.textContent = css$1;
8300
+ document.head.appendChild(tag);
7962
8301
  }
7963
8302
  var dashboard_css_default = {
7964
8303
  "dashboardSurface": "-cerbur-clutch-dsh-worktree-dashboardSurface",
@@ -7972,6 +8311,7 @@ window.__ModuleLoader__.load({
7972
8311
  "dashboardStartActions": "-cerbur-clutch-dsh-worktree-dashboardStartActions",
7973
8312
  "dashboardTopline": "-cerbur-clutch-dsh-worktree-dashboardTopline",
7974
8313
  "dashboardToplineActions": "-cerbur-clutch-dsh-worktree-dashboardToplineActions",
8314
+ "overlay": "-cerbur-clutch-dsh-worktree-overlay",
7975
8315
  "dashboardSidebarButton": "-cerbur-clutch-dsh-worktree-dashboardSidebarButton",
7976
8316
  "dashboardHeader": "-cerbur-clutch-dsh-worktree-dashboardHeader",
7977
8317
  "dashboardIdentity": "-cerbur-clutch-dsh-worktree-dashboardIdentity",
@@ -8241,7 +8581,7 @@ window.__ModuleLoader__.load({
8241
8581
  });
8242
8582
  }
8243
8583
  //#endregion
8244
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_f7c3c8176e38/packages/clutch-dsh-worktree/src/client/dashboard/git/worktree-git.css.mjs
8584
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_63cf54e5ec74/packages/clutch-dsh-worktree/src/client/dashboard/git/worktree-git.css.mjs
8245
8585
  const css = ".-cerbur-clutch-dsh-worktree-gitPanel {\n min-width: 0;\n min-height: 0;\n}\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-gitBaselineSelector select {\n min-width: 180px;\n max-width: min(360px, 60vw);\n padding: 5px 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 font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineSelector select:disabled {\n cursor: wait;\n opacity: 0.7;\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-gitColumns > .-cerbur-clutch-dsh-worktree-gitColumn:last-child {\n border-bottom: 0;\n }\n}\n";
8246
8586
  const styleId = "@cerbur/clutch-dsh-worktree/worktree-git.css";
8247
8587
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree-git.css\"]") === null) {
@@ -8403,7 +8743,7 @@ window.__ModuleLoader__.load({
8403
8743
  children: [(0, react_jsx_runtime.jsx)("span", {
8404
8744
  className: worktree_git_css_default.gitFolderIcon,
8405
8745
  "aria-hidden": "true",
8406
- children: collapsed ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconFolderClose16, {}) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconFolderOpen16, {})
8746
+ children: collapsed ? (0, react_jsx_runtime.jsx)(IconFolderClose16, {}) : (0, react_jsx_runtime.jsx)(IconFolderOpen16, {})
8407
8747
  }), (0, react_jsx_runtime.jsx)("span", {
8408
8748
  className: worktree_git_css_default.gitFolderName,
8409
8749
  title: node.path,
@@ -8783,7 +9123,7 @@ window.__ModuleLoader__.load({
8783
9123
  onClick: () => onOpenFile(diff.path),
8784
9124
  title: t("dashboard.git.openInSidebar"),
8785
9125
  "data-dashboard-git-open-file": diff.path,
8786
- children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconRightUpOutline16, {
9126
+ children: [(0, react_jsx_runtime.jsx)(IconRightUpOutline16, {
8787
9127
  size: 14,
8788
9128
  className: worktree_git_css_default.gitDiffOpenIcon
8789
9129
  }), (0, react_jsx_runtime.jsx)("span", { children: t("dashboard.git.openInSidebar") })]
@@ -8977,6 +9317,7 @@ window.__ModuleLoader__.load({
8977
9317
  }
8978
9318
  Object.freeze([
8979
9319
  "WORKSPACE_NOT_FOUND",
9320
+ "WORKSPACE_ROOT_MISSING",
8980
9321
  "WORKSPACE_NOT_GIT_REPOSITORY",
8981
9322
  "GIT_NOT_INSTALLED",
8982
9323
  "WORKTREE_REQUIRES_INITIAL_COMMIT",
@@ -10510,7 +10851,7 @@ window.__ModuleLoader__.load({
10510
10851
  "aria-expanded": draft !== void 0,
10511
10852
  disabled: disabled || options.length === 0,
10512
10853
  onClick: openEditor,
10513
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconEditOutline16, {})
10854
+ children: (0, react_jsx_runtime.jsx)(IconEditOutline16, {})
10514
10855
  })
10515
10856
  }) : void 0,
10516
10857
  children: saved === void 0 ? (0, react_jsx_runtime.jsx)("span", {
@@ -10545,7 +10886,7 @@ window.__ModuleLoader__.load({
10545
10886
  "data-dashboard-baseline-modal": true,
10546
10887
  children: [
10547
10888
  (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Input, {
10548
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutline16, {}),
10889
+ icon: (0, react_jsx_runtime.jsx)(IconSearchOutline16, {}),
10549
10890
  className: dashboard_css_default.dashboardBaselineSearch,
10550
10891
  "aria-label": t("dashboard.searchBranches"),
10551
10892
  role: "combobox",
@@ -10582,12 +10923,12 @@ window.__ModuleLoader__.load({
10582
10923
  "aria-selected": branch.name === draft,
10583
10924
  onClick: () => selectOption(index),
10584
10925
  children: [
10585
- (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}),
10926
+ (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
10586
10927
  (0, react_jsx_runtime.jsx)("span", {
10587
10928
  className: dashboard_css_default.dashboardBaselineOptionLabel,
10588
10929
  children: branch.name
10589
10930
  }),
10590
- branch.name === draft && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutline16, {})
10931
+ branch.name === draft && (0, react_jsx_runtime.jsx)(IconCheckOutline16, {})
10591
10932
  ]
10592
10933
  }, branch.name))
10593
10934
  }) : (0, react_jsx_runtime.jsx)("div", {
@@ -10745,7 +11086,7 @@ window.__ModuleLoader__.load({
10745
11086
  return (0, react_jsx_runtime.jsx)("li", { children: (0, react_jsx_runtime.jsxs)("button", {
10746
11087
  type: "button",
10747
11088
  "data-dashboard-session": sessionId,
10748
- "aria-current": sessions.current === sessionId ? "page" : void 0,
11089
+ "aria-current": currentSessionIdFromList(sessions) === sessionId ? "page" : void 0,
10749
11090
  onClick: () => onOpenSession(sessionId),
10750
11091
  children: [
10751
11092
  (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "sessions" }),
@@ -10777,7 +11118,7 @@ window.__ModuleLoader__.load({
10777
11118
  })
10778
11119
  });
10779
11120
  const topActionIsCreateSession = sessionIds.length === 0 && onCreateSession !== void 0;
10780
- return (0, react_jsx_runtime.jsx)("section", {
11121
+ return (0, react_jsx_runtime.jsxs)("section", {
10781
11122
  ref: surface,
10782
11123
  className: dashboard_css_default.dashboardSurface,
10783
11124
  "data-worktree-dashboard": record.worktreeId,
@@ -10787,54 +11128,67 @@ window.__ModuleLoader__.load({
10787
11128
  height: 0
10788
11129
  },
10789
11130
  onKeyDown: (event) => {
11131
+ if (event.defaultPrevented) return;
10790
11132
  if (event.key === "Escape") {
10791
11133
  if (event.currentTarget.querySelector("[role=\"menu\"]")) return;
10792
11134
  event.stopPropagation();
10793
11135
  onClose();
10794
11136
  }
10795
11137
  },
10796
- children: (0, react_jsx_runtime.jsxs)("div", {
10797
- className: dashboard_css_default.dashboardPage,
10798
- children: [
10799
- (0, react_jsx_runtime.jsxs)("div", {
10800
- className: dashboard_css_default.dashboardTopline,
10801
- children: [(0, react_jsx_runtime.jsxs)("span", { children: [
10802
- workspaceTitle,
10803
- (0, react_jsx_runtime.jsx)("span", {
10804
- "aria-hidden": "true",
10805
- children: " / "
10806
- }),
10807
- t("dashboard.preview")
10808
- ] }), (0, react_jsx_runtime.jsxs)("div", {
10809
- className: dashboard_css_default.dashboardToplineActions,
10810
- children: [(0, react_jsx_runtime.jsx)("button", {
11138
+ children: [(0, react_jsx_runtime.jsxs)("header", {
11139
+ className: dashboard_css_default.dashboardTopline,
11140
+ "data-dashboard-topbar": true,
11141
+ "data-window-drag": true,
11142
+ children: [(0, react_jsx_runtime.jsxs)("span", {
11143
+ title: `${workspaceTitle}/${displayBranch}`,
11144
+ style: { marginInlineStart: `max(0px, calc(var(--dsh-frame-leading-clearance, 0px) - ${placement?.left ?? 0}px - 20px))` },
11145
+ children: [
11146
+ workspaceTitle,
11147
+ (0, react_jsx_runtime.jsx)("span", {
11148
+ "aria-hidden": "true",
11149
+ children: " / "
11150
+ }),
11151
+ displayBranch
11152
+ ]
11153
+ }), (0, react_jsx_runtime.jsxs)("div", {
11154
+ className: dashboard_css_default.dashboardToplineActions,
11155
+ children: [
11156
+ (0, react_jsx_runtime.jsx)(OpenInAppButton, {
11157
+ path: record.absolutePath,
11158
+ t
11159
+ }),
11160
+ (0, react_jsx_runtime.jsx)("button", {
11161
+ type: "button",
11162
+ className: dashboard_css_default.dashboardButton,
11163
+ "aria-label": t(topActionIsCreateSession ? "dashboard.newSession" : "dashboard.back"),
11164
+ onClick: () => {
11165
+ if (topActionIsCreateSession) onCreateSession?.();
11166
+ else onClose();
11167
+ },
11168
+ children: topActionIsCreateSession ? t("dashboard.newSession") : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: ["← ", t("dashboard.back")] })
11169
+ }),
11170
+ !rightSidebarOpen && onOpenSidebar !== void 0 && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
11171
+ label: t("dashboard.openSidebar"),
11172
+ side: "bottom",
11173
+ delayMs: 500,
11174
+ children: (0, react_jsx_runtime.jsx)("button", {
10811
11175
  type: "button",
10812
- className: dashboard_css_default.dashboardButton,
10813
- "aria-label": t(topActionIsCreateSession ? "dashboard.newSession" : "dashboard.back"),
11176
+ className: dashboard_css_default.dashboardSidebarButton,
11177
+ "aria-label": t("dashboard.openSidebar"),
11178
+ title: t("dashboard.openSidebar"),
11179
+ "data-sidebar-right-expand": true,
10814
11180
  onClick: () => {
10815
- if (topActionIsCreateSession) onCreateSession?.();
10816
- else onClose();
11181
+ onOpenSidebar();
11182
+ setRightSidebarOpen(true);
10817
11183
  },
10818
- children: topActionIsCreateSession ? t("dashboard.newSession") : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: ["← ", t("dashboard.back")] })
10819
- }), !rightSidebarOpen && onOpenSidebar !== void 0 && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
10820
- label: t("dashboard.openSidebar"),
10821
- side: "bottom",
10822
- delayMs: 500,
10823
- children: (0, react_jsx_runtime.jsx)("button", {
10824
- type: "button",
10825
- className: dashboard_css_default.dashboardSidebarButton,
10826
- "aria-label": t("dashboard.openSidebar"),
10827
- title: t("dashboard.openSidebar"),
10828
- "data-sidebar-right-expand": true,
10829
- onClick: () => {
10830
- onOpenSidebar();
10831
- setRightSidebarOpen(true);
10832
- },
10833
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutline16, {})
10834
- })
10835
- })]
10836
- })]
10837
- }),
11184
+ children: (0, react_jsx_runtime.jsx)(IconPanelLeftOutline16, {})
11185
+ })
11186
+ })
11187
+ ]
11188
+ })]
11189
+ }), (0, react_jsx_runtime.jsxs)("div", {
11190
+ className: dashboard_css_default.dashboardPage,
11191
+ children: [
10838
11192
  (0, react_jsx_runtime.jsxs)("header", {
10839
11193
  className: dashboard_css_default.dashboardHeader,
10840
11194
  children: [(0, react_jsx_runtime.jsxs)("div", {
@@ -10856,7 +11210,7 @@ window.__ModuleLoader__.load({
10856
11210
  }
10857
11211
  } : void 0,
10858
11212
  children: [
10859
- (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}),
11213
+ (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
10860
11214
  (0, react_jsx_runtime.jsx)("h1", {
10861
11215
  id: `${id}-title`,
10862
11216
  ref: heading,
@@ -10894,7 +11248,7 @@ window.__ModuleLoader__.load({
10894
11248
  onClick: () => {
10895
11249
  copyPath();
10896
11250
  },
10897
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCopyOutline16, {})
11251
+ children: (0, react_jsx_runtime.jsx)(IconCopyOutline16, {})
10898
11252
  })
10899
11253
  ]
10900
11254
  }),
@@ -10904,12 +11258,9 @@ window.__ModuleLoader__.load({
10904
11258
  children: branchCopyState === "pending" ? "\xA0" : branchCopyState === "copied" ? t("dashboard.branchCopied") : branchCopyState === "failed" ? t("dashboard.branchCopyFailed") : copyState === "copied" ? t("dashboard.copied") : copyState === "failed" ? t("dashboard.copyFailed") : "\xA0"
10905
11259
  })
10906
11260
  ]
10907
- }), (0, react_jsx_runtime.jsxs)("div", {
11261
+ }), (0, react_jsx_runtime.jsx)("div", {
10908
11262
  className: dashboard_css_default.dashboardHeaderAside,
10909
- children: [(0, react_jsx_runtime.jsx)(OpenInAppButton, {
10910
- path: record.absolutePath,
10911
- t
10912
- }), (0, react_jsx_runtime.jsxs)("dl", {
11263
+ children: (0, react_jsx_runtime.jsxs)("dl", {
10913
11264
  className: dashboard_css_default.dashboardFacts,
10914
11265
  children: [
10915
11266
  (0, react_jsx_runtime.jsx)(DashboardFactRow, {
@@ -10942,7 +11293,7 @@ window.__ModuleLoader__.load({
10942
11293
  children: isMainWorktreeId$1(record.worktreeId) ? t("worktree.main") : t(record.source === "external" ? "dashboard.external" : "dashboard.plugin")
10943
11294
  })
10944
11295
  ]
10945
- })]
11296
+ })
10946
11297
  })]
10947
11298
  }),
10948
11299
  (0, react_jsx_runtime.jsx)("div", {
@@ -10982,7 +11333,7 @@ window.__ModuleLoader__.load({
10982
11333
  (0, react_jsx_runtime.jsxs)("section", {
10983
11334
  className: dashboard_css_default.dashboardStart,
10984
11335
  children: [
10985
- (0, react_jsx_runtime.jsxs)("h2", { children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}), t("dashboard.start")] }),
11336
+ (0, react_jsx_runtime.jsxs)("h2", { children: [(0, react_jsx_runtime.jsx)(IconBranchOutline16, {}), t("dashboard.start")] }),
10986
11337
  (0, react_jsx_runtime.jsx)("p", { children: t("dashboard.startDescription") }),
10987
11338
  (0, react_jsx_runtime.jsxs)("div", {
10988
11339
  className: dashboard_css_default.dashboardStartActions,
@@ -11147,7 +11498,73 @@ window.__ModuleLoader__.load({
11147
11498
  children: t("dashboard.mvpHint")
11148
11499
  })
11149
11500
  ]
11150
- })
11501
+ })]
11502
+ });
11503
+ }
11504
+ //#endregion
11505
+ //#region lib/client/dashboard/DashboardRequest.js
11506
+ /** Present a header request while its target read settles, without expanding navigation. */
11507
+ function DashboardRequest({ t, error, onRetry, onClose }) {
11508
+ const ref = (0, react.useRef)(null);
11509
+ const [placement, setPlacement] = (0, react.useState)();
11510
+ (0, react.useLayoutEffect)(() => {
11511
+ if (!ref.current) return;
11512
+ return mountDashboardOverlay(ref.current, (next) => setPlacement((old) => JSON.stringify(old) === JSON.stringify(next) ? old : next));
11513
+ }, []);
11514
+ (0, react.useLayoutEffect)(() => {
11515
+ if (!placement) return;
11516
+ const previous = document.activeElement;
11517
+ const element = ref.current;
11518
+ element?.focus({ preventScroll: true });
11519
+ return () => {
11520
+ if (previous instanceof HTMLElement && previous.isConnected && (element?.contains(document.activeElement) || document.activeElement === document.body)) previous.focus({ preventScroll: true });
11521
+ };
11522
+ }, [placement !== void 0]);
11523
+ return (0, react_jsx_runtime.jsxs)("section", {
11524
+ ref,
11525
+ className: dashboard_css_default.dashboardSurface,
11526
+ "data-worktree-dashboard-request": true,
11527
+ "aria-label": t("dashboard.title"),
11528
+ "aria-busy": error === void 0,
11529
+ tabIndex: -1,
11530
+ style: placement ?? {
11531
+ visibility: "hidden",
11532
+ height: 0
11533
+ },
11534
+ onKeyDown: (event) => {
11535
+ if (event.key === "Escape") {
11536
+ event.stopPropagation();
11537
+ onClose();
11538
+ }
11539
+ },
11540
+ children: [(0, react_jsx_runtime.jsxs)("header", {
11541
+ className: dashboard_css_default.dashboardTopline,
11542
+ "data-dashboard-topbar": true,
11543
+ "data-window-drag": true,
11544
+ children: [(0, react_jsx_runtime.jsx)("span", {
11545
+ style: { marginInlineStart: `max(0px, calc(var(--dsh-frame-leading-clearance, 0px) - ${placement?.left ?? 0}px - 20px))` },
11546
+ children: t("dashboard.title")
11547
+ }), (0, react_jsx_runtime.jsx)("div", {
11548
+ className: dashboard_css_default.dashboardToplineActions,
11549
+ children: (0, react_jsx_runtime.jsx)("button", {
11550
+ type: "button",
11551
+ className: dashboard_css_default.dashboardButton,
11552
+ onClick: onClose,
11553
+ children: t("dashboard.back")
11554
+ })
11555
+ })]
11556
+ }), (0, react_jsx_runtime.jsxs)("div", {
11557
+ className: dashboard_css_default.dashboardPage,
11558
+ children: [(0, react_jsx_runtime.jsx)("p", {
11559
+ role: error ? "alert" : "status",
11560
+ children: error ? formatWorktreeViewError(error, t) : t("status.loading")
11561
+ }), error && (0, react_jsx_runtime.jsx)("button", {
11562
+ type: "button",
11563
+ className: dashboard_css_default.dashboardButton,
11564
+ onClick: onRetry,
11565
+ children: t("action.retry")
11566
+ })]
11567
+ })]
11151
11568
  });
11152
11569
  }
11153
11570
  //#endregion
@@ -11274,11 +11691,15 @@ window.__ModuleLoader__.load({
11274
11691
  const dashboardMainRecord = targetWorkspace === void 0 ? void 0 : createMainWorktreeRecord(targetWorkspace, dashboardMainBranch, targetView?.mainInstructions);
11275
11692
  const dashboardRecord = resolveDashboardRecord(dashboard, source.mode, source.currentSessionId, source.workspaceIds, dashboard === void 0 ? void 0 : targetView?.worktrees, dashboardMainRecord);
11276
11693
  (0, react.useEffect)(() => {
11277
- if (dashboard !== void 0 && dashboardRecord === void 0) setDashboard(void 0);
11694
+ if (dashboard !== void 0 && dashboardRecord === void 0 && (source.mode !== "worktree" || dashboard.sessionId !== void 0 && dashboard.sessionId !== source.currentSessionId || !source.workspaceIds.includes(dashboard.workspaceId) || targetView !== void 0)) setDashboard(void 0);
11278
11695
  }, [
11279
11696
  dashboard,
11280
11697
  dashboardRecord,
11281
- setDashboard
11698
+ setDashboard,
11699
+ source.mode,
11700
+ source.currentSessionId,
11701
+ source.workspaceIds,
11702
+ targetView
11282
11703
  ]);
11283
11704
  const mutation = useSurfaceMutation({ read });
11284
11705
  const lifecycleState = useLifecycleState({
@@ -11402,147 +11823,166 @@ window.__ModuleLoader__.load({
11402
11823
  if (source.mode !== "worktree") return null;
11403
11824
  const { ref, width, bounds, collapsed } = source;
11404
11825
  const { t } = props;
11405
- return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsxs)("aside", {
11406
- ref,
11407
- className: worktree_css_default.surface,
11408
- "data-worktree-surface": true,
11409
- "data-collapsed": collapsed || void 0,
11410
- "aria-label": t("mode.navigation"),
11411
- style: {
11412
- width: `${width}px`,
11413
- ...bounds.ready ? {
11414
- top: `${bounds.top}px`,
11415
- height: `${bounds.height}px`
11416
- } : {
11417
- height: "0px",
11418
- visibility: "hidden"
11419
- }
11420
- },
11421
- children: [
11422
- (0, react_jsx_runtime.jsxs)("div", {
11423
- className: worktree_css_default.wideContent,
11424
- children: [(0, react_jsx_runtime.jsx)(SurfaceHeader, {
11425
- expansion,
11826
+ return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
11827
+ (0, react_jsx_runtime.jsxs)("aside", {
11828
+ ref,
11829
+ className: worktree_css_default.surface,
11830
+ "data-worktree-surface": true,
11831
+ "data-collapsed": collapsed || void 0,
11832
+ "data-native-sidebar-covered": source.nativeCovered || void 0,
11833
+ "aria-hidden": collapsed || void 0,
11834
+ "aria-label": t("mode.navigation"),
11835
+ style: {
11836
+ width: `${width}px`,
11837
+ ...bounds.ready ? {
11838
+ top: `${bounds.top}px`,
11839
+ height: `${bounds.height}px`
11840
+ } : {
11841
+ height: "0px",
11842
+ visibility: "hidden"
11843
+ }
11844
+ },
11845
+ children: [
11846
+ (0, react_jsx_runtime.jsxs)("div", {
11847
+ className: worktree_css_default.wideContent,
11848
+ children: [(0, react_jsx_runtime.jsx)(SurfaceHeader, {
11849
+ expansion,
11850
+ props,
11851
+ source,
11852
+ read,
11853
+ mutation
11854
+ }), (0, react_jsx_runtime.jsx)(SurfaceContent, {
11855
+ source,
11856
+ props,
11857
+ lifecycle,
11858
+ mutation,
11859
+ session,
11860
+ read,
11861
+ expansion,
11862
+ ordering,
11863
+ drag,
11864
+ menus,
11865
+ registration,
11866
+ native,
11867
+ lifecycleState
11868
+ })]
11869
+ }),
11870
+ (0, react_jsx_runtime.jsx)(NativeDialogs, {
11426
11871
  props,
11427
- source,
11428
- read,
11429
- mutation
11430
- }), (0, react_jsx_runtime.jsx)(SurfaceContent, {
11431
- source,
11872
+ native
11873
+ }),
11874
+ (0, react_jsx_runtime.jsx)(RegistrationDialog, {
11432
11875
  props,
11433
- lifecycle,
11876
+ registration,
11877
+ registrationState,
11434
11878
  mutation,
11435
- session,
11436
- read,
11879
+ read
11880
+ }),
11881
+ (0, react_jsx_runtime.jsx)(LifecycleDialogs, {
11882
+ props,
11883
+ lifecycleState,
11884
+ mutation,
11885
+ lifecycle,
11437
11886
  expansion,
11438
- ordering,
11439
- drag,
11440
- menus,
11441
- registration,
11442
- native,
11443
- lifecycleState
11444
- })]
11445
- }),
11446
- (0, react_jsx_runtime.jsx)(NativeDialogs, {
11447
- props,
11448
- native
11449
- }),
11450
- (0, react_jsx_runtime.jsx)(RegistrationDialog, {
11451
- props,
11452
- registration,
11453
- registrationState,
11454
- mutation,
11455
- read
11456
- }),
11457
- (0, react_jsx_runtime.jsx)(LifecycleDialogs, {
11458
- props,
11459
- lifecycleState,
11460
- mutation,
11461
- lifecycle,
11462
- expansion,
11463
- read,
11464
- session
11465
- }),
11466
- (0, react_jsx_runtime.jsx)(AccessConfirmation, {
11467
- source,
11468
- props
11469
- })
11470
- ]
11471
- }), dashboardRecord !== void 0 && (0, react_jsx_runtime.jsx)(WorktreeDashboard, {
11472
- manager: props.manager,
11473
- record: dashboardRecord,
11474
- onSaveInstructions: props.manager ? async (instructions, expectedInstructions) => {
11475
- try {
11476
- return await props.manager.updateWorktreeInstructions({
11477
- workspaceId: dashboardRecord.workspaceId,
11478
- worktreeId: dashboardRecord.worktreeId,
11479
- instructions,
11480
- expectedInstructions
11481
- });
11482
- } finally {
11887
+ read,
11888
+ session
11889
+ }),
11890
+ (0, react_jsx_runtime.jsx)(AccessConfirmation, {
11891
+ source,
11892
+ props
11893
+ })
11894
+ ]
11895
+ }),
11896
+ dashboard !== void 0 && dashboardRecord === void 0 && dashboard.sessionId === source.currentSessionId && source.workspaceIds.includes(dashboard.workspaceId) && targetView === void 0 && (0, react_jsx_runtime.jsx)(DashboardRequest, {
11897
+ t,
11898
+ error: read.readState.error ?? (read.readState.targetError?.workspaceIds.includes(dashboard.workspaceId) ? read.readState.targetError.error : void 0),
11899
+ onClose: closeDashboard,
11900
+ onRetry: () => {
11483
11901
  read.refresh({
11484
- preserveCurrent: true,
11485
11902
  scope: {
11486
11903
  kind: "workspace",
11487
- workspaceId: dashboardRecord.workspaceId
11488
- }
11904
+ workspaceId: dashboard.workspaceId
11905
+ },
11906
+ preserveCurrent: true
11489
11907
  });
11490
11908
  }
11491
- } : void 0,
11492
- onSaveBaseline: props.manager && typeof props.manager.updateWorktreeBaseBranch === "function" && dashboardManagedRecord !== void 0 && dashboardCanCreate ? async (baseBranch, expectedBaseBranch) => {
11493
- try {
11494
- return await props.manager.updateWorktreeBaseBranch({
11909
+ }),
11910
+ dashboardRecord !== void 0 && (0, react_jsx_runtime.jsx)(WorktreeDashboard, {
11911
+ manager: props.manager,
11912
+ record: dashboardRecord,
11913
+ onSaveInstructions: props.manager ? async (instructions, expectedInstructions) => {
11914
+ try {
11915
+ return await props.manager.updateWorktreeInstructions({
11916
+ workspaceId: dashboardRecord.workspaceId,
11917
+ worktreeId: dashboardRecord.worktreeId,
11918
+ instructions,
11919
+ expectedInstructions
11920
+ });
11921
+ } finally {
11922
+ read.refresh({
11923
+ preserveCurrent: true,
11924
+ scope: {
11925
+ kind: "workspace",
11926
+ workspaceId: dashboardRecord.workspaceId
11927
+ }
11928
+ });
11929
+ }
11930
+ } : void 0,
11931
+ onSaveBaseline: props.manager && typeof props.manager.updateWorktreeBaseBranch === "function" && dashboardManagedRecord !== void 0 && dashboardCanCreate ? async (baseBranch, expectedBaseBranch) => {
11932
+ try {
11933
+ return await props.manager.updateWorktreeBaseBranch({
11934
+ workspaceId: dashboardRecord.workspaceId,
11935
+ worktreeId: dashboardRecord.worktreeId,
11936
+ baseBranch,
11937
+ expectedBaseBranch
11938
+ });
11939
+ } finally {
11940
+ read.refresh({
11941
+ preserveCurrent: true,
11942
+ scope: {
11943
+ kind: "workspace",
11944
+ workspaceId: dashboardRecord.workspaceId
11945
+ }
11946
+ });
11947
+ }
11948
+ } : void 0,
11949
+ branches: dashboardView?.branches ?? [],
11950
+ workspaceTitle: dashboardWorkspace?.title ?? "",
11951
+ sessions: source.sessions,
11952
+ sessionPresentations: source.sessionPresentations,
11953
+ 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)),
11954
+ actionPending: mutation.actionPending,
11955
+ onOpenFile: typeof props.openResource === "function" ? onOpenFile : void 0,
11956
+ onOpenSession: (sessionId) => session.openWorkspaceSession(dashboardRecord.workspaceId, sessionId),
11957
+ onCreateSession: dashboardCanCreate && (isMainWorktreeId$1(dashboardRecord.worktreeId) ? props.createMainSession !== void 0 : props.createSessionForWorktree !== void 0) ? () => {
11958
+ if (mutation.actionPending) return;
11959
+ closeDashboard();
11960
+ if (isMainWorktreeId$1(dashboardRecord.worktreeId)) props.createMainSession?.(dashboardRecord.workspaceId);
11961
+ else session.createSession({
11495
11962
  workspaceId: dashboardRecord.workspaceId,
11496
11963
  worktreeId: dashboardRecord.worktreeId,
11497
- baseBranch,
11498
- expectedBaseBranch
11964
+ cwd: dashboardRecord.absolutePath
11499
11965
  });
11500
- } finally {
11501
- read.refresh({
11502
- preserveCurrent: true,
11503
- scope: {
11504
- kind: "workspace",
11505
- workspaceId: dashboardRecord.workspaceId
11506
- }
11966
+ } : void 0,
11967
+ onCreateWorktree: dashboardCanCreate && dashboardRecord.currentBranch !== null && dashboardRecord.branch.length > 0 && dashboardWorkspace !== void 0 && dashboardView !== void 0 ? () => {
11968
+ if (mutation.actionPending) return;
11969
+ const branch = dashboardRecord.currentBranch ?? dashboardRecord.branch;
11970
+ registration.openWorktreeCreator(dashboardWorkspace, {
11971
+ baseBranch: branch,
11972
+ newBranch: createNumberedWorktreeName(branch, [...dashboardView.branches.map((candidate) => candidate.name), ...dashboardView.worktrees.map((candidate) => candidate.branch)])
11507
11973
  });
11508
- }
11509
- } : void 0,
11510
- branches: dashboardView?.branches ?? [],
11511
- workspaceTitle: dashboardWorkspace?.title ?? "",
11512
- sessions: source.sessions,
11513
- sessionPresentations: source.sessionPresentations,
11514
- 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)),
11515
- actionPending: mutation.actionPending,
11516
- onOpenFile: typeof props.openResource === "function" ? onOpenFile : void 0,
11517
- onOpenSession: (sessionId) => session.openWorkspaceSession(dashboardRecord.workspaceId, sessionId),
11518
- onCreateSession: dashboardCanCreate && (isMainWorktreeId$1(dashboardRecord.worktreeId) ? props.createMainSession !== void 0 : props.createSessionForWorktree !== void 0) ? () => {
11519
- if (mutation.actionPending) return;
11520
- closeDashboard();
11521
- if (isMainWorktreeId$1(dashboardRecord.worktreeId)) props.createMainSession?.(dashboardRecord.workspaceId);
11522
- else session.createSession({
11523
- workspaceId: dashboardRecord.workspaceId,
11524
- worktreeId: dashboardRecord.worktreeId,
11525
- cwd: dashboardRecord.absolutePath
11526
- });
11527
- } : void 0,
11528
- onCreateWorktree: dashboardCanCreate && dashboardRecord.currentBranch !== null && dashboardRecord.branch.length > 0 && dashboardWorkspace !== void 0 && dashboardView !== void 0 ? () => {
11529
- if (mutation.actionPending) return;
11530
- const branch = dashboardRecord.currentBranch ?? dashboardRecord.branch;
11531
- registration.openWorktreeCreator(dashboardWorkspace, {
11532
- baseBranch: branch,
11533
- newBranch: createNumberedWorktreeName(branch, [...dashboardView.branches.map((candidate) => candidate.name), ...dashboardView.worktrees.map((candidate) => candidate.branch)])
11534
- });
11535
- } : void 0,
11536
- onArchiveWorktree: dashboardManagedRecord !== void 0 && dashboardManagedRecord.status === "active" && dashboardManagedRecord.health !== "recovery-needed" ? () => {
11537
- if (mutation.actionPending) return;
11538
- lifecycleState.setWorktreeRemoval(dashboardManagedRecord);
11539
- mutation.setActionError(void 0);
11540
- } : void 0,
11541
- t,
11542
- onClose: closeDashboard,
11543
- onOpenSidebar: source.currentSessionId === void 0 ? void 0 : props.openRightSidebar,
11544
- isRightSidebarExpanded: props.isRightSidebarExpanded
11545
- }, `${dashboardRecord.workspaceId}:${dashboardRecord.worktreeId}`)] });
11974
+ } : void 0,
11975
+ onArchiveWorktree: dashboardManagedRecord !== void 0 && dashboardManagedRecord.status === "active" && dashboardManagedRecord.health !== "recovery-needed" ? () => {
11976
+ if (mutation.actionPending) return;
11977
+ lifecycleState.setWorktreeRemoval(dashboardManagedRecord);
11978
+ mutation.setActionError(void 0);
11979
+ } : void 0,
11980
+ t,
11981
+ onClose: closeDashboard,
11982
+ onOpenSidebar: source.currentSessionId === void 0 ? void 0 : props.openRightSidebar,
11983
+ isRightSidebarExpanded: props.isRightSidebarExpanded
11984
+ }, `${dashboardRecord.workspaceId}:${dashboardRecord.worktreeId}`)
11985
+ ] });
11546
11986
  }
11547
11987
  //#endregion
11548
11988
  //#region lib/client/overlay/WorktreeOverlay.js
@@ -11606,7 +12046,7 @@ window.__ModuleLoader__.load({
11606
12046
  function identityFrom(sessions, workspaces) {
11607
12047
  const sessionSnapshot = sessions.getSnapshot();
11608
12048
  const workspaceSnapshot = workspaces.getSnapshot();
11609
- const sessionId = sessionSnapshot.current;
12049
+ const sessionId = currentSessionIdFromList(sessionSnapshot);
11610
12050
  if (sessionId === void 0) return { workspaceId: deriveRecentWorkspaceId({ items: workspaceSnapshot.items }, sessionSnapshot.byId) };
11611
12051
  return {
11612
12052
  sessionId,
@@ -11941,6 +12381,37 @@ window.__ModuleLoader__.load({
11941
12381
  };
11942
12382
  }
11943
12383
  //#endregion
12384
+ //#region lib/client/session/session-rename.js
12385
+ /** Rename a listed Session across DSH generations with different retention semantics. */
12386
+ async function renameWorktreeSession(sessions, sessionId, title) {
12387
+ const compatibleSessions = sessions;
12388
+ if (typeof compatibleSessions.using === "function") {
12389
+ const result = await compatibleSessions.using(sessionId, { source: "workspaceOperation" }, (reference) => reference.binding.session.rename(title));
12390
+ if (!result.ok) throw new Error(result.error.message);
12391
+ return;
12392
+ }
12393
+ const session = compatibleSessions.binding(sessionId)?.session;
12394
+ if (session === void 0) throw new Error(`unknown session "${sessionId}"`);
12395
+ const result = await session.rename(title);
12396
+ if (!result.ok) throw new Error(result.error.message);
12397
+ }
12398
+ //#endregion
12399
+ //#region lib/client/session/session-navigation.js
12400
+ /** Use DSH-owned navigation in 1.7; keep the older Session-controller fallback. */
12401
+ function openWorktreeSession(uiWorkspace, sessions, sessionId) {
12402
+ const compatibleUiWorkspace = uiWorkspace;
12403
+ if (typeof compatibleUiWorkspace.openSession === "function") {
12404
+ compatibleUiWorkspace.openSession(sessionId);
12405
+ return;
12406
+ }
12407
+ const legacyOpen = sessions.open;
12408
+ if (typeof legacyOpen === "function") {
12409
+ legacyOpen(sessionId);
12410
+ return;
12411
+ }
12412
+ throw new Error("DSH Client does not expose a Session navigation method");
12413
+ }
12414
+ //#endregion
11944
12415
  //#region lib/client/permission/worktree-permission.js
11945
12416
  /**
11946
12417
  * Coordinate async permission requests with the one in-page confirmation
@@ -12406,6 +12877,23 @@ window.__ModuleLoader__.load({
12406
12877
  };
12407
12878
  const sessions = ctx.sessions;
12408
12879
  const slots = ctx.slots;
12880
+ ctx.effect(() => {
12881
+ const notice = new RestartNotice((signal) => manager.probeHost(signal));
12882
+ const check = () => void notice.check();
12883
+ const reset = ctx.on("connection/reset", check);
12884
+ const overlay = slots.inject("shell.overlay", () => slots.register({
12885
+ name: "shell.overlay",
12886
+ id: "clutch-dsh-worktree-restart-toast",
12887
+ locale: WORKTREE_NS,
12888
+ inject: () => ({ notice })
12889
+ }, RestartToast));
12890
+ check();
12891
+ return () => {
12892
+ notice.dispose();
12893
+ reset();
12894
+ overlay();
12895
+ };
12896
+ }, "clutch-dsh-worktree: restart reminder");
12409
12897
  const virtualWorkspaceMembership = createVirtualWorkspaceMembership(ctx.workspaces.list);
12410
12898
  const contextProjection = createWorktreeContextProjection({
12411
12899
  sessions: ctx.sessions.list,
@@ -12526,9 +13014,7 @@ window.__ModuleLoader__.load({
12526
13014
  permission: permissionManager,
12527
13015
  confirmFullAccess: permissionManager === void 0 ? void 0 : fullAccessConfirmation.request,
12528
13016
  onPermissionResult: reportPermissionNotice,
12529
- openSession: (sessionId) => {
12530
- ctx.sessions.open(sessionId);
12531
- }
13017
+ openSession: (sessionId) => openWorktreeSession(ctx.uiWorkspace, ctx.sessions, sessionId)
12532
13018
  });
12533
13019
  ctx.effect(() => () => worktreeSessionConnector.dispose(), "clutch-dsh-worktree: Worktree Session connector cleanup");
12534
13020
  const openDashboardForSession = (sessionId) => {
@@ -12646,19 +13132,14 @@ window.__ModuleLoader__.load({
12646
13132
  worktreeId,
12647
13133
  beforeWorktreeId
12648
13134
  }),
12649
- renameSession: async (sessionId, title) => {
12650
- const session = ctx.sessions.binding(sessionId)?.session;
12651
- if (session === void 0) throw new Error(`unknown session "${sessionId}"`);
12652
- const result = await session.rename(title);
12653
- if (!result.ok) throw new Error(result.error.message);
12654
- },
13135
+ renameSession: (sessionId, title) => renameWorktreeSession(ctx.sessions, sessionId, title),
12655
13136
  forkSession: (sessionId) => {
12656
13137
  if (forkableSessions.fork === void 0) return;
12657
13138
  ctx.sessions.fork({
12658
13139
  sessionId,
12659
13140
  increaseTitle: true
12660
13141
  }).then((childId) => {
12661
- ctx.sessions.open(childId);
13142
+ openWorktreeSession(ctx.uiWorkspace, ctx.sessions, childId);
12662
13143
  }).catch(() => {});
12663
13144
  },
12664
13145
  archiveSession: (sessionId) => ctx.workspaces.archiveSession(sessionId),
@@ -12668,9 +13149,7 @@ window.__ModuleLoader__.load({
12668
13149
  retryForkSession: forkCoordinator === void 0 ? void 0 : async (key) => {
12669
13150
  await forkCoordinator.retry(key);
12670
13151
  },
12671
- openSession: (sessionId) => {
12672
- ctx.sessions.open(sessionId);
12673
- },
13152
+ openSession: (sessionId) => openWorktreeSession(ctx.uiWorkspace, ctx.sessions, sessionId),
12674
13153
  onWorktreeForgotten: (input) => {
12675
13154
  forkCoordinator?.forgetWorktree(input);
12676
13155
  for (const sessionId of input.sessionIds) virtualWorkspaceMembership.removeSession(sessionId);