@cerbur/clutch-dsh-worktree 0.1.23 → 0.1.25

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 (96) hide show
  1. package/README.md +65 -18
  2. package/README.zh.md +52 -15
  3. package/assets/screenshots/screenshots-dashboard.png +0 -0
  4. package/assets/screenshots/screenshots-en.png +0 -0
  5. package/assets/screenshots/screenshots-git-reviewer.png +0 -0
  6. package/assets/screenshots/screenshots-zh.png +0 -0
  7. package/lib/client/WorktreeSurface.d.ts +1 -1
  8. package/lib/client/WorktreeSurface.d.ts.map +1 -1
  9. package/lib/client/WorktreeSurface.js +5 -8
  10. package/lib/client/WorktreeSurface.js.map +1 -1
  11. package/lib/client/dsh-icons.d.ts +1 -0
  12. package/lib/client/dsh-icons.d.ts.map +1 -1
  13. package/lib/client/dsh-icons.js +1 -0
  14. package/lib/client/dsh-icons.js.map +1 -1
  15. package/lib/client/dsh-slot-contract.d.ts +6 -1
  16. package/lib/client/dsh-slot-contract.d.ts.map +1 -1
  17. package/lib/client/entry.d.ts.map +1 -1
  18. package/lib/client/entry.js +3 -0
  19. package/lib/client/entry.js.map +1 -1
  20. package/lib/client/locales.d.ts +28 -2
  21. package/lib/client/locales.d.ts.map +1 -1
  22. package/lib/client/locales.js +28 -2
  23. package/lib/client/locales.js.map +1 -1
  24. package/lib/client/overlay/WorktreeOverlay.d.ts +5 -2
  25. package/lib/client/overlay/WorktreeOverlay.d.ts.map +1 -1
  26. package/lib/client/overlay/WorktreeOverlay.js +11 -2
  27. package/lib/client/overlay/WorktreeOverlay.js.map +1 -1
  28. package/lib/client/surface/components/ActiveWorktree.d.ts +1 -1
  29. package/lib/client/surface/components/ActiveWorktree.d.ts.map +1 -1
  30. package/lib/client/surface/components/ActiveWorktree.js +8 -2
  31. package/lib/client/surface/components/ActiveWorktree.js.map +1 -1
  32. package/lib/client/surface/components/ActivityFilterBar.d.ts +16 -0
  33. package/lib/client/surface/components/ActivityFilterBar.d.ts.map +1 -0
  34. package/lib/client/surface/components/ActivityFilterBar.js +48 -0
  35. package/lib/client/surface/components/ActivityFilterBar.js.map +1 -0
  36. package/lib/client/surface/components/AnimatedTree.js +2 -2
  37. package/lib/client/surface/components/AnimatedTree.js.map +1 -1
  38. package/lib/client/surface/components/ArchivedWorktree.d.ts +1 -1
  39. package/lib/client/surface/components/ArchivedWorktree.d.ts.map +1 -1
  40. package/lib/client/surface/components/ArchivedWorktree.js +7 -2
  41. package/lib/client/surface/components/ArchivedWorktree.js.map +1 -1
  42. package/lib/client/surface/components/ArchivedWorktrees.d.ts +1 -1
  43. package/lib/client/surface/components/ArchivedWorktrees.d.ts.map +1 -1
  44. package/lib/client/surface/components/ArchivedWorktrees.js +2 -2
  45. package/lib/client/surface/components/ArchivedWorktrees.js.map +1 -1
  46. package/lib/client/surface/components/SurfaceContent.d.ts +2 -2
  47. package/lib/client/surface/components/SurfaceContent.d.ts.map +1 -1
  48. package/lib/client/surface/components/SurfaceContent.js.map +1 -1
  49. package/lib/client/surface/components/SurfaceHeader.js +1 -1
  50. package/lib/client/surface/components/SurfaceHeader.js.map +1 -1
  51. package/lib/client/surface/components/WorkspaceTree.d.ts +2 -2
  52. package/lib/client/surface/components/WorkspaceTree.d.ts.map +1 -1
  53. package/lib/client/surface/components/WorkspaceTree.js +34 -11
  54. package/lib/client/surface/components/WorkspaceTree.js.map +1 -1
  55. package/lib/client/surface/components/rows.d.ts.map +1 -1
  56. package/lib/client/surface/components/rows.js +1 -1
  57. package/lib/client/surface/components/rows.js.map +1 -1
  58. package/lib/client/surface/state/useActivityFilter.d.ts +25 -0
  59. package/lib/client/surface/state/useActivityFilter.d.ts.map +1 -0
  60. package/lib/client/surface/state/useActivityFilter.js +79 -0
  61. package/lib/client/surface/state/useActivityFilter.js.map +1 -0
  62. package/lib/client/surface/state/useSessionExpansion.d.ts +2 -0
  63. package/lib/client/surface/state/useSessionExpansion.d.ts.map +1 -1
  64. package/lib/client/surface/state/useSessionExpansion.js +75 -17
  65. package/lib/client/surface/state/useSessionExpansion.js.map +1 -1
  66. package/lib/client/surface/state/useSurfaceSources.d.ts +7 -5
  67. package/lib/client/surface/state/useSurfaceSources.d.ts.map +1 -1
  68. package/lib/client/surface/state/useSurfaceSources.js +14 -5
  69. package/lib/client/surface/state/useSurfaceSources.js.map +1 -1
  70. package/lib/client/surface/types.d.ts +2 -0
  71. package/lib/client/surface/types.d.ts.map +1 -1
  72. package/lib/client/view/activity-filter.d.ts +86 -0
  73. package/lib/client/view/activity-filter.d.ts.map +1 -0
  74. package/lib/client/view/activity-filter.js +121 -0
  75. package/lib/client/view/activity-filter.js.map +1 -0
  76. package/lib/client/view/sidebar-workspace-slot.d.ts +14 -0
  77. package/lib/client/view/sidebar-workspace-slot.d.ts.map +1 -0
  78. package/lib/client/view/sidebar-workspace-slot.js +23 -0
  79. package/lib/client/view/sidebar-workspace-slot.js.map +1 -0
  80. package/lib/client/view/view-mode-store.d.ts.map +1 -1
  81. package/lib/client/view/view-mode-store.js +26 -1
  82. package/lib/client/view/view-mode-store.js.map +1 -1
  83. package/lib/client/view/view-mode.d.ts +18 -1
  84. package/lib/client/view/view-mode.d.ts.map +1 -1
  85. package/lib/client/view/view-mode.js.map +1 -1
  86. package/lib/client/view/workspace-region-geometry.d.ts +11 -0
  87. package/lib/client/view/workspace-region-geometry.d.ts.map +1 -0
  88. package/lib/client/view/workspace-region-geometry.js +28 -0
  89. package/lib/client/view/workspace-region-geometry.js.map +1 -0
  90. package/lib/client/view/worktree-expand-state.d.ts +12 -1
  91. package/lib/client/view/worktree-expand-state.d.ts.map +1 -1
  92. package/lib/client/view/worktree-expand-state.js +26 -0
  93. package/lib/client/view/worktree-expand-state.js.map +1 -1
  94. package/lib/client.js +888 -562
  95. package/lib/client.js.map +1 -1
  96. package/package.json +1 -1
