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:
@@ -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`. */
|
||||
|
||||
Reference in New Issue
Block a user