feat(ui): sidebar project tree, status bar and a tabbed workbench for workspaces

The Workspace page's lane strip moves into the sidebar as a project tree:
workspaces grouped by git repository (new GET /api/projects, cached in
memory, POST /api/projects/refresh), untracked worktrees with Adopt, inline
rename, drag/Alt+arrow ordering and a right-click row menu. The selected
workspace is the URL's ?lane=, one shared lane list feeds the tree, the new
bottom status bar and the page. The Changes panel gains an activity bar
(Files / Changes / Sessions, with resume), and split panes get a header.
This commit is contained in:
2026-10-01 16:33:25 +07:00
parent 5b3884b309
commit ba2c4e1914
39 changed files with 2431 additions and 1439 deletions
+9
View File
@@ -404,6 +404,7 @@ import type {
LaneFileContent,
LaneTreeEntry,
LaneCounts,
Project,
LaneGitFacts,
LaneRuntime,
LaneTool,
@@ -2416,6 +2417,14 @@ export const api = {
}>("/remote-sources/sync-all", { method: "POST" }),
},
/** Lanes grouped by git repo, with each repo's worktrees (server/lib/projects.js). */
projects: {
/** GET /api/projects — read on demand by the sidebar tree, never polled. */
list: () => request<{ projects: Project[] }>("/projects"),
/** POST /api/projects/refresh — drop the cached roots/worktree lists, then list. */
refresh: () => request<{ projects: Project[] }>("/projects/refresh", { method: "POST" }),
},
// ──────────────────────────────── Lanes API ────────────────────────────────
/** Agent work lanes: durable units of parallel work, one cwd per lane.
* Maps to `server/routes/lanes.js`. */