package/lib/client.js CHANGED
@@ -1844,6 +1844,20 @@ window.__ModuleLoader__.load({
1844
1844
  "workspace.search": "搜索工作区和会话",
1845
1845
  "search.clear": "清除搜索",
1846
1846
  "workspace.noMatches": "没有匹配的工作区",
1847
+ "filter.group": "按活跃时间筛选",
1848
+ "filter.today": "今日",
1849
+ "filter.last24h": "24 小时",
1850
+ "filter.last7d": "7 天",
1851
+ "filter.all": "全部",
1852
+ "filter.count": "{label},{count} 个会话",
1853
+ "filter.empty": "这个范围内没有会话",
1854
+ "filter.emptyHint": "切换到「全部」查看所有会话。",
1855
+ "filter.emptyHintMenu": "从右侧菜单显示「全部」,即可查看所有会话。",
1856
+ "filter.choose": "选择显示的筛选",
1857
+ "filter.visible": "显示的筛选",
1858
+ "filter.keepOne": "至少保留一个筛选",
1859
+ "filter.keepInactive": "显示无活跃 Workspace",
1860
+ "filter.keepInactiveHint": "同时保留没有活跃 Session 的 Workspace 和 Worktree 结构。",
1847
1861
  "workspace.renameTitle": "重命名工作区",
1848
1862
  "workspace.name": "工作区名称",
1849
1863
  "workspace.duplicate": "已存在同名 Workspace,请使用不同的名称。",
@@ -1889,7 +1903,6 @@ window.__ModuleLoader__.load({
1889
1903
  "worktree.removeDescription": "归档“{name}”?目录、会话绑定和工作目录保持不变。删除目录需另行选择“清理磁盘”。",
1890
1904
  "worktree.removeExternalDescription": "归档“{name}”?外部目录、会话绑定和工作目录保持不变。删除目录需另行选择“清理磁盘”。",
1891
1905
  "worktree.addSession": "向 {name} 添加会话",
1892
- "worktree.noWorktrees": "暂无 Worktree",
1893
1906
  "worktree.createTitle": "新建 Worktree",
1894
1907
  "worktree.createDescription": "“{name}” · Worktree 路径由 DSH 管理。",
1895
1908
  "worktree.tabCreate": "创建",
@@ -2291,6 +2304,20 @@ window.__ModuleLoader__.load({
2291
2304
  "workspace.search": "Search Workspaces and Sessions",
2292
2305
  "search.clear": "Clear search",
2293
2306
  "workspace.noMatches": "No matching Workspaces",
2307
+ "filter.group": "Filter by activity",
2308
+ "filter.today": "Today",
2309
+ "filter.last24h": "24h",
2310
+ "filter.last7d": "7d",
2311
+ "filter.all": "All",
2312
+ "filter.count": "{label}, {count} Sessions",
2313
+ "filter.empty": "No Sessions in this range",
2314
+ "filter.emptyHint": "Switch to All to see every Session.",
2315
+ "filter.emptyHintMenu": "Show All from the range menu to see every Session.",
2316
+ "filter.choose": "Choose visible filters",
2317
+ "filter.visible": "Visible filters",
2318
+ "filter.keepOne": "Keep at least one filter",
2319
+ "filter.keepInactive": "Show inactive Workspaces",
2320
+ "filter.keepInactiveHint": "Also keep Workspaces and Worktrees with no active Session in the range.",
2294
2321
  "workspace.renameTitle": "Rename Workspace",
2295
2322
  "workspace.name": "Workspace name",
2296
2323
  "workspace.duplicate": "A Workspace with this name already exists. Choose a different name.",
@@ -2336,7 +2363,6 @@ window.__ModuleLoader__.load({
2336
2363
  "worktree.removeDescription": "Archive {name}? The directory, Session bindings, and working directories are preserved. Deleting the directory requires the separate Clean Disk action.",
2337
2364
  "worktree.removeExternalDescription": "Archive {name}? The external directory, Session bindings, and working directories are preserved. Deleting the directory requires the separate Clean Disk action.",
2338
2365
  "worktree.addSession": "Add Session to {name}",
2339
- "worktree.noWorktrees": "No Worktrees",
2340
2366
  "worktree.createTitle": "New Worktree",
2341
2367
  "worktree.createDescription": "{name} · the Worktree path is managed by DSH.",
2342
2368
  "worktree.tabCreate": "Create",
@@ -2861,9 +2887,10 @@ window.__ModuleLoader__.load({
2861
2887
  const IconRefreshOutline16 = createDshIconAlias(exports$1, "IconRefreshOutline16", "IconRefreshOutlineRegular");
2862
2888
  const IconRightUpOutline16 = createDshIconAlias(exports$1, "IconRightUpOutline16", "IconRightUpOutlineRegular");
2863
2889
  const IconSearchOutline16 = createDshIconAlias(exports$1, "IconSearchOutline16", "IconSearchOutlineRegular");
2890
+ const IconSlidersTwoOutline16 = createDshIconAlias(exports$1, "IconSlidersTwoOutline16", "IconSlidersTwoOutlineRegular");
2864
2891
  const IconTrashOutline16 = createDshIconAlias(exports$1, "IconTrashOutline16", "IconTrashOutlineRegular");
2865
2892
  //#endregion
2866
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/context/worktree-context.css.mjs
2893
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/context/worktree-context.css.mjs
2867
2894
  const css$9 = ".-cerbur-clutch-dsh-worktree-headerContext {\n display: inline-flex;\n min-width: 0;\n height: 22px;\n align-items: center;\n gap: 4px;\n max-width: 180px;\n overflow: hidden;\n border-radius: 6px;\n padding: 0 2px 0 0;\n background: var(--dsw-alias-fill-tsp-secondary);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 22px;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-contextIcon {\n flex: none;\n opacity: 0.7;\n}\n\n.-cerbur-clutch-dsh-worktree-contextLabel {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-contextHoverTitle {\n max-width: 360px;\n color: var(--dsw-static-neutral-bluish-00);\n font-size: 14px;\n line-height: 20px;\n overflow-wrap: anywhere;\n white-space: normal;\n}\n\n.-cerbur-clutch-dsh-worktree-heroContextHost {\n position: absolute;\n z-index: 0;\n display: block;\n width: max-content;\n max-width: 260px;\n min-height: 22px;\n}\n\n.-cerbur-clutch-dsh-worktree-heroContext {\n display: inline-flex;\n box-sizing: border-box;\n max-width: 260px;\n min-height: 22px;\n align-items: center;\n overflow: hidden;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n padding: 0 8px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 20px;\n pointer-events: auto;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n";
2868
2895
  const styleId$9 = "@cerbur/clutch-dsh-worktree/worktree-context.css";
2869
2896
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree-context.css\"]") === null) {
@@ -2927,8 +2954,8 @@ window.__ModuleLoader__.load({
2927
2954
  globalSetViewMode?.(mode);
2928
2955
  }
2929
2956
  //#endregion
2930
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/worktree.css.mjs
2931
- const css$8 = ".-cerbur-clutch-dsh-worktree-action {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 8px;\n width: calc(100% + 4px);\n height: 42px;\n margin: 4px -2px;\n box-sizing: border-box;\n border: 0;\n border-radius: 12px;\n padding: 0 10px 0 8px;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 22px;\n text-align: left;\n overflow: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-action:hover,\n.-cerbur-clutch-dsh-worktree-action[data-active='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-action[data-collapsed='true'] {\n width: 36px;\n height: 36px;\n margin: 8px 0 10px;\n justify-content: center;\n gap: 0;\n padding: 0;\n border-radius: 50%;\n}\n\n.-cerbur-clutch-dsh-worktree-actionLabel {\n display: inline-flex;\n min-width: 0;\n align-items: center;\n height: 22px;\n overflow: hidden;\n font-weight: 400;\n line-height: 22px;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-surface {\n position: absolute;\n top: 0;\n left: 0;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n min-width: 0;\n overflow: hidden;\n border-right: 1px solid var(--dsw-alias-border-l1);\n background: var(--dsw-specific-sidebar-fill);\n color: var(--dsw-alias-label-primary);\n pointer-events: auto;\n transition: width var(--ds-transition-duration-slow) var(--ds-ease-in-out);\n}\n\n/* Native macOS AppFrame already paints the tint over OS window vibrancy.\n Once the covered native rows are concealed, use that one material without\n adding another fill or backdrop root (menus keep their own native blur). */\n[data-platform='darwin'] .-cerbur-clutch-dsh-worktree-surface[data-native-sidebar-covered='true'] {\n background: transparent;\n border-right: none;\n}\n\n/* The shell overlay is outside the native column's clipping boundary.\n Follow the semantic collapse immediately, even during the track transition. */\n[data-sidebar-collapsed] [data-shell-overlay] .-cerbur-clutch-dsh-worktree-surface,\n.-cerbur-clutch-dsh-worktree-surface[data-collapsed='true'] {\n visibility: hidden;\n opacity: 0;\n pointer-events: none;\n}\n\n@media (prefers-reduced-transparency: reduce) {\n [data-platform='darwin'] .-cerbur-clutch-dsh-worktree-surface[data-native-sidebar-covered='true'] {\n background: color-mix(in srgb, var(--dsw-specific-sidebar-fill) 90%, transparent);\n }\n}\n\n.-cerbur-clutch-dsh-worktree-motionExits {\n position: absolute;\n inset: 0;\n contain: strict;\n overflow: clip;\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .-cerbur-clutch-dsh-worktree-surface {\n transition: none;\n }\n}\n\n.-cerbur-clutch-dsh-worktree-wideContent {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1;\n flex-direction: column;\n}\n\n.-cerbur-clutch-dsh-worktree-surface[data-collapsed='true'] .-cerbur-clutch-dsh-worktree-wideContent {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationDialog {\n width: min(440px, 100%);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody {\n display: grid;\n min-width: 0;\n gap: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody .-cerbur-clutch-dsh-worktree-modalField {\n min-width: 0;\n gap: 8px;\n line-height: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody .-cerbur-clutch-dsh-worktree-renameInput,\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody [data-single-select] > button {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n height: 40px;\n padding: 0 12px;\n border: 1px solid var(--dsw-alias-border-l3);\n font-size: 14px;\n line-height: 22px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody .-cerbur-clutch-dsh-worktree-renameInput:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTabs {\n display: flex;\n gap: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTab {\n border: 0;\n border-bottom: 2px solid transparent;\n padding: 4px 0 8px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 22px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTab[aria-selected='true'] {\n border-bottom-color: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeImportCandidates {\n display: grid;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeImportError {\n display: grid;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton {\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: inherit;\n cursor: pointer;\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-header {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: none;\n min-height: 44px;\n padding: 6px 10px;\n box-sizing: border-box;\n border-bottom: 1px solid var(--dsw-alias-border-l1);\n}\n\n.-cerbur-clutch-dsh-worktree-title {\n min-width: 0;\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n font-weight: 600;\n opacity: 1;\n visibility: visible;\n transition:\n opacity 120ms var(--ds-ease-in-out),\n transform 180ms var(--ds-ease-in-out),\n visibility 0s linear;\n}\n\n.-cerbur-clutch-dsh-worktree-titleHidden {\n flex: 0 0 0px;\n max-width: 0;\n opacity: 0;\n transform: translateX(-4px);\n visibility: hidden;\n pointer-events: none;\n transition-delay: 0s, 0s, 180ms;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 28px;\n height: 28px;\n border: 0;\n border-radius: 7px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 16px;\n line-height: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-modeButton[data-active='true'] {\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-workspacePicker {\n display: block;\n width: calc(100% - 20px);\n margin: 6px 10px 8px;\n padding: 6px 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 7px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceLabel {\n display: block;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollFrame {\n position: relative;\n min-height: 0;\n flex: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-content {\n height: 100%;\n box-sizing: border-box;\n overflow: auto;\n padding: 0 10px 12px;\n scrollbar-width: none;\n}\n\n.-cerbur-clutch-dsh-worktree-content::-webkit-scrollbar {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollContent {\n min-width: 0;\n display: flow-root;\n}\n\n/* The themed thumb floats in the existing right inset. Native scrolling\n stays on .-cerbur-clutch-dsh-worktree-content; OS scrollbar preferences cannot shift the rows. */\n.-cerbur-clutch-dsh-worktree-overlayScrollbar {\n position: absolute;\n top: 0;\n right: 2px;\n bottom: 0;\n width: 5px;\n touch-action: none;\n user-select: none;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollbarThumb {\n width: 100%;\n border-radius: 999px;\n background: var(--dsw-alias-scrollbar-bg-l2);\n opacity: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollFrame:hover .-cerbur-clutch-dsh-worktree-scrollbarThumb,\n.-cerbur-clutch-dsh-worktree-scrollFrame:focus-within .-cerbur-clutch-dsh-worktree-scrollbarThumb,\n.-cerbur-clutch-dsh-worktree-overlayScrollbar[data-dragging='true'] .-cerbur-clutch-dsh-worktree-scrollbarThumb {\n opacity: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollbarThumb:hover,\n.-cerbur-clutch-dsh-worktree-overlayScrollbar[data-dragging='true'] .-cerbur-clutch-dsh-worktree-scrollbarThumb {\n background: var(--dsw-alias-scrollbar-hover-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-content:focus-visible {\n outline: 2px solid var(--dsw-alias-border-l3);\n outline-offset: -2px;\n}\n\n.-cerbur-clutch-dsh-worktree-error {\n margin: 12px 0 0;\n padding: 8px;\n border: 1px solid var(--dsw-alias-state-error-primary);\n border-radius: 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-notice {\n margin: 12px 0 0;\n padding: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 7px;\n background: var(--dsw-alias-button-elevated-fill);\n}\n\n.-cerbur-clutch-dsh-worktree-retryButton,\n.-cerbur-clutch-dsh-worktree-actionButton {\n border: 0;\n border-radius: 6px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-retryButton,\n.-cerbur-clutch-dsh-worktree-actionButton {\n width: 100%;\n padding: 6px 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-recoveryActions {\n display: grid;\n gap: 6px;\n margin-top: 6px;\n}\n\n.-cerbur-clutch-dsh-worktree-retryButton:disabled,\n.-cerbur-clutch-dsh-worktree-actionButton:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.-cerbur-clutch-dsh-worktree-actions {\n display: grid;\n gap: 6px;\n margin-top: 10px;\n padding: 8px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-actionSelect {\n min-width: 0;\n padding: 5px 6px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-section {\n margin: 12px 0 0;\n}\n\n.-cerbur-clutch-dsh-worktree-sectionTitle {\n margin: 0 2px 4px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n text-transform: uppercase;\n}\n\n.-cerbur-clutch-dsh-worktree-empty,\n.-cerbur-clutch-dsh-worktree-message {\n margin: 0;\n padding: 8px 4px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 12px;\n line-height: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitReadiness {\n display: grid;\n gap: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-commandBlock {\n margin: 6px 0 0;\n padding: 8px;\n overflow-x: auto;\n border-radius: 6px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-secondary);\n font:\n 11px/16px ui-monospace,\n SFMono-Regular,\n Menlo,\n monospace;\n white-space: pre-wrap;\n}\n\n.-cerbur-clutch-dsh-worktree-message[data-error='true'] {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktree,\n.-cerbur-clutch-dsh-worktree-session {\n display: flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n border: 0;\n border-radius: 7px;\n padding: 6px 8px;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 12px;\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-worktree {\n cursor: default;\n}\n\n.-cerbur-clutch-dsh-worktree-session {\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-worktree:hover,\n.-cerbur-clutch-dsh-worktree-session:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel,\n.-cerbur-clutch-dsh-worktree-sessionLabel {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-status {\n flex: none;\n margin-left: auto;\n padding-left: 8px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-searchSlot {\n flex: none;\n max-width: 28px;\n min-width: 0;\n display: flex;\n align-items: center;\n margin-left: auto;\n box-sizing: border-box;\n transition:\n flex 180ms var(--ds-ease-in-out),\n max-width 180ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-searchSlotExpanded {\n flex: 1;\n max-width: 100%;\n}\n\n.-cerbur-clutch-dsh-worktree-headerActions {\n flex: none;\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: 0;\n opacity: 1;\n visibility: visible;\n transition:\n opacity 120ms var(--ds-ease-in-out),\n transform 180ms var(--ds-ease-in-out),\n visibility 0s linear;\n}\n\n.-cerbur-clutch-dsh-worktree-headerActionsHidden {\n flex: 0 0 0px;\n max-width: 0;\n margin-left: 0;\n opacity: 0;\n transform: translateX(4px);\n visibility: hidden;\n pointer-events: none;\n transition-delay: 0s, 0s, 180ms;\n}\n\n.-cerbur-clutch-dsh-worktree-search {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n height: 28px;\n box-sizing: border-box;\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n transition:\n background 180ms var(--ds-ease-in-out),\n box-shadow 180ms var(--ds-ease-in-out),\n color 180ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded {\n background: var(--dsw-alias-interactive-bg-subtle);\n box-shadow: inset 0 0 0 1px var(--dsw-alias-border-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded:focus-within {\n box-shadow: inset 0 0 0 1px #3b82f6;\n}\n\n.-cerbur-clutch-dsh-worktree-searchButton {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 50%;\n padding: 0;\n background: transparent;\n cursor: pointer;\n color: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-searchButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded .-cerbur-clutch-dsh-worktree-searchButton:hover {\n background: transparent;\n}\n\n.-cerbur-clutch-dsh-worktree-searchInput {\n flex: 1;\n width: 0;\n min-width: 0;\n box-sizing: border-box;\n border: none;\n outline: none;\n background: transparent;\n opacity: 0;\n pointer-events: none;\n font: inherit;\n font-size: 13px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n transition: opacity 120ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded .-cerbur-clutch-dsh-worktree-searchInput {\n margin-left: -2px;\n opacity: 1;\n pointer-events: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-searchInput::placeholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.-cerbur-clutch-dsh-worktree-clearButton {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n border-radius: 50%;\n padding: 0;\n background: transparent;\n cursor: pointer;\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-clearButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-actionSelect:focus {\n border-color: #3b82f6;\n}\n\n.-cerbur-clutch-dsh-worktree-iconButton {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 0;\n border-radius: 7px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 20px;\n line-height: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-iconButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityBell {\n display: inline-flex;\n position: relative;\n}\n\n.-cerbur-clutch-dsh-worktree-activityBadge {\n position: absolute;\n top: 4px;\n right: 4px;\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: var(--dsw-alias-brand-primary, #3b82f6);\n outline: 2px solid var(--dsw-specific-sidebar-fill);\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityPanel {\n position: fixed;\n z-index: 1000;\n box-sizing: border-box;\n width: min(360px, calc(100vw - 16px));\n max-height: min(440px, calc(100dvh - 72px));\n display: flex;\n flex-direction: column;\n padding: 6px;\n color: var(--dsw-alias-label-primary);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l1);\n box-shadow: var(--dsw-elevation-prominent);\n outline: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityHeading {\n flex: none;\n padding: 8px 10px;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityEmpty {\n margin: 0;\n padding: 26px 10px 32px;\n text-align: center;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityList {\n overflow: auto;\n min-height: 0;\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityEntry {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n box-sizing: border-box;\n width: 100%;\n height: auto;\n border: 0;\n border-radius: 7px;\n padding: 10px;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-activityEntry:hover,\n.-cerbur-clutch-dsh-worktree-activityEntry:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-activityEntry:focus-visible {\n outline: 1px solid var(--dsw-alias-label-secondary);\n outline-offset: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityIdentity {\n display: flex;\n flex-direction: column;\n min-width: 0;\n gap: 3px;\n flex: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-activityName,\n.-cerbur-clutch-dsh-worktree-activityContext {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-activityName {\n font-size: 13px;\n line-height: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityContext,\n.-cerbur-clutch-dsh-worktree-activityTime {\n color: var(--dsw-alias-label-secondary);\n font-size: 11px;\n line-height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityMetadata {\n display: flex;\n flex: none;\n flex-direction: column;\n align-items: flex-end;\n gap: 5px;\n padding-top: 2px;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceList {\n position: relative;\n min-width: 0;\n min-height: 0;\n display: grid;\n gap: 4px;\n overflow-x: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceGroup {\n min-width: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow,\n.-cerbur-clutch-dsh-worktree-worktreeRow {\n position: relative;\n display: flex;\n align-items: center;\n min-width: 0;\n min-height: 36px;\n box-sizing: border-box;\n border-radius: 8px;\n padding: 3px 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow .-cerbur-clutch-dsh-worktree-workspaceDisclosure {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover .-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-workspaceDisclosure {\n display: inline-flex;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover .-cerbur-clutch-dsh-worktree-workspaceIcon,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-workspaceIcon {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeDisclosure,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n display: inline-flex;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeIcon,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-worktreeIcon {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 28px;\n border: 0;\n border-radius: 6px;\n padding: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 17px;\n line-height: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton > svg {\n display: block;\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureArrow {\n transition: transform 150ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton[aria-expanded='true'] .-cerbur-clutch-dsh-worktree-disclosureArrow {\n transform: rotate(90deg);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n.-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n color: var(--dsw-alias-label-caption);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .-cerbur-clutch-dsh-worktree-disclosureArrow {\n transition: none;\n }\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceIcon,\n.-cerbur-clutch-dsh-worktree-worktreeIcon {\n flex: none;\n width: 24px;\n color: var(--dsw-alias-label-secondary);\n font-size: 20px;\n line-height: 1;\n text-align: center;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeIcon[data-worktree-state='done'] {\n color: var(--dsw-alias-state-success-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeIcon[data-worktree-state='warning'] {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeIcon[data-worktree-state='error'] {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeStateLabel {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n overflow: hidden;\n border: 0;\n padding: 0;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceIcon {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceIcon[data-workspace-active='true'] {\n color: var(--dsw-alias-state-business-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceTitle,\n.-cerbur-clutch-dsh-worktree-worktreeLabel {\n min-width: 0;\n overflow: hidden;\n flex: 1;\n padding: 0 6px;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-main-group='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel {\n font-weight: 600;\n}\n\n/* Native title reveal: the span clips its own text and scrolls only while\n hovered. Activity alone keeps the resting ellipsis. */\n@media (hover: hover) {\n .-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeLabel,\n .-cerbur-clutch-dsh-worktree-treeSessionRow:hover .-cerbur-clutch-dsh-worktree-sessionLabel {\n text-overflow: clip;\n }\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel[data-scrolled],\n.-cerbur-clutch-dsh-worktree-sessionLabel[data-scrolled] {\n mask-image: linear-gradient(to right, transparent, #000 12px);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel[data-clipped],\n.-cerbur-clutch-dsh-worktree-sessionLabel[data-clipped] {\n mask-image: linear-gradient(to left, transparent, #000 12px);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel[data-scrolled][data-clipped],\n.-cerbur-clutch-dsh-worktree-sessionLabel[data-scrolled][data-clipped] {\n mask-image: linear-gradient(\n to right,\n transparent,\n #000 12px,\n #000 calc(100% - 12px),\n transparent\n );\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeHoverTitle {\n color: var(--dsw-static-neutral-bluish-00);\n font-size: 14px;\n line-height: 20px;\n overflow-wrap: anywhere;\n}\n\n/* Native Session hover card: full title, relative time, and current status. */\n.-cerbur-clutch-dsh-worktree-sessionHoverContent {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionHoverTitle {\n color: #FFFFFF;\n font-size: 14px;\n line-height: 20px;\n overflow-wrap: break-word;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionHoverTime {\n color: #CFD3D6;\n font-size: 12px;\n line-height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionHoverStatus {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #ADB2B8;\n font-size: 12px;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeActionSlot,\n.-cerbur-clutch-dsh-worktree-workspaceActions {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n height: 28px;\n margin-left: auto;\n}\n\n/* Workspace rows retain the native fixed action column. */\n.-cerbur-clutch-dsh-worktree-workspaceActions {\n flex: 0 0 64px;\n width: 64px;\n}\n\n/* Group actions do not reserve space until their row needs to show them. */\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot {\n min-width: 0;\n flex: 0 0 0;\n width: 0;\n gap: 4px;\n}\n\n/* Keep the 28px activity indicator plus a 4px label gap while collapsed. */\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot {\n flex: 0 0 32px;\n width: 32px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot {\n flex: 0 0 auto;\n width: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceActions > .-cerbur-clutch-dsh-worktree-menuAction {\n position: absolute;\n top: 0;\n right: 32px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceActions > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n position: absolute;\n top: 0;\n right: 0;\n visibility: hidden;\n}\n\n/* Worktree actions flow naturally so the rail matches the controls that exist. */\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n position: static;\n opacity: 0;\n pointer-events: none;\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-groupActivity {\n position: absolute;\n top: 0;\n right: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n visibility: hidden;\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-groupActivity {\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'][data-menu-open='true'] .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'][data-menu-open='true'] .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-groupActivity {\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'][data-menu-open='true']\n .-cerbur-clutch-dsh-worktree-treeActionSlot\n > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'][data-menu-open='true']\n .-cerbur-clutch-dsh-worktree-treeActionSlot\n > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardAction {\n display: inline-flex;\n flex: 0 0 28px;\n width: 28px;\n height: 28px;\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-menuAction {\n display: inline-flex;\n flex: 0 0 28px;\n width: 28px;\n height: 28px;\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-workspaceRow:focus-within .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover [data-add-worktree],\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] [data-add-worktree],\n.-cerbur-clutch-dsh-worktree-workspaceRow:focus-within [data-add-worktree] {\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n opacity: 1;\n pointer-events: auto;\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropBefore::before,\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n position: absolute;\n right: 4px;\n left: 4px;\n height: 2px;\n border-radius: 2px;\n background: var(--dsw-alias-brand-primary);\n content: '';\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropBefore::before {\n top: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n bottom: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropBefore::before,\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n position: absolute;\n right: 4px;\n left: 4px;\n height: 2px;\n border-radius: 2px;\n background: var(--dsw-alias-brand-primary);\n content: '';\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropBefore::before {\n top: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n bottom: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeChildren {\n margin-left: 16px;\n padding: 2px 0 5px 12px;\n border-left: 1px solid var(--dsw-alias-border-l1);\n}\n\n.-cerbur-clutch-dsh-worktree-groupLabel {\n padding: 6px 8px 3px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n}\n\n.-cerbur-clutch-dsh-worktree-groupHeader {\n display: flex;\n align-items: center;\n min-height: 34px;\n padding-right: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-groupHeader .-cerbur-clutch-dsh-worktree-groupLabel {\n flex: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeGroup {\n margin-top: 2px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow {\n min-height: 34px;\n}\n\n/* Compact the Worktree leading slots to make room for its third action. */\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-worktreeIcon,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-disclosureButton {\n width: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow {\n position: relative;\n display: flex;\n align-items: center;\n width: calc(100% - 20px);\n margin-left: 20px;\n min-width: 0;\n min-height: 31px;\n box-sizing: border-box;\n border-radius: 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow:hover,\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-menu-open='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-session-current='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-session-current='true'] .-cerbur-clutch-dsh-worktree-treeSessionContent {\n font-weight: 600;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropBefore::before,\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n position: absolute;\n right: 4px;\n left: 4px;\n height: 2px;\n border-radius: 2px;\n background: var(--dsw-alias-brand-primary);\n content: '';\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropBefore::before {\n top: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n bottom: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionContent {\n display: flex;\n align-items: center;\n flex: 1;\n width: 0;\n min-width: 0;\n min-height: 31px;\n box-sizing: border-box;\n border: 0;\n border-radius: 7px;\n padding: 4px 4px;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionContent:hover {\n background: transparent;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionTrailing {\n position: relative;\n display: inline-flex;\n flex: 0 0 52px;\n align-items: center;\n justify-content: flex-end;\n width: 52px;\n height: 28px;\n margin-left: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionMeta,\n.-cerbur-clutch-dsh-worktree-rowActions {\n position: absolute;\n inset: 0;\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionMeta {\n color: var(--dsw-alias-label-tertiary);\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionStatus {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionTime {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-right: 4px;\n font-size: 12px;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionOverflowButton {\n display: block;\n width: calc(100% - 24px);\n margin: 2px 0 4px 24px;\n padding: 4px 8px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 12px;\n font-weight: 400;\n line-height: 20px;\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionOverflowButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-rowActions {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow:hover .-cerbur-clutch-dsh-worktree-sessionMeta,\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-sessionMeta,\n.-cerbur-clutch-dsh-worktree-sessionTrailing:focus-within .-cerbur-clutch-dsh-worktree-sessionMeta {\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow:hover .-cerbur-clutch-dsh-worktree-rowActions,\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-rowActions,\n.-cerbur-clutch-dsh-worktree-sessionTrailing:focus-within .-cerbur-clutch-dsh-worktree-rowActions {\n display: inline-flex;\n}\n\n.-cerbur-clutch-dsh-worktree-renameInput {\n width: 100%;\n}\n\n.-cerbur-clutch-dsh-worktree-renameError {\n margin: 8px 0 0;\n color: var(--dsw-alias-state-error-primary);\n font-size: 13px;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-emptyNested {\n margin: 0;\n padding: 4px 8px 5px 28px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-archivedGroup {\n margin-top: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-modalField {\n display: grid;\n gap: 5px;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-worktreeHoverDetails {\n max-width: 360px;\n white-space: normal;\n overflow-wrap: anywhere;\n line-height: 1.5;\n}\n";
2957
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/worktree.css.mjs
2958
+ const css$8 = ".-cerbur-clutch-dsh-worktree-action {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 8px;\n width: calc(100% + 4px);\n height: 42px;\n margin: 4px -2px;\n box-sizing: border-box;\n border: 0;\n border-radius: 12px;\n padding: 0 10px 0 8px;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 22px;\n text-align: left;\n overflow: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-action:hover,\n.-cerbur-clutch-dsh-worktree-action[data-active='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-action[data-collapsed='true'] {\n width: 36px;\n height: 36px;\n margin: 8px 0 10px;\n justify-content: center;\n gap: 0;\n padding: 0;\n border-radius: 50%;\n}\n\n.-cerbur-clutch-dsh-worktree-actionLabel {\n display: inline-flex;\n min-width: 0;\n align-items: center;\n height: 22px;\n overflow: hidden;\n font-weight: 400;\n line-height: 22px;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceSeat {\n display: flex;\n flex: 1;\n min-height: 0;\n min-width: 0;\n overflow: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-surface {\n position: relative;\n flex: 1;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n min-width: 0;\n overflow: hidden;\n min-height: 0;\n background: transparent;\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/* Fold state comes directly from the sidebar.-cerbur-clutch-dsh-worktree-workspaces owner. */\n.-cerbur-clutch-dsh-worktree-surface[data-collapsed='true'] {\n visibility: hidden;\n opacity: 0;\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-motionExits {\n position: absolute;\n inset: 0;\n contain: strict;\n overflow: clip;\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .-cerbur-clutch-dsh-worktree-surface {\n transition: none;\n }\n}\n\n.-cerbur-clutch-dsh-worktree-wideContent {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1;\n flex-direction: column;\n}\n\n.-cerbur-clutch-dsh-worktree-surface[data-collapsed='true'] .-cerbur-clutch-dsh-worktree-wideContent {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationDialog {\n width: min(440px, 100%);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody {\n display: grid;\n min-width: 0;\n gap: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody .-cerbur-clutch-dsh-worktree-modalField {\n min-width: 0;\n gap: 8px;\n line-height: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody .-cerbur-clutch-dsh-worktree-renameInput,\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody [data-single-select] > button {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n height: 40px;\n padding: 0 12px;\n border: 1px solid var(--dsw-alias-border-l3);\n font-size: 14px;\n line-height: 22px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody .-cerbur-clutch-dsh-worktree-renameInput:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTabs {\n display: flex;\n gap: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTab {\n border: 0;\n border-bottom: 2px solid transparent;\n padding: 4px 0 8px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 22px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTab[aria-selected='true'] {\n border-bottom-color: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeImportCandidates {\n display: grid;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeImportError {\n display: grid;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton {\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: inherit;\n cursor: pointer;\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-header {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: none;\n height: 36px;\n margin: 2px 0 4px;\n padding: 0 10px 0 4px;\n box-sizing: border-box;\n color: var(--dsw-alias-label-tertiary);\n}\n\n/* Activity range selector. Its tabs scroll horizontally instead of clipping\n labels, while the visible-range menu stays pinned at the right edge. */\n.-cerbur-clutch-dsh-worktree-activityBar {\n display: flex;\n align-items: center;\n gap: 4px;\n flex: none;\n padding: 0 10px 8px;\n box-sizing: border-box;\n border-bottom: 0.5px solid var(--dsw-alias-border-l1);\n}\n\n.-cerbur-clutch-dsh-worktree-activityTabs {\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1 1 auto;\n min-width: 0;\n overflow-x: auto;\n scrollbar-width: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityTabs::-webkit-scrollbar {\n display: none;\n}\n\n/* Compact pinned trigger: it never widens the bar or competes with the active\n range pill, and it keeps the tabs as the only horizontally scrolling row. */\n.-cerbur-clutch-dsh-worktree-activityConfig {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: 0;\n border-radius: 7px;\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-activityConfig:hover,\n.-cerbur-clutch-dsh-worktree-activityConfig[aria-expanded='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityConfig:focus-visible {\n outline: 2px solid var(--dsw-alias-border-l3);\n outline-offset: 1px;\n}\n\n/* Checkbox rows in the pinned menu. They keep the menu open while toggling so\n several ranges can be shown or hidden in one visit. */\n.-cerbur-clutch-dsh-worktree-activityOption {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-height: 30px;\n padding: 5px 8px;\n border: 0;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 13px;\n line-height: 20px;\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-activityOption:hover:not(:disabled),\n.-cerbur-clutch-dsh-worktree-activityOption:focus-visible:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n outline: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityOption:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.-cerbur-clutch-dsh-worktree-activityOptionLabel {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-activityOption[data-checked='true'] .-cerbur-clutch-dsh-worktree-activityOptionLabel {\n font-weight: 500;\n}\n\n.-cerbur-clutch-dsh-worktree-activityOptionCount {\n flex: 0 0 auto;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n}\n\n.-cerbur-clutch-dsh-worktree-activityOptionCheck {\n display: inline-flex;\n flex: 0 0 14px;\n width: 14px;\n height: 14px;\n align-items: center;\n justify-content: center;\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityOptionCheck svg {\n width: 14px;\n height: 14px;\n}\n\n.-cerbur-clutch-dsh-worktree-activitySegment {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n flex: 0 0 auto;\n padding: 3px 8px;\n border: 0;\n /* Explicit pill: the shared standard requires corner-shape with a full circle. */\n border-radius: 999px;\n corner-shape: round;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 11px;\n line-height: 1.4;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-activitySegment:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-activitySegment:focus-visible {\n outline: 2px solid var(--dsw-alias-border-l3);\n outline-offset: 1px;\n}\n\n.-cerbur-clutch-dsh-worktree-activitySegmentActive,\n.-cerbur-clutch-dsh-worktree-activitySegmentActive:hover {\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n.-cerbur-clutch-dsh-worktree-activityLabel {\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-activityCount {\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n.-cerbur-clutch-dsh-worktree-activitySegmentActive .-cerbur-clutch-dsh-worktree-activityCount {\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-sidebarTitle {\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: 400;\n line-height: 20px;\n opacity: 1;\n visibility: visible;\n transition:\n opacity 120ms var(--ds-ease-in-out),\n transform 180ms var(--ds-ease-in-out),\n visibility 0s linear;\n}\n\n.-cerbur-clutch-dsh-worktree-titleHidden {\n flex: 0 0 0px;\n max-width: 0;\n opacity: 0;\n transform: translateX(-4px);\n visibility: hidden;\n pointer-events: none;\n transition-delay: 0s, 0s, 180ms;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 28px;\n height: 28px;\n border: 0;\n border-radius: 7px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 16px;\n line-height: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-modeButton[data-active='true'] {\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-workspacePicker {\n display: block;\n width: calc(100% - 20px);\n margin: 6px 10px 8px;\n padding: 6px 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 7px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceLabel {\n display: block;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollFrame {\n position: relative;\n min-height: 0;\n flex: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-content {\n height: 100%;\n box-sizing: border-box;\n overflow: auto;\n padding: 0 10px 12px 0;\n scrollbar-width: none;\n}\n\n.-cerbur-clutch-dsh-worktree-content::-webkit-scrollbar {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollContent {\n min-width: 0;\n display: flow-root;\n}\n\n/* The themed thumb floats in the existing right inset. Native scrolling\n stays on .-cerbur-clutch-dsh-worktree-content; OS scrollbar preferences cannot shift the rows. */\n.-cerbur-clutch-dsh-worktree-overlayScrollbar {\n position: absolute;\n top: 0;\n right: 2px;\n bottom: 0;\n width: 5px;\n touch-action: none;\n user-select: none;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollbarThumb {\n width: 100%;\n border-radius: 999px;\n background: var(--dsw-alias-scrollbar-bg-l2);\n opacity: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollFrame:hover .-cerbur-clutch-dsh-worktree-scrollbarThumb,\n.-cerbur-clutch-dsh-worktree-scrollFrame:focus-within .-cerbur-clutch-dsh-worktree-scrollbarThumb,\n.-cerbur-clutch-dsh-worktree-overlayScrollbar[data-dragging='true'] .-cerbur-clutch-dsh-worktree-scrollbarThumb {\n opacity: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollbarThumb:hover,\n.-cerbur-clutch-dsh-worktree-overlayScrollbar[data-dragging='true'] .-cerbur-clutch-dsh-worktree-scrollbarThumb {\n background: var(--dsw-alias-scrollbar-hover-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-content:focus-visible {\n outline: 2px solid var(--dsw-alias-border-l3);\n outline-offset: -2px;\n}\n\n.-cerbur-clutch-dsh-worktree-error {\n margin: 12px 0 0;\n padding: 8px;\n border: 1px solid var(--dsw-alias-state-error-primary);\n border-radius: 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-notice {\n margin: 12px 0 0;\n padding: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 7px;\n background: var(--dsw-alias-button-elevated-fill);\n}\n\n.-cerbur-clutch-dsh-worktree-retryButton,\n.-cerbur-clutch-dsh-worktree-actionButton {\n border: 0;\n border-radius: 6px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-retryButton,\n.-cerbur-clutch-dsh-worktree-actionButton {\n width: 100%;\n padding: 6px 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-recoveryActions {\n display: grid;\n gap: 6px;\n margin-top: 6px;\n}\n\n.-cerbur-clutch-dsh-worktree-retryButton:disabled,\n.-cerbur-clutch-dsh-worktree-actionButton:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.-cerbur-clutch-dsh-worktree-actions {\n display: grid;\n gap: 6px;\n margin-top: 10px;\n padding: 8px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-actionSelect {\n min-width: 0;\n padding: 5px 6px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-section {\n margin: 12px 0 0;\n}\n\n.-cerbur-clutch-dsh-worktree-sectionTitle {\n margin: 0 2px 4px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n text-transform: uppercase;\n}\n\n.-cerbur-clutch-dsh-worktree-empty,\n.-cerbur-clutch-dsh-worktree-message {\n margin: 0;\n padding: 8px 4px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 12px;\n line-height: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-emptyHint {\n margin: 0;\n padding: 0 4px 8px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n line-height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityMenuSeparator {\n height: 0.5px;\n margin: 4px 2px;\n background: var(--dsw-alias-border-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-gitReadiness {\n display: grid;\n gap: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-commandBlock {\n margin: 6px 0 0;\n padding: 8px;\n overflow-x: auto;\n border-radius: 6px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-secondary);\n font:\n 11px/16px ui-monospace,\n SFMono-Regular,\n Menlo,\n monospace;\n white-space: pre-wrap;\n}\n\n.-cerbur-clutch-dsh-worktree-message[data-error='true'] {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktree,\n.-cerbur-clutch-dsh-worktree-session {\n display: flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n border: 0;\n border-radius: 7px;\n padding: 6px 8px;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 12px;\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-worktree {\n cursor: default;\n}\n\n.-cerbur-clutch-dsh-worktree-session {\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-worktree:hover,\n.-cerbur-clutch-dsh-worktree-session:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel,\n.-cerbur-clutch-dsh-worktree-sessionLabel {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-status {\n flex: none;\n margin-left: auto;\n padding-left: 8px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-searchSlot {\n flex: none;\n max-width: 28px;\n min-width: 0;\n display: flex;\n align-items: center;\n margin-left: auto;\n box-sizing: border-box;\n transition:\n flex 180ms var(--ds-ease-in-out),\n max-width 180ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-searchSlotExpanded {\n flex: 1;\n max-width: 100%;\n}\n\n.-cerbur-clutch-dsh-worktree-headerActions {\n flex: none;\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: 0;\n opacity: 1;\n visibility: visible;\n transition:\n opacity 120ms var(--ds-ease-in-out),\n transform 180ms var(--ds-ease-in-out),\n visibility 0s linear;\n}\n\n.-cerbur-clutch-dsh-worktree-headerActionsHidden {\n flex: 0 0 0px;\n max-width: 0;\n margin-left: 0;\n opacity: 0;\n transform: translateX(4px);\n visibility: hidden;\n pointer-events: none;\n transition-delay: 0s, 0s, 180ms;\n}\n\n.-cerbur-clutch-dsh-worktree-search {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n height: 28px;\n box-sizing: border-box;\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n transition:\n background 180ms var(--ds-ease-in-out),\n box-shadow 180ms var(--ds-ease-in-out),\n color 180ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded {\n background: var(--dsw-alias-interactive-bg-subtle);\n box-shadow: inset 0 0 0 1px var(--dsw-alias-border-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded:focus-within {\n box-shadow: inset 0 0 0 1px #3b82f6;\n}\n\n.-cerbur-clutch-dsh-worktree-searchButton {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 50%;\n padding: 0;\n background: transparent;\n cursor: pointer;\n color: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-searchButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded .-cerbur-clutch-dsh-worktree-searchButton:hover {\n background: transparent;\n}\n\n.-cerbur-clutch-dsh-worktree-searchInput {\n flex: 1;\n width: 0;\n min-width: 0;\n box-sizing: border-box;\n border: none;\n outline: none;\n background: transparent;\n opacity: 0;\n pointer-events: none;\n font: inherit;\n font-size: 13px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n transition: opacity 120ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded .-cerbur-clutch-dsh-worktree-searchInput {\n margin-left: -2px;\n opacity: 1;\n pointer-events: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-searchInput::placeholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.-cerbur-clutch-dsh-worktree-clearButton {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n border-radius: 50%;\n padding: 0;\n background: transparent;\n cursor: pointer;\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-clearButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-actionSelect:focus {\n border-color: #3b82f6;\n}\n\n.-cerbur-clutch-dsh-worktree-iconButton {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 0;\n border-radius: 7px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 20px;\n line-height: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-iconButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityBell {\n display: inline-flex;\n position: relative;\n}\n\n.-cerbur-clutch-dsh-worktree-activityBadge {\n position: absolute;\n top: 4px;\n right: 4px;\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: var(--dsw-alias-brand-primary, #3b82f6);\n outline: 2px solid var(--dsw-specific-sidebar-fill);\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityPanel {\n position: fixed;\n z-index: 1000;\n box-sizing: border-box;\n width: min(360px, calc(100vw - 16px));\n max-height: min(440px, calc(100dvh - 72px));\n display: flex;\n flex-direction: column;\n padding: 6px;\n color: var(--dsw-alias-label-primary);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l1);\n box-shadow: var(--dsw-elevation-prominent);\n outline: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityHeading {\n flex: none;\n padding: 8px 10px;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityEmpty {\n margin: 0;\n padding: 26px 10px 32px;\n text-align: center;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityList {\n overflow: auto;\n min-height: 0;\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityEntry {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n box-sizing: border-box;\n width: 100%;\n height: auto;\n border: 0;\n border-radius: 7px;\n padding: 10px;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-activityEntry:hover,\n.-cerbur-clutch-dsh-worktree-activityEntry:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-activityEntry:focus-visible {\n outline: 1px solid var(--dsw-alias-label-secondary);\n outline-offset: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityIdentity {\n display: flex;\n flex-direction: column;\n min-width: 0;\n gap: 3px;\n flex: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-activityName,\n.-cerbur-clutch-dsh-worktree-activityContext {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-activityName {\n font-size: 13px;\n line-height: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityContext,\n.-cerbur-clutch-dsh-worktree-activityTime {\n color: var(--dsw-alias-label-secondary);\n font-size: 11px;\n line-height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityMetadata {\n display: flex;\n flex: none;\n flex-direction: column;\n align-items: flex-end;\n gap: 5px;\n padding-top: 2px;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n/* One indent rhythm for the whole tree: each level advances by --wt-step and every\n label starts after one --wt-lead cell, so a Session label shares the exact column\n of its group label (one axis per depth, no per-level ad-hoc offsets). */\n.-cerbur-clutch-dsh-worktree-workspaceList {\n --wt-step: 12px;\n --wt-lead: 20px;\n --wt-label-pad: 6px;\n --wt-row-inset: 4px;\n position: relative;\n min-width: 0;\n min-height: 0;\n display: grid;\n gap: 2px;\n overflow-x: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceGroup {\n min-width: 0;\n}\n\n/* Navigation rows sit in the standard control band (H32-40) and share one radius. */\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 box-sizing: border-box;\n border-radius: var(--dsw-radius-md);\n padding-block: 3px;\n padding-inline: calc(var(--wt-row-inset) + var(--wt-depth, 0) * var(--wt-step))\n var(--wt-row-inset);\n cursor: pointer;\n user-select: none;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow {\n min-height: 34px;\n}\n\n/* One Workspace is open at a time: the open row owns the tree body, and every\n collapsed row carries its aggregated activity indicator at the action edge. The\n open state reuses the native hover fill instead of adding a custom accent bar. */\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-workspace-open='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-workspace-open='true'] .-cerbur-clutch-dsh-worktree-workspaceTitle {\n font-weight: 400;\n}\n\n@media (hover: hover) {\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\n/* The disclosure overlays the type icon's own cell: one 20px axis, no reflow, and\n it stays keyboard reachable while invisible. Hover reveal is pointer-only. */\n.-cerbur-clutch-dsh-worktree-workspaceRow .-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n opacity: 0;\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:focus-within .-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-worktreeDisclosure,\n.-cerbur-clutch-dsh-worktree-workspaceRow .-cerbur-clutch-dsh-worktree-workspaceDisclosure:focus-visible,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-worktreeDisclosure:focus-visible {\n opacity: 1;\n pointer-events: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:focus-within .-cerbur-clutch-dsh-worktree-workspaceIcon,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-worktreeIcon {\n visibility: hidden;\n}\n\n@media (hover: hover) {\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 .-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 opacity: 1;\n pointer-events: auto;\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 .-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 visibility: hidden;\n }\n}\n\n/* Touch and stylus have no hover phase: keep the expand/collapse affordance\n visible so the tab switch never depends on a pointer hover. */\n@media (hover: none) {\n .-cerbur-clutch-dsh-worktree-workspaceRow .-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n .-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n opacity: 1;\n pointer-events: auto;\n }\n\n .-cerbur-clutch-dsh-worktree-workspaceRow .-cerbur-clutch-dsh-worktree-workspaceIcon,\n .-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-worktreeIcon {\n visibility: hidden;\n }\n}\n\n/* Absolute so the reveal never moves the label; the parent row owns the cell.\n The 24px hit target stays centered on the 20px leading cell. */\n.-cerbur-clutch-dsh-worktree-disclosureButton {\n position: absolute;\n inset-inline-start: calc(\n var(--wt-row-inset) + var(--wt-depth, 0) * var(--wt-step) - 2px\n );\n top: 50%;\n transform: translateY(-50%);\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n padding: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 13px;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton:active {\n background: var(--dsw-alias-interactive-bg-active);\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton > svg {\n display: block;\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureArrow {\n transition: transform var(--ds-transition-duration) var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton[aria-expanded='true'] .-cerbur-clutch-dsh-worktree-disclosureArrow {\n transform: rotate(90deg);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n.-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n color: var(--dsw-alias-label-caption);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .-cerbur-clutch-dsh-worktree-disclosureArrow {\n transition: none;\n }\n}\n\n@media (hover: hover) {\n .-cerbur-clutch-dsh-worktree-disclosureButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n }\n}\n\n/* One leading cell for every level keeps all 16px glyphs and the 14px twisty on\n the same vertical axis per depth. */\n.-cerbur-clutch-dsh-worktree-workspaceIcon,\n.-cerbur-clutch-dsh-worktree-worktreeIcon {\n flex: none;\n width: var(--wt-lead);\n color: var(--dsw-alias-label-secondary);\n line-height: 1;\n text-align: center;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeIcon[data-worktree-state='done'] {\n color: var(--dsw-alias-state-success-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeIcon[data-worktree-state='warning'] {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeIcon[data-worktree-state='error'] {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeStateLabel {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n overflow: hidden;\n border: 0;\n padding: 0;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceIcon {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceIcon[data-workspace-active='true'] {\n color: var(--dsw-alias-state-business-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceTitle,\n.-cerbur-clutch-dsh-worktree-worktreeLabel {\n min-width: 0;\n overflow: hidden;\n flex: 1;\n padding: 0 2px;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n}\n\n/* Emphasis stays at weight 500 (design standard: no 600+ in functional CSS). */\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-main-group='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel {\n font-weight: 500;\n}\n\n/* Native title reveal: the span clips its own text and scrolls only while\n hovered. Activity alone keeps the resting ellipsis. */\n@media (hover: hover) {\n .-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeLabel,\n .-cerbur-clutch-dsh-worktree-treeSessionRow:hover .-cerbur-clutch-dsh-worktree-sessionLabel {\n text-overflow: clip;\n }\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel[data-scrolled],\n.-cerbur-clutch-dsh-worktree-sessionLabel[data-scrolled] {\n mask-image: linear-gradient(to right, transparent, #000 12px);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel[data-clipped],\n.-cerbur-clutch-dsh-worktree-sessionLabel[data-clipped] {\n mask-image: linear-gradient(to left, transparent, #000 12px);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel[data-scrolled][data-clipped],\n.-cerbur-clutch-dsh-worktree-sessionLabel[data-scrolled][data-clipped] {\n mask-image: linear-gradient(\n to right,\n transparent,\n #000 12px,\n #000 calc(100% - 12px),\n transparent\n );\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeHoverTitle {\n color: var(--dsw-static-neutral-bluish-00);\n font-size: 13px;\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: 13px;\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/* The intrinsic action column owns the title's visible end. At rest the title\n spans it, leaving only the activity lane; revealed controls narrow the actual\n scroll viewport so the marquee tail and fade stop beside the first button.\n The leading icon, title start and action positions remain fixed. */\n.-cerbur-clutch-dsh-worktree-worktreeRow > .-cerbur-clutch-dsh-worktree-worktreeIcon {\n grid-area: 1 / 1;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow > .-cerbur-clutch-dsh-worktree-worktreeLabel {\n grid-area: 1 / 2 / 2 / 4;\n margin-inline-end: 32px;\n}\n\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 grid-column-end: 3;\n margin-inline-end: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot {\n grid-area: 1 / 3;\n min-width: 0;\n width: auto;\n gap: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceActions > .-cerbur-clutch-dsh-worktree-menuAction {\n position: absolute;\n top: 0;\n right: 32px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceActions > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n position: absolute;\n top: 0;\n right: 0;\n visibility: hidden;\n}\n\n/* Worktree actions flow naturally so the rail matches the controls that exist. */\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n position: static;\n opacity: 0;\n pointer-events: none;\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-groupActivity {\n position: absolute;\n top: 0;\n right: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n visibility: hidden;\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-groupActivity {\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'][data-menu-open='true'] .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'][data-menu-open='true'] .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-groupActivity {\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'][data-menu-open='true']\n .-cerbur-clutch-dsh-worktree-treeActionSlot\n > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'][data-menu-open='true']\n .-cerbur-clutch-dsh-worktree-treeActionSlot\n > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardAction {\n display: inline-flex;\n flex: 0 0 28px;\n width: 28px;\n height: 28px;\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-menuAction {\n display: inline-flex;\n flex: 0 0 28px;\n width: 28px;\n height: 28px;\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-workspaceRow:focus-within .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover [data-add-worktree],\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] [data-add-worktree],\n.-cerbur-clutch-dsh-worktree-workspaceRow:focus-within [data-add-worktree] {\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n opacity: 1;\n pointer-events: auto;\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropBefore::before,\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n position: absolute;\n right: 4px;\n left: 4px;\n height: 2px;\n border-radius: 2px;\n background: var(--dsw-alias-brand-primary);\n content: '';\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropBefore::before {\n top: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n bottom: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropBefore::before,\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n position: absolute;\n right: 4px;\n left: 4px;\n height: 2px;\n border-radius: 2px;\n background: var(--dsw-alias-brand-primary);\n content: '';\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropBefore::before {\n top: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n bottom: -1px;\n}\n\n/* Depth comes from explicit nesting selectors rather than a self-referencing custom\n property (`--d: calc(var(--d) + 1)` is a cycle and resolves to invalid). Rows own\n their inline padding, so nesting never accumulates margins, and rows stay full\n width so hover fills and drop markers share one edge. */\n.-cerbur-clutch-dsh-worktree-treeChildren {\n margin-inline-start: 0;\n padding: 2px 0 5px;\n border-inline-start: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-worktreeRow,\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeSessionRow,\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-sessionOverflowButton {\n --wt-depth: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-worktreeRow,\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeSessionRow,\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-sessionOverflowButton {\n --wt-depth: 2;\n}\n\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-worktreeRow,\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeSessionRow,\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-sessionOverflowButton {\n --wt-depth: 3;\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: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow {\n min-height: 32px;\n padding-block: 2px;\n display: grid;\n grid-template-columns: var(--wt-lead) minmax(0, 1fr) max-content;\n}\n\n/* Session rows indent to their group's label column, not one step past the row\n start: the label reads as a child of that group without hanging to its left. */\n.-cerbur-clutch-dsh-worktree-treeSessionRow {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n margin-inline-start: 0;\n padding-inline-start: calc(\n var(--wt-row-inset) + var(--wt-depth, 0) * var(--wt-step) + var(--wt-lead) +\n var(--wt-label-pad)\n );\n padding-inline-end: var(--wt-row-inset);\n min-width: 0;\n min-height: 30px;\n box-sizing: border-box;\n border-radius: var(--dsw-radius-md);\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: 400;\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: 30px;\n box-sizing: border-box;\n border: 0;\n border-radius: var(--dsw-radius-md);\n padding: 4px 0;\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:focus-visible {\n outline: 2px solid var(--dsw-alias-border-l3);\n outline-offset: 1px;\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: auto;\n margin: 2px var(--wt-row-inset) 4px\n calc(\n var(--wt-row-inset) + var(--wt-depth, 0) * var(--wt-step) + var(--wt-lead) +\n var(--wt-label-pad)\n );\n padding: 4px 8px;\n border: 0;\n border-radius: var(--dsw-radius-sm);\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-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";
2932
2959
  const styleId$8 = "@cerbur/clutch-dsh-worktree/worktree.css";
2933
2960
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree.css\"]") === null) {
2934
2961
  const tag = document.createElement("style");
@@ -2940,7 +2967,9 @@ window.__ModuleLoader__.load({
2940
2967
  var worktree_css_default = {
2941
2968
  "action": "-cerbur-clutch-dsh-worktree-action",
2942
2969
  "actionLabel": "-cerbur-clutch-dsh-worktree-actionLabel",
2970
+ "workspaceSeat": "-cerbur-clutch-dsh-worktree-workspaceSeat",
2943
2971
  "surface": "-cerbur-clutch-dsh-worktree-surface",
2972
+ "workspaces": "-cerbur-clutch-dsh-worktree-workspaces",
2944
2973
  "motionExits": "-cerbur-clutch-dsh-worktree-motionExits",
2945
2974
  "wideContent": "-cerbur-clutch-dsh-worktree-wideContent",
2946
2975
  "worktreeRegistrationDialog": "-cerbur-clutch-dsh-worktree-worktreeRegistrationDialog",
@@ -2953,7 +2982,18 @@ window.__ModuleLoader__.load({
2953
2982
  "worktreeImportError": "-cerbur-clutch-dsh-worktree-worktreeImportError",
2954
2983
  "closeButton": "-cerbur-clutch-dsh-worktree-closeButton",
2955
2984
  "header": "-cerbur-clutch-dsh-worktree-header",
2956
- "title": "-cerbur-clutch-dsh-worktree-title",
2985
+ "activityBar": "-cerbur-clutch-dsh-worktree-activityBar",
2986
+ "activityTabs": "-cerbur-clutch-dsh-worktree-activityTabs",
2987
+ "activityConfig": "-cerbur-clutch-dsh-worktree-activityConfig",
2988
+ "activityOption": "-cerbur-clutch-dsh-worktree-activityOption",
2989
+ "activityOptionLabel": "-cerbur-clutch-dsh-worktree-activityOptionLabel",
2990
+ "activityOptionCount": "-cerbur-clutch-dsh-worktree-activityOptionCount",
2991
+ "activityOptionCheck": "-cerbur-clutch-dsh-worktree-activityOptionCheck",
2992
+ "activitySegment": "-cerbur-clutch-dsh-worktree-activitySegment",
2993
+ "activitySegmentActive": "-cerbur-clutch-dsh-worktree-activitySegmentActive",
2994
+ "activityLabel": "-cerbur-clutch-dsh-worktree-activityLabel",
2995
+ "activityCount": "-cerbur-clutch-dsh-worktree-activityCount",
2996
+ "sidebarTitle": "-cerbur-clutch-dsh-worktree-sidebarTitle",
2957
2997
  "titleHidden": "-cerbur-clutch-dsh-worktree-titleHidden",
2958
2998
  "modeButton": "-cerbur-clutch-dsh-worktree-modeButton",
2959
2999
  "workspacePicker": "-cerbur-clutch-dsh-worktree-workspacePicker",
@@ -2974,6 +3014,8 @@ window.__ModuleLoader__.load({
2974
3014
  "sectionTitle": "-cerbur-clutch-dsh-worktree-sectionTitle",
2975
3015
  "empty": "-cerbur-clutch-dsh-worktree-empty",
2976
3016
  "message": "-cerbur-clutch-dsh-worktree-message",
3017
+ "emptyHint": "-cerbur-clutch-dsh-worktree-emptyHint",
3018
+ "activityMenuSeparator": "-cerbur-clutch-dsh-worktree-activityMenuSeparator",
2977
3019
  "gitReadiness": "-cerbur-clutch-dsh-worktree-gitReadiness",
2978
3020
  "commandBlock": "-cerbur-clutch-dsh-worktree-commandBlock",
2979
3021
  "worktree": "-cerbur-clutch-dsh-worktree-worktree",
@@ -3007,14 +3049,14 @@ window.__ModuleLoader__.load({
3007
3049
  "workspaceGroup": "-cerbur-clutch-dsh-worktree-workspaceGroup",
3008
3050
  "workspaceRow": "-cerbur-clutch-dsh-worktree-workspaceRow",
3009
3051
  "worktreeRow": "-cerbur-clutch-dsh-worktree-worktreeRow",
3052
+ "workspaceTitle": "-cerbur-clutch-dsh-worktree-workspaceTitle",
3010
3053
  "workspaceDisclosure": "-cerbur-clutch-dsh-worktree-workspaceDisclosure",
3011
- "workspaceIcon": "-cerbur-clutch-dsh-worktree-workspaceIcon",
3012
3054
  "worktreeDisclosure": "-cerbur-clutch-dsh-worktree-worktreeDisclosure",
3055
+ "workspaceIcon": "-cerbur-clutch-dsh-worktree-workspaceIcon",
3013
3056
  "worktreeIcon": "-cerbur-clutch-dsh-worktree-worktreeIcon",
3014
3057
  "disclosureButton": "-cerbur-clutch-dsh-worktree-disclosureButton",
3015
3058
  "disclosureArrow": "-cerbur-clutch-dsh-worktree-disclosureArrow",
3016
3059
  "worktreeStateLabel": "-cerbur-clutch-dsh-worktree-worktreeStateLabel",
3017
- "workspaceTitle": "-cerbur-clutch-dsh-worktree-workspaceTitle",
3018
3060
  "treeSessionRow": "-cerbur-clutch-dsh-worktree-treeSessionRow",
3019
3061
  "worktreeHoverTitle": "-cerbur-clutch-dsh-worktree-worktreeHoverTitle",
3020
3062
  "sessionHoverContent": "-cerbur-clutch-dsh-worktree-sessionHoverContent",
@@ -3029,6 +3071,7 @@ window.__ModuleLoader__.load({
3029
3071
  "dropBefore": "-cerbur-clutch-dsh-worktree-dropBefore",
3030
3072
  "dropAfter": "-cerbur-clutch-dsh-worktree-dropAfter",
3031
3073
  "treeChildren": "-cerbur-clutch-dsh-worktree-treeChildren",
3074
+ "sessionOverflowButton": "-cerbur-clutch-dsh-worktree-sessionOverflowButton",
3032
3075
  "groupLabel": "-cerbur-clutch-dsh-worktree-groupLabel",
3033
3076
  "groupHeader": "-cerbur-clutch-dsh-worktree-groupHeader",
3034
3077
  "worktreeGroup": "-cerbur-clutch-dsh-worktree-worktreeGroup",
@@ -3038,9 +3081,7 @@ window.__ModuleLoader__.load({
3038
3081
  "rowActions": "-cerbur-clutch-dsh-worktree-rowActions",
3039
3082
  "sessionStatus": "-cerbur-clutch-dsh-worktree-sessionStatus",
3040
3083
  "sessionTime": "-cerbur-clutch-dsh-worktree-sessionTime",
3041
- "sessionOverflowButton": "-cerbur-clutch-dsh-worktree-sessionOverflowButton",
3042
3084
  "renameError": "-cerbur-clutch-dsh-worktree-renameError",
3043
- "emptyNested": "-cerbur-clutch-dsh-worktree-emptyNested",
3044
3085
  "archivedGroup": "-cerbur-clutch-dsh-worktree-archivedGroup",
3045
3086
  "worktreeHoverDetails": "-cerbur-clutch-dsh-worktree-worktreeHoverDetails"
3046
3087
  };
@@ -3120,7 +3161,7 @@ window.__ModuleLoader__.load({
3120
3161
  });
3121
3162
  }
3122
3163
  //#endregion
3123
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/dashboard/dashboard-header-action.css.mjs
3164
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/dashboard/dashboard-header-action.css.mjs
3124
3165
  const css$7 = "/* Match the native 28px circular Session-header utility controls. */\n.-cerbur-clutch-dsh-worktree-headerDashboardButton {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 6px;\n color: var(--dsw-alias-label-secondary);\n background: transparent;\n border: none;\n border-radius: 28px;\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-headerDashboardButton svg {\n width: 16px;\n height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-headerDashboardButton:hover,\n.-cerbur-clutch-dsh-worktree-headerDashboardButton:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n";
3125
3166
  const styleId$7 = "@cerbur/clutch-dsh-worktree/dashboard-header-action.css";
3126
3167
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard-header-action.css\"]") === null) {
@@ -3689,7 +3730,7 @@ window.__ModuleLoader__.load({
3689
3730
  }, current.key);
3690
3731
  }
3691
3732
  //#endregion
3692
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/select/single-select.css.mjs
3733
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/select/single-select.css.mjs
3693
3734
  const css$6 = ".-cerbur-clutch-dsh-worktree-singleSelectRoot { min-width: 0; width: 100%; }\n.-cerbur-clutch-dsh-worktree-singleSelectTrigger {\n display: flex; align-items: center; gap: 8px; width: 100%; min-width: 0;\n min-height: 36px; padding: 6px 10px; border-radius: var(--dsw-radius-md, 8px);\n border: 1px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-base); color: var(--dsw-alias-label-primary);\n font: inherit; text-align: start; cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-singleSelectRoot[data-size='compact'] { width: min(280px, 45vw); }\n.-cerbur-clutch-dsh-worktree-singleSelectRoot[data-size='compact'] .-cerbur-clutch-dsh-worktree-singleSelectTrigger { min-height: 28px; padding: 3px 8px; font-size: 12px; }\n.-cerbur-clutch-dsh-worktree-singleSelectTrigger:disabled, .-cerbur-clutch-dsh-worktree-singleSelectOption:disabled { opacity: .4; cursor: default; }\n.-cerbur-clutch-dsh-worktree-singleSelectTrigger:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: 2px; }\n.-cerbur-clutch-dsh-worktree-singleSelectPopup {\n position: fixed; z-index: 1100; padding: 8px; box-sizing: border-box;\n border: 0; border-radius: var(--dsw-radius-lg, 12px);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l1);\n box-shadow: var(--dsw-elevation-prominent);\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}\n.-cerbur-clutch-dsh-worktree-singleSelectPicker { display: flex; flex-direction: column; gap: 8px; min-width: 0; }\n.-cerbur-clutch-dsh-worktree-singleSelectSearch { box-sizing: border-box; width: 100%; min-width: 0; }\n.-cerbur-clutch-dsh-worktree-singleSelectLoading { display: flex; align-items: center; justify-content: center; gap: 8px; min-height: 80px; color: var(--dsw-alias-label-secondary); font-size: 12px; }\n.-cerbur-clutch-dsh-worktree-singleSelectLoading svg { width: 16px; height: 16px; animation: singleSelectSpin 1s linear infinite; }\n@keyframes singleSelectSpin { to { transform: rotate(360deg); } }\n@media (prefers-reduced-motion: reduce) { .-cerbur-clutch-dsh-worktree-singleSelectLoading svg { animation: none; } }\n.-cerbur-clutch-dsh-worktree-singleSelectFilters { display: flex; flex-wrap: wrap; gap: 4px; }\n.-cerbur-clutch-dsh-worktree-singleSelectFilters button {\n border: 0; border-radius: var(--dsw-radius-md, 8px); padding: 4px 8px; background: transparent;\n color: var(--dsw-alias-label-secondary); font: inherit; font-size: 11px; cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-singleSelectFilters button[aria-pressed='true'], .-cerbur-clutch-dsh-worktree-singleSelectFilters button:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-primary); }\n.-cerbur-clutch-dsh-worktree-singleSelectViewport {\n height: clamp(120px, calc(100dvh - 160px), 300px); overflow-y: auto; overscroll-behavior: contain;\n padding: 4px; box-sizing: border-box; min-height: 0;\n}\n.-cerbur-clutch-dsh-worktree-singleSelectPopup .-cerbur-clutch-dsh-worktree-singleSelectViewport { height: auto; max-height: var(--single-select-viewport-height, 220px); }\n.-cerbur-clutch-dsh-worktree-singleSelectPopup .-cerbur-clutch-dsh-worktree-singleSelectEmpty { min-height: 80px; }\n.-cerbur-clutch-dsh-worktree-singleSelectGroup { display: flex; align-items: center; justify-content: space-between; gap: 8px; height: 36px; box-sizing: border-box; padding: 6px 8px; color: var(--dsw-alias-label-tertiary); font-size: 11px; line-height: 15px; }\n.-cerbur-clutch-dsh-worktree-singleSelectOption {\n box-sizing: border-box;\n display: flex; align-items: center; gap: 6px; width: 100%; min-height: 34px;\n padding: 6px 8px; border: 0; border-radius: var(--dsw-radius-md, 8px); background: transparent;\n color: var(--dsw-alias-label-primary); font: inherit; font-size: 13px; line-height: 20px; text-align: start; cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-singleSelectOption:hover:not(:disabled), .-cerbur-clutch-dsh-worktree-singleSelectOption[data-highlighted='true']:not(:disabled), .-cerbur-clutch-dsh-worktree-singleSelectOption:focus-visible:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover); outline: none; }\n.-cerbur-clutch-dsh-worktree-singleSelectOption[data-description='true'] { min-height: 48px; }\n.-cerbur-clutch-dsh-worktree-singleSelectText { display: flex; flex-direction: column; flex: 1; min-width: 0; }\n.-cerbur-clutch-dsh-worktree-singleSelectName { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.-cerbur-clutch-dsh-worktree-singleSelectDescription { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--dsw-alias-label-tertiary); font-size: 11px; line-height: 16px; }\n.-cerbur-clutch-dsh-worktree-singleSelectBadge { flex: none; color: var(--dsw-alias-label-tertiary); font-size: 11px; }\n.-cerbur-clutch-dsh-worktree-singleSelectTrigger > svg, .-cerbur-clutch-dsh-worktree-singleSelectOption > svg { width: 14px; height: 14px; flex: none; }\n.-cerbur-clutch-dsh-worktree-singleSelectEmpty { display: grid; place-items: center; height: 100%; color: var(--dsw-alias-label-tertiary); font-size: 13px; }\n";
3694
3735
  const styleId$6 = "@cerbur/clutch-dsh-worktree/single-select.css";
3695
3736
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/single-select.css\"]") === null) {
@@ -4090,7 +4131,7 @@ window.__ModuleLoader__.load({
4090
4131
  });
4091
4132
  }
4092
4133
  //#endregion
4093
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/branch/git-branch.css.mjs
4134
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/branch/git-branch.css.mjs
4094
4135
  const css$5 = ".-cerbur-clutch-dsh-worktree-branchFetch { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; padding: 4px; border: 0; border-radius: var(--dsw-radius-sm); background: transparent; color: var(--dsw-alias-label-secondary); cursor: pointer; }\n.-cerbur-clutch-dsh-worktree-branchFetch:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover); }\n.-cerbur-clutch-dsh-worktree-branchFetch:disabled { opacity: .4; cursor: default; }\n.-cerbur-clutch-dsh-worktree-branchFetch svg { width: 16px; height: 16px; }\n.-cerbur-clutch-dsh-worktree-branchFetch[aria-busy='true'] svg { animation: branchFetchSpin 1s linear infinite; }\n@keyframes branchFetchSpin { to { transform: rotate(360deg); } }\n@media (prefers-reduced-motion: reduce) { .-cerbur-clutch-dsh-worktree-branchFetch[aria-busy='true'] svg { animation: none; } }\n.-cerbur-clutch-dsh-worktree-branchFetch[data-fetch-status='success'], .-cerbur-clutch-dsh-worktree-branchFetch[data-fetch-status='error'] { width: auto; padding-inline: 6px; white-space: nowrap; font-size: 12px; line-height: 18px; }\n.-cerbur-clutch-dsh-worktree-branchFetch[data-fetch-status='success']:disabled { opacity: 1; }\n.-cerbur-clutch-dsh-worktree-branchFetch[data-fetch-status='error'] { color: var(--dsw-alias-state-error-primary); }\n";
4095
4136
  const styleId$5 = "@cerbur/clutch-dsh-worktree/git-branch.css";
4096
4137
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/git-branch.css\"]") === null) {
@@ -5656,6 +5697,18 @@ window.__ModuleLoader__.load({
5656
5697
  function isWorkspaceExpanded(state, workspaceId) {
5657
5698
  return state.collapsedWorkspaceIds[workspaceId] !== true;
5658
5699
  }
5700
+ /**
5701
+ * The one open Workspace that owns the tree body.
5702
+ *
5703
+ * A temporary current-Session reveal wins over the persisted choice so navigation
5704
+ * never waits for the store write. Otherwise the first uncollapsed Workspace is the
5705
+ * open one; legacy records with several uncollapsed IDs render one Workspace and are
5706
+ * normalized by the caller.
5707
+ */
5708
+ function resolveOpenWorkspaceId(state, workspaceIds, revealedWorkspaceId) {
5709
+ if (revealedWorkspaceId !== void 0 && workspaceIds.includes(revealedWorkspaceId)) return revealedWorkspaceId;
5710
+ return workspaceIds.find((workspaceId) => isWorkspaceExpanded(state, workspaceId));
5711
+ }
5659
5712
  function isMainExpanded(state, workspaceId) {
5660
5713
  return state.collapsedMainWorkspaceIds[workspaceId] !== true;
5661
5714
  }
@@ -5685,6 +5738,13 @@ window.__ModuleLoader__.load({
5685
5738
  toggle(draft.collapsedWorkspaceIds, workspaceId);
5686
5739
  });
5687
5740
  },
5741
+ openWorkspaceExclusive: (workspaceId, workspaceIds) => {
5742
+ if (!workspaceIds.includes(workspaceId)) return;
5743
+ store.update((draft) => {
5744
+ for (const id of workspaceIds) if (id === workspaceId) delete draft.collapsedWorkspaceIds[id];
5745
+ else draft.collapsedWorkspaceIds[id] = true;
5746
+ });
5747
+ },
5688
5748
  toggleMain: (workspaceId) => {
5689
5749
  store.update((draft) => {
5690
5750
  toggle(draft.collapsedMainWorkspaceIds, workspaceId);
@@ -5893,6 +5953,7 @@ window.__ModuleLoader__.load({
5893
5953
  className: `${worktree_css_default.workspaceRow} ${markerClass}`,
5894
5954
  "data-worktree-motion-key": `workspace:${workspace.workspaceId}`,
5895
5955
  "data-workspace-drag": drag.active ? "active" : void 0,
5956
+ "data-workspace-open": expanded ? "true" : void 0,
5896
5957
  "data-group-activity": groupActivityVisible ? "true" : void 0,
5897
5958
  "data-menu-open": menuOpen || void 0,
5898
5959
  draggable: true,
@@ -6408,7 +6469,7 @@ window.__ModuleLoader__.load({
6408
6469
  //#endregion
6409
6470
  //#region lib/client/surface/components/ActiveWorktree.js
6410
6471
  function ActiveWorktree({ record, source, expansion, ordering, props, lifecycle, session, menus, mutation, read, registration, lifecycleState, drag, native, bindings, workspaceMatchesQuery, workspace, workspaceWorktreeNames, sameWorkspaceWorktreeDrag, activeWorktrees }) {
6411
- const { sessions, archivedSessionIds, currentSessionId, expandSnapshot, sessionPresentations } = source;
6472
+ const { sessions, archivedSessionIds, currentSessionId, expandSnapshot, sessionPresentations, activity } = source;
6412
6473
  const { query, isCurrentSessionReveal, expandedSessionGroups, toggleWorktree, toggleSessionGroup } = expansion;
6413
6474
  const { orderedSessionIdsByAccount } = ordering;
6414
6475
  const { t, renameSession, forkSession, archiveSession } = props;
@@ -6421,7 +6482,8 @@ window.__ModuleLoader__.load({
6421
6482
  const { setWorktreeRemoval } = lifecycleState;
6422
6483
  const { worktreeDrag, worktreeDropCommitted, setWorktreeDrag, commitWorktreeDrag, sessionDrag, sessionDropCommitted, setSessionDrag, commitSessionDrag } = drag;
6423
6484
  const { openSessionRename, archiveWorktreeSession } = native;
6424
- const worktreeSessionIds = filterVisibleSessionIds(filterArchivedSessionIds(bindingIdsFor(bindings, record.worktreeId).filter((sessionId) => sessions.ids.includes(sessionId)), archivedSessionIds), sessions);
6485
+ const worktreeSessionIds = filterVisibleSessionIds(activity.scopeSessionIds(filterArchivedSessionIds(bindingIdsFor(bindings, record.worktreeId).filter((sessionId) => sessions.ids.includes(sessionId)), archivedSessionIds)), sessions);
6486
+ if (activity.active && !activity.showInactiveStructure && worktreeSessionIds.length === 0) return null;
6425
6487
  const worktreeMatchesQuery = workspaceMatchesQuery || includesText(record.branch, query) || includesText(record.absolutePath, query);
6426
6488
  if (query.length > 0 && !worktreeMatchesQuery && !worktreeSessionIds.some((sessionId) => sessionMatchesQuery(sessionId, sessions, query))) return null;
6427
6489
  const visibleWorktreeSessionIds = worktreeSessionIds.filter((sessionId) => worktreeMatchesQuery || sessionMatchesQuery(sessionId, sessions, query));
@@ -6573,7 +6635,7 @@ window.__ModuleLoader__.load({
6573
6635
  //#endregion
6574
6636
  //#region lib/client/surface/components/ArchivedWorktree.js
6575
6637
  function ArchivedWorktree({ record, source, expansion, ordering, props, lifecycle, mutation, menus, read, lifecycleState, drag, session, native, bindings, workspaceMatchesQuery, workspace }) {
6576
- const { sessions, archivedSessionIds, currentSessionId, expandSnapshot, sessionPresentations } = source;
6638
+ const { sessions, archivedSessionIds, currentSessionId, expandSnapshot, sessionPresentations, activity } = source;
6577
6639
  const { query, isCurrentSessionReveal, expandedSessionGroups, toggleWorktree, toggleSessionGroup } = expansion;
6578
6640
  const { orderedSessionIdsByAccount } = ordering;
6579
6641
  const { t, manager, renameSession, forkSession, archiveSession } = props;
@@ -6585,7 +6647,8 @@ window.__ModuleLoader__.load({
6585
6647
  const { sessionDrag, sessionDropCommitted, setSessionDrag, commitSessionDrag } = drag;
6586
6648
  const { openWorkspaceSession } = session;
6587
6649
  const { openSessionRename, archiveWorktreeSession } = native;
6588
- const worktreeSessionIds = filterVisibleSessionIds(filterArchivedSessionIds(bindingIdsFor(bindings, record.worktreeId).filter((sessionId) => sessions.ids.includes(sessionId)), archivedSessionIds), sessions);
6650
+ const worktreeSessionIds = filterVisibleSessionIds(activity.scopeSessionIds(filterArchivedSessionIds(bindingIdsFor(bindings, record.worktreeId).filter((sessionId) => sessions.ids.includes(sessionId)), archivedSessionIds)), sessions);
6651
+ if (activity.active && !activity.showInactiveStructure && worktreeSessionIds.length === 0) return null;
6589
6652
  const worktreeMatchesQuery = workspaceMatchesQuery || includesText(record.branch, query) || includesText(record.absolutePath, query);
6590
6653
  if (query.length > 0 && !worktreeMatchesQuery && !worktreeSessionIds.some((sessionId) => sessionMatchesQuery(sessionId, sessions, query))) return null;
6591
6654
  const visibleWorktreeSessionIds = worktreeSessionIds.filter((sessionId) => worktreeMatchesQuery || sessionMatchesQuery(sessionId, sessions, query));
@@ -6741,7 +6804,7 @@ window.__ModuleLoader__.load({
6741
6804
  function ArchivedWorktrees({ expansion, props, source, ordering, lifecycle, mutation, menus, read, lifecycleState, drag, session, native, workspace, archivedWorktrees, bindings, workspaceMatchesQuery }) {
6742
6805
  const { isCurrentSessionReveal, expandedArchivedWorkspaces, toggleArchivedWorkspace } = expansion;
6743
6806
  const { t } = props;
6744
- const { sessions, archivedSessionIds, sessionPresentations } = source;
6807
+ const { sessions, archivedSessionIds, sessionPresentations, activity } = source;
6745
6808
  const isArchivedAutoExpanded = isCurrentSessionReveal("archived:" + workspace.workspaceId);
6746
6809
  const isArchivedExpanded = expandedArchivedWorkspaces[workspace.workspaceId] === true || isArchivedAutoExpanded;
6747
6810
  return (0, react_jsx_runtime.jsxs)("div", {
@@ -6752,7 +6815,7 @@ window.__ModuleLoader__.load({
6752
6815
  kind: "archived-group",
6753
6816
  label: `${t("worktree.archivedGroup")} (${archivedWorktrees.length})`,
6754
6817
  expanded: isArchivedExpanded,
6755
- groupActivityStatus: aggregateSessionStatus(filterArchivedSessionIds(archivedWorktrees.flatMap((record) => bindingIdsFor(bindings, record.worktreeId).filter((sessionId) => sessions.ids.includes(sessionId))), archivedSessionIds), sessionPresentations),
6818
+ groupActivityStatus: aggregateSessionStatus(activity.scopeSessionIds(filterArchivedSessionIds(archivedWorktrees.flatMap((record) => bindingIdsFor(bindings, record.worktreeId).filter((sessionId) => sessions.ids.includes(sessionId))), archivedSessionIds)), sessionPresentations),
6756
6819
  icon: (0, react_jsx_runtime.jsx)(IconArchiveOutline20, { size: 16 }),
6757
6820
  workspaceTitle: workspace.title,
6758
6821
  onToggle: () => {
@@ -6848,7 +6911,7 @@ window.__ModuleLoader__.load({
6848
6911
  overlay.append(clone);
6849
6912
  const animation = clone.animate([{ opacity: row.opacity }, { opacity: 0 }], {
6850
6913
  duration: 100,
6851
- easing: "ease-out",
6914
+ easing: "cubic-bezier(0.4, 0, 0.2, 1)",
6852
6915
  fill: "forwards"
6853
6916
  });
6854
6917
  this.removed.set(key, {
@@ -6875,7 +6938,7 @@ window.__ModuleLoader__.load({
6875
6938
  move(element, frames, duration) {
6876
6939
  const animation = element.animate(frames, {
6877
6940
  duration,
6878
- easing: "ease-out"
6941
+ easing: "cubic-bezier(0.4, 0, 0.2, 1)"
6879
6942
  });
6880
6943
  this.movements.set(element, animation);
6881
6944
  animation.onfinish = () => {
@@ -6925,31 +6988,46 @@ window.__ModuleLoader__.load({
6925
6988
  function WorkspaceTree({ props, read, source, expansion, ordering, drag, mutation, menus, registration, native, lifecycle, session, lifecycleState }) {
6926
6989
  const { t, createMainSession, openSession, renameSession, forkSession, archiveSession } = props;
6927
6990
  const { viewByWorkspace } = read;
6928
- const { expandSnapshot, workspaces, sessions, archivedSessionIds, sessionPresentations, currentSessionId } = source;
6929
- const { isCurrentSessionReveal, query, expandedSessionGroups, toggleWorkspace, toggleMain, toggleSessionGroup } = expansion;
6991
+ const { expandSnapshot, workspaces, sessions, archivedSessionIds, sessionPresentations, currentSessionId, activity } = source;
6992
+ const { isCurrentSessionReveal, isWorkspaceOpen, query, expandedSessionGroups, toggleWorkspace, toggleMain, toggleSessionGroup } = expansion;
6930
6993
  const { orderedSessionIdsByAccount } = ordering;
6931
6994
  const { worktreeDrag, workspaceDrag, workspaceDropCommitted, setWorkspaceDrag, commitWorkspaceDrag, sessionDrag, sessionDropCommitted, setSessionDrag, commitSessionDrag } = drag;
6932
6995
  const { actionPending } = mutation;
6933
6996
  const { openWorkspaceMenuId, setOpenWorkspaceMenuId, openMainMenuId, setOpenMainMenuId } = menus;
6934
6997
  const { openWorktreeCreator } = registration;
6935
6998
  const { openWorkspaceRename, openWorkspaceDelete, openSessionRename, archiveWorktreeSession } = native;
6936
- const visibleWorkspaces = workspaces.items.filter((workspace) => workspaceMatches(workspace, viewByWorkspace.get(workspace.workspaceId), sessions, query));
6999
+ const workspaceCandidateSessionIds = (workspaceId) => {
7000
+ const candidates = new Set(workspaceSessionIds(workspaces, workspaceId, sessions.ids));
7001
+ for (const binding of viewByWorkspace.get(workspaceId)?.bindings ?? []) candidates.add(binding.sessionId);
7002
+ return [...candidates];
7003
+ };
7004
+ const structureSurvivesWindow = (sessionIds) => !activity.active || activity.showInactiveStructure || activity.hasActiveSession(sessionIds);
7005
+ const worktreeSurvivesWindow = (workspaceId, worktreeId) => {
7006
+ if (!activity.active || activity.showInactiveStructure) return true;
7007
+ const bindings = viewByWorkspace.get(workspaceId)?.bindings ?? [];
7008
+ return activity.hasActiveSession(filterArchivedSessionIds(bindingIdsFor(bindings, worktreeId).filter((sessionId) => sessions.ids.includes(sessionId)), archivedSessionIds));
7009
+ };
7010
+ const visibleWorkspaces = workspaces.items.filter((workspace) => workspaceMatches(workspace, viewByWorkspace.get(workspace.workspaceId), sessions, query) && structureSurvivesWindow(workspaceCandidateSessionIds(workspace.workspaceId)));
6937
7011
  return (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: (0, react_jsx_runtime.jsx)(AnimatedTree, {
6938
7012
  className: worktree_css_default.workspaceList,
6939
7013
  ready: sessions.phase !== "pending" && workspaceDrag === void 0 && worktreeDrag === void 0 && sessionDrag === void 0,
6940
- resetKey: query,
6941
- children: visibleWorkspaces.length === 0 ? (0, react_jsx_runtime.jsx)("p", {
7014
+ resetKey: activity.window + "|" + query,
7015
+ children: visibleWorkspaces.length === 0 ? (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("p", {
6942
7016
  className: worktree_css_default.empty,
6943
- children: t("workspace.noMatches")
6944
- }) : visibleWorkspaces.map((workspace) => {
7017
+ children: activity.active && !activity.showInactiveStructure ? t("filter.empty") : t("workspace.noMatches")
7018
+ }), activity.active && !activity.showInactiveStructure && (0, react_jsx_runtime.jsx)("p", {
7019
+ className: worktree_css_default.emptyHint,
7020
+ children: t(activity.isWindowVisible("all") ? "filter.emptyHint" : "filter.emptyHintMenu")
7021
+ })] }) : visibleWorkspaces.map((workspace) => {
6945
7022
  const view = viewByWorkspace.get(workspace.workspaceId);
6946
7023
  const currentBranch = view?.currentBranch === null ? void 0 : view?.currentBranch ?? view?.branches.find((branch) => branch.isCurrent)?.name;
6947
7024
  const currentHead = view?.checkout?.currentHead;
6948
7025
  const mainRef = currentHead?.name ?? currentBranch;
6949
7026
  const mainLabel = mainRef === void 0 ? t("worktree.main") : t("worktree.mainWithBranch", { branch: mainRef });
6950
- const expanded = isWorkspaceExpanded(expandSnapshot, workspace.workspaceId) || isCurrentSessionReveal("workspace:" + workspace.workspaceId);
7027
+ const expanded = isWorkspaceOpen(workspace.workspaceId);
6951
7028
  const workspaceMatchesQuery = includesText(workspace.title, query);
6952
- const allWorkspaceSessionIds = filterArchivedSessionIds(workspaceSessionIds(workspaces, workspace.workspaceId, sessions.ids), archivedSessionIds);
7029
+ const workspaceMembershipSessionIds = filterArchivedSessionIds(workspaceSessionIds(workspaces, workspace.workspaceId, sessions.ids), archivedSessionIds);
7030
+ const allWorkspaceSessionIds = activity.scopeSessionIds(workspaceMembershipSessionIds);
6953
7031
  const workspaceGroupActivityStatus = aggregateSessionStatus(filterVisibleSessionIds(allWorkspaceSessionIds, sessions), sessionPresentations);
6954
7032
  const bindings = view?.bindings ?? [];
6955
7033
  const mainSessionIds = filterVisibleSessionIds(unboundSessionIds(allWorkspaceSessionIds, [...new Set(bindings.map((binding) => binding.sessionId))]).filter((id) => view?.knownSessionIds === void 0 || view.knownSessionIds.includes(id)), sessions);
@@ -6964,6 +7042,8 @@ window.__ModuleLoader__.load({
6964
7042
  const worktrees = view?.worktrees ?? [];
6965
7043
  const activeWorktrees = worktrees.filter((record) => record.status === "active");
6966
7044
  const archivedWorktrees = worktrees.filter((record) => record.status === "removed");
7045
+ const visibleActiveWorktrees = activeWorktrees.filter((record) => worktreeSurvivesWindow(workspace.workspaceId, record.worktreeId));
7046
+ const visibleArchivedWorktrees = archivedWorktrees.filter((record) => worktreeSurvivesWindow(workspace.workspaceId, record.worktreeId));
6967
7047
  const workspaceWorktreeNames = [...view?.branches.map((branch) => branch.name) ?? [], ...view?.worktrees.map((worktree) => worktree.branch) ?? []];
6968
7048
  const sameWorkspaceWorktreeDrag = worktreeDrag?.workspaceId === workspace.workspaceId;
6969
7049
  return (0, react_jsx_runtime.jsxs)("section", {
@@ -7113,11 +7193,7 @@ window.__ModuleLoader__.load({
7113
7193
  onFork: forkSession,
7114
7194
  onArchive: archiveSession === void 0 ? void 0 : archiveWorktreeSession
7115
7195
  }),
7116
- activeWorktrees.length === 0 && archivedWorktrees.length === 0 && (0, react_jsx_runtime.jsx)("p", {
7117
- className: worktree_css_default.emptyNested,
7118
- children: t("worktree.noWorktrees")
7119
- }),
7120
- activeWorktrees.map((record) => (0, react_jsx_runtime.jsx)(ActiveWorktree, {
7196
+ visibleActiveWorktrees.map((record) => (0, react_jsx_runtime.jsx)(ActiveWorktree, {
7121
7197
  record,
7122
7198
  source,
7123
7199
  expansion,
@@ -7139,7 +7215,7 @@ window.__ModuleLoader__.load({
7139
7215
  sameWorkspaceWorktreeDrag,
7140
7216
  activeWorktrees
7141
7217
  }, record.worktreeId)),
7142
- archivedWorktrees.length > 0 && (0, react_jsx_runtime.jsx)(ArchivedWorktrees, {
7218
+ visibleArchivedWorktrees.length > 0 && (0, react_jsx_runtime.jsx)(ArchivedWorktrees, {
7143
7219
  expansion,
7144
7220
  props,
7145
7221
  source,
@@ -7153,7 +7229,7 @@ window.__ModuleLoader__.load({
7153
7229
  session,
7154
7230
  native,
7155
7231
  workspace,
7156
- archivedWorktrees,
7232
+ archivedWorktrees: visibleArchivedWorktrees,
7157
7233
  bindings,
7158
7234
  workspaceMatchesQuery
7159
7235
  })
@@ -7437,6 +7513,167 @@ window.__ModuleLoader__.load({
7437
7513
  });
7438
7514
  }
7439
7515
  //#endregion
7516
+ //#region lib/client/surface/components/ActivityFilterBar.js
7517
+ /** Short labels keep four ranges readable in a narrow Sidebar. */
7518
+ const ACTIVITY_OPTIONS = [
7519
+ {
7520
+ id: "today",
7521
+ labelKey: "filter.today"
7522
+ },
7523
+ {
7524
+ id: "last24h",
7525
+ labelKey: "filter.last24h"
7526
+ },
7527
+ {
7528
+ id: "last7d",
7529
+ labelKey: "filter.last7d"
7530
+ },
7531
+ {
7532
+ id: "all",
7533
+ labelKey: "filter.all"
7534
+ }
7535
+ ];
7536
+ /**
7537
+ * Browser-only range selector above the Worktree tree.
7538
+ *
7539
+ * It scopes an existing projection and adds no read: counts come from the Session
7540
+ * list and presentations already held by the surface, and the selected range is a
7541
+ * Client preference, never a Sidecar or DSH value. The trailing menu only chooses
7542
+ * which ranges the bar renders; it never changes membership or Host state.
7543
+ */
7544
+ function ActivityFilterBar({ t, activity }) {
7545
+ const chooseLabel = t("filter.choose");
7546
+ const onlyVisible = activity.visibleWindows.length === 1;
7547
+ return (0, react_jsx_runtime.jsxs)("div", {
7548
+ className: worktree_css_default.activityBar,
7549
+ children: [(0, react_jsx_runtime.jsx)("div", {
7550
+ className: worktree_css_default.activityTabs,
7551
+ role: "group",
7552
+ "aria-label": t("filter.group"),
7553
+ children: ACTIVITY_OPTIONS.filter(({ id }) => activity.isWindowVisible(id)).map(({ id, labelKey }) => {
7554
+ const label = t(labelKey);
7555
+ const selected = activity.window === id;
7556
+ const count = activity.count(id);
7557
+ const accessibleLabel = t("filter.count", {
7558
+ label,
7559
+ count
7560
+ });
7561
+ return (0, react_jsx_runtime.jsxs)("button", {
7562
+ type: "button",
7563
+ className: cx(worktree_css_default.activitySegment, selected && worktree_css_default.activitySegmentActive),
7564
+ "data-activity-window": id,
7565
+ "data-selected": selected || void 0,
7566
+ "aria-pressed": selected,
7567
+ "aria-label": accessibleLabel,
7568
+ title: accessibleLabel,
7569
+ onClick: () => {
7570
+ activity.setWindow(id);
7571
+ },
7572
+ children: [(0, react_jsx_runtime.jsx)("span", {
7573
+ className: worktree_css_default.activityLabel,
7574
+ children: label
7575
+ }), count > 0 && (0, react_jsx_runtime.jsx)("span", {
7576
+ className: worktree_css_default.activityCount,
7577
+ "aria-hidden": "true",
7578
+ children: count
7579
+ })]
7580
+ }, id);
7581
+ })
7582
+ }), (0, react_jsx_runtime.jsxs)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
7583
+ open: activity.menuOpen,
7584
+ onClose: () => {
7585
+ activity.setMenuOpen(false);
7586
+ },
7587
+ align: "end",
7588
+ portal: true,
7589
+ items: [{
7590
+ type: "label",
7591
+ id: "visible-filters",
7592
+ text: t("filter.visible")
7593
+ }],
7594
+ anchor: (0, react_jsx_runtime.jsx)("button", {
7595
+ type: "button",
7596
+ className: worktree_css_default.activityConfig,
7597
+ "data-activity-config": true,
7598
+ "aria-label": chooseLabel,
7599
+ "aria-haspopup": "menu",
7600
+ "aria-expanded": activity.menuOpen,
7601
+ title: chooseLabel,
7602
+ onClick: () => {
7603
+ activity.setMenuOpen(!activity.menuOpen);
7604
+ },
7605
+ children: (0, react_jsx_runtime.jsx)(IconSlidersTwoOutline16, {})
7606
+ }),
7607
+ children: [
7608
+ ACTIVITY_OPTIONS.map(({ id, labelKey }) => {
7609
+ const label = t(labelKey);
7610
+ const checked = activity.isWindowVisible(id);
7611
+ const locked = checked && onlyVisible;
7612
+ return (0, react_jsx_runtime.jsxs)("button", {
7613
+ type: "button",
7614
+ role: "menuitemcheckbox",
7615
+ "aria-checked": checked,
7616
+ "aria-label": t("filter.count", {
7617
+ label,
7618
+ count: activity.count(id)
7619
+ }),
7620
+ className: worktree_css_default.activityOption,
7621
+ "data-activity-option": id,
7622
+ "data-checked": checked || void 0,
7623
+ disabled: locked,
7624
+ title: locked ? t("filter.keepOne") : void 0,
7625
+ onClick: () => {
7626
+ activity.setWindowVisible(id, !checked);
7627
+ },
7628
+ children: [
7629
+ (0, react_jsx_runtime.jsx)("span", {
7630
+ className: worktree_css_default.activityOptionLabel,
7631
+ children: label
7632
+ }),
7633
+ (0, react_jsx_runtime.jsx)("span", {
7634
+ className: worktree_css_default.activityOptionCount,
7635
+ "aria-hidden": "true",
7636
+ children: activity.count(id)
7637
+ }),
7638
+ (0, react_jsx_runtime.jsx)("span", {
7639
+ className: worktree_css_default.activityOptionCheck,
7640
+ "aria-hidden": "true",
7641
+ children: checked && (0, react_jsx_runtime.jsx)(IconCheckOutline16, {})
7642
+ })
7643
+ ]
7644
+ }, id);
7645
+ }),
7646
+ (0, react_jsx_runtime.jsx)("span", {
7647
+ className: worktree_css_default.activityMenuSeparator,
7648
+ role: "separator",
7649
+ "aria-hidden": "true"
7650
+ }),
7651
+ (0, react_jsx_runtime.jsxs)("button", {
7652
+ type: "button",
7653
+ role: "menuitemcheckbox",
7654
+ "aria-checked": activity.showInactiveStructure,
7655
+ "aria-label": t("filter.keepInactive"),
7656
+ className: worktree_css_default.activityOption,
7657
+ "data-activity-keep-inactive": true,
7658
+ "data-checked": activity.showInactiveStructure || void 0,
7659
+ title: t("filter.keepInactiveHint"),
7660
+ onClick: () => {
7661
+ activity.setShowInactiveStructure(!activity.showInactiveStructure);
7662
+ },
7663
+ children: [(0, react_jsx_runtime.jsx)("span", {
7664
+ className: worktree_css_default.activityOptionLabel,
7665
+ children: t("filter.keepInactive")
7666
+ }), (0, react_jsx_runtime.jsx)("span", {
7667
+ className: worktree_css_default.activityOptionCheck,
7668
+ "aria-hidden": "true",
7669
+ children: activity.showInactiveStructure && (0, react_jsx_runtime.jsx)(IconCheckOutline16, {})
7670
+ })]
7671
+ })
7672
+ ]
7673
+ })]
7674
+ });
7675
+ }
7676
+ //#endregion
7440
7677
  //#region lib/client/session/active-sessions.js
7441
7678
  /** Join existing ready facts only, independently of tree search, folding and row limits. */
7442
7679
  function activeSessions(sessions, presentations, workspaces, views) {
@@ -7683,7 +7920,7 @@ window.__ModuleLoader__.load({
7683
7920
  className: worktree_css_default.header,
7684
7921
  children: [
7685
7922
  (0, react_jsx_runtime.jsx)("span", {
7686
- className: cx(worktree_css_default.title, searchExpanded && worktree_css_default.titleHidden),
7923
+ className: cx(worktree_css_default.sidebarTitle, searchExpanded && worktree_css_default.titleHidden),
7687
7924
  children: t("worktree.title")
7688
7925
  }),
7689
7926
  (0, react_jsx_runtime.jsx)("div", {
@@ -8797,6 +9034,7 @@ window.__ModuleLoader__.load({
8797
9034
  const [currentSessionReveal, setCurrentSessionReveal] = (0, react.useState)();
8798
9035
  const revealSessionIdRef = (0, react.useRef)(Symbol("initial"));
8799
9036
  const revealModeRef = (0, react.useRef)(Symbol("initial"));
9037
+ const appliedRevealRef = (0, react.useRef)();
8800
9038
  let activeReveal = currentSessionReveal;
8801
9039
  if (currentSessionId !== revealSessionIdRef.current || mode !== revealModeRef.current) {
8802
9040
  revealSessionIdRef.current = currentSessionId;
@@ -8809,6 +9047,9 @@ window.__ModuleLoader__.load({
8809
9047
  }
8810
9048
  const searchQueryRef = (0, react.useRef)(searchQuery);
8811
9049
  searchQueryRef.current = searchQuery;
9050
+ (0, react.useEffect)(() => {
9051
+ if (mode !== "worktree") appliedRevealRef.current = void 0;
9052
+ }, [mode]);
8812
9053
  (0, react.useEffect)(() => {
8813
9054
  if (!searchExpanded) return;
8814
9055
  const onClick = (event) => {
@@ -8838,6 +9079,9 @@ window.__ModuleLoader__.load({
8838
9079
  ]);
8839
9080
  const currentRevealKeys = (0, react.useMemo)(() => new Set(currentSessionRevealKeys(currentSessionLocation)), [currentSessionLocation]);
8840
9081
  const isCurrentSessionReveal = (key) => activeReveal !== void 0 && activeReveal.sessionId === currentSessionId && currentRevealKeys.has(key) && activeReveal.suppressedKeys[key] !== true;
9082
+ const revealedWorkspaceId = currentSessionLocation?.workspaceId !== void 0 && workspaceIds.includes(currentSessionLocation.workspaceId) && isCurrentSessionReveal("workspace:" + currentSessionLocation.workspaceId) ? currentSessionLocation.workspaceId : void 0;
9083
+ const openWorkspaceId = resolveOpenWorkspaceId(expandSnapshot, workspaceIds, revealedWorkspaceId);
9084
+ const isWorkspaceOpen = (workspaceId) => workspaceId === openWorkspaceId;
8841
9085
  (0, react.useLayoutEffect)(() => {
8842
9086
  locateGenerationRef.current += 1;
8843
9087
  positionedLocateGenerationRef.current = void 0;
@@ -8873,6 +9117,30 @@ window.__ModuleLoader__.load({
8873
9117
  query,
8874
9118
  readState.status
8875
9119
  ]);
9120
+ (0, react.useLayoutEffect)(() => {
9121
+ if (mode !== "worktree" || readState.status !== "ready" || isPendingListPhase(workspaces.phase) || workspaceIds.length === 0) return;
9122
+ const expandedIds = workspaceIds.filter((workspaceId) => isWorkspaceExpanded(expandSnapshot, workspaceId));
9123
+ if (revealedWorkspaceId !== void 0) {
9124
+ const applied = appliedRevealRef.current;
9125
+ if (applied !== void 0 && applied.sessionId === currentSessionId && applied.workspaceId === revealedWorkspaceId) return;
9126
+ expandState.actions.openWorkspaceExclusive(revealedWorkspaceId, workspaceIds);
9127
+ appliedRevealRef.current = {
9128
+ sessionId: currentSessionId,
9129
+ workspaceId: revealedWorkspaceId
9130
+ };
9131
+ return;
9132
+ }
9133
+ if (expandedIds.length > 1 && openWorkspaceId !== void 0) expandState.actions.openWorkspaceExclusive(openWorkspaceId, workspaceIds);
9134
+ }, [
9135
+ mode,
9136
+ readState.status,
9137
+ workspaces.phase,
9138
+ workspaceIds,
9139
+ expandSnapshot,
9140
+ revealedWorkspaceId,
9141
+ openWorkspaceId,
9142
+ expandState
9143
+ ]);
8876
9144
  (0, react.useEffect)(() => {
8877
9145
  if (readState.status !== "ready" || isPendingListPhase(workspaces.phase) || !isCompleteWorktreeWorkspaceSnapshot(workspaceIds, readState.views)) return;
8878
9146
  expandState.actions.retain(workspaceIds, readState.views.flatMap((view) => view.worktrees.map((record) => record.worktreeId)));
@@ -8901,17 +9169,18 @@ window.__ModuleLoader__.load({
8901
9169
  });
8902
9170
  return true;
8903
9171
  };
9172
+ const workspaceGroupKeys = (workspaceId) => ["main:" + workspaceId, ...(viewByWorkspace.get(workspaceId)?.worktrees.map((record) => record.worktreeId) ?? []).map((worktreeId) => "worktree:" + worktreeId)];
8904
9173
  const toggleWorkspace = (workspaceId) => {
8905
- const persistedExpanded = isWorkspaceExpanded(expandSnapshot, workspaceId);
8906
- const autoExpanded = isCurrentSessionReveal("workspace:" + workspaceId);
8907
- const visuallyExpanded = persistedExpanded || autoExpanded;
8908
- if (visuallyExpanded && autoExpanded) suppressCurrentSessionReveal("workspace:" + workspaceId);
8909
- if (visuallyExpanded && !persistedExpanded) {
8910
- clearSessionGroups(["main:" + workspaceId, ...(viewByWorkspace.get(workspaceId)?.worktrees.map((record) => record.worktreeId) ?? []).map((worktreeId) => "worktree:" + worktreeId)]);
9174
+ if (openWorkspaceId === workspaceId) {
9175
+ suppressCurrentSessionReveal("workspace:" + workspaceId);
9176
+ if (isWorkspaceExpanded(expandSnapshot, workspaceId)) expandState.actions.toggleWorkspace(workspaceId);
9177
+ clearSessionGroups(workspaceGroupKeys(workspaceId));
8911
9178
  return;
8912
9179
  }
8913
- expandState.actions.toggleWorkspace(workspaceId);
8914
- if (visuallyExpanded) clearSessionGroups(["main:" + workspaceId, ...(viewByWorkspace.get(workspaceId)?.worktrees.map((record) => record.worktreeId) ?? []).map((worktreeId) => "worktree:" + worktreeId)]);
9180
+ const currentWorkspaceId = currentSessionLocation?.workspaceId;
9181
+ if (currentWorkspaceId !== void 0 && currentWorkspaceId !== workspaceId) suppressCurrentSessionReveal("workspace:" + currentWorkspaceId);
9182
+ if (openWorkspaceId !== void 0) clearSessionGroups(workspaceGroupKeys(openWorkspaceId));
9183
+ expandState.actions.openWorkspaceExclusive(workspaceId, workspaceIds);
8915
9184
  };
8916
9185
  const toggleMain = (workspaceId) => {
8917
9186
  const persistedExpanded = isMainExpanded(expandSnapshot, workspaceId);
@@ -8984,6 +9253,8 @@ window.__ModuleLoader__.load({
8984
9253
  currentSessionLocation,
8985
9254
  currentRevealKeys,
8986
9255
  isCurrentSessionReveal,
9256
+ openWorkspaceId,
9257
+ isWorkspaceOpen,
8987
9258
  clearSessionGroups,
8988
9259
  suppressCurrentSessionReveal,
8989
9260
  toggleWorkspace,
@@ -9464,485 +9735,285 @@ window.__ModuleLoader__.load({
9464
9735
  };
9465
9736
  }
9466
9737
  //#endregion
9467
- //#region lib/client/overlay/overlay-bounds.js
9468
- function computeOverlayBounds(frame, newSession, footer) {
9469
- if (newSession === void 0 || footer === void 0 || ![
9470
- frame.top,
9471
- frame.bottom,
9472
- newSession.top,
9473
- newSession.bottom,
9474
- footer.top,
9475
- footer.bottom
9476
- ].every(Number.isFinite) || frame.bottom <= frame.top || newSession.bottom <= newSession.top || footer.bottom <= footer.top) return {
9477
- ready: false,
9478
- top: 0,
9479
- height: 0
9480
- };
9481
- const top = Math.max(0, Math.min(frame.bottom, newSession.top) - frame.top);
9738
+ //#region lib/client/view/workspace-region-geometry.js
9739
+ /** Measure only the plugin-owned seat for popover readiness, never for placement. */
9740
+ function useWorkspaceRegionGeometry(seat) {
9741
+ const [measured, setMeasured] = (0, react.useState)();
9742
+ (0, react.useLayoutEffect)(() => {
9743
+ if (!seat) return;
9744
+ const element = seat.element;
9745
+ let disposed = false;
9746
+ const measure = () => {
9747
+ if (disposed) return;
9748
+ const rect = element.getBoundingClientRect();
9749
+ const height = element.isConnected && Number.isFinite(rect.height) && rect.width > 0 ? Math.max(0, rect.height) : 0;
9750
+ setMeasured((previous) => previous?.element === element && previous.height === height ? previous : {
9751
+ element,
9752
+ height
9753
+ });
9754
+ };
9755
+ measure();
9756
+ const observer = typeof ResizeObserver === "undefined" ? void 0 : new ResizeObserver(measure);
9757
+ observer?.observe(element);
9758
+ return () => {
9759
+ disposed = true;
9760
+ observer?.disconnect();
9761
+ };
9762
+ }, [seat]);
9763
+ const collapsed = seat?.wide !== true;
9764
+ const height = measured?.element === seat?.element ? measured?.height ?? 0 : 0;
9482
9765
  return {
9483
- ready: true,
9484
- top,
9485
- height: Math.max(top, Math.min(frame.bottom, footer.top) - frame.top) - top
9766
+ collapsed,
9767
+ bounds: {
9768
+ ready: !collapsed && height > 0,
9769
+ top: 0,
9770
+ height
9771
+ }
9486
9772
  };
9487
9773
  }
9488
9774
  //#endregion
9489
- //#region lib/client/layout/app-frame.js
9490
- /** Public AppFrame anchors; never infer a column from sibling order or private classes. */
9491
- function directChildWithin(parent, anchor) {
9492
- let child = anchor;
9493
- while (child && child.parentElement !== parent) child = child.parentElement;
9494
- return child ?? void 0;
9775
+ //#region lib/client/view/activity-filter.js
9776
+ /**
9777
+ * Browser-only activity window that scopes the Worktree tree.
9778
+ *
9779
+ * The filter is a presentation projection over native Session facts
9780
+ * (`updatedAt`, running state and pending interaction). It never adds an RPC,
9781
+ * never reads Git, and never writes a Sidecar field: hiding a row must not
9782
+ * change what the Host or DSH considers to exist.
9783
+ */
9784
+ const ACTIVITY_WINDOWS = [
9785
+ "today",
9786
+ "last24h",
9787
+ "last7d",
9788
+ "all"
9789
+ ];
9790
+ const DAY_MS = 864e5;
9791
+ function isActivityWindowId(value) {
9792
+ return typeof value === "string" && ACTIVITY_WINDOWS.includes(value);
9495
9793
  }
9496
- function resolveAppFrame(surface) {
9497
- const overlay = surface.closest("[data-shell-overlay]");
9498
- const frame = overlay?.parentElement;
9499
- if (!(overlay instanceof HTMLElement) || !frame || !overlay.isConnected) return void 0;
9500
- for (const selector of ["[data-worktree-mode-action]", "[data-pane=\"sidebar\"]"]) {
9501
- const columns = new Set(Array.from(frame.querySelectorAll(selector)).map((anchor) => directChildWithin(frame, anchor)).filter((column) => column instanceof HTMLElement && column !== overlay && !column.hasAttribute("data-shell-overlay") && !column.hasAttribute("data-rightbar-col") && !column.hasAttribute("data-shell-leading")));
9502
- if (columns.size > 1) return void 0;
9503
- const sidebar = columns.values().next().value;
9504
- if (sidebar) return {
9505
- overlay,
9506
- frame,
9507
- sidebar
9508
- };
9794
+ /** Guard persisted values before they scope a visible tree. */
9795
+ function effectiveActivityWindow(value) {
9796
+ return isActivityWindowId(value) ? value : "all";
9797
+ }
9798
+ /** The selector shows every range until the user narrows it. */
9799
+ const DEFAULT_ACTIVITY_WINDOWS = ACTIVITY_WINDOWS;
9800
+ /**
9801
+ * Guard the persisted visible-range list: unknown and duplicate entries are
9802
+ * dropped, the canonical selector order is restored, and an empty result falls
9803
+ * back to every range so the selector can never become unreachable.
9804
+ */
9805
+ function effectiveActivityWindows(value) {
9806
+ const values = Array.isArray(value) ? value.filter(isActivityWindowId) : [];
9807
+ const selected = new Set(values);
9808
+ const visible = ACTIVITY_WINDOWS.filter((window) => selected.has(window));
9809
+ return visible.length > 0 ? visible : DEFAULT_ACTIVITY_WINDOWS;
9810
+ }
9811
+ /**
9812
+ * Apply one visibility checkbox without producing an empty selector.
9813
+ * Re-showing a range inserts it back into the canonical order.
9814
+ */
9815
+ function toggleActivityWindow(current, window, visible) {
9816
+ const enabled = new Set(current);
9817
+ if (visible === enabled.has(window)) return current;
9818
+ if (visible) enabled.add(window);
9819
+ else enabled.delete(window);
9820
+ if (enabled.size === 0) return current;
9821
+ return ACTIVITY_WINDOWS.filter((candidate) => enabled.has(candidate));
9822
+ }
9823
+ /**
9824
+ * Pick the tab that takes over when the selected range is hidden: the next
9825
+ * visible range in selector order, wrapping to the first one at the end.
9826
+ */
9827
+ function nextActivityWindow(hidden, visible) {
9828
+ const start = ACTIVITY_WINDOWS.indexOf(hidden);
9829
+ for (let step = 1; step <= ACTIVITY_WINDOWS.length; step += 1) {
9830
+ const candidate = ACTIVITY_WINDOWS[(start + step) % ACTIVITY_WINDOWS.length];
9831
+ if (candidate !== void 0 && visible.includes(candidate)) return candidate;
9832
+ }
9833
+ return visible[0] ?? "all";
9834
+ }
9835
+ /** Local calendar-day start: DSH presents Session times in the local time zone. */
9836
+ function startOfLocalDay(now) {
9837
+ const date = new Date(now);
9838
+ date.setHours(0, 0, 0, 0);
9839
+ return date.getTime();
9840
+ }
9841
+ /** Inclusive lower bound in epoch milliseconds; `undefined` disables filtering. */
9842
+ function activityWindowSince(window, now) {
9843
+ if (!Number.isFinite(now)) return void 0;
9844
+ switch (window) {
9845
+ case "today": return startOfLocalDay(now);
9846
+ case "last24h": return now - DAY_MS;
9847
+ case "last7d": return now - 7 * DAY_MS;
9848
+ case "all": return;
9509
9849
  }
9510
9850
  }
9511
- function finiteRect(rect) {
9512
- return [
9513
- rect.left,
9514
- rect.right,
9515
- rect.top,
9516
- rect.bottom,
9517
- rect.width,
9518
- rect.height
9519
- ].every(Number.isFinite);
9851
+ function lastActivityAt(sessionId, scope) {
9852
+ const updatedAt = scope.sessionPresentations[sessionId]?.updatedAt ?? scope.sessions.byId[sessionId]?.updatedAt;
9853
+ return updatedAt !== void 0 && Number.isFinite(updatedAt) ? updatedAt : void 0;
9520
9854
  }
9521
- function resolveFrameContent(frame, overlay, sidebar) {
9522
- const rightbars = Array.from(frame.querySelectorAll("[data-rightbar-col]")).filter((column) => directChildWithin(frame, column) !== overlay);
9523
- if (rightbars.length > 1) return void 0;
9524
- const column = rightbars[0];
9525
- const rightbar = frame.hasAttribute("data-rightbar-collapsed") ? void 0 : column;
9526
- const box = overlay.getBoundingClientRect();
9527
- const boundary = sidebar.getBoundingClientRect();
9528
- const columnRect = column?.getBoundingClientRect();
9529
- if (!finiteRect(box) || !finiteRect(boundary) || rightbar && columnRect && !finiteRect(columnRect)) return;
9530
- const centerEdges = [rightbar && columnRect ? columnRect.left : box.right];
9531
- if (!rightbar && columnRect && finiteRect(columnRect)) centerEdges.push(columnRect.left);
9532
- const excluded = column ? directChildWithin(frame, column) : void 0;
9533
- const centers = Array.from(frame.children).filter((child) => {
9534
- if (!(child instanceof HTMLElement) || child === sidebar || child === overlay || child === excluded || child.hasAttribute("data-shell-overlay") || child.hasAttribute("data-shell-leading") || child.hasAttribute("data-window-drag")) return false;
9535
- const rect = child.getBoundingClientRect();
9536
- return finiteRect(rect) && rect.width > 0 && rect.height > 0 && Math.abs(rect.left - boundary.right) <= 1 && centerEdges.some((edge) => Math.abs(rect.right - edge) <= 1) && rect.top >= box.top - 1 && rect.top < box.bottom && Math.abs(rect.bottom - box.bottom) <= 1;
9537
- });
9538
- if (centers.length !== 1) return void 0;
9855
+ /**
9856
+ * A Session is active in a window when it runs now, waits for interaction, or
9857
+ * was updated inside the window. Running and pending Sessions count even with
9858
+ * an old `updatedAt`, because they are active now.
9859
+ */
9860
+ function isSessionActiveInWindow(sessionId, window, now, scope) {
9861
+ const since = activityWindowSince(window, now);
9862
+ if (since === void 0) return true;
9863
+ if (scope.currentSessionId === sessionId) return true;
9864
+ const presentation = scope.sessionPresentations[sessionId];
9865
+ if (presentation !== void 0 && (presentation.ongoing || presentation.status.state === "warning")) return true;
9866
+ const at = lastActivityAt(sessionId, scope);
9867
+ return at !== void 0 && at >= since;
9868
+ }
9869
+ /** Filter a group without mutating its source order. */
9870
+ function filterSessionIdsByActivity(sessionIds, window, now, scope) {
9871
+ if (window === "all") return sessionIds;
9872
+ return sessionIds.filter((sessionId) => isSessionActiveInWindow(sessionId, window, now, scope));
9873
+ }
9874
+ /** Session scope the tree and the range selector both count. */
9875
+ function activityCandidateSessionIds(source, archivedSessionIds) {
9876
+ const excluded = new Set(archivedSessionIds);
9877
+ return source.ids.filter((sessionId) => !excluded.has(sessionId) && source.byId[sessionId]?.blank !== true);
9878
+ }
9879
+ /** Count the Sessions a window would show; used for the range selector labels. */
9880
+ function countSessionsInWindow(candidateSessionIds, window, now, scope) {
9881
+ return filterSessionIdsByActivity(candidateSessionIds, window, now, scope).length;
9882
+ }
9883
+ //#endregion
9884
+ //#region lib/client/surface/state/useActivityFilter.js
9885
+ /** A bounded window crosses a day/hour boundary while the panel is open. */
9886
+ const ACTIVITY_CLOCK_INTERVAL_MS = 6e4;
9887
+ /**
9888
+ * Derive the browser-only activity range for the Worktree tree.
9889
+ *
9890
+ * The range is a persisted Client preference read through the shared view store;
9891
+ * this hook adds the wall clock, the per-Session predicate and the range counts.
9892
+ * It reads only native Session facts, so it never widens the refresh scope.
9893
+ */
9894
+ function useActivityFilter({ props, source, enabled }) {
9895
+ const preferred = props.useStore((state) => state.activityWindow);
9896
+ const preferredWindows = props.useStore((state) => state.activityWindows);
9897
+ const showInactiveStructure = props.useStore((state) => state.showInactiveStructure !== false);
9898
+ const visibleWindows = (0, react.useMemo)(() => effectiveActivityWindows(preferredWindows), [preferredWindows]);
9899
+ const preferredWindow = effectiveActivityWindow(preferred);
9900
+ const window = visibleWindows.includes(preferredWindow) ? preferredWindow : visibleWindows[0] ?? "all";
9901
+ const [now, setNow] = (0, react.useState)(() => Date.now());
9902
+ const [menuOpen, setMenuOpen] = (0, react.useState)(false);
9903
+ (0, react.useEffect)(() => {
9904
+ if (!enabled) return;
9905
+ setNow(Date.now());
9906
+ const timer = setInterval(() => setNow(Date.now()), ACTIVITY_CLOCK_INTERVAL_MS);
9907
+ return () => clearInterval(timer);
9908
+ }, [enabled]);
9909
+ const { sessions, sessionPresentations, currentSessionId, archivedSessionIds } = source;
9910
+ const scope = (0, react.useMemo)(() => ({
9911
+ sessions,
9912
+ sessionPresentations,
9913
+ ...currentSessionId === void 0 ? {} : { currentSessionId }
9914
+ }), [
9915
+ sessions,
9916
+ sessionPresentations,
9917
+ currentSessionId
9918
+ ]);
9919
+ const candidateSessionIds = (0, react.useMemo)(() => activityCandidateSessionIds(sessions, archivedSessionIds), [sessions, archivedSessionIds]);
9920
+ const counts = (0, react.useMemo)(() => {
9921
+ const next = {};
9922
+ for (const candidate of ACTIVITY_WINDOWS) next[candidate] = countSessionsInWindow(candidateSessionIds, candidate, now, scope);
9923
+ return next;
9924
+ }, [
9925
+ candidateSessionIds,
9926
+ now,
9927
+ scope
9928
+ ]);
9929
+ const isActive = (0, react.useCallback)((sessionId) => isSessionActiveInWindow(sessionId, window, now, scope), [
9930
+ now,
9931
+ scope,
9932
+ window
9933
+ ]);
9934
+ const hasActiveSession = (0, react.useCallback)((sessionIds) => sessionIds.some(isActive), [isActive]);
9935
+ const scopeSessionIds = (0, react.useCallback)((sessionIds) => window === "all" ? sessionIds : sessionIds.filter(isActive), [isActive, window]);
9936
+ const setWindow = (0, react.useCallback)((next) => {
9937
+ props.actions.setActivityWindow(effectiveActivityWindow(next));
9938
+ }, [props.actions]);
9939
+ const isWindowVisible = (0, react.useCallback)((candidate) => visibleWindows.includes(candidate), [visibleWindows]);
9940
+ const setWindowVisible = (0, react.useCallback)((candidate, visible) => {
9941
+ props.actions.setActivityWindowVisible(candidate, visible);
9942
+ }, [props.actions]);
9943
+ const setShowInactiveStructure = (0, react.useCallback)((show) => {
9944
+ props.actions.setShowInactiveStructure(show === true);
9945
+ }, [props.actions]);
9946
+ const count = (0, react.useCallback)((candidate) => counts[effectiveActivityWindow(candidate)] ?? 0, [counts]);
9539
9947
  return {
9540
- center: centers[0],
9541
- rightbar
9948
+ window,
9949
+ active: window !== "all",
9950
+ now,
9951
+ setWindow,
9952
+ visibleWindows,
9953
+ isWindowVisible,
9954
+ setWindowVisible,
9955
+ showInactiveStructure,
9956
+ setShowInactiveStructure,
9957
+ menuOpen,
9958
+ setMenuOpen,
9959
+ isActive,
9960
+ scopeSessionIds,
9961
+ hasActiveSession,
9962
+ count
9542
9963
  };
9543
9964
  }
9544
9965
  //#endregion
9545
- //#region lib/client/dashboard/dashboard-overlay.js
9546
- const SIDEBAR_RESIZE_HANDLE_HALF_WIDTH = 4;
9547
- /** Reversible presentation only: leave the native React tree and Session alive. */
9548
- function concealDashboardBackground(element) {
9549
- const visibility = element.style.getPropertyValue("visibility");
9550
- const priority = element.style.getPropertyPriority("visibility");
9551
- const inert = element.getAttribute("inert");
9552
- const hidden = element.getAttribute("aria-hidden");
9553
- element.style.setProperty("visibility", "hidden");
9554
- element.setAttribute("inert", "");
9555
- element.setAttribute("aria-hidden", "true");
9556
- return () => {
9557
- if (element.style.getPropertyValue("visibility") === "hidden") if (visibility) element.style.setProperty("visibility", visibility, priority);
9558
- else element.style.removeProperty("visibility");
9559
- for (const [name, value] of [["inert", inert], ["aria-hidden", hidden]]) if (value === null) element.removeAttribute(name);
9560
- else element.setAttribute(name, value);
9561
- };
9562
- }
9563
- function isRightSidebarOpenFromDom(frame, rightbar) {
9564
- return !frame.hasAttribute("data-rightbar-collapsed") && rightbar instanceof HTMLElement && frame.contains(rightbar) && (rightbar.hasAttribute("data-sidebar-right-open") || rightbar.querySelector("[data-sidebar-right-open]") !== null);
9565
- }
9566
- /** Layout seam shared with the existing Sidebar overlay; fail closed on frame/center loss. */
9567
- function mountDashboardOverlay(surface, onPlacement, options) {
9568
- const overlay = surface.closest("[data-shell-overlay]");
9569
- const frame = overlay?.parentElement;
9570
- if (!overlay || !frame) {
9571
- onPlacement(void 0);
9572
- options?.onRightSidebarChange?.(false);
9573
- return () => {};
9574
- }
9575
- const hidden = /* @__PURE__ */ new Map();
9576
- let observed = [];
9577
- let scheduled;
9578
- let disposed = false;
9579
- let lastRightSidebarOpen;
9580
- const restore = () => {
9581
- for (const cleanup of hidden.values()) cleanup();
9582
- hidden.clear();
9583
- };
9584
- const schedule = () => {
9585
- if (disposed || scheduled !== void 0) return;
9586
- scheduled = requestAnimationFrame(() => {
9587
- scheduled = void 0;
9588
- update();
9589
- });
9590
- };
9591
- const resize = typeof ResizeObserver === "undefined" ? void 0 : new ResizeObserver(schedule);
9592
- const update = () => {
9593
- if (disposed) return;
9594
- const anchors = resolveAppFrame(surface);
9595
- const content = anchors?.frame === frame && anchors.overlay === overlay ? resolveFrameContent(frame, overlay, anchors.sidebar) : void 0;
9596
- const nextObserved = [
9597
- frame,
9598
- overlay,
9599
- ...Array.from(frame.children),
9600
- ...Array.from(frame.querySelectorAll("[data-rightbar-col]"))
9601
- ];
9602
- for (const old of observed) if (!nextObserved.includes(old)) resize?.unobserve(old);
9603
- for (const next of nextObserved) if (!observed.includes(next)) resize?.observe(next);
9604
- observed = nextObserved;
9605
- if (!anchors || !content) {
9606
- restore();
9607
- onPlacement(void 0);
9608
- if (lastRightSidebarOpen) {
9609
- lastRightSidebarOpen = false;
9610
- options?.onRightSidebarChange?.(false);
9611
- }
9612
- return;
9613
- }
9614
- const { sidebar } = anchors;
9615
- const { center, rightbar } = content;
9616
- const box = overlay.getBoundingClientRect();
9617
- const boundary = sidebar.getBoundingClientRect();
9618
- const rightBoundary = rightbar instanceof HTMLElement ? rightbar.getBoundingClientRect().left : box.right;
9619
- const left = Math.max(0, boundary.right - box.left + SIDEBAR_RESIZE_HANDLE_HALF_WIDTH);
9620
- const width = Math.min(box.right, rightBoundary) - box.left - left;
9621
- if (width <= 0 || box.height <= 0) {
9622
- restore();
9623
- onPlacement(void 0);
9624
- return;
9625
- }
9626
- const centerBox = center.getBoundingClientRect();
9627
- const top = Math.max(0, centerBox.top - box.top);
9628
- const height = Math.min(box.bottom, centerBox.bottom) - box.top - top;
9629
- if (height <= 0) {
9630
- restore();
9631
- onPlacement(void 0);
9632
- return;
9633
- }
9634
- for (const [element, cleanup] of hidden) if (element !== center) {
9635
- cleanup();
9636
- hidden.delete(element);
9637
- }
9638
- if (!hidden.has(center)) hidden.set(center, concealDashboardBackground(center));
9639
- onPlacement({
9640
- left,
9641
- top,
9642
- width,
9643
- height
9644
- });
9645
- const isRightSidebarOpen = options?.isRightSidebarExpanded !== void 0 ? options.isRightSidebarExpanded() : isRightSidebarOpenFromDom(frame, rightbar);
9646
- if (lastRightSidebarOpen !== isRightSidebarOpen) {
9647
- lastRightSidebarOpen = isRightSidebarOpen;
9648
- options?.onRightSidebarChange?.(isRightSidebarOpen);
9649
- }
9650
- };
9651
- const mutation = typeof MutationObserver === "undefined" ? void 0 : new MutationObserver(schedule);
9652
- try {
9653
- mutation?.observe(frame, {
9654
- childList: true,
9655
- attributes: true,
9656
- subtree: true,
9657
- attributeFilter: [
9658
- "data-rightbar-collapsed",
9659
- "data-sidebar-right-open",
9660
- "data-sidebar-right-panel",
9661
- "data-rightbar-col",
9662
- "data-worktree-mode-action",
9663
- "data-pane",
9664
- "data-window-drag",
9665
- "data-shell-leading",
9666
- "data-shell-overlay"
9667
- ]
9668
- });
9669
- } catch {
9670
- mutation?.observe(frame, { childList: true });
9671
- }
9672
- if (frame.parentElement) try {
9673
- mutation?.observe(frame.parentElement, { childList: true });
9674
- } catch {}
9675
- update();
9676
- return () => {
9677
- disposed = true;
9678
- resize?.disconnect();
9679
- mutation?.disconnect();
9680
- if (scheduled !== void 0) cancelAnimationFrame(scheduled);
9681
- restore();
9682
- if (lastRightSidebarOpen) {
9683
- lastRightSidebarOpen = false;
9684
- options?.onRightSidebarChange?.(false);
9685
- }
9686
- };
9687
- }
9688
- //#endregion
9689
- //#region lib/client/overlay/sidebar-overlay-geometry.js
9690
- const EMPTY_BOUNDS = {
9691
- ready: false,
9692
- top: 0,
9693
- height: 0
9694
- };
9695
- function asRect(element) {
9696
- const rect = element.getBoundingClientRect();
9697
- return {
9698
- top: rect.top,
9699
- bottom: rect.bottom
9700
- };
9701
- }
9702
- function syncObservedElement(observer, previous, next) {
9703
- const nextElement = next ?? void 0;
9704
- if (previous === nextElement) return previous;
9705
- if (previous !== void 0) observer?.unobserve(previous);
9706
- if (nextElement !== void 0) observer?.observe(nextElement);
9707
- return nextElement;
9708
- }
9709
- function resolveNativeSidebarRoot(sidebar) {
9710
- const newSession = findNewSessionAnchor(sidebar);
9711
- const action = sidebar.querySelector("[data-worktree-mode-action]");
9712
- if (!newSession || !action) return void 0;
9713
- let candidate;
9714
- for (let root = newSession.parentElement; root; root = root.parentElement) {
9715
- const content = directChildWithin(root, newSession);
9716
- const footer = directChildWithin(root, action);
9717
- const rect = root.getBoundingClientRect();
9718
- if (content && footer && content !== footer) {
9719
- candidate ??= root;
9720
- if (rect.width > 0 && rect.height > 0) return root;
9721
- }
9722
- if (root === sidebar) break;
9723
- }
9724
- return candidate;
9725
- }
9726
- function findNewSessionAnchor(root) {
9727
- const labels = [
9728
- "新建会话",
9729
- "New session",
9730
- "新会话",
9731
- "New Session"
9732
- ];
9733
- const buttons = Array.from(root.querySelectorAll("button")).filter((button) => {
9734
- let parent = button.parentElement;
9735
- while (parent && parent !== root) {
9736
- if (parent.hasAttribute("data-window-drag")) return false;
9737
- parent = parent.parentElement;
9738
- }
9739
- return true;
9740
- });
9741
- const visibleLabel = buttons.find((button) => {
9742
- const text = button.textContent?.trim();
9743
- if (!text) return false;
9744
- return text.startsWith("新会话") || text.startsWith("New Session");
9745
- });
9746
- if (visibleLabel !== void 0) return visibleLabel;
9747
- for (const label of labels) {
9748
- const button = buttons.find((candidate) => candidate.getAttribute("aria-label") === label);
9749
- if (button !== void 0) return button;
9750
- }
9751
- }
9752
- function sidebarFooterCandidate(root) {
9753
- return directChildWithin(root, root.querySelector("[data-worktree-mode-action]"));
9754
- }
9755
- /** Resolve the footer slot semantically, then validate its content boundary. */
9756
- function resolveSidebarFooter(root, newSession) {
9757
- if (!newSession) return void 0;
9758
- const children = Array.from(root.children);
9759
- const content = directChildWithin(root, newSession);
9760
- const start = content === void 0 ? -1 : children.indexOf(content);
9761
- if (start < 0) return void 0;
9762
- const anchorRect = asRect(newSession);
9763
- const rootRect = asRect(root);
9764
- const candidate = sidebarFooterCandidate(root);
9765
- if (!candidate || children.indexOf(candidate) <= start) return void 0;
9766
- const rect = asRect(candidate);
9767
- return [
9768
- anchorRect.top,
9769
- anchorRect.bottom,
9770
- rootRect.top,
9771
- rootRect.bottom,
9772
- rect.top,
9773
- rect.bottom
9774
- ].every(Number.isFinite) && anchorRect.bottom > anchorRect.top && rect.bottom > rect.top && rect.top >= anchorRect.bottom && rect.top >= rootRect.top && rect.bottom <= rootRect.bottom ? candidate : void 0;
9775
- }
9776
- /** Hide only the native content covered by the plugin, keeping chrome and footer alive. */
9777
- function coveredSidebarChildren(root, newSession, footer) {
9778
- if (!newSession || !footer) return [];
9779
- const first = directChildWithin(root, newSession);
9780
- const children = Array.from(root.children ?? []);
9781
- const start = first === void 0 ? -1 : children.indexOf(first);
9782
- const end = children.indexOf(footer);
9783
- if (start < 0 || end <= start) return [];
9784
- return children.slice(start, end).filter((element) => element instanceof HTMLElement);
9785
- }
9786
- function concealSidebarContent(element) {
9787
- const restore = concealDashboardBackground(element);
9788
- const opacity = element.style.getPropertyValue("opacity");
9789
- const priority = element.style.getPropertyPriority("opacity");
9790
- element.style.setProperty("opacity", "0");
9791
- return () => {
9792
- restore();
9793
- if (element.style.getPropertyValue("opacity") !== "0") return;
9794
- if (opacity) element.style.setProperty("opacity", opacity, priority);
9795
- else element.style.removeProperty("opacity");
9796
- };
9797
- }
9798
- function useSidebarOverlayGeometry(active) {
9799
- const ref = (0, react.useRef)(null);
9800
- const [width, setWidth] = (0, react.useState)(280);
9801
- const [bounds, setBounds] = (0, react.useState)(EMPTY_BOUNDS);
9802
- const [collapsed, setCollapsed] = (0, react.useState)(false);
9803
- const [nativeCovered, setNativeCovered] = (0, react.useState)(false);
9804
- (0, react.useLayoutEffect)(() => {
9805
- if (!active) {
9806
- setBounds(EMPTY_BOUNDS);
9807
- setNativeCovered(false);
9808
- return;
9809
- }
9810
- const surface = ref.current;
9811
- const overlay = surface?.closest("[data-shell-overlay]");
9812
- const frame = overlay?.parentElement;
9813
- if (!(overlay instanceof HTMLElement) || !frame || !surface) {
9814
- setBounds(EMPTY_BOUNDS);
9815
- return;
9816
- }
9817
- const overlayElement = overlay;
9818
- let frameHandle;
9819
- let disposed = false;
9820
- let observedNewSession;
9821
- let observedFooter;
9822
- let observedRoot;
9823
- let observedSidebar;
9824
- const hidden = /* @__PURE__ */ new Map();
9825
- function restore() {
9826
- for (const cleanup of hidden.values()) cleanup();
9827
- hidden.clear();
9828
- }
9829
- function update() {
9830
- if (disposed) return;
9831
- const anchors = resolveAppFrame(surface);
9832
- const sidebarElement = anchors?.sidebar;
9833
- const currentRoot = sidebarElement && resolveNativeSidebarRoot(sidebarElement);
9834
- observedSidebar = syncObservedElement(resizeObserver, observedSidebar, sidebarElement);
9835
- observedRoot = syncObservedElement(resizeObserver, observedRoot, currentRoot);
9836
- const nextWidth = sidebarElement?.getBoundingClientRect().width;
9837
- const nextCollapsed = frame?.hasAttribute("data-sidebar-collapsed") === true || nextWidth !== void 0 && nextWidth <= 64;
9838
- setCollapsed(nextCollapsed);
9839
- if (nextWidth !== void 0 && Number.isFinite(nextWidth)) setWidth(Math.max(0, nextWidth));
9840
- if (anchors?.frame !== frame || anchors?.overlay !== overlayElement || !(currentRoot instanceof HTMLElement) || !sidebarElement || nextWidth === void 0 || !Number.isFinite(nextWidth)) {
9841
- observedNewSession = syncObservedElement(resizeObserver, observedNewSession, void 0);
9842
- observedFooter = syncObservedElement(resizeObserver, observedFooter, void 0);
9843
- restore();
9844
- setNativeCovered(false);
9845
- setBounds(EMPTY_BOUNDS);
9846
- return;
9847
- }
9848
- const newSession = findNewSessionAnchor(currentRoot);
9849
- const footer = resolveSidebarFooter(currentRoot, newSession);
9850
- observedNewSession = syncObservedElement(resizeObserver, observedNewSession, newSession);
9851
- observedFooter = syncObservedElement(resizeObserver, observedFooter, sidebarFooterCandidate(currentRoot));
9852
- const nextBounds = computeOverlayBounds(asRect(overlayElement), newSession === void 0 ? void 0 : asRect(newSession), footer === void 0 ? void 0 : asRect(footer));
9853
- setBounds(nextCollapsed ? EMPTY_BOUNDS : nextBounds);
9854
- const covered = !nextCollapsed && nextBounds.ready && nextBounds.height > 0 ? coveredSidebarChildren(currentRoot, newSession, footer) : [];
9855
- for (const [element, cleanup] of hidden) if (!covered.includes(element)) {
9856
- cleanup();
9857
- hidden.delete(element);
9858
- }
9859
- for (const element of covered) if (!hidden.has(element)) hidden.set(element, concealSidebarContent(element));
9860
- setNativeCovered(covered.length > 0);
9861
- }
9862
- function scheduleUpdate() {
9863
- if (disposed || frameHandle !== void 0) return;
9864
- frameHandle = requestAnimationFrame(() => {
9865
- frameHandle = void 0;
9866
- update();
9867
- });
9868
- }
9869
- const resizeObserver = typeof ResizeObserver === "function" ? new ResizeObserver(scheduleUpdate) : void 0;
9870
- for (const element of [overlayElement, frame]) resizeObserver?.observe(element);
9871
- update();
9872
- const mutationObserver = typeof MutationObserver === "function" ? new MutationObserver(scheduleUpdate) : void 0;
9873
- mutationObserver?.observe(frame, {
9874
- childList: true,
9875
- subtree: true,
9876
- attributes: true,
9877
- attributeFilter: [
9878
- "data-sidebar-collapsed",
9879
- "data-worktree-mode-action",
9880
- "data-pane",
9881
- "data-shell-overlay",
9882
- "data-window-drag"
9883
- ]
9884
- });
9885
- if (frame?.parentElement) mutationObserver?.observe(frame.parentElement, { childList: true });
9886
- return () => {
9887
- disposed = true;
9888
- resizeObserver?.disconnect();
9889
- mutationObserver?.disconnect();
9890
- if (frameHandle !== void 0) cancelAnimationFrame(frameHandle);
9891
- restore();
9892
- };
9893
- }, [active]);
9894
- return {
9895
- ref,
9896
- width,
9897
- bounds,
9898
- collapsed,
9899
- nativeCovered
9900
- };
9901
- }
9902
- //#endregion
9903
- //#region lib/client/surface/state/useSurfaceSources.js
9904
- function useSurfaceSources({ props }) {
9905
- const { useStore, available, manager, useSessions, useSessionStatus, useWorkspaces, forkRecovery, expandState, sessionOrder } = props;
9906
- const preferredMode = useStore((state) => state.viewMode);
9907
- const mode = effectiveViewMode(preferredMode, available && manager !== void 0);
9908
- const sessions = useSessions((state) => state);
9909
- const sessionStatuses = useSessionStatus?.((state) => state);
9910
- const nativeWorkspaces = useWorkspaces((state) => state);
9911
- const retainedWorkspaces = (0, react.useRef)();
9912
- const workspaces = (0, react.useMemo)(() => {
9913
- const next = retainPendingWorkspaces(retainedWorkspaces.current, nativeWorkspaces);
9914
- retainedWorkspaces.current = next;
9915
- return next;
9916
- }, [nativeWorkspaces]);
9917
- const forkRecoveryStore = forkRecovery ?? EMPTY_FORK_RECOVERY_STORE;
9918
- const forkRecoverySnapshot = (0, react.useSyncExternalStore)(forkRecoveryStore.subscribe, forkRecoveryStore.getSnapshot, forkRecoveryStore.getSnapshot);
9919
- const currentSessionId = currentSessionIdFromList(sessions);
9920
- const workspaceIds = useStableWorkspaceIds(workspaces.items);
9921
- const workspaceIdsRef = (0, react.useRef)(workspaceIds);
9922
- workspaceIdsRef.current = workspaceIds;
9923
- const expandSnapshot = (0, react.useSyncExternalStore)(expandState.subscribe, expandState.getSnapshot, expandState.getSnapshot);
9924
- const sessionOrderSnapshot = (0, react.useSyncExternalStore)(sessionOrder.subscribe, sessionOrder.getSnapshot, sessionOrder.getSnapshot);
9925
- const sessionPresentations = (0, react.useMemo)(() => deriveSessionPresentationIndex(sessions, sessionStatuses), [sessions.byId, sessionStatuses]);
9926
- const { ref, width, bounds, collapsed, nativeCovered } = useSidebarOverlayGeometry(mode === "worktree");
9927
- return {
9928
- preferredMode,
9929
- mode,
9930
- sessions,
9931
- workspaces,
9932
- forkRecoveryStore,
9933
- forkRecoverySnapshot,
9934
- currentSessionId,
9935
- workspaceIds,
9936
- workspaceIdsRef,
9937
- expandSnapshot,
9938
- sessionOrderSnapshot,
9939
- sessionPresentations,
9940
- ref,
9941
- width,
9942
- bounds,
9943
- collapsed,
9944
- nativeCovered,
9945
- archivedSessionIds: workspaces.archivedSessionIds ?? []
9966
+ //#region lib/client/surface/state/useSurfaceSources.js
9967
+ function useSurfaceSources({ props }) {
9968
+ const { useStore, available, manager, useSessions, useSessionStatus, useWorkspaces, forkRecovery, expandState, sessionOrder } = props;
9969
+ const preferredMode = useStore((state) => state.viewMode);
9970
+ const mode = effectiveViewMode(preferredMode, available && manager !== void 0);
9971
+ const sessions = useSessions((state) => state);
9972
+ const sessionStatuses = useSessionStatus?.((state) => state);
9973
+ const nativeWorkspaces = useWorkspaces((state) => state);
9974
+ const retainedWorkspaces = (0, react.useRef)();
9975
+ const workspaces = (0, react.useMemo)(() => {
9976
+ const next = retainPendingWorkspaces(retainedWorkspaces.current, nativeWorkspaces);
9977
+ retainedWorkspaces.current = next;
9978
+ return next;
9979
+ }, [nativeWorkspaces]);
9980
+ const forkRecoveryStore = forkRecovery ?? EMPTY_FORK_RECOVERY_STORE;
9981
+ const forkRecoverySnapshot = (0, react.useSyncExternalStore)(forkRecoveryStore.subscribe, forkRecoveryStore.getSnapshot, forkRecoveryStore.getSnapshot);
9982
+ const currentSessionId = currentSessionIdFromList(sessions);
9983
+ const workspaceIds = useStableWorkspaceIds(workspaces.items);
9984
+ const workspaceIdsRef = (0, react.useRef)(workspaceIds);
9985
+ workspaceIdsRef.current = workspaceIds;
9986
+ const expandSnapshot = (0, react.useSyncExternalStore)(expandState.subscribe, expandState.getSnapshot, expandState.getSnapshot);
9987
+ const sessionOrderSnapshot = (0, react.useSyncExternalStore)(sessionOrder.subscribe, sessionOrder.getSnapshot, sessionOrder.getSnapshot);
9988
+ const sessionPresentations = (0, react.useMemo)(() => deriveSessionPresentationIndex(sessions, sessionStatuses), [sessions.byId, sessionStatuses]);
9989
+ const { bounds, collapsed } = useWorkspaceRegionGeometry(props.sidebarSeat);
9990
+ const archivedSessionIds = workspaces.archivedSessionIds ?? [];
9991
+ return {
9992
+ preferredMode,
9993
+ mode,
9994
+ sessions,
9995
+ workspaces,
9996
+ forkRecoveryStore,
9997
+ forkRecoverySnapshot,
9998
+ currentSessionId,
9999
+ workspaceIds,
10000
+ workspaceIdsRef,
10001
+ expandSnapshot,
10002
+ sessionOrderSnapshot,
10003
+ sessionPresentations,
10004
+ activity: useActivityFilter({
10005
+ props,
10006
+ enabled: mode === "worktree",
10007
+ source: {
10008
+ sessions,
10009
+ sessionPresentations,
10010
+ currentSessionId,
10011
+ archivedSessionIds
10012
+ }
10013
+ }),
10014
+ bounds,
10015
+ collapsed,
10016
+ archivedSessionIds
9946
10017
  };
9947
10018
  }
9948
10019
  //#endregion
@@ -10223,7 +10294,7 @@ window.__ModuleLoader__.load({
10223
10294
  };
10224
10295
  const defaultOpenInAppController = new OpenInAppController();
10225
10296
  //#endregion
10226
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/dashboard/open-in-app.css.mjs
10297
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/dashboard/open-in-app.css.mjs
10227
10298
  const css$4 = ".-cerbur-clutch-dsh-worktree-control {\n display: inline-flex;\n align-self: flex-end;\n}\n\n.-cerbur-clutch-dsh-worktree-split {\n display: inline-flex;\n align-items: stretch;\n box-sizing: border-box;\n height: 28px;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: 14px;\n overflow: hidden;\n font-family: var(--dsw-font-family);\n}\n\n.-cerbur-clutch-dsh-worktree-split .-cerbur-clutch-dsh-worktree-main,\n.-cerbur-clutch-dsh-worktree-split .-cerbur-clutch-dsh-worktree-chevron {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n border: 0;\n background: none;\n color: var(--dsw-alias-label-primary);\n font-size: 11px;\n font-weight: 400;\n line-height: 16px;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-main {\n padding: 5px 6px 5px 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-main:hover:not(:disabled),\n.-cerbur-clutch-dsh-worktree-main:focus-visible,\n.-cerbur-clutch-dsh-worktree-chevron:hover,\n.-cerbur-clutch-dsh-worktree-chevron:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-main:disabled {\n color: var(--dsw-alias-label-dimmed);\n cursor: wait;\n}\n\n.-cerbur-clutch-dsh-worktree-main[data-state='error'] {\n color: var(--dsw-alias-state-error-primary, #e03e3e);\n box-shadow: inset 0 0 0 1px var(--dsw-alias-state-error-primary, #e03e3e);\n}\n\n.-cerbur-clutch-dsh-worktree-split .-cerbur-clutch-dsh-worktree-chevron {\n padding: 5px 6px 5px 4px;\n border-left: 0.5px solid var(--dsw-alias-border-l4);\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-icon {\n flex: none;\n}\n\n.-cerbur-clutch-dsh-worktree-split .-cerbur-clutch-dsh-worktree-icon {\n width: 16px;\n height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-split .-cerbur-clutch-dsh-worktree-chevron svg {\n width: 12px;\n height: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-fallback {\n text-decoration: none;\n align-self: flex-end;\n}\n\nimg.-cerbur-clutch-dsh-worktree-icon {\n display: block;\n object-fit: contain;\n user-select: none;\n}\n";
10228
10299
  const styleId$4 = "@cerbur/clutch-dsh-worktree/open-in-app.css";
10229
10300
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/open-in-app.css\"]") === null) {
@@ -10425,6 +10496,206 @@ window.__ModuleLoader__.load({
10425
10496
  });
10426
10497
  }
10427
10498
  //#endregion
10499
+ //#region lib/client/layout/app-frame.js
10500
+ /** Public AppFrame anchors; never infer a column from sibling order or private classes. */
10501
+ function directChildWithin(parent, anchor) {
10502
+ let child = anchor;
10503
+ while (child && child.parentElement !== parent) child = child.parentElement;
10504
+ return child ?? void 0;
10505
+ }
10506
+ function resolveAppFrame(surface) {
10507
+ const overlay = surface.closest("[data-shell-overlay]");
10508
+ const frame = overlay?.parentElement;
10509
+ if (!(overlay instanceof HTMLElement) || !frame || !overlay.isConnected) return void 0;
10510
+ for (const selector of ["[data-worktree-mode-action]", "[data-pane=\"sidebar\"]"]) {
10511
+ const columns = new Set(Array.from(frame.querySelectorAll(selector)).map((anchor) => directChildWithin(frame, anchor)).filter((column) => column instanceof HTMLElement && column !== overlay && !column.hasAttribute("data-shell-overlay") && !column.hasAttribute("data-rightbar-col") && !column.hasAttribute("data-shell-leading")));
10512
+ if (columns.size > 1) return void 0;
10513
+ const sidebar = columns.values().next().value;
10514
+ if (sidebar) return {
10515
+ overlay,
10516
+ frame,
10517
+ sidebar
10518
+ };
10519
+ }
10520
+ }
10521
+ function finiteRect(rect) {
10522
+ return [
10523
+ rect.left,
10524
+ rect.right,
10525
+ rect.top,
10526
+ rect.bottom,
10527
+ rect.width,
10528
+ rect.height
10529
+ ].every(Number.isFinite);
10530
+ }
10531
+ function resolveFrameContent(frame, overlay, sidebar) {
10532
+ const rightbars = Array.from(frame.querySelectorAll("[data-rightbar-col]")).filter((column) => directChildWithin(frame, column) !== overlay);
10533
+ if (rightbars.length > 1) return void 0;
10534
+ const column = rightbars[0];
10535
+ const rightbar = frame.hasAttribute("data-rightbar-collapsed") ? void 0 : column;
10536
+ const box = overlay.getBoundingClientRect();
10537
+ const boundary = sidebar.getBoundingClientRect();
10538
+ const columnRect = column?.getBoundingClientRect();
10539
+ if (!finiteRect(box) || !finiteRect(boundary) || rightbar && columnRect && !finiteRect(columnRect)) return;
10540
+ const centerEdges = [rightbar && columnRect ? columnRect.left : box.right];
10541
+ if (!rightbar && columnRect && finiteRect(columnRect)) centerEdges.push(columnRect.left);
10542
+ const excluded = column ? directChildWithin(frame, column) : void 0;
10543
+ const centers = Array.from(frame.children).filter((child) => {
10544
+ if (!(child instanceof HTMLElement) || child === sidebar || child === overlay || child === excluded || child.hasAttribute("data-shell-overlay") || child.hasAttribute("data-shell-leading") || child.hasAttribute("data-window-drag")) return false;
10545
+ const rect = child.getBoundingClientRect();
10546
+ return finiteRect(rect) && rect.width > 0 && rect.height > 0 && Math.abs(rect.left - boundary.right) <= 1 && centerEdges.some((edge) => Math.abs(rect.right - edge) <= 1) && rect.top >= box.top - 1 && rect.top < box.bottom && Math.abs(rect.bottom - box.bottom) <= 1;
10547
+ });
10548
+ if (centers.length !== 1) return void 0;
10549
+ return {
10550
+ center: centers[0],
10551
+ rightbar
10552
+ };
10553
+ }
10554
+ //#endregion
10555
+ //#region lib/client/dashboard/dashboard-overlay.js
10556
+ const SIDEBAR_RESIZE_HANDLE_HALF_WIDTH = 4;
10557
+ /** Reversible presentation only: leave the native React tree and Session alive. */
10558
+ function concealDashboardBackground(element) {
10559
+ const visibility = element.style.getPropertyValue("visibility");
10560
+ const priority = element.style.getPropertyPriority("visibility");
10561
+ const inert = element.getAttribute("inert");
10562
+ const hidden = element.getAttribute("aria-hidden");
10563
+ element.style.setProperty("visibility", "hidden");
10564
+ element.setAttribute("inert", "");
10565
+ element.setAttribute("aria-hidden", "true");
10566
+ return () => {
10567
+ if (element.style.getPropertyValue("visibility") === "hidden") if (visibility) element.style.setProperty("visibility", visibility, priority);
10568
+ else element.style.removeProperty("visibility");
10569
+ for (const [name, value] of [["inert", inert], ["aria-hidden", hidden]]) if (value === null) element.removeAttribute(name);
10570
+ else element.setAttribute(name, value);
10571
+ };
10572
+ }
10573
+ function isRightSidebarOpenFromDom(frame, rightbar) {
10574
+ return !frame.hasAttribute("data-rightbar-collapsed") && rightbar instanceof HTMLElement && frame.contains(rightbar) && (rightbar.hasAttribute("data-sidebar-right-open") || rightbar.querySelector("[data-sidebar-right-open]") !== null);
10575
+ }
10576
+ /** Layout seam shared with the existing Sidebar overlay; fail closed on frame/center loss. */
10577
+ function mountDashboardOverlay(surface, onPlacement, options) {
10578
+ const overlay = surface.closest("[data-shell-overlay]");
10579
+ const frame = overlay?.parentElement;
10580
+ if (!overlay || !frame) {
10581
+ onPlacement(void 0);
10582
+ options?.onRightSidebarChange?.(false);
10583
+ return () => {};
10584
+ }
10585
+ const hidden = /* @__PURE__ */ new Map();
10586
+ let observed = [];
10587
+ let scheduled;
10588
+ let disposed = false;
10589
+ let lastRightSidebarOpen;
10590
+ const restore = () => {
10591
+ for (const cleanup of hidden.values()) cleanup();
10592
+ hidden.clear();
10593
+ };
10594
+ const schedule = () => {
10595
+ if (disposed || scheduled !== void 0) return;
10596
+ scheduled = requestAnimationFrame(() => {
10597
+ scheduled = void 0;
10598
+ update();
10599
+ });
10600
+ };
10601
+ const resize = typeof ResizeObserver === "undefined" ? void 0 : new ResizeObserver(schedule);
10602
+ const update = () => {
10603
+ if (disposed) return;
10604
+ const anchors = resolveAppFrame(surface);
10605
+ const content = anchors?.frame === frame && anchors.overlay === overlay ? resolveFrameContent(frame, overlay, anchors.sidebar) : void 0;
10606
+ const nextObserved = [
10607
+ frame,
10608
+ overlay,
10609
+ ...Array.from(frame.children),
10610
+ ...Array.from(frame.querySelectorAll("[data-rightbar-col]"))
10611
+ ];
10612
+ for (const old of observed) if (!nextObserved.includes(old)) resize?.unobserve(old);
10613
+ for (const next of nextObserved) if (!observed.includes(next)) resize?.observe(next);
10614
+ observed = nextObserved;
10615
+ if (!anchors || !content) {
10616
+ restore();
10617
+ onPlacement(void 0);
10618
+ if (lastRightSidebarOpen) {
10619
+ lastRightSidebarOpen = false;
10620
+ options?.onRightSidebarChange?.(false);
10621
+ }
10622
+ return;
10623
+ }
10624
+ const { sidebar } = anchors;
10625
+ const { center, rightbar } = content;
10626
+ const box = overlay.getBoundingClientRect();
10627
+ const boundary = sidebar.getBoundingClientRect();
10628
+ const rightBoundary = rightbar instanceof HTMLElement ? rightbar.getBoundingClientRect().left : box.right;
10629
+ const left = Math.max(0, boundary.right - box.left + SIDEBAR_RESIZE_HANDLE_HALF_WIDTH);
10630
+ const width = Math.min(box.right, rightBoundary) - box.left - left;
10631
+ if (width <= 0 || box.height <= 0) {
10632
+ restore();
10633
+ onPlacement(void 0);
10634
+ return;
10635
+ }
10636
+ const centerBox = center.getBoundingClientRect();
10637
+ const top = Math.max(0, centerBox.top - box.top);
10638
+ const height = Math.min(box.bottom, centerBox.bottom) - box.top - top;
10639
+ if (height <= 0) {
10640
+ restore();
10641
+ onPlacement(void 0);
10642
+ return;
10643
+ }
10644
+ for (const [element, cleanup] of hidden) if (element !== center) {
10645
+ cleanup();
10646
+ hidden.delete(element);
10647
+ }
10648
+ if (!hidden.has(center)) hidden.set(center, concealDashboardBackground(center));
10649
+ onPlacement({
10650
+ left,
10651
+ top,
10652
+ width,
10653
+ height
10654
+ });
10655
+ const isRightSidebarOpen = options?.isRightSidebarExpanded !== void 0 ? options.isRightSidebarExpanded() : isRightSidebarOpenFromDom(frame, rightbar);
10656
+ if (lastRightSidebarOpen !== isRightSidebarOpen) {
10657
+ lastRightSidebarOpen = isRightSidebarOpen;
10658
+ options?.onRightSidebarChange?.(isRightSidebarOpen);
10659
+ }
10660
+ };
10661
+ const mutation = typeof MutationObserver === "undefined" ? void 0 : new MutationObserver(schedule);
10662
+ try {
10663
+ mutation?.observe(frame, {
10664
+ childList: true,
10665
+ attributes: true,
10666
+ subtree: true,
10667
+ attributeFilter: [
10668
+ "data-rightbar-collapsed",
10669
+ "data-sidebar-right-open",
10670
+ "data-sidebar-right-panel",
10671
+ "data-rightbar-col",
10672
+ "data-worktree-mode-action",
10673
+ "data-pane",
10674
+ "data-window-drag",
10675
+ "data-shell-leading",
10676
+ "data-shell-overlay"
10677
+ ]
10678
+ });
10679
+ } catch {
10680
+ mutation?.observe(frame, { childList: true });
10681
+ }
10682
+ if (frame.parentElement) try {
10683
+ mutation?.observe(frame.parentElement, { childList: true });
10684
+ } catch {}
10685
+ update();
10686
+ return () => {
10687
+ disposed = true;
10688
+ resize?.disconnect();
10689
+ mutation?.disconnect();
10690
+ if (scheduled !== void 0) cancelAnimationFrame(scheduled);
10691
+ restore();
10692
+ if (lastRightSidebarOpen) {
10693
+ lastRightSidebarOpen = false;
10694
+ options?.onRightSidebarChange?.(false);
10695
+ }
10696
+ };
10697
+ }
10698
+ //#endregion
10428
10699
  //#region lib/client/dashboard/worktree-acquisition-facts.js
10429
10700
  function selectWorktreeAcquisitionFacts(record) {
10430
10701
  return {
@@ -10434,7 +10705,7 @@ window.__ModuleLoader__.load({
10434
10705
  };
10435
10706
  }
10436
10707
  //#endregion
10437
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/dashboard/dashboard.css.mjs
10708
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/dashboard/dashboard.css.mjs
10438
10709
  const css$3 = ".-cerbur-clutch-dsh-worktree-dashboardSurface {\n position: absolute;\n box-sizing: border-box;\n z-index: 2;\n overflow: auto;\n overscroll-behavior: contain;\n pointer-events: auto;\n container-type: inline-size;\n background: var(--dsw-alias-bg-base, #fff);\n color: var(--dsw-alias-label-primary, #19212f);\n font-family: inherit;\n font-size: 14px;\n line-height: 1.5;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardSurface *,\n.-cerbur-clutch-dsh-worktree-dashboardSurface *::before,\n.-cerbur-clutch-dsh-worktree-dashboardSurface *::after {\n box-sizing: border-box;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface button:not(.-cerbur-clutch-dsh-worktree-dashboardRefButton) {\n font: inherit;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface svg {\n width: 18px;\n height: 18px;\n flex: none;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface code {\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface button:focus-visible,\n.-cerbur-clutch-dsh-worktree-dashboardSurface a:focus-visible,\n.-cerbur-clutch-dsh-worktree-dashboardPanel:focus-visible {\n outline: 2px solid #497cd4;\n outline-offset: 3px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface h1:focus {\n outline: none;\n}\n.-cerbur-clutch-dsh-worktree-dashboardPage {\n max-width: 1240px;\n margin: 0 auto;\n padding: 24px 30px 28px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessions {\n list-style: none;\n padding: 0;\n margin: 12px 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessions button {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 12px 8px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessionLabel {\n flex: 1;\n min-width: 0;\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessionMeta {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: flex-end;\n min-width: 28px;\n color: var(--dsw-alias-label-tertiary, #858e9d);\n}\n.-cerbur-clutch-dsh-worktree-dashboardChildPath {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #788191);\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardChildState {\n display: flex;\n flex: none;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardManageToolbar {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 12px;\n margin-top: 20px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageToolbar label,\n.-cerbur-clutch-dsh-worktree-dashboardManageStopped {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageHint {\n color: var(--dsw-alias-label-secondary, #788191);\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageList,\n.-cerbur-clutch-dsh-worktree-dashboardManageResults,\n.-cerbur-clutch-dsh-worktree-dashboardManageConfirmList {\n list-style: none;\n padding: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageList label {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 8px;\n border-radius: 6px;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageList label:hover,\n.-cerbur-clutch-dsh-worktree-dashboardManageList label:has(input:checked) {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageList label:has(input:focus-visible) {\n outline: 2px solid #497cd4;\n outline-offset: 2px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageList input,\n.-cerbur-clutch-dsh-worktree-dashboardManageToolbar input,\n.-cerbur-clutch-dsh-worktree-dashboardManageStopped input {\n flex: none;\n accent-color: var(--dsw-alias-brand-primary, #497cd4);\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageResults li,\n.-cerbur-clutch-dsh-worktree-dashboardManageConfirmList li {\n padding: 8px 0;\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageConfirmList {\n max-height: 260px;\n overflow: auto;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageConfirmList code {\n display: block;\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageResults [data-batch-result='failed'] {\n color: var(--dsw-alias-label-error, #d34b4b);\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessionStatus {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessionTime {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12px;\n line-height: 20px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessions button:hover,\n.-cerbur-clutch-dsh-worktree-dashboardSessions button[aria-current] {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface a {\n text-decoration: none;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions button:not(:disabled) {\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTopline {\n position: sticky;\n top: 0;\n z-index: 3;\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: space-between;\n gap: 8px 20px;\n min-height: 50px;\n padding: 10px 20px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n background: var(--dsw-alias-bg-base, #fff);\n color: var(--dsw-alias-label-secondary, #677080);\n font-size: 13px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTopline > span {\n flex: 1 1 120px;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTopline > span > span {\n margin: 0 8px;\n opacity: 0.5;\n}\n.-cerbur-clutch-dsh-worktree-dashboardToplineActions {\n display: inline-flex;\n flex-wrap: nowrap;\n flex-shrink: 0;\n align-items: center;\n gap: 8px;\n margin-inline-start: auto;\n max-width: 100%;\n -webkit-app-region: no-drag;\n}\n/* AppFrame's native reopen/New Session seat follows shell.-cerbur-clutch-dsh-worktree-overlay in DOM order.\n Keep its existing actions above the Dashboard, with its published clearance\n reserved in the title. This rule disappears as soon as the Dashboard closes. */\nhtml[data-platform='darwin']\n [data-sidebar-collapsed]:has([data-worktree-dashboard], [data-worktree-dashboard-request])\n > [data-shell-leading] {\n z-index: 21;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSidebarButton {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 6px;\n border: 0;\n border-radius: 28px;\n background: transparent;\n color: var(--dsw-alias-label-secondary, #677080);\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSidebarButton:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n.-cerbur-clutch-dsh-worktree-dashboardSidebarButton svg {\n width: 15px;\n height: 15px;\n transform: scaleX(-1);\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeader {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(260px, 0.45fr);\n gap: 32px;\n margin-bottom: 15px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardIdentity {\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow > svg {\n width: 24px;\n height: 24px;\n color: #3e73ca;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow h1 {\n font-size: 25px;\n letter-spacing: -0.6px;\n line-height: 1.3;\n font-weight: 650;\n margin: 0;\n flex: 0 1 auto;\n overflow: hidden;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardRefButton {\n display: block;\n max-width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHealth,\n.-cerbur-clutch-dsh-worktree-dashboardSoon {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n white-space: nowrap;\n border-radius: 6px;\n padding: 3px 7px;\n font-size: 11px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary, #687182);\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n.-cerbur-clutch-dsh-worktree-dashboardHealth[data-health='ready'] {\n background: color-mix(in srgb, #1eab78 13%, transparent);\n color: #21976f;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHealth[data-health='repair'],\n.-cerbur-clutch-dsh-worktree-dashboardHealth[data-health='recovery-needed'],\n.-cerbur-clutch-dsh-worktree-dashboardHealth[data-health='branch-drift'] {\n background: color-mix(in srgb, #e7a839 14%, transparent);\n color: #b27a1e;\n}\n.-cerbur-clutch-dsh-worktree-dashboardPath {\n display: flex;\n align-items: flex-start;\n gap: 9px;\n margin-top: 12px;\n color: var(--dsw-alias-label-secondary, #697283);\n}\n.-cerbur-clutch-dsh-worktree-dashboardPath code {\n padding-top: 4px;\n overflow-wrap: anywhere;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFieldLabel {\n font-size: 10px;\n border: 1px solid var(--dsw-alias-border-l3, #e5e7ed);\n border-radius: 4px;\n padding: 2px 5px;\n margin-top: 2px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardIconButton {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 29px;\n height: 29px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: inherit;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardIconButton:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n.-cerbur-clutch-dsh-worktree-dashboardCopyStatus {\n font-size: 12px;\n margin: 4px 0 0;\n min-height: 18px;\n color: #21976f;\n}\n.-cerbur-clutch-dsh-worktree-dashboardCopyStatus[role='alert'] {\n color: #bd5d43;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderAside {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 8px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderAside > button,\n.-cerbur-clutch-dsh-worktree-dashboardHeaderAside > a {\n align-self: flex-end;\n}\n.-cerbur-clutch-dsh-worktree-dashboardButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 7px;\n padding: 6px 11px;\n border: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 6px;\n background: var(--dsw-alias-bg-base, #fff);\n color: inherit;\n white-space: nowrap;\n cursor: pointer;\n font-size: 12px !important;\n line-height: 1.5;\n}\n.-cerbur-clutch-dsh-worktree-dashboardButton:disabled {\n color: var(--dsw-alias-label-secondary, #737e8e);\n cursor: not-allowed;\n}\n.-cerbur-clutch-dsh-worktree-dashboardButton:not(:disabled):hover {\n background: var(--dsw-alias-interactive-bg-hover, #f4f6f9);\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabs {\n display: flex;\n gap: 22px;\n overflow-x: auto;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #e1e5ed);\n margin-bottom: 24px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabs button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n gap: 8px;\n padding: 12px 2px;\n border: 0;\n border-bottom: 2px solid transparent;\n background: transparent;\n color: var(--dsw-alias-label-secondary, #6c7480);\n cursor: pointer;\n font-size: 13px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabs button[aria-selected='true'] {\n color: #4276c8;\n border-bottom-color: #4276c8;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabs svg {\n width: 16px;\n height: 16px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardPanel {\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardGrid {\n display: grid;\n grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr);\n gap: 20px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardColumn {\n display: flex;\n flex-direction: column;\n gap: 20px;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardCard,\n.-cerbur-clutch-dsh-worktree-dashboardStart {\n padding: 20px;\n border: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n border-radius: 11px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardCard h2,\n.-cerbur-clutch-dsh-worktree-dashboardStart h2 {\n display: flex;\n align-items: center;\n gap: 9px;\n font-size: 16px;\n font-weight: 620;\n line-height: 1.4;\n margin: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardCard p,\n.-cerbur-clutch-dsh-worktree-dashboardStart > p {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #7b8290);\n margin: 8px 0 15px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardCardHeading {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 10px;\n margin-bottom: 7px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStart {\n background: linear-gradient(\n 115deg,\n color-mix(in srgb, #6b9eff 9%, transparent),\n color-mix(in srgb, #6b9eff 3%, transparent)\n );\n}\n.-cerbur-clutch-dsh-worktree-dashboardStart h2 > svg {\n color: #477bc6;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 13px;\n margin-top: 23px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions button {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 18px 14px;\n text-align: left;\n border: 1px solid color-mix(in srgb, #7299e7 28%, transparent);\n border-radius: 8px;\n background: color-mix(in srgb, #6b9eff 5%, transparent);\n color: #4673bc;\n cursor: not-allowed;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions button:nth-child(2) {\n color: #38846e;\n border-color: color-mix(in srgb, #4fba9a 25%, transparent);\n background: color-mix(in srgb, #4fba9a 5%, transparent);\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions svg {\n width: 23px;\n height: 23px;\n margin-top: 3px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions strong {\n display: block;\n font-size: 14px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions small {\n display: block;\n margin-top: 6px;\n line-height: 1.6;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #69788a);\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions em {\n display: block;\n font-size: 10px;\n font-style: normal;\n margin-top: 10px;\n opacity: 0.75;\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionPlaceholder {\n padding: 26px 20px;\n min-height: 177px;\n border: 1px dashed var(--dsw-alias-border-l3, #dfe4ed);\n border-radius: 7px;\n background: var(--dsw-alias-interactive-bg-hover, #f7f8fa);\n text-align: center;\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionPlaceholder > svg {\n display: block;\n margin: 0 auto 10px;\n width: 25px;\n height: 25px;\n color: #929cac;\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionPlaceholder strong {\n font-size: 13px;\n font-weight: 500;\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionPlaceholder p {\n max-width: 310px;\n margin: 7px auto 12px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardEmpty {\n display: flex;\n flex-direction: column;\n gap: 8px;\n align-items: center;\n justify-content: center;\n min-height: 78px;\n padding: 10px 8px;\n text-align: center;\n}\n.-cerbur-clutch-dsh-worktree-dashboardEmpty p {\n max-width: 300px;\n margin: 0;\n line-height: 1.7;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts {\n margin: 8px 0 14px;\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts > div {\n display: grid;\n grid-template-columns: minmax(70px, 0.65fr) minmax(0, 1fr);\n gap: 12px;\n align-items: center;\n padding: 11px 0;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #eef0f5);\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts > div:last-child {\n border: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts dt {\n grid-column: 1;\n min-width: 0;\n color: var(--dsw-alias-label-secondary, #788191);\n /* Prefer normal break points (including trailing `/` and `-`) first. */\n overflow-wrap: break-word;\n word-break: normal;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts dd {\n grid-column: 2;\n min-width: 0;\n margin: 0;\n text-align: right;\n /* Only split an unbreakable value after natural opportunities are exhausted. */\n overflow-wrap: break-word;\n word-break: normal;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts > div:has(.-cerbur-clutch-dsh-worktree-dashboardFactAction > *) {\n grid-template-columns: minmax(70px, 0.65fr) minmax(0, 1fr) 29px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts dd > span {\n max-width: 100%;\n flex-wrap: wrap;\n justify-content: flex-end;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFactAction {\n display: flex;\n grid-column: 3;\n align-items: center;\n justify-content: flex-end;\n min-width: 29px;\n min-height: 29px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFactAction:empty { display: none; }\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts {\n width: 100%;\n margin: 0;\n padding: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts > div,\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts > div:has(.-cerbur-clutch-dsh-worktree-dashboardFactAction > *) {\n grid-template-columns: minmax(60px, 0.55fr) minmax(0, 1fr) 26px;\n gap: 8px;\n min-height: 34px;\n padding: 3px 0;\n border: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts time {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-secondary, #687182);\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts .-cerbur-clutch-dsh-worktree-dashboardFactAction {\n min-width: 26px;\n min-height: 26px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts .-cerbur-clutch-dsh-worktree-dashboardIconButton {\n width: 26px;\n height: 26px;\n border-radius: 6px;\n color: var(--dsw-alias-label-tertiary, #858e9d);\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts .-cerbur-clutch-dsh-worktree-dashboardIconButton:hover,\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts .-cerbur-clutch-dsh-worktree-dashboardIconButton:focus-visible {\n background: transparent;\n color: var(--dsw-alias-label-primary, #19212f);\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts .-cerbur-clutch-dsh-worktree-dashboardIconButton svg {\n width: 14px;\n height: 14px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHistorical {\n color: var(--dsw-alias-label-secondary, #788191);\n}\n.-cerbur-clutch-dsh-worktree-dashboardSyncOptions {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSyncOptions p {\n margin: 0;\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSyncOptions label {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSyncOptions input {\n margin-top: 4px;\n accent-color: var(--dsw-alias-text-link, #3e73ca);\n}\n.-cerbur-clutch-dsh-worktree-dashboardSyncOptions small {\n display: block;\n margin-top: 4px;\n color: var(--dsw-alias-label-secondary, #788191);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n max-width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-primary, #19212f);\n text-align: left;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink > span {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink svg {\n width: 14px;\n height: 14px;\n color: var(--dsw-alias-label-tertiary, #858e9d);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink:hover,\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink:focus-visible {\n color: var(--dsw-alias-text-link, #3e73ca);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink:hover svg,\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink:focus-visible svg {\n color: inherit;\n}\n.-cerbur-clutch-dsh-worktree-dashboardIconButton:disabled {\n color: var(--dsw-alias-label-secondary, #788191);\n cursor: not-allowed;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineModal {\n box-sizing: border-box;\n width: min(440px, calc(100vw - 48px));\n max-height: calc(100vh - 48px);\n max-height: calc(100dvh - 48px);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineModalContent {\n box-sizing: border-box;\n min-height: 0;\n overflow-y: auto;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselinePicker {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 100%;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardLink {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n width: 100%;\n background: transparent;\n border: 1px solid var(--dsw-alias-border-l3, #e2e6ed);\n border-radius: 6px;\n padding: 7px 10px;\n font-size: 12px !important;\n color: inherit;\n cursor: pointer;\n margin-top: 8px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardLink:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f5f7fa);\n}\n.-cerbur-clutch-dsh-worktree-dashboardQuickActions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 16px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardQuickActions .-cerbur-clutch-dsh-worktree-dashboardButton {\n justify-content: flex-start;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 390px;\n padding: 40px 24px;\n text-align: center;\n border: 1px dashed var(--dsw-alias-border-l3, #dde3ec);\n border-radius: 11px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder > svg {\n width: 36px;\n height: 36px;\n color: #7c9bcf;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder h2 {\n font-size: 20px;\n font-weight: 600;\n margin: 16px 0 4px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder p {\n max-width: 420px;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary, #7b8596);\n margin: 8px 0 18px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFooter {\n margin: 23px 0 0;\n text-align: center;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary, #8a92a0);\n}\n\n@container (max-width: 820px) {\n .-cerbur-clutch-dsh-worktree-dashboardPage {\n padding: 20px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardHeader {\n grid-template-columns: minmax(0, 1fr);\n gap: 12px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardHeaderAside {\n display: flex;\n }\n .-cerbur-clutch-dsh-worktree-dashboardGrid {\n grid-template-columns: minmax(0, 1fr);\n }\n .-cerbur-clutch-dsh-worktree-dashboardTabs {\n gap: 18px;\n }\n}\n\n@container (max-width: 440px) {\n .-cerbur-clutch-dsh-worktree-dashboardManageList label {\n display: grid;\n grid-template-columns: auto auto minmax(0, 1fr);\n gap: 8px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardManageList .-cerbur-clutch-dsh-worktree-dashboardChildState {\n grid-column: 3;\n align-items: flex-start;\n flex-direction: row;\n flex-wrap: wrap;\n min-width: 0;\n }\n .-cerbur-clutch-dsh-worktree-dashboardManageList .-cerbur-clutch-dsh-worktree-dashboardHealth {\n white-space: normal;\n }\n .-cerbur-clutch-dsh-worktree-dashboardPage {\n padding: 16px 12px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardTitleRow h1 {\n font-size: 22px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardStartActions {\n grid-template-columns: minmax(0, 1fr);\n }\n .-cerbur-clutch-dsh-worktree-dashboardCard,\n .-cerbur-clutch-dsh-worktree-dashboardStart {\n padding: 16px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardTopline {\n gap: 10px;\n }\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionsText {\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n max-height: 240px;\n overflow: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardInstructionsInput {\n box-sizing: border-box;\n width: 100%;\n resize: vertical;\n padding: 10px;\n border: 1px solid var(--dsw-alias-border-l4);\n border-radius: 8px;\n background: var(--dsw-alias-bg-base);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardInstructionActions {\n display: flex;\n gap: 8px;\n margin-top: 8px;\n}\n";
10439
10710
  const styleId$3 = "@cerbur/clutch-dsh-worktree/dashboard.css";
10440
10711
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard.css\"]") === null) {
@@ -10746,7 +11017,7 @@ window.__ModuleLoader__.load({
10746
11017
  });
10747
11018
  }
10748
11019
  //#endregion
10749
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/dashboard/git/worktree-git.css.mjs
11020
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/dashboard/git/worktree-git.css.mjs
10750
11021
  const css$2 = ".-cerbur-clutch-dsh-worktree-gitPanel {\n min-width: 0;\n min-height: 0;\n}\n.-cerbur-clutch-dsh-worktree-gitCommitStats {\n display: inline-flex;\n gap: 8px;\n color: var(--dsw-alias-label-secondary, #677080);\n font-variant-numeric: tabular-nums;\n}\n.-cerbur-clutch-dsh-worktree-gitFileRow {\n display: flex;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-gitFileRow > button:first-child { flex: 1; min-width: 0; }\n.-cerbur-clutch-dsh-worktree-gitFileRow > .-cerbur-clutch-dsh-worktree-gitFileOpen { width: 28px; min-width: 28px; flex: none; padding: 4px; opacity: 0; }\n.-cerbur-clutch-dsh-worktree-gitFileRow > .-cerbur-clutch-dsh-worktree-gitFileOpen svg { width: 14px; height: 14px; }\n.-cerbur-clutch-dsh-worktree-gitFileRow:hover > .-cerbur-clutch-dsh-worktree-gitFileOpen,\n.-cerbur-clutch-dsh-worktree-gitFileRow:focus-within > .-cerbur-clutch-dsh-worktree-gitFileOpen { opacity: 1; }\n\n.-cerbur-clutch-dsh-worktree-gitPanelHeader {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 20px;\n margin-bottom: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitPanelHeader h2 {\n margin: 0;\n font-size: 18px;\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitPanelHeading {\n min-width: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineSelector {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n margin-top: 10px;\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselinePrompt {\n padding: 22px;\n border: 1px dashed var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 10px;\n background: var(--dsw-alias-bg-base, #fff);\n color: var(--dsw-alias-label-secondary, #6f7887);\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselinePrompt strong {\n display: block;\n margin-bottom: 6px;\n color: var(--dsw-alias-label-primary, #273142);\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselinePrompt p {\n margin: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineFacts {\n display: flex;\n flex-wrap: wrap;\n gap: 8px 20px;\n margin: 10px 0 0;\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineFacts > div {\n display: flex;\n gap: 6px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineFacts dt::after {\n content: ':';\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineFacts dd {\n margin: 0;\n color: var(--dsw-alias-label-primary, #273142);\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineFacts code {\n margin-left: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDerived {\n margin-left: 7px;\n color: var(--dsw-alias-state-warn-label, #9a6e22);\n}\n\n.-cerbur-clutch-dsh-worktree-gitRefresh {\n flex: none;\n padding: 6px 11px;\n border: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 6px;\n background: var(--dsw-alias-bg-base, #fff);\n color: inherit;\n cursor: pointer;\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitRefresh:disabled {\n color: var(--dsw-alias-label-secondary, #7d8795);\n cursor: wait;\n}\n\n/*\n * One 3x3 grid carries both layouts: commit and changed-file panes sit around a\n * row divider, the diff sits beside them across a column divider. Wide layouts\n * place the stack in the left column, narrow layouts place all three panes on\n * three rows. Both shares are custom properties the dividers drag, and both are\n * clamped so each pane keeps a usable size.\n */\n.-cerbur-clutch-dsh-worktree-gitColumns {\n /* Keep the Git surface bounded by the viewport, never by its data volume. */\n --git-columns-height: clamp(360px, calc(100vh - 300px), 560px);\n --git-columns-height: clamp(360px, calc(100dvh - 300px), 560px);\n /* Leading-pane shares: the row divider and the column divider drag these. */\n --git-rows-top: 45%;\n --git-columns-left: 38%;\n display: grid;\n grid-template-columns:\n minmax(240px, min(var(--git-columns-left), calc(100% - 247px)))\n 7px\n minmax(240px, 1fr);\n grid-template-rows:\n minmax(140px, min(var(--git-rows-top), calc(100% - 147px)))\n 7px\n minmax(140px, 1fr);\n height: var(--git-columns-height);\n min-height: 0;\n border: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n border-radius: 10px;\n overflow: hidden;\n resize: none;\n}\n\n/* Wide: commits over changed files in the left column, diff down the right column. */\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='commits'] {\n grid-area: 1 / 1;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='rows'] {\n grid-area: 2 / 1;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='changed-files'] {\n grid-area: 3 / 1;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='columns'] {\n grid-area: 1 / 2 / -1 / 3;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='diff'] {\n grid-area: 1 / 3 / -1 / -1;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--dsw-alias-bg-base, #fff);\n touch-action: none;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter::before {\n content: '';\n border-radius: 999px;\n background: var(--dsw-alias-border-l2, #cbd2dc);\n transition: background 0.15s ease;\n}\n\n/* Widen the grab area without moving the visible divider line. */\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter::after {\n content: '';\n position: absolute;\n}\n\n/* Both divider panes draw a full border box, so the pane above and the pane below\n (or the pane left and the pane right) are each closed by their own edge. */\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='rows'] {\n box-sizing: border-box;\n height: 7px;\n cursor: row-resize;\n border-top: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n border-bottom: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='rows']::before {\n width: 30px;\n height: 2px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='rows']::after {\n inset: -3px 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='columns'] {\n box-sizing: border-box;\n width: 7px;\n cursor: col-resize;\n border-left: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n border-right: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='columns']::before {\n width: 2px;\n height: 30px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='columns']::after {\n inset: 0 -3px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter:hover::before,\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter:focus-visible::before,\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter[data-dashboard-git-splitting='true']::before {\n background: var(--dsw-alias-state-business-primary, #467bc8);\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter:focus-visible {\n outline: 2px solid #497cd4;\n outline-offset: -2px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumn {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n background: var(--dsw-alias-bg-base, #fff);\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeader {\n display: flex;\n flex: none;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n min-height: 43px;\n padding: 12px 13px 9px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #edf0f4);\n color: var(--dsw-alias-label-secondary, #6f7887);\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeader h3 {\n margin: 0;\n color: var(--dsw-alias-label-primary, #273142);\n font-size: 12px;\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeader span,\n.-cerbur-clutch-dsh-worktree-gitColumnHeader code {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeaderMeta {\n display: flex;\n min-width: 0;\n align-items: baseline;\n justify-content: flex-end;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeader .-cerbur-clutch-dsh-worktree-gitLineStats,\n.-cerbur-clutch-dsh-worktree-gitColumnHeader .-cerbur-clutch-dsh-worktree-gitLineStats > span {\n overflow: visible;\n text-overflow: clip;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeaderUnknown {\n color: var(--dsw-alias-label-tertiary, #8a94a3);\n}\n\n/* Right side of the commits header: the truncation note and the multi-select switch. */\n.-cerbur-clutch-dsh-worktree-gitColumnHeaderControls {\n display: flex;\n min-width: 0;\n align-self: center;\n align-items: center;\n justify-content: flex-end;\n gap: 10px;\n}\n\n/*\n * A native checkbox owns the state, focus and keyboard behavior; the track and\n * thumb below are presentational and follow :checked through the sibling selector.\n */\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelect {\n position: relative;\n display: inline-flex;\n flex: none;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n user-select: none;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelect input {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip-path: inset(50%);\n border: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelectTrack {\n position: relative;\n display: block;\n flex: none;\n width: 24px;\n height: 14px;\n border-radius: 999px;\n background: var(--dsw-alias-border-l2, #cbd2dc);\n transition: background 0.15s ease;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelectThumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: var(--dsw-alias-bg-base, #fff);\n box-shadow: 0 1px 2px rgb(15 23 42 / 25%);\n transition: transform 0.15s ease;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelect input:checked + .-cerbur-clutch-dsh-worktree-gitCommitMultiSelectTrack {\n background: var(--dsw-alias-state-business-primary, #467bc8);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelect input:checked + .-cerbur-clutch-dsh-worktree-gitCommitMultiSelectTrack .-cerbur-clutch-dsh-worktree-gitCommitMultiSelectThumb {\n transform: translateX(10px);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelect input:focus-visible + .-cerbur-clutch-dsh-worktree-gitCommitMultiSelectTrack {\n outline: 2px solid #497cd4;\n outline-offset: 2px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryButton {\n display: flex;\n width: calc(100% - 10px);\n flex-direction: column;\n gap: 3px;\n margin: 5px;\n padding: 8px;\n border: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 6px;\n background: var(--dsw-alias-bg-base, #fff);\n color: var(--dsw-alias-label-primary, #273142);\n text-align: left;\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryButton:hover,\n.-cerbur-clutch-dsh-worktree-gitSummaryButton[aria-pressed='true'] {\n border-color: var(--dsw-alias-state-business-primary, #467bc8);\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryButton span {\n font-size: 12px;\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryButton small {\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle {\n display: flex;\n align-items: flex-start;\n gap: 7px;\n width: calc(100% - 20px);\n margin: 3px 10px 8px;\n color: var(--dsw-alias-label-primary, #273142);\n cursor: pointer;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle input {\n flex: none;\n margin: 2px 0 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle span {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 2px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle strong {\n font-weight: 560;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle small {\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle input:disabled,\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle:has(input:disabled) {\n cursor: wait;\n opacity: 0.65;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSelectionToolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 5px 10px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #edf0f4);\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSelectionToolbar button {\n border: 0;\n background: transparent;\n color: var(--dsw-alias-state-business-primary, #467bc8);\n cursor: pointer;\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList {\n display: block;\n flex: 1 1 auto;\n min-height: 0;\n overflow-x: hidden;\n overflow-y: auto;\n overscroll-behavior: contain;\n scrollbar-gutter: stable;\n list-style: none;\n padding: 5px;\n margin: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList {\n overflow-x: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList > li,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitFolderChildren,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitFolderChildren > li {\n width: max-content;\n min-width: 100%;\n}\n\n.-cerbur-clutch-dsh-worktree-gitFolderChildren {\n list-style: none;\n padding: 0 0 0 12px;\n margin: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitFolderButton {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 8px;\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 11px;\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitFolderButton:hover,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitFolderButton:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n color: var(--dsw-alias-label-primary, #273142);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFolderIcon {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n color: var(--dsw-alias-label-secondary, #6f7887);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFolderIcon > svg {\n width: 16px;\n height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitFolderName {\n min-width: max-content;\n overflow: visible;\n text-overflow: clip;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList button {\n display: block;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button {\n display: grid;\n width: 100%;\n grid-template-columns: 15px minmax(0, 1fr);\n padding: 9px 8px;\n}\n\n/* Without the multi-select marks a row has a single column, so the subject and meta align with it. */\n.-cerbur-clutch-dsh-worktree-gitCommitList[data-dashboard-git-commit-multiselect='off'] button {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList[data-dashboard-git-commit-multiselect='off'] .-cerbur-clutch-dsh-worktree-gitCommitSubject,\n.-cerbur-clutch-dsh-worktree-gitCommitList[data-dashboard-git-commit-multiselect='off'] .-cerbur-clutch-dsh-worktree-gitCommitMeta {\n grid-column: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitSelectionMark {\n grid-row: 1 / span 2;\n color: var(--dsw-alias-state-business-primary, #467bc8);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button:hover,\n.-cerbur-clutch-dsh-worktree-gitCommitList button[aria-selected='true'],\n.-cerbur-clutch-dsh-worktree-gitChangedFileList button:hover,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList button[aria-selected='true'] {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button[aria-selected='true'] {\n box-shadow: inset 2px 0 var(--dsw-alias-state-business-primary, #467bc8);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button[data-dashboard-git-commit-kind='working-tree'] {\n background: var(--dsw-alias-state-warn-tertiary, #f8f5ed);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button[data-dashboard-git-commit-kind='working-tree'][aria-selected='true'] {\n box-shadow: inset 2px 0 var(--dsw-alias-state-warn-primary, #b18435);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitSubject {\n grid-column: 2;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMeta {\n grid-column: 2;\n display: flex;\n gap: 7px;\n margin-top: 4px;\n overflow: hidden;\n color: var(--dsw-alias-label-secondary, #7c8594);\n font-size: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMeta span,\n.-cerbur-clutch-dsh-worktree-gitCommitMeta time {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMeta time {\n margin-left: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitWorkingTree {\n color: var(--dsw-alias-state-warn-label, #8a6728);\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList button {\n display: flex;\n width: max-content;\n min-width: 100%;\n box-sizing: border-box;\n align-items: flex-start;\n gap: 7px;\n padding: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitFileIcon {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n color: var(--dsw-alias-label-secondary, #6f7887);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFileIconGlyph {\n width: 16px;\n height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitFilePath {\n min-width: max-content;\n flex: 0 0 auto;\n overflow: visible;\n text-overflow: clip;\n white-space: nowrap;\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='added'] {\n color: var(--dsw-alias-state-success-primary, #23845f);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='deleted'] {\n color: var(--dsw-alias-state-error-secondary, #bd5d55);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='modified'],\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='renamed'],\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='copied'],\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='type-changed'] {\n color: var(--dsw-alias-state-business-primary, #467bc8);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFileContributors {\n flex: none;\n max-width: 9em;\n overflow: hidden;\n color: var(--dsw-alias-label-tertiary, #65758d);\n font-size: 9px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-gitLineStats {\n display: inline-flex;\n flex: none;\n gap: 6px;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitLineStats {\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitLineAdded {\n color: var(--dsw-alias-state-success-primary, #23845f);\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitLineRemoved {\n color: var(--dsw-alias-state-error-secondary, #bd5d55);\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffContainer {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffToolbar {\n display: flex;\n flex: none;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 6px 12px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #edf0f4);\n background: var(--dsw-alias-bg-base, #ffffff);\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffPath {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n color: var(--dsw-alias-label-primary, #263342);\n font-weight: 560;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffOpenInSidebar {\n display: inline-flex;\n flex: none;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n border: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 4px;\n background: var(--dsw-alias-bg-base, #ffffff);\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 11px;\n line-height: 16px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n/* The square 16px arrow keeps its aspect ratio; pin the box so it centers on the label. */\n.-cerbur-clutch-dsh-worktree-gitDiffOpenIcon {\n flex: none;\n width: 14px;\n height: 14px;\n color: var(--dsw-alias-label-tertiary, #8a94a3);\n transition: color 0.15s ease;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffOpenInSidebar:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n color: var(--dsw-alias-label-primary, #263342);\n border-color: var(--dsw-alias-border-l2, #cbd2dc);\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffOpenInSidebar:hover .-cerbur-clutch-dsh-worktree-gitDiffOpenIcon {\n color: var(--dsw-alias-label-primary, #263342);\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiff {\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n padding: 7px 0 12px;\n background: var(--dsw-alias-markdown-code-block, #fafbfc);\n color: var(--dsw-alias-label-primary, #263342);\n font: 11px/1.65 ui-monospace, SFMono-Regular, Consolas, monospace;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffSegment {\n margin-bottom: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffSegmentHeader {\n padding: 5px 12px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 10px;\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffSegmentHeader code {\n color: var(--dsw-alias-label-primary, #273142);\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffHunk {\n margin-bottom: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffHunkHeader {\n padding: 3px 12px;\n background: var(--dsw-alias-markdown-code-block-banner, #edf3fb);\n color: var(--dsw-alias-state-business-primary, #4a70a1);\n box-shadow: inset 0 1px 0 var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.04)), inset 0 -1px 0 var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.04));\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffLine {\n display: grid;\n grid-template-columns: 44px 44px minmax(0, 1fr);\n min-width: max-content;\n padding-right: 12px;\n white-space: pre;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffLineadd {\n background: color-mix(\n in srgb,\n var(--dsw-alias-state-success-primary, #23845f) 18%,\n var(--dsw-alias-markdown-code-block, #fafbfc)\n );\n box-shadow: inset 2px 0 var(--dsw-alias-state-success-primary, #23845f);\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffLinedelete {\n background: color-mix(\n in srgb,\n var(--dsw-alias-state-error-secondary, #bd5d55) 18%,\n var(--dsw-alias-markdown-code-block, #fafbfc)\n );\n box-shadow: inset 2px 0 var(--dsw-alias-state-error-secondary, #bd5d55);\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffLineNumber {\n padding-right: 8px;\n color: var(--dsw-alias-label-tertiary, #9aa3af);\n text-align: right;\n user-select: none;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffLine code {\n min-width: 0;\n color: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSrOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffEmpty,\n.-cerbur-clutch-dsh-worktree-gitDiffMessage,\n.-cerbur-clutch-dsh-worktree-gitEmpty,\n.-cerbur-clutch-dsh-worktree-gitLoading,\n.-cerbur-clutch-dsh-worktree-gitUnavailable,\n.-cerbur-clutch-dsh-worktree-gitError {\n padding: 24px 16px;\n color: var(--dsw-alias-label-secondary, #727d8d);\n font-size: 12px;\n text-align: center;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffMessage,\n.-cerbur-clutch-dsh-worktree-gitUnavailable {\n min-height: 150px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitUnavailable strong {\n display: block;\n margin-bottom: 7px;\n color: var(--dsw-alias-label-primary, #273142);\n font-size: 14px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitUnavailable p {\n max-width: 500px;\n margin: 0 auto;\n line-height: 1.7;\n}\n\n.-cerbur-clutch-dsh-worktree-gitError {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 9px 12px;\n color: var(--dsw-alias-state-error-primary, #ae5c4c);\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-gitError p {\n margin: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitError button {\n flex: none;\n border: 1px solid currentColor;\n border-radius: 5px;\n background: transparent;\n color: inherit;\n cursor: pointer;\n font-size: 11px;\n padding: 3px 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffFolded {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 12px;\n border-top: 1px dashed var(--dsw-alias-border-l3, #dfe3ea);\n background: var(--dsw-alias-bg-base, #fff);\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffShowAll {\n padding: 2px 8px;\n border: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-primary, #273142);\n cursor: pointer;\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-gitRawDiff {\n display: block;\n flex: 1 1 auto;\n min-height: 0;\n max-height: none;\n overflow: auto;\n padding: 12px;\n margin: 0;\n white-space: pre;\n background: var(--dsw-alias-markdown-code-block, #fafbfc);\n color: var(--dsw-alias-label-primary, #263342);\n font: 11px/1.65 ui-monospace, SFMono-Regular, Consolas, monospace;\n}\n\n@container (min-width: 901px) {\n .-cerbur-clutch-dsh-worktree-gitColumns {\n /* Two stacked panes need more vertical room than three side-by-side panes. */\n --git-columns-height: clamp(440px, calc(100vh - 300px), 720px);\n --git-columns-height: clamp(440px, calc(100dvh - 300px), 720px);\n }\n}\n\n@container (max-width: 900px) {\n /* Narrow layout keeps the two-row arrangement: commits and changed files side by\n side on the first row, with the summary diff across the second row. Both\n dividers move with the panes, so either axis stays adjustable. */\n .-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='commits'] {\n grid-area: 1 / 1;\n }\n .-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='columns'] {\n grid-area: 1 / 2;\n }\n .-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='changed-files'] {\n grid-area: 1 / 3;\n }\n .-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='rows'] {\n grid-area: 2 / 1 / 3 / -1;\n }\n .-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='diff'] {\n grid-area: 3 / 1 / -1 / -1;\n }\n}\n\n@container (max-width: 520px) {\n .-cerbur-clutch-dsh-worktree-gitPanelHeader {\n flex-direction: column;\n gap: 10px;\n }\n .-cerbur-clutch-dsh-worktree-gitRefresh {\n align-self: flex-end;\n }\n .-cerbur-clutch-dsh-worktree-gitColumns {\n display: block;\n height: auto;\n min-height: 0;\n }\n .-cerbur-clutch-dsh-worktree-gitColumnSplitter {\n display: none;\n }\n .-cerbur-clutch-dsh-worktree-gitColumn {\n height: clamp(260px, calc(100vh - 360px), 360px);\n height: clamp(260px, calc(100dvh - 360px), 360px);\n min-height: 260px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n }\n .-cerbur-clutch-dsh-worktree-gitColumn:has(> .-cerbur-clutch-dsh-worktree-gitEmpty),\n .-cerbur-clutch-dsh-worktree-gitColumn:has(.-cerbur-clutch-dsh-worktree-gitDiffEmpty) { height: auto; min-height: 100px; }\n .-cerbur-clutch-dsh-worktree-gitColumns > .-cerbur-clutch-dsh-worktree-gitColumn:last-child {\n border-bottom: 0;\n }\n}\n";
10751
11022
  const styleId$2 = "@cerbur/clutch-dsh-worktree/worktree-git.css";
10752
11023
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree-git.css\"]") === null) {
@@ -12923,7 +13194,7 @@ window.__ModuleLoader__.load({
12923
13194
  });
12924
13195
  }
12925
13196
  //#endregion
12926
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/settings/settings.css.mjs
13197
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/settings/settings.css.mjs
12927
13198
  const css$1 = ".-cerbur-clutch-dsh-worktree-settings {\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n min-width: 0;\n max-width: 720px;\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsh-content-font-size, 14px);\n line-height: calc(var(--dsh-content-font-size, 14px) + 8px);\n}\n\n[data-worktree-settings-nav-icon] > svg:not(.-cerbur-clutch-dsh-worktree-settingsNavIcon) {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsNavIcon {\n order: -1;\n flex: 0 0 auto;\n width: 16px;\n height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-toolSettings {\n display: flex;\n flex-direction: column;\n gap: 20px;\n min-width: 0;\n padding: 20px;\n border: 0.5px solid var(--dsw-alias-settings-card-stroke, var(--dsw-alias-border-l4));\n border-radius: var(--dsw-radius-xl, 16px);\n background: var(--dsw-alias-settings-card-fill, var(--dsw-alias-bg-layer-2));\n}\n\n.-cerbur-clutch-dsh-worktree-toolHeader,\n.-cerbur-clutch-dsh-worktree-toolRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 24px;\n}\n\n.-cerbur-clutch-dsh-worktree-toolHeader > div,\n.-cerbur-clutch-dsh-worktree-toolRow > div {\n min-width: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-toolTitle {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-toolHeader h3 {\n margin: 0;\n font-size: calc(var(--dsh-content-font-size, 14px) + 2px);\n font-weight: 600;\n}\n\n.-cerbur-clutch-dsh-worktree-toolHeader p,\n.-cerbur-clutch-dsh-worktree-toolOptionsHeading p,\n.-cerbur-clutch-dsh-worktree-toolRow p {\n margin: 0;\n color: var(--dsw-alias-label-tertiary);\n font-size: var(--dsh-content-font-size-secondary, calc(var(--dsh-content-font-size, 14px) - 1px));\n line-height: 1.5;\n overflow-wrap: anywhere;\n}\n\n.-cerbur-clutch-dsh-worktree-toolOptions {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding-top: 20px;\n border-top: 0.5px solid var(--dsw-alias-settings-card-stroke, var(--dsw-alias-border-l4));\n}\n\n.-cerbur-clutch-dsh-worktree-toolOptionsHeading h4 {\n margin: 0 0 6px;\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsh-content-font-size, 14px);\n font-weight: 500;\n}\n\n.-cerbur-clutch-dsh-worktree-toolList {\n padding-left: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-toolRow {\n padding: 12px 0;\n}\n\n.-cerbur-clutch-dsh-worktree-toolRow + .-cerbur-clutch-dsh-worktree-toolRow {\n border-top: 0.5px solid var(--dsw-alias-border-l4);\n}\n\n.-cerbur-clutch-dsh-worktree-toolRow h5 {\n margin: 0 0 6px;\n font-size: var(--dsh-content-font-size, 14px);\n font-weight: 500;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsTitle {\n margin: 0;\n font-size: calc(var(--dsh-content-font-size, 14px) + 2px);\n line-height: calc(var(--dsh-content-font-size, 14px) + 10px);\n font-weight: 500;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsTabs {\n width: 100%;\n box-sizing: border-box;\n}\n\n/* Native controls keep their palette and keyboard behavior; text and control\n height follow the body's font-size preference even on older DSH themes. */\n.-cerbur-clutch-dsh-worktree-settings .-cerbur-clutch-dsh-worktree-settingsTabs [role='tab'] {\n height: auto;\n min-height: 34px;\n padding-block: 6px;\n font-size: inherit;\n line-height: calc(var(--dsh-content-font-size, 14px) + 6px);\n white-space: normal;\n overflow-wrap: anywhere;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsPanel,\n.-cerbur-clutch-dsh-worktree-issueList {\n display: flex;\n flex-direction: column;\n min-width: 0;\n gap: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-issueList {\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsDescription,\n.-cerbur-clutch-dsh-worktree-settingsHint,\n.-cerbur-clutch-dsh-worktree-settingsEmpty,\n.-cerbur-clutch-dsh-worktree-issueMessage {\n margin: 0;\n overflow-wrap: anywhere;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsDescription,\n.-cerbur-clutch-dsh-worktree-settingsHint,\n.-cerbur-clutch-dsh-worktree-settingsEmpty {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.-cerbur-clutch-dsh-worktree-settingsHint {\n font-size: var(--dsh-content-font-size-secondary, calc(var(--dsh-content-font-size, 14px) - 1px));\n line-height: 1.5;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsToolbar {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: 12px;\n padding: 16px 0;\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-settingsToolbar > .-cerbur-clutch-dsh-worktree-settingsHint {\n flex: 1 1 240px;\n min-width: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsEmpty {\n padding-block: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-issue {\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n padding: 12px 14px;\n border: 0.5px solid var(--dsw-alias-settings-card-stroke, var(--dsw-alias-border-l4));\n border-radius: var(--dsw-radius-xl, 16px);\n background: var(--dsw-alias-settings-card-fill, var(--dsw-alias-bg-layer-2));\n}\n\n.-cerbur-clutch-dsh-worktree-issueHeader {\n display: flex;\n align-items: baseline;\n flex-wrap: wrap;\n gap: 6px 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-issueTitle {\n flex: 1 1 240px;\n min-width: 0;\n margin: 0;\n font-size: inherit;\n line-height: inherit;\n font-weight: 500;\n overflow-wrap: anywhere;\n}\n\n.-cerbur-clutch-dsh-worktree-settings .-cerbur-clutch-dsh-worktree-issueStatus,\n.-cerbur-clutch-dsh-worktree-settings .-cerbur-clutch-dsh-worktree-settingsAction {\n font-size: calc(var(--dsh-content-font-size, 14px) - 2px);\n line-height: calc(var(--dsh-content-font-size, 14px) + 4px);\n}\n\n.-cerbur-clutch-dsh-worktree-settings .-cerbur-clutch-dsh-worktree-settingsAction {\n flex: none;\n height: auto;\n min-height: 28px;\n padding-block: 4px;\n font-family: inherit;\n white-space: normal;\n overflow-wrap: anywhere;\n max-width: 100%;\n}\n\n.-cerbur-clutch-dsh-worktree-issueActions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-issueDiagnostics {\n min-width: 0;\n padding-top: 10px;\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-issueDiagnostics summary {\n width: fit-content;\n max-width: 100%;\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsh-content-font-size-secondary, calc(var(--dsh-content-font-size, 14px) - 1px));\n line-height: 1.5;\n cursor: pointer;\n overflow-wrap: anywhere;\n}\n\n.-cerbur-clutch-dsh-worktree-issueDiagnostics summary:focus-visible,\n.-cerbur-clutch-dsh-worktree-settings .-cerbur-clutch-dsh-worktree-settingsAction:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n border-radius: var(--dsw-radius-xs, 4px);\n}\n\n.-cerbur-clutch-dsh-worktree-issueDiagnostics pre {\n box-sizing: border-box;\n max-width: 100%;\n max-height: 320px;\n overflow: auto;\n margin: 10px 0 0;\n padding: 10px 12px;\n border-radius: var(--dsw-radius-md, 12px);\n background: var(--dsw-alias-bg-module-platform);\n color: var(--dsw-alias-label-secondary);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsh-content-font-size-secondary, calc(var(--dsh-content-font-size, 14px) - 1px));\n line-height: 1.5;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n user-select: text;\n}\n";
12928
13199
  const styleId$1 = "@cerbur/clutch-dsh-worktree/settings.css";
12929
13200
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/settings.css\"]") === null) {
@@ -14576,7 +14847,7 @@ window.__ModuleLoader__.load({
14576
14847
  }
14577
14848
  //#endregion
14578
14849
  //#region lib/client/WorktreeSurface.js
14579
- /** Composes independent surface state/action domains into the sidebar overlay. */
14850
+ /** Retains shared state/actions and portals navigation into the workspace slot. */
14580
14851
  function WorktreeSurface(inputProps) {
14581
14852
  const [internalDashboard, setInternalDashboard] = (0, react.useState)();
14582
14853
  const pendingDashboard = (0, react.useRef)();
@@ -14788,55 +15059,50 @@ window.__ModuleLoader__.load({
14788
15059
  dashboardWorkspace
14789
15060
  ]);
14790
15061
  if (source.mode !== "worktree") return null;
14791
- const { ref, width, bounds, collapsed } = source;
15062
+ const { collapsed } = source;
14792
15063
  const { t } = props;
14793
15064
  return (0, react_jsx_runtime.jsxs)(NotificationProvider, {
14794
15065
  t,
14795
15066
  openSettings: props.openErrorSettings,
14796
15067
  children: [
14797
- (0, react_jsx_runtime.jsxs)("aside", {
14798
- ref,
15068
+ props.sidebarSeat && (0, react_dom.createPortal)((0, react_jsx_runtime.jsxs)("aside", {
14799
15069
  className: worktree_css_default.surface,
14800
15070
  "data-worktree-surface": true,
14801
15071
  "data-collapsed": collapsed || void 0,
14802
- "data-native-sidebar-covered": source.nativeCovered || void 0,
14803
15072
  "aria-hidden": collapsed || void 0,
14804
15073
  "aria-label": t("mode.navigation"),
14805
- style: {
14806
- width: `${width}px`,
14807
- ...bounds.ready ? {
14808
- top: `${bounds.top}px`,
14809
- height: `${bounds.height}px`
14810
- } : {
14811
- height: "0px",
14812
- visibility: "hidden"
14813
- }
14814
- },
14815
15074
  children: [
14816
15075
  (0, react_jsx_runtime.jsxs)("div", {
14817
15076
  className: worktree_css_default.wideContent,
14818
- children: [(0, react_jsx_runtime.jsx)(SurfaceHeader, {
14819
- onOpenSession: session.openWorkspaceSession,
14820
- expansion,
14821
- props,
14822
- source,
14823
- read,
14824
- mutation
14825
- }), (0, react_jsx_runtime.jsx)(SurfaceContent, {
14826
- source,
14827
- props,
14828
- lifecycle,
14829
- mutation,
14830
- session,
14831
- read,
14832
- expansion,
14833
- ordering,
14834
- drag,
14835
- menus,
14836
- registration,
14837
- native,
14838
- lifecycleState
14839
- })]
15077
+ children: [
15078
+ (0, react_jsx_runtime.jsx)(SurfaceHeader, {
15079
+ onOpenSession: session.openWorkspaceSession,
15080
+ expansion,
15081
+ props,
15082
+ source,
15083
+ read,
15084
+ mutation
15085
+ }),
15086
+ (0, react_jsx_runtime.jsx)(ActivityFilterBar, {
15087
+ t,
15088
+ activity: source.activity
15089
+ }),
15090
+ (0, react_jsx_runtime.jsx)(SurfaceContent, {
15091
+ source,
15092
+ props,
15093
+ lifecycle,
15094
+ mutation,
15095
+ session,
15096
+ read,
15097
+ expansion,
15098
+ ordering,
15099
+ drag,
15100
+ menus,
15101
+ registration,
15102
+ native,
15103
+ lifecycleState
15104
+ })
15105
+ ]
14840
15106
  }),
14841
15107
  (0, react_jsx_runtime.jsx)(NativeDialogs, {
14842
15108
  props,
@@ -14859,7 +15125,7 @@ window.__ModuleLoader__.load({
14859
15125
  session
14860
15126
  })
14861
15127
  ]
14862
- }),
15128
+ }), props.sidebarSeat.element),
14863
15129
  dashboard !== void 0 && dashboardRecord === void 0 && dashboard.sessionId === source.currentSessionId && source.workspaceIds.includes(dashboard.workspaceId) && targetView === void 0 && (0, react_jsx_runtime.jsx)(DashboardRequest, {
14864
15130
  context: targetWorkspace === void 0 ? dashboard.workspaceId : targetWorkspace.title + " · " + targetWorkspace.path,
14865
15131
  t,
@@ -14997,9 +15263,45 @@ window.__ModuleLoader__.load({
14997
15263
  }
14998
15264
  //#endregion
14999
15265
  //#region lib/client/overlay/WorktreeOverlay.js
15000
- /** Compose the independent Hero context and Worktree navigation overlays. */
15266
+ /** Keep view state and center overlays alive while the workspace slot changes occupants. */
15001
15267
  function WorktreeOverlay(props) {
15002
- return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)(WorktreeHeroContext, { ...props }), (0, react_jsx_runtime.jsx)(WorktreeSurface, { ...props })] });
15268
+ const [sidebarSeat, setSidebarSeat] = (0, react.useState)();
15269
+ const active = props.useStore((state) => state.viewMode) === "worktree" && props.available && props.manager !== void 0;
15270
+ (0, react.useLayoutEffect)(() => {
15271
+ if (!active) return;
15272
+ return props.mountWorkspaceSidebar(setSidebarSeat);
15273
+ }, [active, props.mountWorkspaceSidebar]);
15274
+ return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)(WorktreeHeroContext, { ...props }), (0, react_jsx_runtime.jsx)(WorktreeSurface, {
15275
+ ...props,
15276
+ sidebarSeat
15277
+ })] });
15278
+ }
15279
+ //#endregion
15280
+ //#region lib/client/view/sidebar-workspace-slot.js
15281
+ /** The shell owns placement and fold state; no native DOM discovery is needed. */
15282
+ function WorktreeWorkspaceSeat({ wide, publish }) {
15283
+ const ref = (0, react.useRef)(null);
15284
+ (0, react.useLayoutEffect)(() => {
15285
+ const element = ref.current;
15286
+ if (element) publish({
15287
+ element,
15288
+ wide
15289
+ });
15290
+ return () => publish(void 0);
15291
+ }, [wide, publish]);
15292
+ return (0, react_jsx_runtime.jsx)("div", {
15293
+ ref,
15294
+ className: worktree_css_default.workspaceSeat,
15295
+ "data-worktree-workspace-seat": true
15296
+ });
15297
+ }
15298
+ /** Shadow only the browsing region, preserving the native registration and its children. */
15299
+ function workspaceSidebarMount(slots) {
15300
+ return (publish) => slots.inject("sidebar.workspaces", () => slots.register({
15301
+ name: "sidebar.workspaces",
15302
+ priority: -10,
15303
+ inject: () => ({ publish })
15304
+ }, WorktreeWorkspaceSeat));
15003
15305
  }
15004
15306
  //#endregion
15005
15307
  //#region lib/client/settings/WorktreeSettings.js
@@ -15384,7 +15686,7 @@ window.__ModuleLoader__.load({
15384
15686
  }, "clutch-dsh-worktree: steer activity");
15385
15687
  }
15386
15688
  //#endregion
15387
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_26adaba12f8b/packages/clutch-dsh-worktree/src/client/steer/steer.css.mjs
15689
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/steer/steer.css.mjs
15388
15690
  const css = ".-cerbur-clutch-dsh-worktree-strip {\n box-sizing: border-box;\n flex: none;\n min-width: 0;\n width: calc(100% - var(--dsh-composer-side-clearance, 16px) - var(--dsh-composer-side-clearance, 16px));\n max-width: var(--dsh-composer-card-max-width, 760px);\n margin: 0 auto;\n padding: 8px 12px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 12px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-title { font-weight: 600; margin-bottom: 4px; }\n.-cerbur-clutch-dsh-worktree-items { max-height: 200px; overflow: auto; }\n.-cerbur-clutch-dsh-worktree-item summary { display: flex; align-items: baseline; gap: 8px; cursor: pointer; padding: 4px 0; }\n.-cerbur-clutch-dsh-worktree-item summary::before { content: '›'; flex: none; }\n.-cerbur-clutch-dsh-worktree-item[open] summary::before { transform: rotate(90deg); }\n.-cerbur-clutch-dsh-worktree-status { flex: none; }\n.-cerbur-clutch-dsh-worktree-preview { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.-cerbur-clutch-dsh-worktree-body { padding: 4px 0 8px; overflow-wrap: anywhere; }\n.-cerbur-clutch-dsh-worktree-body p { margin: 6px 0; white-space: pre-wrap; }\n.-cerbur-clutch-dsh-worktree-sender { font-family: monospace; }\n";
15389
15691
  const styleId = "@cerbur/clutch-dsh-worktree/steer.css";
15390
15692
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/steer.css\"]") === null) {
@@ -15729,11 +16031,33 @@ window.__ModuleLoader__.load({
15729
16031
  /** Create one root-scoped, browser-local view-mode store for the two slot entries. */
15730
16032
  function createWorktreeViewStore() {
15731
16033
  return defineStore({
15732
- init: () => ({ viewMode: "workspace-session" }),
16034
+ init: () => ({
16035
+ viewMode: "workspace-session",
16036
+ activityWindow: "all",
16037
+ activityWindows: [...DEFAULT_ACTIVITY_WINDOWS],
16038
+ showInactiveStructure: true
16039
+ }),
15733
16040
  persist: WORKTREE_VIEW_MODE_STORAGE_KEY,
15734
- actions: { setViewMode: (draft, mode) => {
15735
- draft.viewMode = mode;
15736
- } }
16041
+ actions: {
16042
+ setViewMode: (draft, mode) => {
16043
+ draft.viewMode = mode;
16044
+ },
16045
+ setActivityWindow: (draft, window) => {
16046
+ draft.activityWindows = effectiveActivityWindows(draft.activityWindows);
16047
+ draft.activityWindow = window;
16048
+ },
16049
+ setShowInactiveStructure: (draft, show) => {
16050
+ draft.showInactiveStructure = show === true;
16051
+ },
16052
+ setActivityWindowVisible: (draft, window, visible) => {
16053
+ const current = effectiveActivityWindows(draft.activityWindows);
16054
+ const next = toggleActivityWindow(current, window, visible);
16055
+ if (next === current) return;
16056
+ draft.activityWindows = next;
16057
+ const selected = effectiveActivityWindow(draft.activityWindow);
16058
+ if (!next.includes(selected)) draft.activityWindow = nextActivityWindow(selected, next);
16059
+ }
16060
+ }
15737
16061
  });
15738
16062
  }
15739
16063
  //#endregion
@@ -16200,6 +16524,7 @@ window.__ModuleLoader__.load({
16200
16524
  const dashboardStore = createSnapshotStore(void 0);
16201
16525
  const sessions = ctx.sessions;
16202
16526
  const slots = ctx.slots;
16527
+ const mountWorkspaceSidebar = workspaceSidebarMount(slots);
16203
16528
  slots.inject("conversation.input.dock", () => slots.register({
16204
16529
  name: "conversation.input.dock",
16205
16530
  id: "clutch-dsh-worktree-steer",
@@ -16459,6 +16784,7 @@ window.__ModuleLoader__.load({
16459
16784
  store: viewStore,
16460
16785
  locale: WORKTREE_NS,
16461
16786
  inject: () => ({
16787
+ mountWorkspaceSidebar,
16462
16788
  available: true,
16463
16789
  openErrorSettings: () => openWorktreeErrorSettings(ctx.slots),
16464
16790
  openResource: (address, options) => {