feat: workspace aliases, tab groups of split panes, native path picker (v2.1.0)
- /api/workspaces and `agenthub workspace(s)` / `--workspace` as aliases of /api/lanes and `agenthub lanes` / `--lane`; old names print one stderr note. REPL `help lanes|workspace|workspaces` resolves through the aliases. - A workspace holds up to ten sessions (slots 0-9); every console tab is a group of 1-4 split panes (PaneGroups, agenthub.workspace.paneLayout); parseGroups keeps the stored active tab when an earlier one is dropped. - Browse button beside path fields: POST /api/lanes/pick-path opens the OS picker on the server's desktop — loopback only and no forwarding header (EREMOTE), a display failure is ENODIALOG not a Cancel, the dialog is killed when the request closes, a folder field falls back to the in-app browser on any failure. - Changes rail counts chip, image viewer (/git/raw), status bar session counts and per-day cost (`date=` on /api/pricing/cost). - /agenthub-open and /agenthub-doctor run from the INSTALLED build (supersededBy), doctor offers fixes behind two confirmations; plugin-open treats a locked bootstrap as non-fatal. - New-terminal shell waits for the first attach (issue #55). - repo-onboarding / debug-live-issue skills removed. - OpenAPI: pick-path, lane/date on /pricing/cost, tool on /run/history, /api/workspaces mount.
This commit is contained in:
@@ -265,7 +265,7 @@ function tmuxStatus() {
|
||||
return [
|
||||
"warn",
|
||||
"tmux",
|
||||
"not found — Start Run and `agenthub lanes shell` will fail (everything else is unaffected). " +
|
||||
"not found — Start Run and `agenthub workspace shell` will fail (everything else is unaffected). " +
|
||||
"Install it: sudo apt install tmux / brew install tmux (Windows: run AgentHub under WSL2)",
|
||||
];
|
||||
}
|
||||
|
||||
+18
-3
@@ -9,7 +9,9 @@
|
||||
* for `--force` rebuilds or a first build that failed during bootstrap, and it
|
||||
* re-runs bootstrap first when the live server belongs to a retired plugin root
|
||||
* (a mid-session `/plugin` update) so the new bundle is not left calling routes
|
||||
* the running server never had.
|
||||
* the running server never had. It exits 1 when that bootstrap does not answer
|
||||
* `ok` (bar `locked` — another one is running) as well as when the build fails,
|
||||
* so `/agenthub-open` knows to run the doctor.
|
||||
*
|
||||
* The client source is copied out of the (replaced-on-update) plugin cache into
|
||||
* the runtime dir before building, so neither the cache nor the checkout is
|
||||
@@ -122,7 +124,20 @@ if (require.main === module) {
|
||||
// old server never had. Hand the version handover back to bootstrap, which
|
||||
// owns stop/start and the dependency install the new root may need.
|
||||
const stale = (boot.readState() || {}).pluginRoot !== PLUGIN_ROOT || !boot.serverIsLive();
|
||||
if (stale) boot.bootstrap();
|
||||
// Its answer matters: printing a URL with exit 0 after a refused bootstrap
|
||||
// (old Node, failed install) told /agenthub-open everything was fine.
|
||||
const booted = stale ? boot.bootstrap() : "ok";
|
||||
if (booted === "locked") {
|
||||
// A SessionStart bootstrap holds the lock and will (re)start the server
|
||||
// itself; a doctor's `--force` would only hit the same lock.
|
||||
console.error("Another bootstrap is running — the server restarts when it finishes.");
|
||||
} else if (booted !== "ok") {
|
||||
console.error(
|
||||
`The dashboard server was not (re)started: bootstrap answered "${booted}" — ` +
|
||||
`see ${path.join(boot.runtimeDir(), "bootstrap.log")}`
|
||||
);
|
||||
process.exitCode = 1;
|
||||
}
|
||||
|
||||
const result = buildClient({ force: process.argv.includes("--force") });
|
||||
if (result === "failed") {
|
||||
@@ -130,7 +145,7 @@ if (require.main === module) {
|
||||
process.exitCode = 1;
|
||||
} else {
|
||||
if (result === "built") console.log("Dashboard UI built.");
|
||||
if (stale) console.log("Server restarted on the current plugin version.");
|
||||
if (stale && booted === "ok") console.log("Server restarted on the current plugin version.");
|
||||
console.log(dashboardUrl());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user