@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.
- package/README.md +120 -10
- package/README.zh.md +96 -10
- package/assets/screenshots/screenshots-agent-steer.jpg +0 -0
- package/assets/screenshots/screenshots-baseline-sync.png +0 -0
- package/lib/client/WorktreeSurface.d.ts.map +1 -1
- package/lib/client/WorktreeSurface.js +19 -3
- package/lib/client/WorktreeSurface.js.map +1 -1
- package/lib/client/context/worktree-context-store.d.ts +3 -1
- package/lib/client/context/worktree-context-store.d.ts.map +1 -1
- package/lib/client/context/worktree-context-store.js +3 -2
- package/lib/client/context/worktree-context-store.js.map +1 -1
- package/lib/client/dashboard/WorktreeDashboard.d.ts +8 -3
- package/lib/client/dashboard/WorktreeDashboard.d.ts.map +1 -1
- package/lib/client/dashboard/WorktreeDashboard.js +120 -12
- package/lib/client/dashboard/WorktreeDashboard.js.map +1 -1
- package/lib/client/dashboard/dashboard-selection.d.ts +4 -0
- package/lib/client/dashboard/dashboard-selection.d.ts.map +1 -1
- package/lib/client/dashboard/dashboard-selection.js +23 -0
- package/lib/client/dashboard/dashboard-selection.js.map +1 -1
- package/lib/client/dsh-slot-contract.d.ts +8 -1
- package/lib/client/dsh-slot-contract.d.ts.map +1 -1
- package/lib/client/entry.d.ts.map +1 -1
- package/lib/client/entry.js +22 -4
- package/lib/client/entry.js.map +1 -1
- package/lib/client/locales.d.ts +58 -0
- package/lib/client/locales.d.ts.map +1 -1
- package/lib/client/locales.js +66 -8
- package/lib/client/locales.js.map +1 -1
- package/lib/client/permission/worktree-permission.d.ts.map +1 -1
- package/lib/client/permission/worktree-permission.js +14 -6
- package/lib/client/permission/worktree-permission.js.map +1 -1
- package/lib/client/session/active-sessions.d.ts +21 -0
- package/lib/client/session/active-sessions.d.ts.map +1 -0
- package/lib/client/session/active-sessions.js +61 -0
- package/lib/client/session/active-sessions.js.map +1 -0
- package/lib/client/settings/diagnostics.d.ts +4 -0
- package/lib/client/settings/diagnostics.d.ts.map +1 -1
- package/lib/client/settings/diagnostics.js +12 -0
- package/lib/client/settings/diagnostics.js.map +1 -1
- package/lib/client/steer/SteerDock.d.ts +8 -0
- package/lib/client/steer/SteerDock.d.ts.map +1 -0
- package/lib/client/steer/SteerDock.js +12 -0
- package/lib/client/steer/SteerDock.js.map +1 -0
- package/lib/client/steer/steer-activity.d.ts +18 -0
- package/lib/client/steer/steer-activity.d.ts.map +1 -0
- package/lib/client/steer/steer-activity.js +37 -0
- package/lib/client/steer/steer-activity.js.map +1 -0
- package/lib/client/steer/steer-state.d.ts +24 -0
- package/lib/client/steer/steer-state.d.ts.map +1 -0
- package/lib/client/steer/steer-state.js +102 -0
- package/lib/client/steer/steer-state.js.map +1 -0
- package/lib/client/surface/components/SessionActivityBell.d.ts +14 -0
- package/lib/client/surface/components/SessionActivityBell.d.ts.map +1 -0
- package/lib/client/surface/components/SessionActivityBell.js +92 -0
- package/lib/client/surface/components/SessionActivityBell.js.map +1 -0
- package/lib/client/surface/components/SurfaceHeader.d.ts +3 -2
- package/lib/client/surface/components/SurfaceHeader.d.ts.map +1 -1
- package/lib/client/surface/components/SurfaceHeader.js +4 -2
- package/lib/client/surface/components/SurfaceHeader.js.map +1 -1
- package/lib/client/surface/state/useSurfaceRefresh.d.ts.map +1 -1
- package/lib/client/surface/state/useSurfaceRefresh.js +6 -3
- package/lib/client/surface/state/useSurfaceRefresh.js.map +1 -1
- package/lib/client/surface/types.d.ts +5 -1
- package/lib/client/surface/types.d.ts.map +1 -1
- package/lib/client/view/worktree-view-read.d.ts +3 -0
- package/lib/client/view/worktree-view-read.d.ts.map +1 -1
- package/lib/client/view/worktree-view-read.js +23 -1
- package/lib/client/view/worktree-view-read.js.map +1 -1
- package/lib/client/worktree-connection.d.ts +1 -0
- package/lib/client/worktree-connection.d.ts.map +1 -1
- package/lib/client/worktree-connection.js +2 -0
- package/lib/client/worktree-connection.js.map +1 -1
- package/lib/client.js +1298 -484
- package/lib/client.js.map +1 -1
- package/lib/contract/baseline-sync.d.ts +27 -0
- package/lib/contract/baseline-sync.d.ts.map +1 -0
- package/lib/contract/baseline-sync.js +2 -0
- package/lib/contract/baseline-sync.js.map +1 -0
- package/lib/contract/index.contract.js +1 -0
- package/lib/contract/index.contract.js.map +1 -1
- package/lib/contract/index.d.ts +5 -1
- package/lib/contract/index.d.ts.map +1 -1
- package/lib/contract/index.js +1 -0
- package/lib/contract/index.js.map +1 -1
- package/lib/contract/worktree-permission.d.ts +2 -0
- package/lib/contract/worktree-permission.d.ts.map +1 -1
- package/lib/contract/worktree-permission.js +1 -1
- package/lib/contract/worktree-permission.js.map +1 -1
- package/lib/contract/worktree-tool-changes.d.ts +2 -0
- package/lib/contract/worktree-tool-changes.d.ts.map +1 -1
- package/lib/host/baseline-sync.d.ts +15 -0
- package/lib/host/baseline-sync.d.ts.map +1 -0
- package/lib/host/baseline-sync.js +93 -0
- package/lib/host/baseline-sync.js.map +1 -0
- package/lib/host/remote.d.ts +2 -1
- package/lib/host/remote.d.ts.map +1 -1
- package/lib/host/remote.js +1 -1
- package/lib/host/remote.js.map +1 -1
- package/lib/host/service.d.ts +5 -0
- package/lib/host/service.d.ts.map +1 -1
- package/lib/host/service.js +27 -2
- package/lib/host/service.js.map +1 -1
- package/lib/host/worktree-permission.d.ts +12 -0
- package/lib/host/worktree-permission.d.ts.map +1 -1
- package/lib/host/worktree-permission.js +87 -16
- package/lib/host/worktree-permission.js.map +1 -1
- package/lib/host/worktree-tool-changes.d.ts +1 -1
- package/lib/host/worktree-tool-changes.d.ts.map +1 -1
- package/lib/host/worktree-tool-changes.js +5 -2
- package/lib/host/worktree-tool-changes.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/manage/manager.d.ts +5 -0
- package/lib/manage/manager.d.ts.map +1 -1
- package/lib/manage/manager.js +17 -1
- package/lib/manage/manager.js.map +1 -1
- package/lib/manage/types.d.ts +5 -0
- package/lib/manage/types.d.ts.map +1 -1
- package/lib/tool/agent-relay.d.ts +55 -0
- package/lib/tool/agent-relay.d.ts.map +1 -0
- package/lib/tool/agent-relay.js +159 -0
- package/lib/tool/agent-relay.js.map +1 -0
- package/lib/tool/delegation.d.ts +1 -0
- package/lib/tool/delegation.d.ts.map +1 -1
- package/lib/tool/delegation.js +32 -6
- package/lib/tool/delegation.js.map +1 -1
- package/lib/tool/dispatch-session.d.ts +18 -0
- package/lib/tool/dispatch-session.d.ts.map +1 -0
- package/lib/tool/dispatch-session.js +41 -0
- package/lib/tool/dispatch-session.js.map +1 -0
- package/lib/tool/errors.d.ts +6 -0
- package/lib/tool/errors.d.ts.map +1 -1
- package/lib/tool/errors.js +16 -2
- package/lib/tool/errors.js.map +1 -1
- package/lib/tool/guidance.d.ts +1 -0
- package/lib/tool/guidance.d.ts.map +1 -1
- package/lib/tool/guidance.js +2 -0
- package/lib/tool/guidance.js.map +1 -1
- package/lib/tool/index.d.ts.map +1 -1
- package/lib/tool/index.js +38 -4
- package/lib/tool/index.js.map +1 -1
- package/lib/tool/inputs.d.ts.map +1 -1
- package/lib/tool/inputs.js +6 -6
- package/lib/tool/inputs.js.map +1 -1
- package/lib/tool/list-models.js +2 -2
- package/lib/tool/list-models.js.map +1 -1
- package/lib/tool/list-sessions.js +2 -2
- package/lib/tool/list-sessions.js.map +1 -1
- package/lib/tool/list-worktrees.js +1 -1
- package/lib/tool/list-worktrees.js.map +1 -1
- package/lib/tool/native-session.d.ts +4 -0
- package/lib/tool/native-session.d.ts.map +1 -1
- package/lib/tool/native-session.js +17 -0
- package/lib/tool/native-session.js.map +1 -1
- package/lib/tool/new-worktree.js +4 -4
- package/lib/tool/new-worktree.js.map +1 -1
- package/lib/tool/report-result.d.ts.map +1 -1
- package/lib/tool/report-result.js +9 -7
- package/lib/tool/report-result.js.map +1 -1
- package/lib/tool/schema.d.ts +8 -0
- package/lib/tool/schema.d.ts.map +1 -1
- package/lib/tool/schema.js +31 -2
- package/lib/tool/schema.js.map +1 -1
- package/lib/tool/send-message.d.ts.map +1 -1
- package/lib/tool/send-message.js +8 -7
- package/lib/tool/send-message.js.map +1 -1
- package/lib/tool/span-worktree.d.ts.map +1 -1
- package/lib/tool/span-worktree.js +33 -59
- package/lib/tool/span-worktree.js.map +1 -1
- package/lib/tool/types.d.ts +2 -0
- package/lib/tool/types.d.ts.map +1 -1
- package/lib/tool/wire-schema.d.ts +4 -0
- package/lib/tool/wire-schema.d.ts.map +1 -0
- package/lib/tool/wire-schema.js +24 -0
- package/lib/tool/wire-schema.js.map +1 -0
- package/lib/typert.host.js +117 -56
- package/lib/typert.remote-client.d.ts +3 -1
- package/lib/typert.remote-client.d.ts.map +1 -1
- package/lib/typert.remote-client.js +117 -56
- 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": "
|
|
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": "
|
|
1012
|
+
"dashboard.hint.children": "查看以当前分支为已保存基线的 Worktree。",
|
|
990
1013
|
"dashboard.hint.settings": "这里将提供 Worktree 指令与偏好设置。当前不会保存任何更改。",
|
|
991
|
-
"dashboard.mvpHint": "
|
|
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
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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/
|
|
1990
|
-
const css$
|
|
1991
|
-
const styleId$
|
|
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$
|
|
1996
|
-
tag.textContent = css$
|
|
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/
|
|
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$
|
|
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$
|
|
2060
|
-
tag.textContent = css$
|
|
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/
|
|
2235
|
-
const css$
|
|
2236
|
-
const styleId$
|
|
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$
|
|
2241
|
-
tag.textContent = css$
|
|
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/
|
|
2860
|
-
const css$
|
|
2861
|
-
const styleId$
|
|
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$
|
|
2866
|
-
tag.textContent = css$
|
|
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/
|
|
3261
|
-
const css$
|
|
3262
|
-
const styleId$
|
|
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$
|
|
3267
|
-
tag.textContent = css$
|
|
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, {
|
|
8596
|
-
|
|
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/
|
|
9607
|
-
const css$
|
|
9608
|
-
const styleId$
|
|
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$
|
|
9613
|
-
tag.textContent = css$
|
|
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/
|
|
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$
|
|
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$
|
|
9824
|
-
tag.textContent = css$
|
|
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/
|
|
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$
|
|
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$
|
|
10125
|
-
tag.textContent = css$
|
|
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/
|
|
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
|
|
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
|
|
12813
|
-
|
|
12814
|
-
|
|
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: [
|
|
12901
|
-
|
|
12902
|
-
|
|
12903
|
-
|
|
12904
|
-
|
|
12905
|
-
|
|
12906
|
-
|
|
12907
|
-
|
|
12908
|
-
|
|
12909
|
-
|
|
12910
|
-
|
|
12911
|
-
|
|
12912
|
-
|
|
12913
|
-
|
|
12914
|
-
|
|
12915
|
-
|
|
12916
|
-
|
|
12917
|
-
|
|
12918
|
-
|
|
12919
|
-
|
|
12920
|
-
|
|
12921
|
-
|
|
12922
|
-
|
|
12923
|
-
|
|
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.
|
|
12939
|
-
"aria-label": t("dashboard.
|
|
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
|
-
|
|
12944
|
-
|
|
13414
|
+
if (topActionIsCreateSession) onCreateSession?.();
|
|
13415
|
+
else onClose();
|
|
12945
13416
|
},
|
|
12946
|
-
children: (0, react_jsx_runtime.
|
|
12947
|
-
})
|
|
12948
|
-
|
|
12949
|
-
|
|
12950
|
-
|
|
12951
|
-
|
|
12952
|
-
|
|
12953
|
-
|
|
12954
|
-
|
|
12955
|
-
|
|
12956
|
-
|
|
12957
|
-
|
|
12958
|
-
|
|
12959
|
-
|
|
12960
|
-
|
|
12961
|
-
|
|
12962
|
-
|
|
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
|
-
|
|
13078
|
-
|
|
13079
|
-
|
|
13080
|
-
|
|
13081
|
-
|
|
13082
|
-
|
|
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.
|
|
13445
|
+
className: dashboard_css_default.dashboardIdentity,
|
|
13110
13446
|
children: [
|
|
13111
|
-
(0, react_jsx_runtime.jsxs)("
|
|
13112
|
-
className: dashboard_css_default.
|
|
13447
|
+
(0, react_jsx_runtime.jsxs)("div", {
|
|
13448
|
+
className: dashboard_css_default.dashboardTitleRow,
|
|
13113
13449
|
children: [
|
|
13114
|
-
(0, react_jsx_runtime.
|
|
13115
|
-
(0, react_jsx_runtime.jsx)("
|
|
13116
|
-
|
|
13117
|
-
|
|
13118
|
-
|
|
13119
|
-
|
|
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
|
-
|
|
13127
|
-
|
|
13128
|
-
|
|
13129
|
-
|
|
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)(
|
|
13135
|
-
|
|
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)("
|
|
13160
|
-
|
|
13161
|
-
|
|
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
|
-
|
|
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.
|
|
13208
|
-
|
|
13209
|
-
|
|
13210
|
-
|
|
13211
|
-
|
|
13212
|
-
|
|
13213
|
-
|
|
13214
|
-
|
|
13215
|
-
|
|
13216
|
-
|
|
13217
|
-
|
|
13218
|
-
|
|
13219
|
-
|
|
13220
|
-
|
|
13221
|
-
|
|
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
|
-
})
|
|
13243
|
-
|
|
13244
|
-
|
|
13245
|
-
|
|
13246
|
-
|
|
13247
|
-
|
|
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
|
-
|
|
13261
|
-
|
|
13262
|
-
|
|
13263
|
-
|
|
13264
|
-
|
|
13265
|
-
|
|
13266
|
-
|
|
13267
|
-
|
|
13268
|
-
|
|
13269
|
-
|
|
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
|
-
|
|
13272
|
-
|
|
13273
|
-
|
|
13274
|
-
|
|
13275
|
-
|
|
13276
|
-
|
|
13277
|
-
|
|
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
|
-
},
|
|
13281
|
-
|
|
13282
|
-
|
|
13283
|
-
|
|
13284
|
-
|
|
13285
|
-
|
|
13286
|
-
|
|
13287
|
-
|
|
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
|
-
|
|
13292
|
-
|
|
13293
|
-
|
|
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
|
-
|
|
14606
|
-
|
|
14607
|
-
|
|
14608
|
-
|
|
14609
|
-
|
|
14610
|
-
|
|
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", () =>
|
|
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
|
},
|