feat(ui): sidebar lists workspaces with their sessions, Claude Desktop style

The sidebar's project tree becomes a flat workspace list (WorkspaceTree):
one row per workspace in the stored order, each expanding to its sessions.
A session that still has a live pane opens /workspace?lane=<id>&run=<runId>,
which only attaches pane 0 to that tmux session; any other session opens
its read-only transcript. Nothing in the sidebar starts or resumes a run.
This commit is contained in:
2026-10-01 22:23:01 +07:00
parent 744e9c6cda
commit 2e051e23b6
16 changed files with 616 additions and 538 deletions
+6 -10
View File
@@ -312,15 +312,6 @@
"conflict.save": "Save and mark resolved",
"changes.takeOursHint": "Keep your version of the whole file",
"changes.takeTheirsHint": "Take the incoming version of the whole file",
"projects.title": "Projects",
"projects.folders": "Folders",
"projects.newWorkspace": "New workspace in {{name}}",
"projects.refresh": "Refresh projects and worktrees",
"projects.hidden_one": "{{count}} hidden",
"projects.hidden_other": "{{count}} hidden",
"projects.pick": "Pick a workspace in the sidebar",
"row.primary": "primary",
"row.adopt": "Adopt",
"row.actions": "Workspace actions",
"row.hint": "Double-click to rename · drag or Alt+↑/↓ to reorder · right-click for actions",
"menu.start": "Start",
@@ -338,5 +329,10 @@
"sessions.empty": "No sessions in this workspace yet",
"sessions.resume": "Resume",
"sessions.open": "Open",
"sessions.search": "Filter sessions…"
"sessions.search": "Filter sessions…",
"tree.title": "Workspaces",
"tree.search": "Search workspaces and sessions",
"tree.newSession": "New session",
"tree.noSessions": "No sessions yet",
"tree.transcriptHint": "No live pane — opens the transcript"
}
+6 -10
View File
@@ -312,15 +312,6 @@
"conflict.save": "Lưu và đánh dấu đã xong",
"changes.takeOursHint": "Giữ bản của mình cho cả file",
"changes.takeTheirsHint": "Lấy bản kia cho cả file",
"projects.title": "Dự án",
"projects.folders": "Thư mục",
"projects.newWorkspace": "Workspace mới trong {{name}}",
"projects.refresh": "Làm mới dự án và worktree",
"projects.hidden_one": "{{count}} đang ẩn",
"projects.hidden_other": "{{count}} đang ẩn",
"projects.pick": "Chọn một workspace ở thanh bên",
"row.primary": "chính",
"row.adopt": "Nhận",
"row.actions": "Thao tác workspace",
"row.hint": "Nhấp đúp để đổi tên · kéo hoặc Alt+↑/↓ để sắp xếp · chuột phải để xem thao tác",
"menu.start": "Bắt đầu",
@@ -338,5 +329,10 @@
"sessions.empty": "Chưa có phiên nào trong workspace này",
"sessions.resume": "Tiếp tục",
"sessions.open": "Mở",
"sessions.search": "Lọc phiên…"
"sessions.search": "Lọc phiên…",
"tree.title": "Không gian làm việc",
"tree.search": "Tìm workspace và session",
"tree.newSession": "Session mới",
"tree.noSessions": "Chưa có session",
"tree.transcriptHint": "Không còn pane — mở transcript"
}