@cerbur/clutch-dsh-worktree 0.1.18 → 0.1.20

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 (181) hide show
  1. package/README.md +120 -10
  2. package/README.zh.md +96 -10
  3. package/assets/screenshots/screenshots-agent-steer.jpg +0 -0
  4. package/assets/screenshots/screenshots-baseline-sync.png +0 -0
  5. package/lib/client/WorktreeSurface.d.ts.map +1 -1
  6. package/lib/client/WorktreeSurface.js +19 -3
  7. package/lib/client/WorktreeSurface.js.map +1 -1
  8. package/lib/client/context/worktree-context-store.d.ts +3 -1
  9. package/lib/client/context/worktree-context-store.d.ts.map +1 -1
  10. package/lib/client/context/worktree-context-store.js +3 -2
  11. package/lib/client/context/worktree-context-store.js.map +1 -1
  12. package/lib/client/dashboard/WorktreeDashboard.d.ts +8 -3
  13. package/lib/client/dashboard/WorktreeDashboard.d.ts.map +1 -1
  14. package/lib/client/dashboard/WorktreeDashboard.js +120 -12
  15. package/lib/client/dashboard/WorktreeDashboard.js.map +1 -1
  16. package/lib/client/dashboard/dashboard-selection.d.ts +4 -0
  17. package/lib/client/dashboard/dashboard-selection.d.ts.map +1 -1
  18. package/lib/client/dashboard/dashboard-selection.js +23 -0
  19. package/lib/client/dashboard/dashboard-selection.js.map +1 -1
  20. package/lib/client/dsh-slot-contract.d.ts +8 -1
  21. package/lib/client/dsh-slot-contract.d.ts.map +1 -1
  22. package/lib/client/entry.d.ts.map +1 -1
  23. package/lib/client/entry.js +22 -4
  24. package/lib/client/entry.js.map +1 -1
  25. package/lib/client/locales.d.ts +58 -0
  26. package/lib/client/locales.d.ts.map +1 -1
  27. package/lib/client/locales.js +66 -8
  28. package/lib/client/locales.js.map +1 -1
  29. package/lib/client/permission/worktree-permission.d.ts.map +1 -1
  30. package/lib/client/permission/worktree-permission.js +14 -6
  31. package/lib/client/permission/worktree-permission.js.map +1 -1
  32. package/lib/client/session/active-sessions.d.ts +21 -0
  33. package/lib/client/session/active-sessions.d.ts.map +1 -0
  34. package/lib/client/session/active-sessions.js +61 -0
  35. package/lib/client/session/active-sessions.js.map +1 -0
  36. package/lib/client/settings/diagnostics.d.ts +4 -0
  37. package/lib/client/settings/diagnostics.d.ts.map +1 -1
  38. package/lib/client/settings/diagnostics.js +12 -0
  39. package/lib/client/settings/diagnostics.js.map +1 -1
  40. package/lib/client/steer/SteerDock.d.ts +8 -0
  41. package/lib/client/steer/SteerDock.d.ts.map +1 -0
  42. package/lib/client/steer/SteerDock.js +12 -0
  43. package/lib/client/steer/SteerDock.js.map +1 -0
  44. package/lib/client/steer/steer-activity.d.ts +18 -0
  45. package/lib/client/steer/steer-activity.d.ts.map +1 -0
  46. package/lib/client/steer/steer-activity.js +37 -0
  47. package/lib/client/steer/steer-activity.js.map +1 -0
  48. package/lib/client/steer/steer-state.d.ts +24 -0
  49. package/lib/client/steer/steer-state.d.ts.map +1 -0
  50. package/lib/client/steer/steer-state.js +102 -0
  51. package/lib/client/steer/steer-state.js.map +1 -0
  52. package/lib/client/surface/components/SessionActivityBell.d.ts +14 -0
  53. package/lib/client/surface/components/SessionActivityBell.d.ts.map +1 -0
  54. package/lib/client/surface/components/SessionActivityBell.js +92 -0
  55. package/lib/client/surface/components/SessionActivityBell.js.map +1 -0
  56. package/lib/client/surface/components/SurfaceHeader.d.ts +3 -2
  57. package/lib/client/surface/components/SurfaceHeader.d.ts.map +1 -1
  58. package/lib/client/surface/components/SurfaceHeader.js +4 -2
  59. package/lib/client/surface/components/SurfaceHeader.js.map +1 -1
  60. package/lib/client/surface/state/useSurfaceRefresh.d.ts.map +1 -1
  61. package/lib/client/surface/state/useSurfaceRefresh.js +6 -3
  62. package/lib/client/surface/state/useSurfaceRefresh.js.map +1 -1
  63. package/lib/client/surface/types.d.ts +5 -1
  64. package/lib/client/surface/types.d.ts.map +1 -1
  65. package/lib/client/view/worktree-view-read.d.ts +3 -0
  66. package/lib/client/view/worktree-view-read.d.ts.map +1 -1
  67. package/lib/client/view/worktree-view-read.js +23 -1
  68. package/lib/client/view/worktree-view-read.js.map +1 -1
  69. package/lib/client/worktree-connection.d.ts +1 -0
  70. package/lib/client/worktree-connection.d.ts.map +1 -1
  71. package/lib/client/worktree-connection.js +2 -0
  72. package/lib/client/worktree-connection.js.map +1 -1
  73. package/lib/client.js +1298 -484
  74. package/lib/client.js.map +1 -1
  75. package/lib/contract/baseline-sync.d.ts +27 -0
  76. package/lib/contract/baseline-sync.d.ts.map +1 -0
  77. package/lib/contract/baseline-sync.js +2 -0
  78. package/lib/contract/baseline-sync.js.map +1 -0
  79. package/lib/contract/index.contract.js +1 -0
  80. package/lib/contract/index.contract.js.map +1 -1
  81. package/lib/contract/index.d.ts +5 -1
  82. package/lib/contract/index.d.ts.map +1 -1
  83. package/lib/contract/index.js +1 -0
  84. package/lib/contract/index.js.map +1 -1
  85. package/lib/contract/worktree-permission.d.ts +2 -0
  86. package/lib/contract/worktree-permission.d.ts.map +1 -1
  87. package/lib/contract/worktree-permission.js +1 -1
  88. package/lib/contract/worktree-permission.js.map +1 -1
  89. package/lib/contract/worktree-tool-changes.d.ts +2 -0
  90. package/lib/contract/worktree-tool-changes.d.ts.map +1 -1
  91. package/lib/host/baseline-sync.d.ts +15 -0
  92. package/lib/host/baseline-sync.d.ts.map +1 -0
  93. package/lib/host/baseline-sync.js +93 -0
  94. package/lib/host/baseline-sync.js.map +1 -0
  95. package/lib/host/remote.d.ts +2 -1
  96. package/lib/host/remote.d.ts.map +1 -1
  97. package/lib/host/remote.js +1 -1
  98. package/lib/host/remote.js.map +1 -1
  99. package/lib/host/service.d.ts +5 -0
  100. package/lib/host/service.d.ts.map +1 -1
  101. package/lib/host/service.js +27 -2
  102. package/lib/host/service.js.map +1 -1
  103. package/lib/host/worktree-permission.d.ts +12 -0
  104. package/lib/host/worktree-permission.d.ts.map +1 -1
  105. package/lib/host/worktree-permission.js +87 -16
  106. package/lib/host/worktree-permission.js.map +1 -1
  107. package/lib/host/worktree-tool-changes.d.ts +1 -1
  108. package/lib/host/worktree-tool-changes.d.ts.map +1 -1
  109. package/lib/host/worktree-tool-changes.js +5 -2
  110. package/lib/host/worktree-tool-changes.js.map +1 -1
  111. package/lib/index.d.ts +1 -1
  112. package/lib/index.d.ts.map +1 -1
  113. package/lib/index.js.map +1 -1
  114. package/lib/manage/manager.d.ts +5 -0
  115. package/lib/manage/manager.d.ts.map +1 -1
  116. package/lib/manage/manager.js +17 -1
  117. package/lib/manage/manager.js.map +1 -1
  118. package/lib/manage/types.d.ts +5 -0
  119. package/lib/manage/types.d.ts.map +1 -1
  120. package/lib/tool/agent-relay.d.ts +55 -0
  121. package/lib/tool/agent-relay.d.ts.map +1 -0
  122. package/lib/tool/agent-relay.js +159 -0
  123. package/lib/tool/agent-relay.js.map +1 -0
  124. package/lib/tool/delegation.d.ts +1 -0
  125. package/lib/tool/delegation.d.ts.map +1 -1
  126. package/lib/tool/delegation.js +32 -6
  127. package/lib/tool/delegation.js.map +1 -1
  128. package/lib/tool/dispatch-session.d.ts +18 -0
  129. package/lib/tool/dispatch-session.d.ts.map +1 -0
  130. package/lib/tool/dispatch-session.js +41 -0
  131. package/lib/tool/dispatch-session.js.map +1 -0
  132. package/lib/tool/errors.d.ts +6 -0
  133. package/lib/tool/errors.d.ts.map +1 -1
  134. package/lib/tool/errors.js +16 -2
  135. package/lib/tool/errors.js.map +1 -1
  136. package/lib/tool/guidance.d.ts +1 -0
  137. package/lib/tool/guidance.d.ts.map +1 -1
  138. package/lib/tool/guidance.js +2 -0
  139. package/lib/tool/guidance.js.map +1 -1
  140. package/lib/tool/index.d.ts.map +1 -1
  141. package/lib/tool/index.js +38 -4
  142. package/lib/tool/index.js.map +1 -1
  143. package/lib/tool/inputs.d.ts.map +1 -1
  144. package/lib/tool/inputs.js +6 -6
  145. package/lib/tool/inputs.js.map +1 -1
  146. package/lib/tool/list-models.js +2 -2
  147. package/lib/tool/list-models.js.map +1 -1
  148. package/lib/tool/list-sessions.js +2 -2
  149. package/lib/tool/list-sessions.js.map +1 -1
  150. package/lib/tool/list-worktrees.js +1 -1
  151. package/lib/tool/list-worktrees.js.map +1 -1
  152. package/lib/tool/native-session.d.ts +4 -0
  153. package/lib/tool/native-session.d.ts.map +1 -1
  154. package/lib/tool/native-session.js +17 -0
  155. package/lib/tool/native-session.js.map +1 -1
  156. package/lib/tool/new-worktree.js +4 -4
  157. package/lib/tool/new-worktree.js.map +1 -1
  158. package/lib/tool/report-result.d.ts.map +1 -1
  159. package/lib/tool/report-result.js +9 -7
  160. package/lib/tool/report-result.js.map +1 -1
  161. package/lib/tool/schema.d.ts +8 -0
  162. package/lib/tool/schema.d.ts.map +1 -1
  163. package/lib/tool/schema.js +31 -2
  164. package/lib/tool/schema.js.map +1 -1
  165. package/lib/tool/send-message.d.ts.map +1 -1
  166. package/lib/tool/send-message.js +8 -7
  167. package/lib/tool/send-message.js.map +1 -1
  168. package/lib/tool/span-worktree.d.ts.map +1 -1
  169. package/lib/tool/span-worktree.js +33 -59
  170. package/lib/tool/span-worktree.js.map +1 -1
  171. package/lib/tool/types.d.ts +2 -0
  172. package/lib/tool/types.d.ts.map +1 -1
  173. package/lib/tool/wire-schema.d.ts +4 -0
  174. package/lib/tool/wire-schema.d.ts.map +1 -0
  175. package/lib/tool/wire-schema.js +24 -0
  176. package/lib/tool/wire-schema.js.map +1 -0
  177. package/lib/typert.host.js +117 -56
  178. package/lib/typert.remote-client.d.ts +3 -1
  179. package/lib/typert.remote-client.d.ts.map +1 -1
  180. package/lib/typert.remote-client.js +117 -56
  181. package/package.json +4 -1
package/lib/client.js CHANGED
@@ -780,6 +780,14 @@ window.__ModuleLoader__.load({
780
780
  //#region lib/client/locales.js
781
781
  const WORKTREE_NS = "worktree";
782
782
  const zh = {
783
+ "steer.title": "Agent steer",
784
+ "steer.pending": "等待接收",
785
+ "steer.preparing": "准备接收",
786
+ "steer.received": "已进入会话上下文",
787
+ "steer.canceled": "已取消",
788
+ "steer.unknown": "状态待确认",
789
+ "steer.sender": "发送方:{sender}",
790
+ "steer.receiptHint": "接收不代表任务完成。展示本轮或最近一轮的接收记录。",
783
791
  "dashboard.mainReady": "本地 checkout",
784
792
  "dashboard.git.sessionRequired": "请先为此工作目录新建会话,再在侧栏打开文件。",
785
793
  "dashboard.git.outsideSession": "文件位于此会话工作目录之外。请在 IDE 中打开,或使用仓库根目录的会话。",
@@ -941,6 +949,7 @@ window.__ModuleLoader__.load({
941
949
  "dashboard.cancelInstructions": "取消",
942
950
  "dashboard.instructionsSaveFailed": "保存失败,草稿已保留。可重试;若其他窗口已修改指令,请取消并重新打开编辑。",
943
951
  "dashboard.editBase": "编辑基线",
952
+ "dashboard.openBaseWorktree": "前往基线 Worktree",
944
953
  "dashboard.editBaseDescription": "选择本地或已获取的远端 branch 作为 Git 与变更的比较基线。",
945
954
  "dashboard.searchBranches": "搜索 branch",
946
955
  "dashboard.noMatchingBranches": "没有匹配的 branch",
@@ -976,7 +985,8 @@ window.__ModuleLoader__.load({
976
985
  "dashboard.workingTree": "未提交变更",
977
986
  "dashboard.viewDetails": "查看详情",
978
987
  "dashboard.derived": "派生 Worktree",
979
- "dashboard.childrenHint": "派生关系尚未接入,不代表没有其他 Worktree。",
988
+ "dashboard.childrenHint": "显示同一 Workspace 中,已保存基线为当前分支的直接派生 Worktree(含已归档项)。修改基线后,列表随之更新。",
989
+ "dashboard.noChildren": "暂无基线指向当前分支的 Worktree。",
980
990
  "dashboard.viewChildren": "查看派生 Worktree",
981
991
  "dashboard.quickActions": "快捷操作",
982
992
  "dashboard.action.terminal": "在终端中打开",
@@ -984,11 +994,24 @@ window.__ModuleLoader__.load({
984
994
  "dashboard.action.pullRequest": "创建 Pull Request",
985
995
  "dashboard.action.tests": "运行测试",
986
996
  "dashboard.action.sync": "同步基线",
997
+ "dashboard.sync.description": "选择同步方式。确认后会在当前 Worktree 创建并打开一个任务会话,由 Agent 执行;使用原生权限策略,遇到未提交变更或冲突时停止并报告。",
998
+ "dashboard.sync.rebase": "将当前分支的提交重放到已保存基线之上,改写当前分支的提交历史。",
999
+ "dashboard.sync.merge": "将已保存基线合入当前分支,保留已有提交历史。",
1000
+ "dashboard.sync.create": "创建同步会话",
1001
+ "dashboard.sync.creating": "正在创建…",
1002
+ "dashboard.sync.openSession": "打开已创建会话",
1003
+ "dashboard.sync.partial": "会话已保留。请打开该会话检查;检查前不要重复创建会话或提交任务。",
1004
+ "dashboard.sync.binding-failed": "会话已创建,但 Worktree 绑定失败。请打开已创建会话检查目录与 Worktree 可用状态,确认绑定恢复后再提交任务。",
1005
+ "dashboard.sync.model-failed": "会话已创建并绑定,但模型配置失败。请在已创建会话中检查可用模型与配置。",
1006
+ "dashboard.sync.title-failed": "会话已创建并绑定,但标题设置失败。请在已创建会话中检查或修改标题。",
1007
+ "dashboard.sync.reporting-failed": "会话已创建,但结果报告准备失败。请在已创建会话中检查报告配置。",
1008
+ "dashboard.sync.prompt-failed": "会话已创建,但任务提交未获确认。请先检查已创建会话的消息与运行状态,确认是否已接收任务。",
1009
+ "dashboard.sync.failed": "同步会话创建失败,可重试同一请求。",
987
1010
  "dashboard.action.archive": "归档 Worktree",
988
1011
  "dashboard.hint.git": "这里展示相对于所选 branch 基线的提交、已提交和未提交的变化行数、变更文件和统一 Diff。",
989
- "dashboard.hint.children": "这里将展示基于此 Worktree 派生的工作目录与关系。",
1012
+ "dashboard.hint.children": "查看以当前分支为已保存基线的 Worktree。",
990
1013
  "dashboard.hint.settings": "这里将提供 Worktree 指令与偏好设置。当前不会保存任何更改。",
991
- "dashboard.mvpHint": "MVP · 会话、新建 Worktree、归档、Git 变更和 VS Code 已接入;其余标记为“即将推出”的操作暂不可用。",
1014
+ "dashboard.mvpHint": "同步基线会创建 Agent 任务会话,完成状态与执行结果请在会话中查看。",
992
1015
  "mode.open": "打开 Worktree 模式",
993
1016
  "mode.exit": "退出 Worktree 模式",
994
1017
  "mode.label": "Worktree",
@@ -1084,6 +1107,12 @@ window.__ModuleLoader__.load({
1084
1107
  "session.expandMore": "展开其余 {count} 个会话",
1085
1108
  "session.collapse": "收起",
1086
1109
  "session.name": "会话名称",
1110
+ "activity.title": "活跃会话",
1111
+ "activity.count": "活跃会话({n})",
1112
+ "activity.empty": "无活跃会话",
1113
+ "activity.unknownWorktree": "Worktree 暂不可用",
1114
+ "activity.runningFor": "已运行 {t}",
1115
+ "activity.seconds": "{n}秒",
1087
1116
  "session.status.running": "进行中",
1088
1117
  "session.status.subagentsRunning.one": "{n} 个子代理运行中",
1089
1118
  "session.status.subagentsRunning.other": "{n} 个子代理运行中",
@@ -1124,7 +1153,7 @@ window.__ModuleLoader__.load({
1124
1153
  "permission.unverified": "无法确认 Session 权限,会话已保留。请检查 DSH 的权限设置;清理后的权限调整可在设置 → Worktree → 报错与修复中重试。",
1125
1154
  "permission.unavailable": "暂时无法读取 Worktree Session 权限。请检查 DSH 连接和 Session 权限设置后重试。",
1126
1155
  "permission.fullAccessTitle": "确认启用 Worktree Full access?",
1127
- "permission.fullAccessDescription": "启用 Worktree Full access 后,此 Session 可能访问 Session 目录之外的关联 Git 元数据和 Worktree 文件。完全访问会关闭此 Session 的文件系统沙箱,但会保留审批提示;网络和进程策略不变。目标 Worktree:{cwd}",
1156
+ "permission.fullAccessDescription": "启用 Worktree Full access 后,此 Session 可能访问 Session 目录之外的关联 Git 元数据和 Worktree 文件。完全访问会关闭此 Session 的文件系统沙箱,但会保留审批提示;网络和进程策略不变。若命名预设尚未加载,原生权限菜单可能显示 Custom(自定义),实际仍使用完全文件访问与 ask 审批,无需仅为预设名称重启。目标 Worktree:{cwd}",
1128
1157
  "permission.fullAccessAcknowledge": "我已了解风险,并愿意继续",
1129
1158
  "permission.fullAccessEnable": "启用 Worktree Full access",
1130
1159
  "status.loading": "正在加载工作区…",
@@ -1192,6 +1221,14 @@ window.__ModuleLoader__.load({
1192
1221
  "error.unexpected": "操作失败(错误码:{code})。请刷新后重试;若仍失败,请将错误码和 DSH 日志提供给维护者。"
1193
1222
  };
1194
1223
  const en = {
1224
+ "steer.title": "Agent steer",
1225
+ "steer.pending": "Waiting for receipt",
1226
+ "steer.preparing": "Preparing receipt",
1227
+ "steer.received": "Entered conversation context",
1228
+ "steer.canceled": "Canceled",
1229
+ "steer.unknown": "Status unconfirmed",
1230
+ "steer.sender": "From: {sender}",
1231
+ "steer.receiptHint": "Receipt does not mean task completion. Entries belong to the current or most recent turn.",
1195
1232
  "dashboard.mainReady": "Local checkout",
1196
1233
  "dashboard.git.sessionRequired": "Create a Session for this working directory before opening files in the sidebar.",
1197
1234
  "dashboard.git.outsideSession": "This file is outside the Session working directory. Open it in an IDE or use a Session at the repository root.",
@@ -1353,6 +1390,7 @@ window.__ModuleLoader__.load({
1353
1390
  "dashboard.cancelInstructions": "Cancel",
1354
1391
  "dashboard.instructionsSaveFailed": "Save failed; your draft is retained. Retry, or cancel and reopen if another window changed the instructions.",
1355
1392
  "dashboard.editBase": "Edit baseline",
1393
+ "dashboard.openBaseWorktree": "Open base Worktree",
1356
1394
  "dashboard.editBaseDescription": "Choose a local or fetched remote branch as the Git & Changes comparison baseline.",
1357
1395
  "dashboard.searchBranches": "Search branches",
1358
1396
  "dashboard.noMatchingBranches": "No matching branches",
@@ -1388,7 +1426,8 @@ window.__ModuleLoader__.load({
1388
1426
  "dashboard.workingTree": "Uncommitted changes",
1389
1427
  "dashboard.viewDetails": "View details",
1390
1428
  "dashboard.derived": "Derived Worktrees",
1391
- "dashboard.childrenHint": "Parent and child relationships are not connected yet.",
1429
+ "dashboard.childrenHint": "Direct Worktrees in this Workspace whose saved baseline matches the current branch, including archived entries. Changing a baseline updates this list.",
1430
+ "dashboard.noChildren": "No Worktrees have a saved baseline matching the current branch.",
1392
1431
  "dashboard.viewChildren": "View all children",
1393
1432
  "dashboard.quickActions": "Quick Actions",
1394
1433
  "dashboard.action.terminal": "Open in Terminal",
@@ -1396,11 +1435,24 @@ window.__ModuleLoader__.load({
1396
1435
  "dashboard.action.pullRequest": "Create Pull Request",
1397
1436
  "dashboard.action.tests": "Run Tests",
1398
1437
  "dashboard.action.sync": "Sync with Base",
1438
+ "dashboard.sync.description": "Choose a strategy. Confirming creates and opens a task Session in this Worktree for the Agent to execute under native permissions. It stops and reports uncommitted changes or conflicts.",
1439
+ "dashboard.sync.rebase": "Replay this branch’s commits onto the saved baseline, rewriting this branch’s history.",
1440
+ "dashboard.sync.merge": "Merge the saved baseline into this branch while preserving existing commit history.",
1441
+ "dashboard.sync.create": "Create sync Session",
1442
+ "dashboard.sync.creating": "Creating…",
1443
+ "dashboard.sync.openSession": "Open created Session",
1444
+ "dashboard.sync.partial": "The Session is retained. Open it to inspect before creating another Session or submitting the task again.",
1445
+ "dashboard.sync.binding-failed": "The Session was created, but its Worktree binding failed. Open it to check its directory and Worktree availability, and confirm the binding is restored before submitting the task.",
1446
+ "dashboard.sync.model-failed": "The Session was created and bound, but model setup failed. Check available models and configuration in the created Session.",
1447
+ "dashboard.sync.title-failed": "The Session was created and bound, but setting its title failed. Check or change the title in the created Session.",
1448
+ "dashboard.sync.reporting-failed": "The Session was created, but result reporting setup failed. Check reporting configuration in the created Session.",
1449
+ "dashboard.sync.prompt-failed": "The Session was created, but task submission was not confirmed. Inspect its messages and running state first to determine whether the task was accepted.",
1450
+ "dashboard.sync.failed": "Sync Session creation failed. Retry the same request.",
1399
1451
  "dashboard.action.archive": "Archive Worktree",
1400
1452
  "dashboard.hint.git": "View commits, committed and uncommitted line totals, changed files, and unified diffs relative to the selected branch baseline.",
1401
- "dashboard.hint.children": "Derived worktrees and their relationships will appear here.",
1453
+ "dashboard.hint.children": "View Worktrees whose saved baseline matches the current branch.",
1402
1454
  "dashboard.hint.settings": "Worktree instructions and preferences will appear here. No changes are saved yet.",
1403
- "dashboard.mvpHint": "MVP · Sessions, Worktree creation, archive, Git changes, and VS Code are connected. Other actions marked Coming soon are unavailable.",
1455
+ "dashboard.mvpHint": "Baseline synchronization creates an Agent task Session. Check that Session for completion and results.",
1404
1456
  "mode.open": "Open Worktree mode",
1405
1457
  "mode.exit": "Exit Worktree mode",
1406
1458
  "mode.label": "Worktree",
@@ -1496,6 +1548,12 @@ window.__ModuleLoader__.load({
1496
1548
  "session.expandMore": "Expand {count} more",
1497
1549
  "session.collapse": "Collapse",
1498
1550
  "session.name": "Session name",
1551
+ "activity.title": "Active sessions",
1552
+ "activity.count": "Active sessions ({n})",
1553
+ "activity.empty": "No active sessions",
1554
+ "activity.unknownWorktree": "Worktree unavailable",
1555
+ "activity.runningFor": "Running for {t}",
1556
+ "activity.seconds": "{n}s",
1499
1557
  "session.status.running": "Running",
1500
1558
  "session.status.subagentsRunning.one": "{n} subagent running",
1501
1559
  "session.status.subagentsRunning.other": "{n} subagents running",
@@ -1536,7 +1594,7 @@ window.__ModuleLoader__.load({
1536
1594
  "permission.unverified": "Session permissions could not be verified; the Session was retained. Check the permission settings in DSH. Permission updates after cleanup can be retried in Settings → Worktree → Errors & recovery.",
1537
1595
  "permission.unavailable": "Worktree Session permissions could not be read. Check your DSH connection and the Session permission settings, then retry.",
1538
1596
  "permission.fullAccessTitle": "Enable Worktree Full access?",
1539
- "permission.fullAccessDescription": "Worktree Full access lets this Session access linked Git metadata and Worktree files outside the Session directory. It disables filesystem confinement for this Session while keeping approval prompts enabled; network and process policy are unchanged. Target Worktree: {cwd}",
1597
+ "permission.fullAccessDescription": "Worktree Full access lets this Session access linked Git metadata and Worktree files outside the Session directory. It disables filesystem confinement for this Session while keeping approval prompts enabled; network and process policy are unchanged. If the named preset has not loaded, the native permission menu may show Custom; full file access and ask approval still apply without restarting just for the preset label. Target Worktree: {cwd}",
1540
1598
  "permission.fullAccessAcknowledge": "I understand the risks and want to continue",
1541
1599
  "permission.fullAccessEnable": "Enable Worktree Full access",
1542
1600
  "status.loading": "Loading Workspaces…",
@@ -1612,6 +1670,7 @@ window.__ModuleLoader__.load({
1612
1670
  * the browser call surface auditable without making React know wire names.
1613
1671
  */
1614
1672
  const WORKTREE_CONNECTION_ENDPOINTS = Object.freeze({
1673
+ syncWorktreeBaseline: "worktreeManager/syncWorktreeBaseline",
1615
1674
  getWorkspaceGitState: "worktreeManager/getWorkspaceGitState",
1616
1675
  getToolSettings: "worktreeManager/getToolSettings",
1617
1676
  updateToolSettings: "worktreeManager/updateToolSettings",
@@ -1746,6 +1805,7 @@ window.__ModuleLoader__.load({
1746
1805
  return unwrap(WORKTREE_CONNECTION_ENDPOINTS[method], await call(method, input));
1747
1806
  }
1748
1807
  return {
1808
+ syncWorktreeBaseline: (input) => invoke("syncWorktreeBaseline", input),
1749
1809
  getToolSettings: (input) => invoke("getToolSettings", input),
1750
1810
  updateToolSettings: (input) => invoke("updateToolSettings", input),
1751
1811
  watchToolChanges: async (afterRevision, signal) => unwrap(WORKTREE_CONNECTION_ENDPOINTS.watchToolChanges, await call("watchToolChanges", { afterRevision }, signal)),
@@ -1969,6 +2029,7 @@ window.__ModuleLoader__.load({
1969
2029
  const IconArchiveOutline20 = createDshIconAlias(exports$1, "IconArchiveOutline20", "IconArchiveOutlineRegular");
1970
2030
  const IconBranchOutline16 = createDshIconAlias(exports$1, "IconBranchOutline16", "IconBranchOutlineRegular");
1971
2031
  const IconChevronDownOutline14 = createDshIconAlias(exports$1, "IconChevronDownOutline14", "IconChevronDownOutlineRegular");
2032
+ const IconChevronRightOutline14 = createDshIconAlias(exports$1, "IconChevronRightOutline14", "IconChevronRightOutlineRegular");
1972
2033
  const IconCheckOutline16 = createDshIconAlias(exports$1, "IconCheckOutline16", "IconCheckOutlineRegular");
1973
2034
  const IconCloseFill14 = createDshIconAlias(exports$1, "IconCloseFill14", "IconCloseFillRegular");
1974
2035
  const IconCloseOutline16 = createDshIconAlias(exports$1, "IconCloseOutline16", "IconCloseOutlineRegular");
@@ -1986,14 +2047,14 @@ window.__ModuleLoader__.load({
1986
2047
  const IconSearchOutline16 = createDshIconAlias(exports$1, "IconSearchOutline16", "IconSearchOutlineRegular");
1987
2048
  const IconTrashOutline16 = createDshIconAlias(exports$1, "IconTrashOutline16", "IconTrashOutlineRegular");
1988
2049
  //#endregion
1989
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_ef7f6cd81f87/packages/clutch-dsh-worktree/src/client/context/worktree-context.css.mjs
1990
- const css$8 = ".-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";
1991
- const styleId$8 = "@cerbur/clutch-dsh-worktree/worktree-context.css";
2050
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_49c1cce49fdb/packages/clutch-dsh-worktree/src/client/context/worktree-context.css.mjs
2051
+ 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";
2052
+ const styleId$9 = "@cerbur/clutch-dsh-worktree/worktree-context.css";
1992
2053
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree-context.css\"]") === null) {
1993
2054
  const tag = document.createElement("style");
1994
2055
  tag.dataset.plugin = "@cerbur/clutch-dsh-worktree";
1995
- tag.dataset.pluginCss = styleId$8;
1996
- tag.textContent = css$8;
2056
+ tag.dataset.pluginCss = styleId$9;
2057
+ tag.textContent = css$9;
1997
2058
  document.head.appendChild(tag);
1998
2059
  }
1999
2060
  var worktree_context_css_default = {
@@ -2050,14 +2111,14 @@ window.__ModuleLoader__.load({
2050
2111
  globalSetViewMode?.(mode);
2051
2112
  }
2052
2113
  //#endregion
2053
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_ef7f6cd81f87/packages/clutch-dsh-worktree/src/client/worktree.css.mjs
2054
- const css$7 = ".-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-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";
2055
- const styleId$7 = "@cerbur/clutch-dsh-worktree/worktree.css";
2114
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_49c1cce49fdb/packages/clutch-dsh-worktree/src/client/worktree.css.mjs
2115
+ 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";
2116
+ const styleId$8 = "@cerbur/clutch-dsh-worktree/worktree.css";
2056
2117
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree.css\"]") === null) {
2057
2118
  const tag = document.createElement("style");
2058
2119
  tag.dataset.plugin = "@cerbur/clutch-dsh-worktree";
2059
- tag.dataset.pluginCss = styleId$7;
2060
- tag.textContent = css$7;
2120
+ tag.dataset.pluginCss = styleId$8;
2121
+ tag.textContent = css$8;
2061
2122
  document.head.appendChild(tag);
2062
2123
  }
2063
2124
  var worktree_css_default = {
@@ -2114,6 +2175,18 @@ window.__ModuleLoader__.load({
2114
2175
  "searchInput": "-cerbur-clutch-dsh-worktree-searchInput",
2115
2176
  "clearButton": "-cerbur-clutch-dsh-worktree-clearButton",
2116
2177
  "iconButton": "-cerbur-clutch-dsh-worktree-iconButton",
2178
+ "activityBell": "-cerbur-clutch-dsh-worktree-activityBell",
2179
+ "activityBadge": "-cerbur-clutch-dsh-worktree-activityBadge",
2180
+ "activityPanel": "-cerbur-clutch-dsh-worktree-activityPanel",
2181
+ "activityHeading": "-cerbur-clutch-dsh-worktree-activityHeading",
2182
+ "activityEmpty": "-cerbur-clutch-dsh-worktree-activityEmpty",
2183
+ "activityList": "-cerbur-clutch-dsh-worktree-activityList",
2184
+ "activityEntry": "-cerbur-clutch-dsh-worktree-activityEntry",
2185
+ "activityIdentity": "-cerbur-clutch-dsh-worktree-activityIdentity",
2186
+ "activityName": "-cerbur-clutch-dsh-worktree-activityName",
2187
+ "activityContext": "-cerbur-clutch-dsh-worktree-activityContext",
2188
+ "activityTime": "-cerbur-clutch-dsh-worktree-activityTime",
2189
+ "activityMetadata": "-cerbur-clutch-dsh-worktree-activityMetadata",
2117
2190
  "workspaceList": "-cerbur-clutch-dsh-worktree-workspaceList",
2118
2191
  "workspaceGroup": "-cerbur-clutch-dsh-worktree-workspaceGroup",
2119
2192
  "workspaceRow": "-cerbur-clutch-dsh-worktree-workspaceRow",
@@ -2231,14 +2304,14 @@ window.__ModuleLoader__.load({
2231
2304
  });
2232
2305
  }
2233
2306
  //#endregion
2234
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_ef7f6cd81f87/packages/clutch-dsh-worktree/src/client/dashboard/dashboard-header-action.css.mjs
2235
- const css$6 = "/* 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";
2236
- const styleId$6 = "@cerbur/clutch-dsh-worktree/dashboard-header-action.css";
2307
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_49c1cce49fdb/packages/clutch-dsh-worktree/src/client/dashboard/dashboard-header-action.css.mjs
2308
+ 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";
2309
+ const styleId$7 = "@cerbur/clutch-dsh-worktree/dashboard-header-action.css";
2237
2310
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard-header-action.css\"]") === null) {
2238
2311
  const tag = document.createElement("style");
2239
2312
  tag.dataset.plugin = "@cerbur/clutch-dsh-worktree";
2240
- tag.dataset.pluginCss = styleId$6;
2241
- tag.textContent = css$6;
2313
+ tag.dataset.pluginCss = styleId$7;
2314
+ tag.textContent = css$7;
2242
2315
  document.head.appendChild(tag);
2243
2316
  }
2244
2317
  var dashboard_header_action_css_default = { "headerDashboardButton": "-cerbur-clutch-dsh-worktree-headerDashboardButton" };
@@ -2510,6 +2583,7 @@ window.__ModuleLoader__.load({
2510
2583
  return record.gitRootPath ?? record.absolutePath;
2511
2584
  }
2512
2585
  Object.freeze([
2586
+ "syncWorktreeBaseline",
2513
2587
  "getWorkspaceGitState",
2514
2588
  "getToolSettings",
2515
2589
  "updateToolSettings",
@@ -2724,6 +2798,18 @@ window.__ModuleLoader__.load({
2724
2798
  limitHistory();
2725
2799
  emit();
2726
2800
  },
2801
+ /** Late results retain evidence without reactivating an unmounted UI source. */
2802
+ recordInactive(source, notices) {
2803
+ if (notices.length === 0) return;
2804
+ for (const notice of notices) snapshot = [...snapshot.filter((entry) => entry.key !== notice.key), {
2805
+ ...notice,
2806
+ source,
2807
+ status: "inactive",
2808
+ actions: []
2809
+ }];
2810
+ limitHistory();
2811
+ emit();
2812
+ },
2727
2813
  deactivate(source) {
2728
2814
  sources.delete(source);
2729
2815
  retire(source, "inactive");
@@ -2856,14 +2942,14 @@ window.__ModuleLoader__.load({
2856
2942
  }, current.key);
2857
2943
  }
2858
2944
  //#endregion
2859
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_ef7f6cd81f87/packages/clutch-dsh-worktree/src/client/select/single-select.css.mjs
2860
- const css$5 = ".-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";
2861
- const styleId$5 = "@cerbur/clutch-dsh-worktree/single-select.css";
2945
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_49c1cce49fdb/packages/clutch-dsh-worktree/src/client/select/single-select.css.mjs
2946
+ 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";
2947
+ const styleId$6 = "@cerbur/clutch-dsh-worktree/single-select.css";
2862
2948
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/single-select.css\"]") === null) {
2863
2949
  const tag = document.createElement("style");
2864
2950
  tag.dataset.plugin = "@cerbur/clutch-dsh-worktree";
2865
- tag.dataset.pluginCss = styleId$5;
2866
- tag.textContent = css$5;
2951
+ tag.dataset.pluginCss = styleId$6;
2952
+ tag.textContent = css$6;
2867
2953
  document.head.appendChild(tag);
2868
2954
  }
2869
2955
  var single_select_css_default = {
@@ -3257,14 +3343,14 @@ window.__ModuleLoader__.load({
3257
3343
  });
3258
3344
  }
3259
3345
  //#endregion
3260
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_ef7f6cd81f87/packages/clutch-dsh-worktree/src/client/branch/git-branch.css.mjs
3261
- const css$4 = ".-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";
3262
- const styleId$4 = "@cerbur/clutch-dsh-worktree/git-branch.css";
3346
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_49c1cce49fdb/packages/clutch-dsh-worktree/src/client/branch/git-branch.css.mjs
3347
+ 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";
3348
+ const styleId$5 = "@cerbur/clutch-dsh-worktree/git-branch.css";
3263
3349
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/git-branch.css\"]") === null) {
3264
3350
  const tag = document.createElement("style");
3265
3351
  tag.dataset.plugin = "@cerbur/clutch-dsh-worktree";
3266
- tag.dataset.pluginCss = styleId$4;
3267
- tag.textContent = css$4;
3352
+ tag.dataset.pluginCss = styleId$5;
3353
+ tag.textContent = css$5;
3268
3354
  document.head.appendChild(tag);
3269
3355
  }
3270
3356
  var git_branch_css_default = { "branchFetch": "-cerbur-clutch-dsh-worktree-branchFetch" };
@@ -3546,7 +3632,8 @@ window.__ModuleLoader__.load({
3546
3632
  if (current !== void 0) return current;
3547
3633
  const created = {
3548
3634
  generation: 0,
3549
- stale: false
3635
+ stale: false,
3636
+ changeIds: /* @__PURE__ */ new Set()
3550
3637
  };
3551
3638
  entries.set(workspaceId, created);
3552
3639
  return created;
@@ -3577,10 +3664,21 @@ window.__ModuleLoader__.load({
3577
3664
  return promise;
3578
3665
  };
3579
3666
  return {
3667
+ resetChangeIds() {
3668
+ if (disposed) return;
3669
+ for (const entry of entries.values()) entry.changeIds.clear();
3670
+ },
3580
3671
  invalidate(workspaceId, options) {
3581
3672
  if (disposed) return;
3582
3673
  const entry = entryFor(workspaceId);
3674
+ const changeId = options?.changeId;
3675
+ if (changeId !== void 0 && entry.changeIds.has(changeId)) return;
3583
3676
  if (options?.reuseInFlight && entry.inFlight?.generation === entry.generation) return;
3677
+ if (changeId === void 0) entry.changeIds.clear();
3678
+ else {
3679
+ entry.changeIds.add(changeId);
3680
+ if (entry.changeIds.size > 128) entry.changeIds.delete(entry.changeIds.values().next().value);
3681
+ }
3584
3682
  entry.generation += 1;
3585
3683
  entry.stale = true;
3586
3684
  entry.view = void 0;
@@ -5268,6 +5366,24 @@ window.__ModuleLoader__.load({
5268
5366
  }
5269
5367
  //#endregion
5270
5368
  //#region lib/client/dashboard/dashboard-selection.js
5369
+ function localBranch(record) {
5370
+ if (record.currentBranch === null || record.currentHead !== void 0 && record.currentHead.kind !== "branch") return void 0;
5371
+ const branch = record.currentHead?.name ?? record.currentBranch ?? record.branch;
5372
+ return branch ? branch.replace(/^refs\/heads\//u, "") : void 0;
5373
+ }
5374
+ function matchesBaseline(baseBranch, branch) {
5375
+ return branch !== void 0 && (baseBranch === branch || baseBranch === `refs/heads/${branch}`);
5376
+ }
5377
+ /** Direct baseline relationships from the current Workspace projection, never Git ancestry. */
5378
+ function selectDerivedWorktrees(parent, records) {
5379
+ const branch = localBranch(parent);
5380
+ return records.filter((candidate) => candidate.workspaceId === parent.workspaceId && candidate.worktreeId !== parent.worktreeId && matchesBaseline(candidate.baseBranch, branch));
5381
+ }
5382
+ /** Navigate only when the saved baseline identifies one checkout in this Workspace. */
5383
+ function selectBaseWorktree(child, records, mainRecord, baseBranch = child.baseBranch) {
5384
+ const matches = (mainRecord === void 0 ? records : [...records, mainRecord]).filter((candidate) => candidate.workspaceId === child.workspaceId && candidate.worktreeId !== child.worktreeId && matchesBaseline(baseBranch, localBranch(candidate)));
5385
+ return matches.length === 1 ? matches[0] : void 0;
5386
+ }
5271
5387
  function isMainWorktreeId$1(worktreeId) {
5272
5388
  return worktreeId === "main" || worktreeId.startsWith("main:");
5273
5389
  }
@@ -5373,7 +5489,7 @@ window.__ModuleLoader__.load({
5373
5489
  }
5374
5490
  }
5375
5491
  /** Native Workspace hover-card time copy, including the trailing "ago" marker. */
5376
- function sessionHoverTimeLabel(t, value) {
5492
+ function sessionHoverTimeLabel$1(t, value) {
5377
5493
  const label = sessionTimeLabel$1(t, value);
5378
5494
  return value.unit === "now" ? label : t("session.time.ago", { t: label });
5379
5495
  }
@@ -5399,7 +5515,7 @@ window.__ModuleLoader__.load({
5399
5515
  }),
5400
5516
  !blank && timeValue !== void 0 && (0, react_jsx_runtime.jsx)("div", {
5401
5517
  className: worktree_css_default.sessionHoverTime,
5402
- children: sessionHoverTimeLabel(t, timeValue)
5518
+ children: sessionHoverTimeLabel$1(t, timeValue)
5403
5519
  }),
5404
5520
  statuses.map((status) => (0, react_jsx_runtime.jsxs)("div", {
5405
5521
  className: worktree_css_default.sessionHoverStatus,
@@ -6976,8 +7092,239 @@ window.__ModuleLoader__.load({
6976
7092
  });
6977
7093
  }
6978
7094
  //#endregion
7095
+ //#region lib/client/session/active-sessions.js
7096
+ /** Join existing ready facts only, independently of tree search, folding and row limits. */
7097
+ function activeSessions(sessions, presentations, workspaces, views) {
7098
+ const archived = new Set(workspaces.archivedSessionIds ?? []);
7099
+ const listed = new Set(sessions.ids);
7100
+ const seen = /* @__PURE__ */ new Set();
7101
+ const result = [];
7102
+ for (const workspace of workspaces.items) {
7103
+ const view = views.find((item) => item.workspaceId === workspace.workspaceId);
7104
+ const members = /* @__PURE__ */ new Set([...workspaceSessionIds(workspaces, workspace.workspaceId, sessions.ids), ...view?.bindings.map((binding) => binding.sessionId) ?? []]);
7105
+ for (const sessionId of members) {
7106
+ const presentation = presentations[sessionId];
7107
+ if (seen.has(sessionId) || !listed.has(sessionId) || archived.has(sessionId) || sessions.byId[sessionId]?.blank === true || presentation === void 0 || !presentation.ongoing && !presentation.completed && presentation.status.state !== "warning") continue;
7108
+ seen.add(sessionId);
7109
+ const binding = view?.bindings.find((item) => item.sessionId === sessionId);
7110
+ const record = view?.worktrees.find((item) => item.worktreeId === binding?.worktreeId);
7111
+ result.push({
7112
+ sessionId,
7113
+ workspaceId: workspace.workspaceId,
7114
+ workspaceTitle: workspace.title,
7115
+ worktree: binding === void 0 ? view === void 0 ? void 0 : null : record?.branch,
7116
+ presentation
7117
+ });
7118
+ }
7119
+ }
7120
+ return result.sort((a, b) => (b.presentation.updatedAt ?? 0) - (a.presentation.updatedAt ?? 0));
7121
+ }
7122
+ /** Ephemeral display clocks, never an unread owner or persisted Session fact. */
7123
+ function activityClocks(previous, presentations, now) {
7124
+ return new Map(Object.entries(presentations).map(([id, presentation]) => {
7125
+ const old = previous.get(id);
7126
+ const transitioned = old !== void 0 && old.ongoing !== presentation.ongoing;
7127
+ const newPrompt = presentation.ongoing && presentation.updatedAt !== void 0 && (old?.updatedAt === void 0 || presentation.updatedAt > old.updatedAt);
7128
+ return [id, {
7129
+ ongoing: presentation.ongoing,
7130
+ updatedAt: presentation.updatedAt,
7131
+ since: transitioned ? now : newPrompt ? presentation.updatedAt : old?.since ?? presentation.updatedAt
7132
+ }];
7133
+ }));
7134
+ }
7135
+ //#endregion
7136
+ //#region lib/client/session/session-labels.js
7137
+ /** Localize the native-compatible Session status used by both surfaces. */
7138
+ function sessionStatusLabel(t, status) {
7139
+ switch (status.labelKey) {
7140
+ case "running": return t("session.status.running");
7141
+ case "subagentsRunning": return t(status.runningSubagentCount === 1 ? "session.status.subagentsRunning.one" : "session.status.subagentsRunning.other", { n: status.runningSubagentCount });
7142
+ case "idle": return t("session.status.idle");
7143
+ case "waitingApproval": return t("session.status.waitingApproval");
7144
+ case "planReview": return t("session.status.planReview");
7145
+ case "waitingAnswer": return t("session.status.waitingAnswer");
7146
+ case "completed": return t("session.status.completed");
7147
+ }
7148
+ }
7149
+ /** Localize the compact relative time shown for idle Sessions. */
7150
+ function sessionTimeLabel(t, value) {
7151
+ switch (value.unit) {
7152
+ case "now": return t("session.time.now");
7153
+ case "minutes": return t("session.time.minutes", { n: value.n });
7154
+ case "hours": return t("session.time.hours", { n: value.n });
7155
+ case "days": return t("session.time.days", { n: value.n });
7156
+ case "months": return t("session.time.months", { n: value.n });
7157
+ case "years": return t("session.time.years", { n: value.n });
7158
+ }
7159
+ }
7160
+ /** Include the native relative-time suffix used in Session hover details. */
7161
+ function sessionHoverTimeLabel(t, value) {
7162
+ const label = sessionTimeLabel(t, value);
7163
+ return value.unit === "now" ? label : t("session.time.ago", { t: label });
7164
+ }
7165
+ //#endregion
7166
+ //#region lib/client/surface/components/SessionActivityBell.js
7167
+ function SessionActivityBell({ entries, sessions, presentations, t, hidden, onOpenSession }) {
7168
+ const [open, setOpen] = (0, react.useState)(false);
7169
+ const [now, setNow] = (0, react.useState)(Date.now);
7170
+ const clocks = (0, react.useRef)(/* @__PURE__ */ new Map());
7171
+ const root = (0, react.useRef)(null);
7172
+ const trigger = (0, react.useRef)(null);
7173
+ const panel = (0, react.useRef)(null);
7174
+ const panelId = (0, react.useId)();
7175
+ const visible = open && !hidden;
7176
+ const position = (0, _deepseek_ai_dsh_client_ui_primitives.useAnchoredPosition)({
7177
+ open: visible,
7178
+ anchorRef: trigger,
7179
+ panelRef: panel,
7180
+ side: "bottom",
7181
+ align: "end",
7182
+ gap: 8,
7183
+ margin: 8
7184
+ });
7185
+ (0, _deepseek_ai_dsh_client_ui_primitives.useDismissOnOutsidePointer)(root, visible, setOpen, panel);
7186
+ (0, react.useEffect)(() => {
7187
+ const timestamp = Date.now();
7188
+ clocks.current = activityClocks(clocks.current, presentations, timestamp);
7189
+ setNow(timestamp);
7190
+ }, [presentations]);
7191
+ (0, react.useEffect)(() => {
7192
+ if (hidden) setOpen(false);
7193
+ }, [hidden]);
7194
+ (0, react.useEffect)(() => {
7195
+ if (!visible) return;
7196
+ const timer = window.setInterval(() => setNow(Date.now()), 1e3);
7197
+ const dismiss = (event) => {
7198
+ if (event.key === "Escape") {
7199
+ event.preventDefault();
7200
+ setOpen(false);
7201
+ trigger.current?.focus();
7202
+ }
7203
+ };
7204
+ document.addEventListener("keydown", dismiss);
7205
+ return () => {
7206
+ window.clearInterval(timer);
7207
+ document.removeEventListener("keydown", dismiss);
7208
+ };
7209
+ }, [visible]);
7210
+ (0, react.useEffect)(() => {
7211
+ if (visible && position !== null) panel.current?.focus();
7212
+ }, [visible, position === null]);
7213
+ const hasActivity = entries.length > 0;
7214
+ return (0, react_jsx_runtime.jsxs)("span", {
7215
+ ref: root,
7216
+ className: worktree_css_default.activityBell,
7217
+ children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
7218
+ label: t("activity.title"),
7219
+ side: "bottom",
7220
+ delayMs: 500,
7221
+ disabled: visible,
7222
+ children: (0, react_jsx_runtime.jsxs)("button", {
7223
+ ref: trigger,
7224
+ type: "button",
7225
+ className: worktree_css_default.iconButton,
7226
+ "aria-label": hasActivity ? t("activity.count", { n: entries.length }) : t("activity.title"),
7227
+ "aria-expanded": visible,
7228
+ "aria-haspopup": "dialog",
7229
+ "aria-controls": visible ? panelId : void 0,
7230
+ "data-session-activity": hasActivity ? "active" : "empty",
7231
+ onClick: () => {
7232
+ setNow(Date.now());
7233
+ setOpen((value) => !value);
7234
+ },
7235
+ children: [(0, react_jsx_runtime.jsx)("svg", {
7236
+ width: "16",
7237
+ height: "16",
7238
+ viewBox: "0 0 16 16",
7239
+ fill: "none",
7240
+ stroke: "currentColor",
7241
+ strokeWidth: "1.25",
7242
+ strokeLinecap: "round",
7243
+ strokeLinejoin: "round",
7244
+ "aria-hidden": "true",
7245
+ children: (0, react_jsx_runtime.jsx)("path", { d: "M6.25 13a1.8 1.8 0 0 0 3.5 0M2.5 11.5c1-1 1.25-2 1.25-4.5a4.25 4.25 0 0 1 8.5 0c0 2.5.25 3.5 1.25 4.5Z" })
7246
+ }), hasActivity && (0, react_jsx_runtime.jsx)("span", {
7247
+ className: worktree_css_default.activityBadge,
7248
+ "aria-hidden": "true"
7249
+ })]
7250
+ })
7251
+ }), visible && (0, react_dom.createPortal)((0, react_jsx_runtime.jsxs)(_deepseek_ai_dsh_client_ui_primitives.MenuSurface, {
7252
+ ref: panel,
7253
+ id: panelId,
7254
+ role: "dialog",
7255
+ "aria-label": t("activity.title"),
7256
+ tabIndex: -1,
7257
+ className: worktree_css_default.activityPanel,
7258
+ style: {
7259
+ ...position,
7260
+ visibility: position === null ? "hidden" : void 0
7261
+ },
7262
+ onBlur: (event) => {
7263
+ const next = event.relatedTarget;
7264
+ if (next instanceof Node && !event.currentTarget.contains(next) && !root.current?.contains(next)) setOpen(false);
7265
+ },
7266
+ children: [(0, react_jsx_runtime.jsx)("div", {
7267
+ className: worktree_css_default.activityHeading,
7268
+ children: t("activity.title")
7269
+ }), entries.length === 0 ? (0, react_jsx_runtime.jsx)("p", {
7270
+ className: worktree_css_default.activityEmpty,
7271
+ children: t("activity.empty")
7272
+ }) : (0, react_jsx_runtime.jsx)("ul", {
7273
+ className: worktree_css_default.activityList,
7274
+ children: entries.map((entry) => {
7275
+ const { sessionId, presentation } = entry;
7276
+ const status = sessionStatusLabel(t, presentation.status);
7277
+ const since = clocks.current.get(sessionId)?.since ?? presentation.updatedAt;
7278
+ const time = relativeTime(since, now);
7279
+ const duration = since === void 0 ? void 0 : Math.max(0, Math.floor((now - since) / 1e3));
7280
+ const timeLabel = time === void 0 ? void 0 : presentation.ongoing ? t("activity.runningFor", { t: duration !== void 0 && duration < 60 ? t("activity.seconds", { n: duration }) : sessionTimeLabel(t, time) }) : sessionHoverTimeLabel(t, time);
7281
+ return (0, react_jsx_runtime.jsx)("li", { children: (0, react_jsx_runtime.jsxs)("button", {
7282
+ type: "button",
7283
+ className: worktree_css_default.activityEntry,
7284
+ "data-activity-session": sessionId,
7285
+ onClick: () => {
7286
+ setOpen(false);
7287
+ onOpenSession(entry.workspaceId, sessionId);
7288
+ },
7289
+ children: [(0, react_jsx_runtime.jsxs)("span", {
7290
+ className: worktree_css_default.activityIdentity,
7291
+ children: [
7292
+ (0, react_jsx_runtime.jsx)("span", {
7293
+ className: worktree_css_default.activityName,
7294
+ children: sessionDisplayLabel(sessionId, sessions, t("session.new"))
7295
+ }),
7296
+ (0, react_jsx_runtime.jsx)("span", {
7297
+ className: worktree_css_default.activityContext,
7298
+ title: entry.workspaceTitle,
7299
+ children: entry.workspaceTitle
7300
+ }),
7301
+ (0, react_jsx_runtime.jsx)("span", {
7302
+ className: worktree_css_default.activityContext,
7303
+ title: entry.worktree ?? void 0,
7304
+ children: entry.worktree === null ? t("worktree.main") : entry.worktree ?? t("activity.unknownWorktree")
7305
+ })
7306
+ ]
7307
+ }), (0, react_jsx_runtime.jsxs)("span", {
7308
+ className: worktree_css_default.activityMetadata,
7309
+ children: [(0, react_jsx_runtime.jsx)("span", {
7310
+ role: "img",
7311
+ "aria-label": status,
7312
+ title: status,
7313
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: presentation.status.state })
7314
+ }), timeLabel !== void 0 && (0, react_jsx_runtime.jsx)("span", {
7315
+ className: worktree_css_default.activityTime,
7316
+ children: timeLabel
7317
+ })]
7318
+ })]
7319
+ }) }, sessionId);
7320
+ })
7321
+ })]
7322
+ }), document.body)]
7323
+ });
7324
+ }
7325
+ //#endregion
6979
7326
  //#region lib/client/surface/components/SurfaceHeader.js
6980
- function SurfaceHeader({ expansion, props, source, read, mutation }) {
7327
+ function SurfaceHeader({ expansion, props, source, read, mutation, onOpenSession }) {
6981
7328
  const { searchExpanded, searchRoot, setSearchExpanded, searchInput, searchQuery, setSearchQuery, setExpandedArchivedWorkspaces, setExpandedSessionGroups, setCurrentSessionReveal, currentSessionLocation } = expansion;
6982
7329
  const { t, expandState, createWorkspace, actions } = props;
6983
7330
  const { workspaceIds } = source;
@@ -7058,6 +7405,14 @@ window.__ModuleLoader__.load({
7058
7405
  (0, react_jsx_runtime.jsxs)("div", {
7059
7406
  className: cx(worktree_css_default.headerActions, searchExpanded && worktree_css_default.headerActionsHidden),
7060
7407
  children: [
7408
+ (0, react_jsx_runtime.jsx)(SessionActivityBell, {
7409
+ entries: activeSessions(source.sessions, source.sessionPresentations, source.workspaces, readState.views),
7410
+ sessions: source.sessions,
7411
+ presentations: source.sessionPresentations,
7412
+ t,
7413
+ hidden: searchExpanded || source.collapsed || !source.bounds.ready,
7414
+ onOpenSession
7415
+ }),
7061
7416
  (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
7062
7417
  label: t("workspace.collapseAll"),
7063
7418
  side: "bottom",
@@ -8565,7 +8920,7 @@ window.__ModuleLoader__.load({
8565
8920
  });
8566
8921
  const selectedWorkspaceIds = [...currentWorkspaceIds];
8567
8922
  for (const workspaceId of selectedWorkspaceIds) viewReader.invalidate(workspaceId);
8568
- const contextRefresh = options.invalidateContext === false ? void 0 : invalidateWorktreeContext?.();
8923
+ const contextRefresh = options.invalidateContext === false ? void 0 : invalidateWorktreeContext?.(void 0, { alreadyInvalidated: true });
8569
8924
  await refreshGuard.current.run(async () => {
8570
8925
  const [views] = await Promise.all([viewReader.readMany(selectedWorkspaceIds), contextRefresh ?? Promise.resolve()]);
8571
8926
  return views;
@@ -8592,8 +8947,11 @@ window.__ModuleLoader__.load({
8592
8947
  if (selectedWorkspaceIds.length === 0) return;
8593
8948
  await Promise.allSettled(selectedWorkspaceIds.map(async (workspaceId) => {
8594
8949
  const guard = guardFor(workspaceId);
8595
- if (!options.alreadyInvalidated) viewReader.invalidate(workspaceId, { reuseInFlight: options.reuseInFlight });
8596
- const contextRefresh = options.invalidateContext === false ? void 0 : invalidateWorktreeContext?.(workspaceId);
8950
+ if (!options.alreadyInvalidated) viewReader.invalidate(workspaceId, {
8951
+ reuseInFlight: options.reuseInFlight,
8952
+ changeId: options.changeId
8953
+ });
8954
+ const contextRefresh = options.invalidateContext === false ? void 0 : invalidateWorktreeContext?.(workspaceId, { alreadyInvalidated: true });
8597
8955
  const generation = guard.begin();
8598
8956
  try {
8599
8957
  const view = await viewReader.read(workspaceId);
@@ -9501,31 +9859,6 @@ window.__ModuleLoader__.load({
9501
9859
  };
9502
9860
  }
9503
9861
  //#endregion
9504
- //#region lib/client/session/session-labels.js
9505
- /** Localize the native-compatible Session status used by both surfaces. */
9506
- function sessionStatusLabel(t, status) {
9507
- switch (status.labelKey) {
9508
- case "running": return t("session.status.running");
9509
- case "subagentsRunning": return t(status.runningSubagentCount === 1 ? "session.status.subagentsRunning.one" : "session.status.subagentsRunning.other", { n: status.runningSubagentCount });
9510
- case "idle": return t("session.status.idle");
9511
- case "waitingApproval": return t("session.status.waitingApproval");
9512
- case "planReview": return t("session.status.planReview");
9513
- case "waitingAnswer": return t("session.status.waitingAnswer");
9514
- case "completed": return t("session.status.completed");
9515
- }
9516
- }
9517
- /** Localize the compact relative time shown for idle Sessions. */
9518
- function sessionTimeLabel(t, value) {
9519
- switch (value.unit) {
9520
- case "now": return t("session.time.now");
9521
- case "minutes": return t("session.time.minutes", { n: value.n });
9522
- case "hours": return t("session.time.hours", { n: value.n });
9523
- case "days": return t("session.time.days", { n: value.n });
9524
- case "months": return t("session.time.months", { n: value.n });
9525
- case "years": return t("session.time.years", { n: value.n });
9526
- }
9527
- }
9528
- //#endregion
9529
9862
  //#region lib/client/dashboard/vscode-url.js
9530
9863
  /** Encode path segments while retaining Windows drive and directory separators. */
9531
9864
  function vscodeFolderUrl(absolutePath) {
@@ -9603,14 +9936,14 @@ window.__ModuleLoader__.load({
9603
9936
  };
9604
9937
  const defaultOpenInAppController = new OpenInAppController();
9605
9938
  //#endregion
9606
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_ef7f6cd81f87/packages/clutch-dsh-worktree/src/client/dashboard/open-in-app.css.mjs
9607
- const css$3 = ".-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";
9608
- const styleId$3 = "@cerbur/clutch-dsh-worktree/open-in-app.css";
9939
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_49c1cce49fdb/packages/clutch-dsh-worktree/src/client/dashboard/open-in-app.css.mjs
9940
+ 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";
9941
+ const styleId$4 = "@cerbur/clutch-dsh-worktree/open-in-app.css";
9609
9942
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/open-in-app.css\"]") === null) {
9610
9943
  const tag = document.createElement("style");
9611
9944
  tag.dataset.plugin = "@cerbur/clutch-dsh-worktree";
9612
- tag.dataset.pluginCss = styleId$3;
9613
- tag.textContent = css$3;
9945
+ tag.dataset.pluginCss = styleId$4;
9946
+ tag.textContent = css$4;
9614
9947
  document.head.appendChild(tag);
9615
9948
  }
9616
9949
  var open_in_app_css_default = {
@@ -9814,14 +10147,14 @@ window.__ModuleLoader__.load({
9814
10147
  };
9815
10148
  }
9816
10149
  //#endregion
9817
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_ef7f6cd81f87/packages/clutch-dsh-worktree/src/client/dashboard/dashboard.css.mjs
9818
- const css$2 = ".-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-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-dashboardHeaderAside .-cerbur-clutch-dsh-worktree-dashboardFacts > div {\n padding: 4px 0;\n border: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHistorical {\n color: var(--dsw-alias-label-secondary, #788191);\n}\n.-cerbur-clutch-dsh-worktree-dashboardIconButton:disabled {\n color: var(--dsw-alias-label-secondary, #788191);\n cursor: not-allowed;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineModal {\n box-sizing: border-box;\n width: min(440px, calc(100vw - 48px));\n max-height: calc(100vh - 48px);\n max-height: calc(100dvh - 48px);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineModalContent {\n box-sizing: border-box;\n min-height: 0;\n overflow-y: auto;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselinePicker {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 100%;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardLink {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n width: 100%;\n background: transparent;\n border: 1px solid var(--dsw-alias-border-l3, #e2e6ed);\n border-radius: 6px;\n padding: 7px 10px;\n font-size: 12px !important;\n color: inherit;\n cursor: pointer;\n margin-top: 8px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardLink:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f5f7fa);\n}\n.-cerbur-clutch-dsh-worktree-dashboardQuickActions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 16px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardQuickActions .-cerbur-clutch-dsh-worktree-dashboardButton {\n justify-content: flex-start;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 390px;\n padding: 40px 24px;\n text-align: center;\n border: 1px dashed var(--dsw-alias-border-l3, #dde3ec);\n border-radius: 11px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder > svg {\n width: 36px;\n height: 36px;\n color: #7c9bcf;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder h2 {\n font-size: 20px;\n font-weight: 600;\n margin: 16px 0 4px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder p {\n max-width: 420px;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary, #7b8596);\n margin: 8px 0 18px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFooter {\n margin: 23px 0 0;\n text-align: center;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary, #8a92a0);\n}\n\n@container (max-width: 820px) {\n .-cerbur-clutch-dsh-worktree-dashboardPage {\n padding: 20px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardHeader {\n grid-template-columns: minmax(0, 1fr);\n gap: 12px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardHeaderAside {\n display: flex;\n }\n .-cerbur-clutch-dsh-worktree-dashboardGrid {\n grid-template-columns: minmax(0, 1fr);\n }\n .-cerbur-clutch-dsh-worktree-dashboardTabs {\n gap: 18px;\n }\n}\n\n@container (max-width: 440px) {\n .-cerbur-clutch-dsh-worktree-dashboardPage {\n padding: 16px 12px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardTitleRow h1 {\n font-size: 22px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardStartActions {\n grid-template-columns: minmax(0, 1fr);\n }\n .-cerbur-clutch-dsh-worktree-dashboardCard,\n .-cerbur-clutch-dsh-worktree-dashboardStart {\n padding: 16px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardTopline {\n gap: 10px;\n }\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionsText {\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n max-height: 240px;\n overflow: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardInstructionsInput {\n box-sizing: border-box;\n width: 100%;\n resize: vertical;\n padding: 10px;\n border: 1px solid var(--dsw-alias-border-l4);\n border-radius: 8px;\n background: var(--dsw-alias-bg-base);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardInstructionActions {\n display: flex;\n gap: 8px;\n margin-top: 8px;\n}\n";
9819
- const styleId$2 = "@cerbur/clutch-dsh-worktree/dashboard.css";
10150
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_49c1cce49fdb/packages/clutch-dsh-worktree/src/client/dashboard/dashboard.css.mjs
10151
+ 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.-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-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";
10152
+ const styleId$3 = "@cerbur/clutch-dsh-worktree/dashboard.css";
9820
10153
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard.css\"]") === null) {
9821
10154
  const tag = document.createElement("style");
9822
10155
  tag.dataset.plugin = "@cerbur/clutch-dsh-worktree";
9823
- tag.dataset.pluginCss = styleId$2;
9824
- tag.textContent = css$2;
10156
+ tag.dataset.pluginCss = styleId$3;
10157
+ tag.textContent = css$3;
9825
10158
  document.head.appendChild(tag);
9826
10159
  }
9827
10160
  var dashboard_css_default = {
@@ -9832,6 +10165,8 @@ window.__ModuleLoader__.load({
9832
10165
  "dashboardSessions": "-cerbur-clutch-dsh-worktree-dashboardSessions",
9833
10166
  "dashboardSessionLabel": "-cerbur-clutch-dsh-worktree-dashboardSessionLabel",
9834
10167
  "dashboardSessionMeta": "-cerbur-clutch-dsh-worktree-dashboardSessionMeta",
10168
+ "dashboardChildPath": "-cerbur-clutch-dsh-worktree-dashboardChildPath",
10169
+ "dashboardChildState": "-cerbur-clutch-dsh-worktree-dashboardChildState",
9835
10170
  "dashboardSessionStatus": "-cerbur-clutch-dsh-worktree-dashboardSessionStatus",
9836
10171
  "dashboardSessionTime": "-cerbur-clutch-dsh-worktree-dashboardSessionTime",
9837
10172
  "dashboardStartActions": "-cerbur-clutch-dsh-worktree-dashboardStartActions",
@@ -9860,7 +10195,10 @@ window.__ModuleLoader__.load({
9860
10195
  "dashboardEmpty": "-cerbur-clutch-dsh-worktree-dashboardEmpty",
9861
10196
  "dashboardFacts": "-cerbur-clutch-dsh-worktree-dashboardFacts",
9862
10197
  "dashboardFactAction": "-cerbur-clutch-dsh-worktree-dashboardFactAction",
10198
+ "dashboardHeaderFacts": "-cerbur-clutch-dsh-worktree-dashboardHeaderFacts",
9863
10199
  "dashboardHistorical": "-cerbur-clutch-dsh-worktree-dashboardHistorical",
10200
+ "dashboardSyncOptions": "-cerbur-clutch-dsh-worktree-dashboardSyncOptions",
10201
+ "dashboardBaseLink": "-cerbur-clutch-dsh-worktree-dashboardBaseLink",
9864
10202
  "dashboardBaselineModal": "-cerbur-clutch-dsh-worktree-dashboardBaselineModal",
9865
10203
  "dashboardBaselineModalContent": "-cerbur-clutch-dsh-worktree-dashboardBaselineModalContent",
9866
10204
  "dashboardBaselinePicker": "-cerbur-clutch-dsh-worktree-dashboardBaselinePicker",
@@ -10115,14 +10453,14 @@ window.__ModuleLoader__.load({
10115
10453
  });
10116
10454
  }
10117
10455
  //#endregion
10118
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_ef7f6cd81f87/packages/clutch-dsh-worktree/src/client/dashboard/git/worktree-git.css.mjs
10119
- const css$1 = ".-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";
10120
- const styleId$1 = "@cerbur/clutch-dsh-worktree/worktree-git.css";
10456
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_49c1cce49fdb/packages/clutch-dsh-worktree/src/client/dashboard/git/worktree-git.css.mjs
10457
+ 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";
10458
+ const styleId$2 = "@cerbur/clutch-dsh-worktree/worktree-git.css";
10121
10459
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree-git.css\"]") === null) {
10122
10460
  const tag = document.createElement("style");
10123
10461
  tag.dataset.plugin = "@cerbur/clutch-dsh-worktree";
10124
- tag.dataset.pluginCss = styleId$1;
10125
- tag.textContent = css$1;
10462
+ tag.dataset.pluginCss = styleId$2;
10463
+ tag.textContent = css$2;
10126
10464
  document.head.appendChild(tag);
10127
10465
  }
10128
10466
  var worktree_git_css_default = {
@@ -12292,14 +12630,14 @@ window.__ModuleLoader__.load({
12292
12630
  });
12293
12631
  }
12294
12632
  //#endregion
12295
- //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_ef7f6cd81f87/packages/clutch-dsh-worktree/src/client/settings/settings.css.mjs
12296
- const css = ".-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";
12297
- const styleId = "@cerbur/clutch-dsh-worktree/settings.css";
12633
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_49c1cce49fdb/packages/clutch-dsh-worktree/src/client/settings/settings.css.mjs
12634
+ 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";
12635
+ const styleId$1 = "@cerbur/clutch-dsh-worktree/settings.css";
12298
12636
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/settings.css\"]") === null) {
12299
12637
  const tag = document.createElement("style");
12300
12638
  tag.dataset.plugin = "@cerbur/clutch-dsh-worktree";
12301
- tag.dataset.pluginCss = styleId;
12302
- tag.textContent = css;
12639
+ tag.dataset.pluginCss = styleId$1;
12640
+ tag.textContent = css$1;
12303
12641
  document.head.appendChild(tag);
12304
12642
  }
12305
12643
  var settings_css_default = {
@@ -12477,6 +12815,45 @@ window.__ModuleLoader__.load({
12477
12815
  "children",
12478
12816
  "settings"
12479
12817
  ];
12818
+ /** getRandomValues is also available on plain-HTTP LAN origins. */
12819
+ function createSyncRequestId() {
12820
+ return "sync:" + Array.from(globalThis.crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(16)), (byte) => byte.toString(16).padStart(2, "0")).join("");
12821
+ }
12822
+ function baselineSyncFailureNotices(record, requestId, result, t, onOpenSession) {
12823
+ if (result.status === "dispatched") return [];
12824
+ const status = result.status;
12825
+ const context = record.branch + " · " + record.absolutePath;
12826
+ return [{
12827
+ key: JSON.stringify([
12828
+ "sync",
12829
+ record.workspaceId,
12830
+ record.worktreeId,
12831
+ requestId,
12832
+ result.sessionId
12833
+ ]),
12834
+ context,
12835
+ error: {
12836
+ code: "WORKTREE_SYNC_PARTIAL",
12837
+ message: result.error ?? "",
12838
+ retryable: false,
12839
+ details: {
12840
+ workspaceId: record.workspaceId,
12841
+ worktreeId: record.worktreeId,
12842
+ requestId,
12843
+ sessionId: result.sessionId,
12844
+ status
12845
+ }
12846
+ },
12847
+ text: t(`dashboard.sync.${status}`) + " " + t("dashboard.sync.partial"),
12848
+ message: (translate) => translate(`dashboard.sync.${status}`) + " " + translate("dashboard.sync.partial"),
12849
+ describe: (translate) => translate("dashboard.action.sync") + " · " + context,
12850
+ actions: onOpenSession === void 0 ? [] : [{
12851
+ label: t("dashboard.sync.openSession"),
12852
+ leaveSettings: true,
12853
+ onClick: () => onOpenSession(result.sessionId)
12854
+ }]
12855
+ }];
12856
+ }
12480
12857
  function DashboardIcon({ kind }) {
12481
12858
  return (0, react_jsx_runtime.jsx)("svg", {
12482
12859
  viewBox: "0 0 24 24",
@@ -12519,16 +12896,7 @@ window.__ModuleLoader__.load({
12519
12896
  })
12520
12897
  ] });
12521
12898
  }
12522
- function PlaceholderButton({ children, t }) {
12523
- return (0, react_jsx_runtime.jsx)("button", {
12524
- type: "button",
12525
- className: dashboard_css_default.dashboardButton,
12526
- disabled: true,
12527
- title: t("dashboard.soon"),
12528
- children
12529
- });
12530
- }
12531
- function WorktreeBaselineEditor({ value, branches, loading, currentBranch, onSave, onFetch, onLoad, t, disabled, context }) {
12899
+ function WorktreeBaselineEditor({ value, renderValue, branches, loading, currentBranch, onSave, onFetch, onLoad, t, disabled, context }) {
12532
12900
  const [saved, setSaved] = (0, react.useState)(value);
12533
12901
  const [draft, setDraft] = (0, react.useState)();
12534
12902
  const [pending, setPending] = (0, react.useState)(false);
@@ -12638,7 +13006,7 @@ window.__ModuleLoader__.load({
12638
13006
  children: (0, react_jsx_runtime.jsx)(IconEditOutline16, {})
12639
13007
  })
12640
13008
  }) : void 0,
12641
- children: saved === void 0 ? (0, react_jsx_runtime.jsx)("span", {
13009
+ children: renderValue !== void 0 ? renderValue(saved) : saved === void 0 ? (0, react_jsx_runtime.jsx)("span", {
12642
13010
  className: dashboard_css_default.dashboardHistorical,
12643
13011
  children: t("dashboard.historicalUnavailable")
12644
13012
  }) : (0, react_jsx_runtime.jsx)("span", {
@@ -12703,7 +13071,7 @@ window.__ModuleLoader__.load({
12703
13071
  })] });
12704
13072
  }
12705
13073
  /** A managed Worktree or browser Main projection with explicit unavailable states for inapplicable facts. */
12706
- function WorktreeDashboard({ manager, record, workspaceTitle, t, onClose, onOpenSidebar, isRightSidebarExpanded, sessions, sessionPresentations, sessionIds, actionPending, onOpenSession, onCreateSession, onCreateWorktree, onArchiveWorktree, onOpenFile, onSaveInstructions, onSaveBaseline, onFetchBranches, onLoadBranches, branches = [], branchesLoading = false }) {
13074
+ function WorktreeDashboard({ manager, record, worktrees = [], mainRecord, onOpenWorktree, workspaceTitle, t, onClose, onOpenSidebar, isRightSidebarExpanded, sessions, sessionPresentations, sessionIds, actionPending, onOpenSession, onCreateSession, onCreateWorktree, onArchiveWorktree, onSyncBaseline, onOpenFile, onSaveInstructions, onSaveBaseline, onFetchBranches, onLoadBranches, branches = [], branchesLoading = false }) {
12707
13075
  const surface = (0, react.useRef)(null);
12708
13076
  const heading = (0, react.useRef)(null);
12709
13077
  const [placement, setPlacement] = (0, react.useState)();
@@ -12798,6 +13166,89 @@ window.__ModuleLoader__.load({
12798
13166
  return result;
12799
13167
  };
12800
13168
  const displayedBaseline = onSaveBaseline === void 0 ? record.baseBranch : baselineBranch;
13169
+ const [syncOpen, setSyncOpen] = (0, react.useState)(false);
13170
+ const [syncStrategy, setSyncStrategy] = (0, react.useState)("rebase");
13171
+ const [syncPending, setSyncPending] = (0, react.useState)(false);
13172
+ const [syncError, setSyncError] = (0, react.useState)();
13173
+ const [syncResult, setSyncResult] = (0, react.useState)();
13174
+ const syncRequest = (0, react.useRef)();
13175
+ const syncBusy = (0, react.useRef)(false);
13176
+ const syncGeneration = (0, react.useRef)(0);
13177
+ (0, react.useEffect)(() => {
13178
+ syncGeneration.current++;
13179
+ syncBusy.current = false;
13180
+ syncRequest.current = void 0;
13181
+ setSyncOpen(false);
13182
+ setSyncPending(false);
13183
+ setSyncError(void 0);
13184
+ setSyncResult(void 0);
13185
+ return () => {
13186
+ syncGeneration.current++;
13187
+ };
13188
+ }, [
13189
+ record.workspaceId,
13190
+ record.worktreeId,
13191
+ displayedBaseline,
13192
+ manager
13193
+ ]);
13194
+ const closeSync = () => {
13195
+ if (syncBusy.current) return;
13196
+ syncGeneration.current++;
13197
+ setSyncOpen(false);
13198
+ };
13199
+ const startSync = async () => {
13200
+ if (syncBusy.current || syncResult || !onSyncBaseline || !displayedBaseline) return;
13201
+ const generation = syncGeneration.current;
13202
+ syncBusy.current = true;
13203
+ setSyncPending(true);
13204
+ setSyncError(void 0);
13205
+ let requestId = syncRequest.current;
13206
+ try {
13207
+ requestId ??= createSyncRequestId();
13208
+ syncRequest.current = requestId;
13209
+ const result = await onSyncBaseline(syncStrategy, displayedBaseline, requestId);
13210
+ if (generation !== syncGeneration.current) {
13211
+ if (result.status !== "dispatched") worktreeDiagnostics.recordInactive("sync:" + requestId, baselineSyncFailureNotices(record, requestId, result, t));
13212
+ return;
13213
+ }
13214
+ setSyncResult(result);
13215
+ if (result.status === "dispatched") {
13216
+ setSyncOpen(false);
13217
+ onOpenSession(result.sessionId);
13218
+ }
13219
+ } catch (cause) {
13220
+ if (generation === syncGeneration.current) setSyncError(toWorktreeViewError(cause));
13221
+ } finally {
13222
+ if (generation === syncGeneration.current) {
13223
+ syncBusy.current = false;
13224
+ setSyncPending(false);
13225
+ }
13226
+ }
13227
+ };
13228
+ const partialSync = syncResult !== void 0 && syncResult.status !== "dispatched" ? {
13229
+ ...syncResult,
13230
+ status: syncResult.status
13231
+ } : void 0;
13232
+ const renderBaseline = (value) => {
13233
+ const label = value === void 0 ? (0, react_jsx_runtime.jsx)("span", {
13234
+ className: dashboard_css_default.dashboardHistorical,
13235
+ children: t("dashboard.historicalUnavailable")
13236
+ }) : (0, react_jsx_runtime.jsx)("span", {
13237
+ "data-dashboard-baseline-value": true,
13238
+ title: value,
13239
+ children: value.replace(/^refs\/(heads|remotes)\//u, "")
13240
+ });
13241
+ const base = selectBaseWorktree(record, worktrees, mainRecord, value);
13242
+ return base === void 0 || onOpenWorktree === void 0 ? label : (0, react_jsx_runtime.jsxs)("button", {
13243
+ type: "button",
13244
+ className: dashboard_css_default.dashboardBaseLink,
13245
+ "data-dashboard-base-worktree": base.worktreeId,
13246
+ "aria-label": t("dashboard.openBaseWorktree"),
13247
+ title: t("dashboard.openBaseWorktree"),
13248
+ onClick: () => onOpenWorktree(base),
13249
+ children: [label, (0, react_jsx_runtime.jsx)(IconChevronRightOutline14, {})]
13250
+ });
13251
+ };
12801
13252
  const gitOverview = useWorktreeGitOverview({
12802
13253
  manager,
12803
13254
  workspaceId: record.workspaceId,
@@ -12809,9 +13260,43 @@ window.__ModuleLoader__.load({
12809
13260
  const acquisitionFacts = selectWorktreeAcquisitionFacts(record);
12810
13261
  const acquisitionLabel = acquisitionFacts.timestampKind === "imported" ? "dashboard.imported" : "dashboard.created";
12811
13262
  const tabLabel = (value) => t(`dashboard.tab.${value}`);
12812
- const placeholder = (0, react_jsx_runtime.jsx)("span", {
12813
- className: dashboard_css_default.dashboardSoon,
12814
- children: t("dashboard.soon")
13263
+ const derivedWorktrees = selectDerivedWorktrees(record, worktrees);
13264
+ const worktreeList = (records) => records.length === 0 ? (0, react_jsx_runtime.jsx)("div", {
13265
+ className: dashboard_css_default.dashboardEmpty,
13266
+ children: (0, react_jsx_runtime.jsx)("p", { children: t("dashboard.noChildren") })
13267
+ }) : (0, react_jsx_runtime.jsx)("ul", {
13268
+ className: dashboard_css_default.dashboardSessions,
13269
+ children: records.map((child) => (0, react_jsx_runtime.jsx)("li", { children: (0, react_jsx_runtime.jsxs)("button", {
13270
+ type: "button",
13271
+ "data-dashboard-worktree": child.worktreeId,
13272
+ disabled: onOpenWorktree === void 0,
13273
+ onClick: () => onOpenWorktree?.(child),
13274
+ children: [
13275
+ (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
13276
+ (0, react_jsx_runtime.jsxs)("span", {
13277
+ className: dashboard_css_default.dashboardSessionLabel,
13278
+ children: [(0, react_jsx_runtime.jsx)("strong", { children: child.currentHead?.name ?? child.currentBranch ?? child.branch }), (0, react_jsx_runtime.jsx)("code", {
13279
+ className: dashboard_css_default.dashboardChildPath,
13280
+ children: child.absolutePath
13281
+ })]
13282
+ }),
13283
+ (0, react_jsx_runtime.jsxs)("span", {
13284
+ className: dashboard_css_default.dashboardChildState,
13285
+ children: [child.status === "removed" && (0, react_jsx_runtime.jsx)("span", {
13286
+ className: dashboard_css_default.dashboardSoon,
13287
+ children: t("dashboard.archived")
13288
+ }), (0, react_jsx_runtime.jsx)("span", {
13289
+ className: dashboard_css_default.dashboardHealth,
13290
+ "data-health": child.health ?? "unknown",
13291
+ children: t(child.health === "ready" ? "worktree.ready" : child.health === "repair" ? "worktree.repair" : child.health === "recovery-needed" ? "worktree.recovery" : child.health === "branch-drift" ? "worktree.branchDrift" : child.health === "cleaned" ? "dashboard.cleaned" : "dashboard.unknown")
13292
+ })]
13293
+ }),
13294
+ (0, react_jsx_runtime.jsx)("span", {
13295
+ "aria-hidden": "true",
13296
+ children: "→"
13297
+ })
13298
+ ]
13299
+ }) }, child.worktreeId))
12815
13300
  });
12816
13301
  const selectTab = (next, focus = false) => {
12817
13302
  setTab(next);
@@ -12891,409 +13376,472 @@ window.__ModuleLoader__.load({
12891
13376
  onKeyDown: (event) => {
12892
13377
  if (event.defaultPrevented) return;
12893
13378
  if (event.key === "Escape") {
13379
+ if (syncOpen) return;
12894
13380
  if (event.target?.closest?.("[data-single-select-picker]")) return;
12895
13381
  if (event.currentTarget.querySelector("[role=\"menu\"]")) return;
12896
13382
  event.stopPropagation();
12897
13383
  onClose();
12898
13384
  }
12899
13385
  },
12900
- children: [(0, react_jsx_runtime.jsxs)("header", {
12901
- className: dashboard_css_default.dashboardTopline,
12902
- "data-dashboard-topbar": true,
12903
- "data-window-drag": true,
12904
- children: [(0, react_jsx_runtime.jsxs)("span", {
12905
- title: `${workspaceTitle}/${displayBranch}`,
12906
- style: { marginInlineStart: `max(0px, calc(var(--dsh-frame-leading-clearance, 0px) - ${placement?.left ?? 0}px - 20px))` },
12907
- children: [
12908
- workspaceTitle,
12909
- (0, react_jsx_runtime.jsx)("span", {
12910
- "aria-hidden": "true",
12911
- children: " / "
12912
- }),
12913
- displayBranch
12914
- ]
12915
- }), (0, react_jsx_runtime.jsxs)("div", {
12916
- className: dashboard_css_default.dashboardToplineActions,
12917
- children: [
12918
- (0, react_jsx_runtime.jsx)(OpenInAppButton, {
12919
- path: record.absolutePath,
12920
- t
12921
- }),
12922
- (0, react_jsx_runtime.jsx)("button", {
12923
- type: "button",
12924
- className: dashboard_css_default.dashboardButton,
12925
- "aria-label": t(topActionIsCreateSession ? "dashboard.newSession" : "dashboard.back"),
12926
- onClick: () => {
12927
- if (topActionIsCreateSession) onCreateSession?.();
12928
- else onClose();
12929
- },
12930
- children: topActionIsCreateSession ? t("dashboard.newSession") : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: ["← ", t("dashboard.back")] })
12931
- }),
12932
- !rightSidebarOpen && onOpenSidebar !== void 0 && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
12933
- label: t("dashboard.openSidebar"),
12934
- side: "bottom",
12935
- delayMs: 500,
12936
- children: (0, react_jsx_runtime.jsx)("button", {
13386
+ children: [
13387
+ (0, react_jsx_runtime.jsxs)("header", {
13388
+ className: dashboard_css_default.dashboardTopline,
13389
+ "data-dashboard-topbar": true,
13390
+ "data-window-drag": true,
13391
+ children: [(0, react_jsx_runtime.jsxs)("span", {
13392
+ title: `${workspaceTitle}/${displayBranch}`,
13393
+ style: { marginInlineStart: `max(0px, calc(var(--dsh-frame-leading-clearance, 0px) - ${placement?.left ?? 0}px - 20px))` },
13394
+ children: [
13395
+ workspaceTitle,
13396
+ (0, react_jsx_runtime.jsx)("span", {
13397
+ "aria-hidden": "true",
13398
+ children: " / "
13399
+ }),
13400
+ displayBranch
13401
+ ]
13402
+ }), (0, react_jsx_runtime.jsxs)("div", {
13403
+ className: dashboard_css_default.dashboardToplineActions,
13404
+ children: [
13405
+ (0, react_jsx_runtime.jsx)(OpenInAppButton, {
13406
+ path: record.absolutePath,
13407
+ t
13408
+ }),
13409
+ (0, react_jsx_runtime.jsx)("button", {
12937
13410
  type: "button",
12938
- className: dashboard_css_default.dashboardSidebarButton,
12939
- "aria-label": t("dashboard.openSidebar"),
12940
- title: t("dashboard.openSidebar"),
12941
- "data-sidebar-right-expand": true,
13411
+ className: dashboard_css_default.dashboardButton,
13412
+ "aria-label": t(topActionIsCreateSession ? "dashboard.newSession" : "dashboard.back"),
12942
13413
  onClick: () => {
12943
- onOpenSidebar();
12944
- setRightSidebarOpen(true);
13414
+ if (topActionIsCreateSession) onCreateSession?.();
13415
+ else onClose();
12945
13416
  },
12946
- children: (0, react_jsx_runtime.jsx)(IconPanelLeftOutline16, {})
12947
- })
12948
- })
12949
- ]
12950
- })]
12951
- }), (0, react_jsx_runtime.jsxs)("div", {
12952
- className: dashboard_css_default.dashboardPage,
12953
- children: [
12954
- (0, react_jsx_runtime.jsxs)("header", {
12955
- className: dashboard_css_default.dashboardHeader,
12956
- children: [(0, react_jsx_runtime.jsxs)("div", {
12957
- className: dashboard_css_default.dashboardIdentity,
12958
- children: [
12959
- (0, react_jsx_runtime.jsxs)("div", {
12960
- className: dashboard_css_default.dashboardTitleRow,
12961
- children: [
12962
- (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
12963
- (0, react_jsx_runtime.jsx)("h1", {
12964
- id: `${id}-title`,
12965
- ref: heading,
12966
- tabIndex: -1,
12967
- children: (0, react_jsx_runtime.jsx)("button", {
12968
- type: "button",
12969
- className: dashboard_css_default.dashboardRefButton,
12970
- "data-dashboard-copy": "branch",
12971
- disabled: !branchAvailable,
12972
- "aria-label": branchAvailable ? t("dashboard.copyBranch") : void 0,
12973
- title: branchAvailable ? t("dashboard.copyBranch") : void 0,
12974
- "aria-busy": branchAvailable && branchCopyState === "pending" ? true : void 0,
12975
- onClick: branchAvailable ? () => void copyBranch() : void 0,
12976
- children: displayBranch
12977
- })
12978
- }),
12979
- record.currentHead?.kind !== void 0 && record.currentHead.kind !== "branch" && (0, react_jsx_runtime.jsx)("span", {
12980
- className: dashboard_css_default.dashboardSoon,
12981
- children: t(record.currentHead.kind === "tag" ? "dashboard.refKind.tag" : "dashboard.refKind.commit")
12982
- }),
12983
- (0, react_jsx_runtime.jsxs)("span", {
12984
- className: dashboard_css_default.dashboardHealth,
12985
- "data-health": isMain ? "local" : record.health ?? "unknown",
12986
- children: [(0, react_jsx_runtime.jsx)("span", {
12987
- "aria-hidden": "true",
12988
- children: "●"
12989
- }), t(healthKey)]
12990
- }),
12991
- record.status === "removed" && (0, react_jsx_runtime.jsx)("span", {
12992
- className: dashboard_css_default.dashboardSoon,
12993
- children: t("dashboard.archived")
12994
- })
12995
- ]
12996
- }),
12997
- (0, react_jsx_runtime.jsxs)("div", {
12998
- className: dashboard_css_default.dashboardPath,
12999
- children: [
13000
- (0, react_jsx_runtime.jsx)("span", {
13001
- className: dashboard_css_default.dashboardFieldLabel,
13002
- children: "cwd"
13003
- }),
13004
- (0, react_jsx_runtime.jsx)("code", { children: record.absolutePath }),
13005
- (0, react_jsx_runtime.jsx)("button", {
13006
- type: "button",
13007
- className: dashboard_css_default.dashboardIconButton,
13008
- "aria-label": t("worktree.copyPath"),
13009
- title: t("worktree.copyPath"),
13010
- disabled: copyState === "pending",
13011
- onClick: () => {
13012
- copyPath();
13013
- },
13014
- children: (0, react_jsx_runtime.jsx)(IconCopyOutline16, {})
13015
- })
13016
- ]
13017
- }),
13018
- (0, react_jsx_runtime.jsx)(NotificationToasts, { notices: [...branchCopyState === "failed" ? [{
13019
- key: "copy-branch:" + record.absolutePath,
13020
- text: t("dashboard.branchCopyFailed"),
13021
- context: workspaceTitle + " · " + record.branch + " · " + record.absolutePath,
13022
- message: (translate) => translate("dashboard.branchCopyFailed")
13023
- }] : [], ...copyState === "failed" ? [{
13024
- key: "copy-path:" + record.absolutePath,
13025
- text: t("dashboard.copyFailed"),
13026
- context: workspaceTitle + " · " + record.absolutePath,
13027
- message: (translate) => translate("dashboard.copyFailed")
13028
- }] : []] }),
13029
- (0, react_jsx_runtime.jsx)("p", {
13030
- className: dashboard_css_default.dashboardCopyStatus,
13031
- role: "status",
13032
- children: branchCopyState === "copied" ? t("dashboard.branchCopied") : copyState === "copied" ? t("dashboard.copied") : "\xA0"
13417
+ children: topActionIsCreateSession ? t("dashboard.newSession") : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: ["← ", t("dashboard.back")] })
13418
+ }),
13419
+ !rightSidebarOpen && onOpenSidebar !== void 0 && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
13420
+ label: t("dashboard.openSidebar"),
13421
+ side: "bottom",
13422
+ delayMs: 500,
13423
+ children: (0, react_jsx_runtime.jsx)("button", {
13424
+ type: "button",
13425
+ className: dashboard_css_default.dashboardSidebarButton,
13426
+ "aria-label": t("dashboard.openSidebar"),
13427
+ title: t("dashboard.openSidebar"),
13428
+ "data-sidebar-right-expand": true,
13429
+ onClick: () => {
13430
+ onOpenSidebar();
13431
+ setRightSidebarOpen(true);
13432
+ },
13433
+ children: (0, react_jsx_runtime.jsx)(IconPanelLeftOutline16, {})
13033
13434
  })
13034
- ]
13035
- }), (0, react_jsx_runtime.jsx)("div", {
13036
- className: dashboard_css_default.dashboardHeaderAside,
13037
- children: (0, react_jsx_runtime.jsxs)("dl", {
13038
- className: dashboard_css_default.dashboardFacts,
13039
- children: [
13040
- !isMain && (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13041
- label: t(acquisitionLabel),
13042
- children: acquisitionFacts.timestamp ? (0, react_jsx_runtime.jsx)("time", {
13043
- dateTime: acquisitionFacts.timestamp,
13044
- children: new Date(acquisitionFacts.timestamp).toLocaleString()
13045
- }) : (0, react_jsx_runtime.jsx)("span", {
13046
- className: dashboard_css_default.dashboardHistorical,
13047
- children: t("dashboard.historicalUnavailable")
13048
- })
13049
- }),
13050
- !isMain && (persistBaseline !== void 0 ? (0, react_jsx_runtime.jsx)(WorktreeBaselineEditor, {
13051
- context: workspaceTitle + " · " + record.branch + " · " + record.absolutePath,
13052
- value: baselineBranch,
13053
- branches,
13054
- loading: branchesLoading,
13055
- currentBranch: baselineCurrentBranch,
13056
- onSave: persistBaseline,
13057
- onFetch: onFetchBranches,
13058
- onLoad: onLoadBranches,
13059
- t,
13060
- disabled: record.status !== "active" || record.health === "recovery-needed"
13061
- }) : (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13062
- label: t("dashboard.base"),
13063
- baseline: true,
13064
- children: displayedBaseline?.replace(/^refs\/(heads|remotes)\//u, "") ?? (0, react_jsx_runtime.jsx)("span", {
13065
- className: dashboard_css_default.dashboardHistorical,
13066
- children: t("dashboard.historicalUnavailable")
13067
- })
13068
- })),
13069
- (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13070
- label: t("dashboard.source"),
13071
- children: isMainWorktreeId$1(record.worktreeId) ? t("worktree.main") : t(record.source === "external" ? "dashboard.external" : "dashboard.plugin")
13072
- })
13073
- ]
13074
13435
  })
13075
- })]
13076
- }),
13077
- (0, react_jsx_runtime.jsx)("div", {
13078
- className: dashboard_css_default.dashboardTabs,
13079
- role: "tablist",
13080
- "aria-label": t("dashboard.title"),
13081
- children: TABS.map((value) => (0, react_jsx_runtime.jsxs)("button", {
13082
- type: "button",
13083
- id: `${id}-${value}`,
13084
- role: "tab",
13085
- "aria-selected": tab === value,
13086
- "aria-controls": `${id}-panel`,
13087
- tabIndex: tab === value ? 0 : -1,
13088
- onClick: () => selectTab(value),
13089
- onKeyDown: (event) => {
13090
- const index = TABS.indexOf(value);
13091
- const next = event.key === "ArrowRight" ? TABS[(index + 1) % TABS.length] : event.key === "ArrowLeft" ? TABS[(index + TABS.length - 1) % TABS.length] : event.key === "Home" ? TABS[0] : event.key === "End" ? TABS[TABS.length - 1] : void 0;
13092
- if (next) {
13093
- event.preventDefault();
13094
- selectTab(next, true);
13095
- }
13096
- },
13097
- children: [(0, react_jsx_runtime.jsx)(DashboardIcon, { kind: value }), tabLabel(value)]
13098
- }, value))
13099
- }),
13100
- (0, react_jsx_runtime.jsx)("div", {
13101
- id: `${id}-panel`,
13102
- role: "tabpanel",
13103
- "aria-labelledby": `${id}-${tab}`,
13104
- tabIndex: 0,
13105
- className: dashboard_css_default.dashboardPanel,
13106
- children: tab === "overview" ? (0, react_jsx_runtime.jsxs)("div", {
13107
- className: dashboard_css_default.dashboardGrid,
13436
+ ]
13437
+ })]
13438
+ }),
13439
+ (0, react_jsx_runtime.jsxs)("div", {
13440
+ className: dashboard_css_default.dashboardPage,
13441
+ children: [
13442
+ (0, react_jsx_runtime.jsxs)("header", {
13443
+ className: dashboard_css_default.dashboardHeader,
13108
13444
  children: [(0, react_jsx_runtime.jsxs)("div", {
13109
- className: dashboard_css_default.dashboardColumn,
13445
+ className: dashboard_css_default.dashboardIdentity,
13110
13446
  children: [
13111
- (0, react_jsx_runtime.jsxs)("section", {
13112
- className: dashboard_css_default.dashboardStart,
13447
+ (0, react_jsx_runtime.jsxs)("div", {
13448
+ className: dashboard_css_default.dashboardTitleRow,
13113
13449
  children: [
13114
- (0, react_jsx_runtime.jsxs)("h2", { children: [(0, react_jsx_runtime.jsx)(IconBranchOutline16, {}), t("dashboard.start")] }),
13115
- (0, react_jsx_runtime.jsx)("p", { children: t("dashboard.startDescription") }),
13116
- (0, react_jsx_runtime.jsxs)("div", {
13117
- className: dashboard_css_default.dashboardStartActions,
13118
- children: [(0, react_jsx_runtime.jsxs)("button", {
13119
- type: "button",
13120
- disabled: actionPending || !onCreateWorktree,
13121
- onClick: onCreateWorktree,
13122
- "data-dashboard-action": "create-worktree",
13123
- children: [(0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "git" }), (0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)("strong", { children: t("dashboard.newWorktree") }), (0, react_jsx_runtime.jsx)("small", { children: t("dashboard.newWorktreeDescription") })] })]
13124
- }), (0, react_jsx_runtime.jsxs)("button", {
13450
+ (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
13451
+ (0, react_jsx_runtime.jsx)("h1", {
13452
+ id: `${id}-title`,
13453
+ ref: heading,
13454
+ tabIndex: -1,
13455
+ children: (0, react_jsx_runtime.jsx)("button", {
13125
13456
  type: "button",
13126
- disabled: actionPending || !onCreateSession,
13127
- onClick: onCreateSession,
13128
- "data-dashboard-action": "create-session",
13129
- children: [(0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "sessions" }), (0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)("strong", { children: t("dashboard.newSession") }), (0, react_jsx_runtime.jsx)("small", { children: t("dashboard.newSessionDescription") })] })]
13130
- })]
13457
+ className: dashboard_css_default.dashboardRefButton,
13458
+ "data-dashboard-copy": "branch",
13459
+ disabled: !branchAvailable,
13460
+ "aria-label": branchAvailable ? t("dashboard.copyBranch") : void 0,
13461
+ title: branchAvailable ? t("dashboard.copyBranch") : void 0,
13462
+ "aria-busy": branchAvailable && branchCopyState === "pending" ? true : void 0,
13463
+ onClick: branchAvailable ? () => void copyBranch() : void 0,
13464
+ children: displayBranch
13465
+ })
13466
+ }),
13467
+ record.currentHead?.kind !== void 0 && record.currentHead.kind !== "branch" && (0, react_jsx_runtime.jsx)("span", {
13468
+ className: dashboard_css_default.dashboardSoon,
13469
+ children: t(record.currentHead.kind === "tag" ? "dashboard.refKind.tag" : "dashboard.refKind.commit")
13470
+ }),
13471
+ (0, react_jsx_runtime.jsxs)("span", {
13472
+ className: dashboard_css_default.dashboardHealth,
13473
+ "data-health": isMain ? "local" : record.health ?? "unknown",
13474
+ children: [(0, react_jsx_runtime.jsx)("span", {
13475
+ "aria-hidden": "true",
13476
+ children: "●"
13477
+ }), t(healthKey)]
13478
+ }),
13479
+ record.status === "removed" && (0, react_jsx_runtime.jsx)("span", {
13480
+ className: dashboard_css_default.dashboardSoon,
13481
+ children: t("dashboard.archived")
13131
13482
  })
13132
13483
  ]
13133
13484
  }),
13134
- (0, react_jsx_runtime.jsxs)(Card, {
13135
- title: t("dashboard.instructions"),
13136
- icon: (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "instructions" }),
13137
- children: [(0, react_jsx_runtime.jsx)("p", { children: t("dashboard.instructionsDescription") }), (0, react_jsx_runtime.jsx)(WorktreeInstructions, {
13138
- context: workspaceTitle + " · " + record.branch + " · " + record.absolutePath,
13139
- value: record.instructions ?? "",
13140
- onSave: onSaveInstructions,
13141
- t,
13142
- disabled: actionPending || record.health === "recovery-needed"
13143
- })]
13144
- }),
13145
- (0, react_jsx_runtime.jsxs)(Card, {
13146
- title: tabLabel("sessions"),
13147
- icon: (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "sessions" }),
13148
- action: (0, react_jsx_runtime.jsx)("span", { children: sessionIds.length }),
13149
- children: [sessionList(sessionIds.slice(0, 5)), tabLink("sessions", t("dashboard.viewSessions"))]
13150
- })
13151
- ]
13152
- }), (0, react_jsx_runtime.jsxs)("div", {
13153
- className: dashboard_css_default.dashboardColumn,
13154
- children: [
13155
- (0, react_jsx_runtime.jsxs)(Card, {
13156
- title: t("dashboard.status"),
13157
- icon: (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "git" }),
13485
+ (0, react_jsx_runtime.jsxs)("div", {
13486
+ className: dashboard_css_default.dashboardPath,
13158
13487
  children: [
13159
- (0, react_jsx_runtime.jsx)("p", { children: t("dashboard.statusHint") }),
13160
- (0, react_jsx_runtime.jsxs)("dl", {
13161
- className: dashboard_css_default.dashboardFacts,
13162
- children: [
13163
- (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13164
- label: t("dashboard.health"),
13165
- children: t(healthKey)
13166
- }),
13167
- (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13168
- label: t("dashboard.branch"),
13169
- children: liveBranch
13170
- }),
13171
- !isMain && (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13172
- label: t("dashboard.base"),
13173
- children: displayedBaseline?.replace(/^refs\/(heads|remotes)\//u, "") ?? (0, react_jsx_runtime.jsx)("span", {
13174
- className: dashboard_css_default.dashboardHistorical,
13175
- children: t("dashboard.historicalUnavailable")
13176
- })
13177
- }),
13178
- (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13179
- label: t("dashboard.aheadBehind"),
13180
- children: (0, react_jsx_runtime.jsx)(WorktreeGitOverviewValue, {
13181
- state: gitOverview,
13182
- metric: "aheadBehind",
13183
- t
13184
- })
13185
- }),
13186
- (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13187
- label: t("dashboard.committedChanges"),
13188
- children: (0, react_jsx_runtime.jsx)(WorktreeGitOverviewValue, {
13189
- state: gitOverview,
13190
- metric: "committed",
13191
- t
13192
- })
13193
- }),
13194
- (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13195
- label: t("dashboard.workingTree"),
13196
- children: (0, react_jsx_runtime.jsx)(WorktreeGitOverviewValue, {
13197
- state: gitOverview,
13198
- metric: "workingTree",
13199
- t
13200
- })
13201
- })
13202
- ]
13488
+ (0, react_jsx_runtime.jsx)("span", {
13489
+ className: dashboard_css_default.dashboardFieldLabel,
13490
+ children: "cwd"
13203
13491
  }),
13204
- tabLink("git", t("dashboard.viewDetails"))
13492
+ (0, react_jsx_runtime.jsx)("code", { children: record.absolutePath }),
13493
+ (0, react_jsx_runtime.jsx)("button", {
13494
+ type: "button",
13495
+ className: dashboard_css_default.dashboardIconButton,
13496
+ "aria-label": t("worktree.copyPath"),
13497
+ title: t("worktree.copyPath"),
13498
+ disabled: copyState === "pending",
13499
+ onClick: () => {
13500
+ copyPath();
13501
+ },
13502
+ children: (0, react_jsx_runtime.jsx)(IconCopyOutline16, {})
13503
+ })
13205
13504
  ]
13206
13505
  }),
13207
- (0, react_jsx_runtime.jsxs)(Card, {
13208
- title: t("dashboard.derived"),
13209
- icon: (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "children" }),
13210
- action: placeholder,
13211
- children: [(0, react_jsx_runtime.jsx)("div", {
13212
- className: dashboard_css_default.dashboardEmpty,
13213
- children: (0, react_jsx_runtime.jsx)("p", { children: t("dashboard.childrenHint") })
13214
- }), tabLink("children", t("dashboard.viewChildren"))]
13215
- }),
13216
- (0, react_jsx_runtime.jsx)(Card, {
13217
- title: t("dashboard.quickActions"),
13218
- icon: (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "actions" }),
13219
- children: (0, react_jsx_runtime.jsxs)("div", {
13220
- className: dashboard_css_default.dashboardQuickActions,
13221
- children: [[
13222
- "terminal",
13223
- "diff",
13224
- "pullRequest",
13225
- "tests",
13226
- "sync"
13227
- ].map((action) => (0, react_jsx_runtime.jsx)(PlaceholderButton, {
13228
- t,
13229
- children: t(`dashboard.action.${action}`)
13230
- }, action)), (0, react_jsx_runtime.jsx)("button", {
13231
- type: "button",
13232
- className: dashboard_css_default.dashboardButton,
13233
- disabled: actionPending || !onArchiveWorktree,
13234
- onClick: onArchiveWorktree,
13235
- "data-dashboard-action": "archive-worktree",
13236
- children: t("dashboard.action.archive")
13237
- })]
13238
- })
13506
+ (0, react_jsx_runtime.jsx)(NotificationToasts, { notices: [...branchCopyState === "failed" ? [{
13507
+ key: "copy-branch:" + record.absolutePath,
13508
+ text: t("dashboard.branchCopyFailed"),
13509
+ context: workspaceTitle + " · " + record.branch + " · " + record.absolutePath,
13510
+ message: (translate) => translate("dashboard.branchCopyFailed")
13511
+ }] : [], ...copyState === "failed" ? [{
13512
+ key: "copy-path:" + record.absolutePath,
13513
+ text: t("dashboard.copyFailed"),
13514
+ context: workspaceTitle + " · " + record.absolutePath,
13515
+ message: (translate) => translate("dashboard.copyFailed")
13516
+ }] : []] }),
13517
+ (0, react_jsx_runtime.jsx)("p", {
13518
+ className: dashboard_css_default.dashboardCopyStatus,
13519
+ role: "status",
13520
+ children: branchCopyState === "copied" ? t("dashboard.branchCopied") : copyState === "copied" ? t("dashboard.copied") : "\xA0"
13239
13521
  })
13240
13522
  ]
13523
+ }), (0, react_jsx_runtime.jsx)("div", {
13524
+ className: dashboard_css_default.dashboardHeaderAside,
13525
+ children: (0, react_jsx_runtime.jsxs)("dl", {
13526
+ className: `${dashboard_css_default.dashboardFacts} ${dashboard_css_default.dashboardHeaderFacts}`,
13527
+ children: [
13528
+ !isMain && (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13529
+ label: t(acquisitionLabel),
13530
+ children: acquisitionFacts.timestamp ? (0, react_jsx_runtime.jsx)("time", {
13531
+ dateTime: acquisitionFacts.timestamp,
13532
+ children: new Date(acquisitionFacts.timestamp).toLocaleString()
13533
+ }) : (0, react_jsx_runtime.jsx)("span", {
13534
+ className: dashboard_css_default.dashboardHistorical,
13535
+ children: t("dashboard.historicalUnavailable")
13536
+ })
13537
+ }),
13538
+ !isMain && (persistBaseline !== void 0 ? (0, react_jsx_runtime.jsx)(WorktreeBaselineEditor, {
13539
+ context: workspaceTitle + " · " + record.branch + " · " + record.absolutePath,
13540
+ value: baselineBranch,
13541
+ renderValue: renderBaseline,
13542
+ branches,
13543
+ loading: branchesLoading,
13544
+ currentBranch: baselineCurrentBranch,
13545
+ onSave: persistBaseline,
13546
+ onFetch: onFetchBranches,
13547
+ onLoad: onLoadBranches,
13548
+ t,
13549
+ disabled: record.status !== "active" || record.health === "recovery-needed"
13550
+ }) : (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13551
+ label: t("dashboard.base"),
13552
+ baseline: true,
13553
+ children: renderBaseline(displayedBaseline)
13554
+ })),
13555
+ (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13556
+ label: t("dashboard.source"),
13557
+ children: isMainWorktreeId$1(record.worktreeId) ? t("worktree.main") : t(record.source === "external" ? "dashboard.external" : "dashboard.plugin")
13558
+ })
13559
+ ]
13560
+ })
13241
13561
  })]
13242
- }) : tab === "git" ? (0, react_jsx_runtime.jsx)(WorktreeGitPanel, {
13243
- context: workspaceTitle + " · " + record.branch + " · " + record.absolutePath,
13244
- manager,
13245
- workspaceId: record.workspaceId,
13246
- worktreeId: record.worktreeId,
13247
- defaultBaselineBranch: displayedBaseline,
13248
- currentBranch: baselineCurrentBranch,
13249
- capturedBaseline: record.baseCommit !== void 0,
13250
- onOpenFile: onOpenFile === void 0 ? void 0 : (filePath) => {
13251
- onOpenFile?.(filePath);
13252
- setRightSidebarOpen(isRightSidebarExpanded?.() ?? false);
13253
- },
13254
- t
13255
- }) : tab === "sessions" ? (0, react_jsx_runtime.jsx)(Card, {
13256
- title: tabLabel("sessions"),
13257
- icon: (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "sessions" }),
13258
- action: (0, react_jsx_runtime.jsx)("button", {
13562
+ }),
13563
+ (0, react_jsx_runtime.jsx)("div", {
13564
+ className: dashboard_css_default.dashboardTabs,
13565
+ role: "tablist",
13566
+ "aria-label": t("dashboard.title"),
13567
+ children: TABS.map((value) => (0, react_jsx_runtime.jsxs)("button", {
13259
13568
  type: "button",
13260
- className: dashboard_css_default.dashboardButton,
13261
- disabled: actionPending || !onCreateSession,
13262
- onClick: onCreateSession,
13263
- children: t("dashboard.newSession")
13264
- }),
13265
- children: sessionList(sessionIds)
13266
- }) : tab === "settings" ? (0, react_jsx_runtime.jsx)(Card, {
13267
- title: tabLabel("settings"),
13268
- icon: (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "settings" }),
13269
- children: (0, react_jsx_runtime.jsx)(ToolSettings, {
13569
+ id: `${id}-${value}`,
13570
+ role: "tab",
13571
+ "aria-selected": tab === value,
13572
+ "aria-controls": `${id}-panel`,
13573
+ tabIndex: tab === value ? 0 : -1,
13574
+ onClick: () => selectTab(value),
13575
+ onKeyDown: (event) => {
13576
+ const index = TABS.indexOf(value);
13577
+ const next = event.key === "ArrowRight" ? TABS[(index + 1) % TABS.length] : event.key === "ArrowLeft" ? TABS[(index + TABS.length - 1) % TABS.length] : event.key === "Home" ? TABS[0] : event.key === "End" ? TABS[TABS.length - 1] : void 0;
13578
+ if (next) {
13579
+ event.preventDefault();
13580
+ selectTab(next, true);
13581
+ }
13582
+ },
13583
+ children: [(0, react_jsx_runtime.jsx)(DashboardIcon, { kind: value }), tabLabel(value)]
13584
+ }, value))
13585
+ }),
13586
+ (0, react_jsx_runtime.jsx)("div", {
13587
+ id: `${id}-panel`,
13588
+ role: "tabpanel",
13589
+ "aria-labelledby": `${id}-${tab}`,
13590
+ tabIndex: 0,
13591
+ className: dashboard_css_default.dashboardPanel,
13592
+ children: tab === "overview" ? (0, react_jsx_runtime.jsxs)("div", {
13593
+ className: dashboard_css_default.dashboardGrid,
13594
+ children: [(0, react_jsx_runtime.jsxs)("div", {
13595
+ className: dashboard_css_default.dashboardColumn,
13596
+ children: [
13597
+ (0, react_jsx_runtime.jsxs)("section", {
13598
+ className: dashboard_css_default.dashboardStart,
13599
+ children: [
13600
+ (0, react_jsx_runtime.jsxs)("h2", { children: [(0, react_jsx_runtime.jsx)(IconBranchOutline16, {}), t("dashboard.start")] }),
13601
+ (0, react_jsx_runtime.jsx)("p", { children: t("dashboard.startDescription") }),
13602
+ (0, react_jsx_runtime.jsxs)("div", {
13603
+ className: dashboard_css_default.dashboardStartActions,
13604
+ children: [(0, react_jsx_runtime.jsxs)("button", {
13605
+ type: "button",
13606
+ disabled: actionPending || !onCreateWorktree,
13607
+ onClick: onCreateWorktree,
13608
+ "data-dashboard-action": "create-worktree",
13609
+ children: [(0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "git" }), (0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)("strong", { children: t("dashboard.newWorktree") }), (0, react_jsx_runtime.jsx)("small", { children: t("dashboard.newWorktreeDescription") })] })]
13610
+ }), (0, react_jsx_runtime.jsxs)("button", {
13611
+ type: "button",
13612
+ disabled: actionPending || !onCreateSession,
13613
+ onClick: onCreateSession,
13614
+ "data-dashboard-action": "create-session",
13615
+ children: [(0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "sessions" }), (0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)("strong", { children: t("dashboard.newSession") }), (0, react_jsx_runtime.jsx)("small", { children: t("dashboard.newSessionDescription") })] })]
13616
+ })]
13617
+ })
13618
+ ]
13619
+ }),
13620
+ (0, react_jsx_runtime.jsxs)(Card, {
13621
+ title: t("dashboard.instructions"),
13622
+ icon: (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "instructions" }),
13623
+ children: [(0, react_jsx_runtime.jsx)("p", { children: t("dashboard.instructionsDescription") }), (0, react_jsx_runtime.jsx)(WorktreeInstructions, {
13624
+ context: workspaceTitle + " · " + record.branch + " · " + record.absolutePath,
13625
+ value: record.instructions ?? "",
13626
+ onSave: onSaveInstructions,
13627
+ t,
13628
+ disabled: actionPending || record.health === "recovery-needed"
13629
+ })]
13630
+ }),
13631
+ (0, react_jsx_runtime.jsxs)(Card, {
13632
+ title: tabLabel("sessions"),
13633
+ icon: (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "sessions" }),
13634
+ action: (0, react_jsx_runtime.jsx)("span", { children: sessionIds.length }),
13635
+ children: [sessionList(sessionIds.slice(0, 5)), tabLink("sessions", t("dashboard.viewSessions"))]
13636
+ })
13637
+ ]
13638
+ }), (0, react_jsx_runtime.jsxs)("div", {
13639
+ className: dashboard_css_default.dashboardColumn,
13640
+ children: [
13641
+ (0, react_jsx_runtime.jsxs)(Card, {
13642
+ title: t("dashboard.status"),
13643
+ icon: (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "git" }),
13644
+ children: [
13645
+ (0, react_jsx_runtime.jsx)("p", { children: t("dashboard.statusHint") }),
13646
+ (0, react_jsx_runtime.jsxs)("dl", {
13647
+ className: dashboard_css_default.dashboardFacts,
13648
+ children: [
13649
+ (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13650
+ label: t("dashboard.health"),
13651
+ children: t(healthKey)
13652
+ }),
13653
+ (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13654
+ label: t("dashboard.branch"),
13655
+ children: liveBranch
13656
+ }),
13657
+ !isMain && (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13658
+ label: t("dashboard.base"),
13659
+ children: displayedBaseline?.replace(/^refs\/(heads|remotes)\//u, "") ?? (0, react_jsx_runtime.jsx)("span", {
13660
+ className: dashboard_css_default.dashboardHistorical,
13661
+ children: t("dashboard.historicalUnavailable")
13662
+ })
13663
+ }),
13664
+ (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13665
+ label: t("dashboard.aheadBehind"),
13666
+ children: (0, react_jsx_runtime.jsx)(WorktreeGitOverviewValue, {
13667
+ state: gitOverview,
13668
+ metric: "aheadBehind",
13669
+ t
13670
+ })
13671
+ }),
13672
+ (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13673
+ label: t("dashboard.committedChanges"),
13674
+ children: (0, react_jsx_runtime.jsx)(WorktreeGitOverviewValue, {
13675
+ state: gitOverview,
13676
+ metric: "committed",
13677
+ t
13678
+ })
13679
+ }),
13680
+ (0, react_jsx_runtime.jsx)(DashboardFactRow, {
13681
+ label: t("dashboard.workingTree"),
13682
+ children: (0, react_jsx_runtime.jsx)(WorktreeGitOverviewValue, {
13683
+ state: gitOverview,
13684
+ metric: "workingTree",
13685
+ t
13686
+ })
13687
+ })
13688
+ ]
13689
+ }),
13690
+ tabLink("git", t("dashboard.viewDetails"))
13691
+ ]
13692
+ }),
13693
+ (0, react_jsx_runtime.jsxs)(Card, {
13694
+ title: t("dashboard.derived"),
13695
+ icon: (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "children" }),
13696
+ action: (0, react_jsx_runtime.jsx)("span", { children: derivedWorktrees.length }),
13697
+ children: [
13698
+ (0, react_jsx_runtime.jsx)("p", { children: t("dashboard.childrenHint") }),
13699
+ worktreeList(derivedWorktrees.slice(0, 5)),
13700
+ tabLink("children", t("dashboard.viewChildren"))
13701
+ ]
13702
+ }),
13703
+ (0, react_jsx_runtime.jsx)(Card, {
13704
+ title: t("dashboard.quickActions"),
13705
+ icon: (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "actions" }),
13706
+ children: (0, react_jsx_runtime.jsxs)("div", {
13707
+ className: dashboard_css_default.dashboardQuickActions,
13708
+ children: [(0, react_jsx_runtime.jsx)("button", {
13709
+ type: "button",
13710
+ className: dashboard_css_default.dashboardButton,
13711
+ "data-dashboard-action": "sync-baseline",
13712
+ disabled: actionPending || !onSyncBaseline || !displayedBaseline,
13713
+ onClick: () => {
13714
+ setSyncOpen(true);
13715
+ },
13716
+ children: t("dashboard.action.sync")
13717
+ }), (0, react_jsx_runtime.jsx)("button", {
13718
+ type: "button",
13719
+ className: dashboard_css_default.dashboardButton,
13720
+ disabled: actionPending || !onArchiveWorktree,
13721
+ onClick: onArchiveWorktree,
13722
+ "data-dashboard-action": "archive-worktree",
13723
+ children: t("dashboard.action.archive")
13724
+ })]
13725
+ })
13726
+ })
13727
+ ]
13728
+ })]
13729
+ }) : tab === "git" ? (0, react_jsx_runtime.jsx)(WorktreeGitPanel, {
13730
+ context: workspaceTitle + " · " + record.branch + " · " + record.absolutePath,
13270
13731
  manager,
13271
- scope: isMainWorktreeId$1(record.worktreeId) ? {
13272
- kind: "local",
13273
- workspaceId: record.workspaceId
13274
- } : {
13275
- kind: "worktree",
13276
- workspaceId: record.workspaceId,
13277
- worktreeId: record.worktreeId
13732
+ workspaceId: record.workspaceId,
13733
+ worktreeId: record.worktreeId,
13734
+ defaultBaselineBranch: displayedBaseline,
13735
+ currentBranch: baselineCurrentBranch,
13736
+ capturedBaseline: record.baseCommit !== void 0,
13737
+ onOpenFile: onOpenFile === void 0 ? void 0 : (filePath) => {
13738
+ onOpenFile?.(filePath);
13739
+ setRightSidebarOpen(isRightSidebarExpanded?.() ?? false);
13278
13740
  },
13279
13741
  t
13280
- }, JSON.stringify([record.workspaceId, record.worktreeId]))
13281
- }) : (0, react_jsx_runtime.jsxs)("section", {
13282
- className: dashboard_css_default.dashboardTabPlaceholder,
13283
- children: [
13284
- (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: tab }),
13285
- (0, react_jsx_runtime.jsx)("h2", { children: tabLabel(tab) }),
13286
- (0, react_jsx_runtime.jsx)("p", { children: t(`dashboard.hint.${tab}`) }),
13287
- placeholder
13288
- ]
13742
+ }) : tab === "sessions" ? (0, react_jsx_runtime.jsx)(Card, {
13743
+ title: tabLabel("sessions"),
13744
+ icon: (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "sessions" }),
13745
+ action: (0, react_jsx_runtime.jsx)("button", {
13746
+ type: "button",
13747
+ className: dashboard_css_default.dashboardButton,
13748
+ disabled: actionPending || !onCreateSession,
13749
+ onClick: onCreateSession,
13750
+ children: t("dashboard.newSession")
13751
+ }),
13752
+ children: sessionList(sessionIds)
13753
+ }) : tab === "settings" ? (0, react_jsx_runtime.jsx)(Card, {
13754
+ title: tabLabel("settings"),
13755
+ icon: (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "settings" }),
13756
+ children: (0, react_jsx_runtime.jsx)(ToolSettings, {
13757
+ manager,
13758
+ scope: isMainWorktreeId$1(record.worktreeId) ? {
13759
+ kind: "local",
13760
+ workspaceId: record.workspaceId
13761
+ } : {
13762
+ kind: "worktree",
13763
+ workspaceId: record.workspaceId,
13764
+ worktreeId: record.worktreeId
13765
+ },
13766
+ t
13767
+ }, JSON.stringify([record.workspaceId, record.worktreeId]))
13768
+ }) : (0, react_jsx_runtime.jsxs)(Card, {
13769
+ title: tabLabel("children"),
13770
+ icon: (0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "children" }),
13771
+ action: (0, react_jsx_runtime.jsx)("span", { children: derivedWorktrees.length }),
13772
+ children: [(0, react_jsx_runtime.jsx)("p", { children: t("dashboard.childrenHint") }), worktreeList(derivedWorktrees)]
13773
+ })
13774
+ }),
13775
+ (0, react_jsx_runtime.jsx)("p", {
13776
+ className: dashboard_css_default.dashboardFooter,
13777
+ children: t("dashboard.mvpHint")
13289
13778
  })
13290
- }),
13291
- (0, react_jsx_runtime.jsx)("p", {
13292
- className: dashboard_css_default.dashboardFooter,
13293
- children: t("dashboard.mvpHint")
13779
+ ]
13780
+ }),
13781
+ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
13782
+ open: syncOpen,
13783
+ onClose: closeSync,
13784
+ closeLabel: t("dialog.close"),
13785
+ title: t("dashboard.action.sync"),
13786
+ description: t("dashboard.sync.description"),
13787
+ className: dashboard_css_default.dashboardBaselineModal,
13788
+ footer: (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
13789
+ variant: "outline",
13790
+ disabled: syncPending,
13791
+ onClick: closeSync,
13792
+ children: t("dashboard.cancelBase")
13793
+ }), syncResult ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
13794
+ variant: "primary",
13795
+ onClick: () => onOpenSession(syncResult.sessionId),
13796
+ children: t("dashboard.sync.openSession")
13797
+ }) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
13798
+ variant: "primary",
13799
+ disabled: syncPending,
13800
+ onClick: () => void startSync(),
13801
+ children: t(syncPending ? "dashboard.sync.creating" : "dashboard.sync.create")
13802
+ })] }),
13803
+ children: (0, react_jsx_runtime.jsxs)("div", {
13804
+ className: dashboard_css_default.dashboardSyncOptions,
13805
+ children: [
13806
+ (0, react_jsx_runtime.jsxs)("p", { children: [
13807
+ (0, react_jsx_runtime.jsx)("code", { children: displayedBaseline }),
13808
+ (0, react_jsx_runtime.jsx)("span", {
13809
+ "aria-hidden": "true",
13810
+ children: " → "
13811
+ }),
13812
+ (0, react_jsx_runtime.jsx)("code", { children: record.currentBranch ?? record.branch })
13813
+ ] }),
13814
+ ["rebase", "merge"].map((strategy) => (0, react_jsx_runtime.jsxs)("label", { children: [(0, react_jsx_runtime.jsx)("input", {
13815
+ type: "radio",
13816
+ name: `${id}-sync-strategy`,
13817
+ value: strategy,
13818
+ checked: syncStrategy === strategy,
13819
+ disabled: syncPending || syncResult !== void 0 || syncError !== void 0,
13820
+ onChange: () => {
13821
+ syncRequest.current = void 0;
13822
+ setSyncStrategy(strategy);
13823
+ }
13824
+ }), (0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)("strong", { children: strategy === "rebase" ? "Rebase" : "Merge baseline" }), (0, react_jsx_runtime.jsx)("small", { children: t(`dashboard.sync.${strategy}`) })] })] }, strategy)),
13825
+ partialSync && (0, react_jsx_runtime.jsxs)("p", {
13826
+ role: "status",
13827
+ children: [
13828
+ t(`dashboard.sync.${partialSync.status}`),
13829
+ (0, react_jsx_runtime.jsx)("br", {}),
13830
+ t("dashboard.sync.partial"),
13831
+ (0, react_jsx_runtime.jsx)("br", {}),
13832
+ (0, react_jsx_runtime.jsx)("code", { children: partialSync.sessionId })
13833
+ ]
13834
+ })
13835
+ ]
13294
13836
  })
13295
- ]
13296
- })]
13837
+ }),
13838
+ (0, react_jsx_runtime.jsx)(NotificationToasts, { notices: partialSync !== void 0 ? baselineSyncFailureNotices(record, syncRequest.current, partialSync, t, onOpenSession) : syncError === void 0 ? [] : [{
13839
+ key: "sync:" + record.worktreeId,
13840
+ error: syncError,
13841
+ text: t("dashboard.sync.failed") + " " + formatWorktreeViewError(syncError, t),
13842
+ message: (translate) => translate("dashboard.sync.failed") + " " + formatWorktreeViewError(syncError, translate)
13843
+ }] })
13844
+ ]
13297
13845
  });
13298
13846
  }
13299
13847
  //#endregion
@@ -13750,6 +14298,7 @@ window.__ModuleLoader__.load({
13750
14298
  (0, react_jsx_runtime.jsxs)("div", {
13751
14299
  className: worktree_css_default.wideContent,
13752
14300
  children: [(0, react_jsx_runtime.jsx)(SurfaceHeader, {
14301
+ onOpenSession: session.openWorkspaceSession,
13753
14302
  expansion,
13754
14303
  props,
13755
14304
  source,
@@ -13815,6 +14364,9 @@ window.__ModuleLoader__.load({
13815
14364
  dashboardRecord !== void 0 && (0, react_jsx_runtime.jsx)(WorktreeDashboard, {
13816
14365
  manager: props.manager,
13817
14366
  record: dashboardRecord,
14367
+ worktrees: dashboardView?.worktrees ?? [],
14368
+ mainRecord: dashboardMainRecord,
14369
+ onOpenWorktree: openDashboard,
13818
14370
  onSaveInstructions: props.manager ? async (instructions, expectedInstructions) => {
13819
14371
  try {
13820
14372
  return await props.manager.updateWorktreeInstructions({
@@ -13872,6 +14424,29 @@ window.__ModuleLoader__.load({
13872
14424
  sessionPresentations: source.sessionPresentations,
13873
14425
  sessionIds: dashboardSessionIds(dashboardRecord, source.sessions, dashboardView?.bindings ?? [], source.archivedSessionIds, isMainWorktreeId$1(dashboardRecord.worktreeId) ? ordering.orderedSessionIdsByAccount.get(`main:${dashboardRecord.workspaceId}`) : ordering.orderedSessionIdsByAccount.get(`worktree:${dashboardRecord.worktreeId}`), dashboardWorkspace === void 0 ? [] : workspaceSessionIds(source.workspaces, dashboardWorkspace.workspaceId, source.sessions.ids)),
13874
14426
  actionPending: mutation.actionPending,
14427
+ onSyncBaseline: props.manager?.syncWorktreeBaseline !== void 0 && dashboardManagedRecord !== void 0 && dashboardCanCreate && (dashboardRecord.health === void 0 || dashboardRecord.health === "ready") ? async (strategy, baseBranch, requestId) => {
14428
+ let completed = false;
14429
+ try {
14430
+ const result = await props.manager.syncWorktreeBaseline({
14431
+ workspaceId: dashboardRecord.workspaceId,
14432
+ worktreeId: dashboardRecord.worktreeId,
14433
+ strategy,
14434
+ baseBranch,
14435
+ requestId
14436
+ });
14437
+ completed = true;
14438
+ return result;
14439
+ } finally {
14440
+ read.refresh({
14441
+ preserveCurrent: true,
14442
+ changeId: completed ? requestId : void 0,
14443
+ scope: {
14444
+ kind: "workspace",
14445
+ workspaceId: dashboardRecord.workspaceId
14446
+ }
14447
+ });
14448
+ }
14449
+ } : void 0,
13875
14450
  onOpenFile: typeof props.openResource === "function" ? onOpenFile : void 0,
13876
14451
  onOpenSession: (sessionId) => session.openWorkspaceSession(dashboardRecord.workspaceId, sessionId),
13877
14452
  onCreateSession: dashboardCanCreate && (isMainWorktreeId$1(dashboardRecord.worktreeId) ? props.createMainSession !== void 0 : props.createSessionForWorktree !== void 0) ? () => {
@@ -14138,6 +14713,224 @@ window.__ModuleLoader__.load({
14138
14713
  }, "clutch-dsh-worktree: command activity");
14139
14714
  }
14140
14715
  //#endregion
14716
+ //#region lib/client/steer/steer-state.js
14717
+ const EMPTY_STEER_STATE = {
14718
+ pending: [],
14719
+ rows: []
14720
+ };
14721
+ function object(value) {
14722
+ return typeof value === "object" && value !== null ? value : void 0;
14723
+ }
14724
+ /** Identity and source must both identify a Worktree task relay, never a report or human echo. */
14725
+ function steerRelay(value) {
14726
+ const message = object(value);
14727
+ const source = object(message?.source);
14728
+ if (typeof message?.id !== "string" || !/^clutch-worktree-relay:[a-f0-9]{64}$/.test(message.id) || message.role !== "user" || source?.kind !== "agent-message" || source.form !== "relay" || typeof source.senderSessionId !== "string" || !Array.isArray(message.content)) return void 0;
14729
+ const content = message.content.map(object);
14730
+ const envelope = "Agent " + source.senderSessionId + " sent a message: ";
14731
+ const body = content[0]?.type === "text" && content[0].text === envelope ? content.slice(1) : content;
14732
+ return {
14733
+ id: message.id,
14734
+ sender: source.senderSessionId,
14735
+ text: body.flatMap((part) => part?.type === "text" && typeof part.text === "string" ? [part.text] : []).join("\n"),
14736
+ status: "pending"
14737
+ };
14738
+ }
14739
+ function bounded(rows) {
14740
+ const recent = rows.filter((row) => row.status !== "pending" && row.status !== "preparing").slice(-8);
14741
+ const keep = new Set(recent.map((row) => row.id));
14742
+ return rows.filter((row) => row.status === "pending" || row.status === "preparing" || keep.has(row.id));
14743
+ }
14744
+ /** Replay native evidence; an inbox claim alone never establishes receipt or completion. */
14745
+ function reduceSteerState(state, event) {
14746
+ const data = object(event.data);
14747
+ if (event.type === "turn/start") return {
14748
+ ...state,
14749
+ rows: bounded(state.rows.filter((row) => row.status === "pending" || row.status === "preparing").map((row) => row.status === "preparing" ? {
14750
+ ...row,
14751
+ status: "unknown"
14752
+ } : row))
14753
+ };
14754
+ if (event.type === "user/message") {
14755
+ if (event.surfaceOp !== "append") return state;
14756
+ const receipt = steerRelay(data);
14757
+ if (receipt === void 0) return state;
14758
+ const rows = state.rows.map((row) => row.id === receipt.id && row.sender === receipt.sender && row.text === receipt.text ? {
14759
+ ...row,
14760
+ status: "received"
14761
+ } : row);
14762
+ return {
14763
+ ...state,
14764
+ rows: bounded(rows)
14765
+ };
14766
+ }
14767
+ if (event.type !== "agent/inbox/spliced" || !Array.isArray(data?.inserted)) return state;
14768
+ const inserted = data.inserted;
14769
+ if (data.target === "next-turn") {
14770
+ const queued = new Set(inserted.map((item) => object(item)?.id));
14771
+ return {
14772
+ ...state,
14773
+ rows: state.rows.filter((row) => !queued.has(row.id))
14774
+ };
14775
+ }
14776
+ if (data.target !== "next-step") return state;
14777
+ const start = data.start;
14778
+ const count = data.removedCount ?? 0;
14779
+ const ids = inserted.map((item) => object(item)?.id);
14780
+ const positionsKnown = typeof start === "number" && Number.isSafeInteger(start) && start >= 0 && typeof count === "number" && Number.isSafeInteger(count) && count >= 0 && ids.every((id) => typeof id === "string") && state.pending !== void 0 && start + count <= state.pending.length;
14781
+ const previous = state.pending ?? [];
14782
+ const removed = new Set(positionsKnown ? previous.slice(start, start + count) : []);
14783
+ const pending = positionsKnown ? [
14784
+ ...previous.slice(0, start),
14785
+ ...ids,
14786
+ ...previous.slice(start + count)
14787
+ ] : void 0;
14788
+ let rows = state.rows.map((row) => removed.has(row.id) ? {
14789
+ ...row,
14790
+ status: data.outcome === "canceled" ? "canceled" : "preparing"
14791
+ } : !positionsKnown && (row.status === "pending" || row.status === "preparing") ? {
14792
+ ...row,
14793
+ status: "unknown"
14794
+ } : row);
14795
+ for (const item of inserted) {
14796
+ const relay = steerRelay(item);
14797
+ if (relay !== void 0) rows = [...rows.filter((row) => row.id !== relay.id), relay];
14798
+ }
14799
+ return {
14800
+ pending,
14801
+ rows: bounded(rows)
14802
+ };
14803
+ }
14804
+ /** Merge the authoritative pending projection with verified, current/recent-turn receipts. */
14805
+ function visibleSteerRows(state, inbox) {
14806
+ const projection = object(inbox);
14807
+ const queued = new Set(Array.isArray(projection?.["next-turn"]) ? projection["next-turn"].map((item) => object(item)?.id) : []);
14808
+ const rows = new Map((state?.rows ?? []).map((row) => [row.id, row]));
14809
+ if (Array.isArray(projection?.["next-step"])) for (const value of projection["next-step"]) {
14810
+ const relay = steerRelay(value);
14811
+ if (relay !== void 0 && !rows.has(relay.id)) rows.set(relay.id, relay);
14812
+ }
14813
+ const waiting = Array.isArray(projection?.["next-step"]) ? new Set(projection["next-step"].map((item) => object(item)?.id)) : void 0;
14814
+ const order = [...waiting ?? []];
14815
+ const rank = new Map(order.map((id, index) => [id, index]));
14816
+ return [...rows.values()].filter((row) => !queued.has(row.id)).map((row) => {
14817
+ if (row.status === "unknown" && waiting?.has(row.id)) return {
14818
+ ...row,
14819
+ status: "pending"
14820
+ };
14821
+ if (row.status === "pending" && !waiting?.has(row.id)) return {
14822
+ ...row,
14823
+ status: waiting === void 0 ? "unknown" : "preparing"
14824
+ };
14825
+ return row;
14826
+ }).sort((a, b) => (rank.get(a.id) ?? order.length) - (rank.get(b.id) ?? order.length));
14827
+ }
14828
+ //#endregion
14829
+ //#region lib/client/steer/steer-activity.js
14830
+ const WORKTREE_STEER_TARGET = "clutch-dsh-worktree-steer";
14831
+ /** One Session-local fold, rebuilt by native history replacement and pagination. */
14832
+ const worktreeSteerNode = {
14833
+ kind: WORKTREE_STEER_TARGET,
14834
+ target: WORKTREE_STEER_TARGET,
14835
+ match: (event) => event.type === "turn/start" || event.type === "agent/inbox/spliced" || event.type === "user/message" && event.surfaceOp === "append" && steerRelay(event.data) !== void 0 ? {
14836
+ id: "state",
14837
+ role: "start"
14838
+ } : null,
14839
+ start: (_context, match) => reduceSteerState(EMPTY_STEER_STATE, match.event),
14840
+ update: (context, match) => reduceSteerState(context.state, match.event),
14841
+ buildViewNode: (context) => context.state === void 0 ? null : {
14842
+ key: context.key,
14843
+ kind: WORKTREE_STEER_TARGET,
14844
+ id: context.id,
14845
+ target: WORKTREE_STEER_TARGET,
14846
+ data: context.state
14847
+ }
14848
+ };
14849
+ const worktreeSteerView = {
14850
+ target: WORKTREE_STEER_TARGET,
14851
+ create: () => {
14852
+ let state = EMPTY_STEER_STATE;
14853
+ return {
14854
+ empty: EMPTY_STEER_STATE,
14855
+ replace: ({ nodes }) => state = nodes.at(-1)?.data ?? EMPTY_STEER_STATE,
14856
+ apply: ({ upserts }) => state = upserts.at(-1)?.data ?? state
14857
+ };
14858
+ },
14859
+ isActive: () => false
14860
+ };
14861
+ function installWorktreeSteerActivity(ctx) {
14862
+ ctx.effect(() => {
14863
+ const node = ctx.uiConversation.events.register(worktreeSteerNode);
14864
+ const view = ctx.uiConversation.views.register(worktreeSteerView);
14865
+ return () => {
14866
+ view();
14867
+ node();
14868
+ };
14869
+ }, "clutch-dsh-worktree: steer activity");
14870
+ }
14871
+ //#endregion
14872
+ //#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_49c1cce49fdb/packages/clutch-dsh-worktree/src/client/steer/steer.css.mjs
14873
+ 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";
14874
+ const styleId = "@cerbur/clutch-dsh-worktree/steer.css";
14875
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/steer.css\"]") === null) {
14876
+ const tag = document.createElement("style");
14877
+ tag.dataset.plugin = "@cerbur/clutch-dsh-worktree";
14878
+ tag.dataset.pluginCss = styleId;
14879
+ tag.textContent = css;
14880
+ document.head.appendChild(tag);
14881
+ }
14882
+ var steer_css_default = {
14883
+ "strip": "-cerbur-clutch-dsh-worktree-strip",
14884
+ "title": "-cerbur-clutch-dsh-worktree-title",
14885
+ "items": "-cerbur-clutch-dsh-worktree-items",
14886
+ "item": "-cerbur-clutch-dsh-worktree-item",
14887
+ "status": "-cerbur-clutch-dsh-worktree-status",
14888
+ "preview": "-cerbur-clutch-dsh-worktree-preview",
14889
+ "body": "-cerbur-clutch-dsh-worktree-body",
14890
+ "sender": "-cerbur-clutch-dsh-worktree-sender"
14891
+ };
14892
+ //#endregion
14893
+ //#region lib/client/steer/SteerDock.js
14894
+ function SteerDock({ useProjection, steer, t }) {
14895
+ const rows = visibleSteerRows((0, react.useSyncExternalStore)(steer.subscribe, steer.getSnapshot, steer.getSnapshot), useProjection("inbox"));
14896
+ if (rows.length === 0) return null;
14897
+ return (0, react_jsx_runtime.jsxs)("section", {
14898
+ className: steer_css_default.strip,
14899
+ "aria-label": t("steer.title"),
14900
+ children: [(0, react_jsx_runtime.jsxs)("div", {
14901
+ className: steer_css_default.title,
14902
+ children: [
14903
+ t("steer.title"),
14904
+ " · ",
14905
+ rows.length
14906
+ ]
14907
+ }), (0, react_jsx_runtime.jsx)("div", {
14908
+ className: steer_css_default.items,
14909
+ children: rows.map((row) => (0, react_jsx_runtime.jsxs)("details", {
14910
+ className: steer_css_default.item,
14911
+ "data-worktree-steer": row.status,
14912
+ children: [(0, react_jsx_runtime.jsxs)("summary", { children: [(0, react_jsx_runtime.jsx)("span", {
14913
+ className: steer_css_default.status,
14914
+ children: t(`steer.${row.status}`)
14915
+ }), (0, react_jsx_runtime.jsx)("span", {
14916
+ className: steer_css_default.preview,
14917
+ children: row.text
14918
+ })] }), (0, react_jsx_runtime.jsxs)("div", {
14919
+ className: steer_css_default.body,
14920
+ children: [
14921
+ (0, react_jsx_runtime.jsx)("div", {
14922
+ className: steer_css_default.sender,
14923
+ children: t("steer.sender", { sender: row.sender })
14924
+ }),
14925
+ (0, react_jsx_runtime.jsx)("p", { children: row.text }),
14926
+ (0, react_jsx_runtime.jsx)("small", { children: t("steer.receiptHint") })
14927
+ ]
14928
+ })]
14929
+ }, row.id))
14930
+ })]
14931
+ });
14932
+ }
14933
+ //#endregion
14141
14934
  //#region lib/client/settings/settings-navigation.js
14142
14935
  /** The rc.1 native Settings shell shares one viewing store between mouse and command entry. */
14143
14936
  function openWorktreeErrorSettings(slots) {
@@ -14393,12 +15186,12 @@ window.__ModuleLoader__.load({
14393
15186
  return {
14394
15187
  store,
14395
15188
  refresh,
14396
- async invalidate(workspaceId) {
15189
+ async invalidate(workspaceId, options) {
14397
15190
  if (disposed) return;
14398
15191
  const identity = identityFrom(input.sessions, input.workspaces);
14399
15192
  if (workspaceId !== void 0 && workspaceId !== identity.workspaceId) return;
14400
15193
  if (identity.workspaceId === void 0) return;
14401
- input.viewReader.invalidate(identity.workspaceId);
15194
+ if (!options?.alreadyInvalidated) input.viewReader.invalidate(identity.workspaceId);
14402
15195
  await refresh();
14403
15196
  await waitForLatestRefresh(workspaceId ?? identity.workspaceId);
14404
15197
  },
@@ -14602,13 +15395,19 @@ window.__ModuleLoader__.load({
14602
15395
  },
14603
15396
  request: (input) => {
14604
15397
  if (disposed) return Promise.resolve(false);
14605
- return new Promise((resolve) => {
14606
- queue.push({
14607
- input,
14608
- resolve
14609
- });
14610
- showNext();
15398
+ const existing = [active, ...queue].find((pending) => pending !== void 0 && pending.input.workspaceId === input.workspaceId && pending.input.worktreeId === input.worktreeId && pending.input.sessionId === input.sessionId && pending.input.cwd === input.cwd);
15399
+ if (existing !== void 0) return existing.promise;
15400
+ let settle;
15401
+ const promise = new Promise((resolve) => {
15402
+ settle = resolve;
15403
+ });
15404
+ queue.push({
15405
+ input: { ...input },
15406
+ resolve: settle,
15407
+ promise
14611
15408
  });
15409
+ showNext();
15410
+ return promise;
14612
15411
  },
14613
15412
  resolve: (confirmed) => {
14614
15413
  if (active === void 0) return;
@@ -15019,6 +15818,7 @@ window.__ModuleLoader__.load({
15019
15818
  */
15020
15819
  function apply(ctx) {
15021
15820
  installWorktreeCommandActivity(ctx);
15821
+ installWorktreeSteerActivity(ctx);
15022
15822
  const locale = ctx.locale;
15023
15823
  if (typeof document !== "undefined") ctx.effect(() => installWorktreePermissionIcon(document), "clutch-dsh-worktree: permission icon cleanup");
15024
15824
  ctx.effect(() => locale.register(WORKTREE_NS, {
@@ -15042,6 +15842,17 @@ window.__ModuleLoader__.load({
15042
15842
  };
15043
15843
  const sessions = ctx.sessions;
15044
15844
  const slots = ctx.slots;
15845
+ slots.inject("conversation.input.dock", () => slots.register({
15846
+ name: "conversation.input.dock",
15847
+ id: "clutch-dsh-worktree-steer",
15848
+ order: 21,
15849
+ locale: WORKTREE_NS,
15850
+ inject: (sessionId) => {
15851
+ const binding = ctx.sessions.binding(sessionId);
15852
+ if (binding === void 0) throw new Error("Worktree steer: Session is unavailable");
15853
+ return { steer: ctx.uiConversation.binding(binding).target(WORKTREE_STEER_TARGET) };
15854
+ }
15855
+ }, SteerDock));
15045
15856
  ctx.effect(() => slots.inject("shell.overlay", () => slots.register({
15046
15857
  name: "shell.overlay",
15047
15858
  id: "clutch-dsh-worktree-settings-icon",
@@ -15073,13 +15884,16 @@ window.__ModuleLoader__.load({
15073
15884
  });
15074
15885
  const toolChanges = createWorktreeToolChangeMonitor({
15075
15886
  read: (revision, signal) => manager.watchToolChanges(revision, signal),
15076
- changed: ({ workspaceId }) => {
15077
- viewReader.invalidate(workspaceId);
15887
+ changed: ({ workspaceId, requestId }) => {
15888
+ viewReader.invalidate(workspaceId, { changeId: requestId });
15078
15889
  if (contextProjection.store.getSnapshot().workspaceId === workspaceId) contextProjection.refresh();
15079
15890
  }
15080
15891
  });
15081
15892
  ctx.effect(() => () => toolChanges.dispose(), "clutch-dsh-worktree: tool notification cleanup");
15082
- ctx.on("connection/reset", () => toolChanges.reset());
15893
+ ctx.on("connection/reset", () => {
15894
+ viewReader.resetChangeIds();
15895
+ toolChanges.reset();
15896
+ });
15083
15897
  if (typeof document !== "undefined") toolChanges.start();
15084
15898
  ctx.effect(() => () => manager.dispose(), "clutch-dsh-worktree: connection cleanup");
15085
15899
  ctx.effect(() => () => viewReader.dispose(), "clutch-dsh-worktree: view reader cleanup");
@@ -15304,7 +16118,7 @@ window.__ModuleLoader__.load({
15304
16118
  if (workspacePath !== null) await ctx.workspaces.create({ path: workspacePath });
15305
16119
  },
15306
16120
  createSessionForWorktree: (input) => worktreeSessionConnector.create(input),
15307
- invalidateWorktreeContext: (workspaceId) => contextProjection.invalidate(workspaceId),
16121
+ invalidateWorktreeContext: (workspaceId, options) => contextProjection.invalidate(workspaceId, options),
15308
16122
  createMainSession: (workspaceId) => {
15309
16123
  ctx.uiWorkspace.startSession(workspaceId);
15310
16124
  },