From 3d8cf85ef29a8e690035b9b45f33b576477064c4 Mon Sep 17 00:00:00 2001 From: Nathan Esquenazi Date: Fri, 3 Apr 2026 19:47:38 +0000 Subject: [PATCH] fix: profile default workspace reads terminal.cwd; dropdown opens upward MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. _profile_default_workspace() now checks terminal.cwd Profile config.yaml files don't have a 'workspace' or 'default_workspace' key — they store the working directory as terminal.cwd (the hermes-agent CLI setting). Added it as the third fallback after 'workspace' and 'default_workspace', so switching to camanji correctly resolves ~/Camanji, webui resolves ~/webui-mvp, etc. 2. Workspace dropdown opens upward (bottom: calc(100% + 4px)) The dropdown is now anchored at the bottom of the sidebar. Opening it downward (top: 100%) caused it to clip off screen. Flipped to open upward with an upward shadow so it expands into the session list area instead. Tests: 426 passed, 0 failed. --- api/workspace.py | 26 ++++++++++++++++++++------ static/style.css | 2 +- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/api/workspace.py b/api/workspace.py index 0db7b5b..de0ff05 100644 --- a/api/workspace.py +++ b/api/workspace.py @@ -53,17 +53,31 @@ def _last_workspace_file() -> Path: def _profile_default_workspace() -> str: """Read the profile's default workspace from its config.yaml. + Checks keys in priority order: + 1. 'workspace' — explicit webui workspace key + 2. 'default_workspace' — alternate explicit key + 3. 'terminal.cwd' — hermes-agent terminal working dir (most common) + Falls back to the boot-time DEFAULT_WORKSPACE constant. """ try: - from api.profiles import get_active_hermes_home from api.config import get_config cfg = get_config() - ws = cfg.get('default_workspace') - if ws: - p = Path(ws).expanduser().resolve() - if p.is_dir(): - return str(p) + # Explicit webui workspace keys first + for key in ('workspace', 'default_workspace'): + ws = cfg.get(key) + if ws: + p = Path(str(ws)).expanduser().resolve() + if p.is_dir(): + return str(p) + # Fall through to terminal.cwd — the agent's configured working directory + terminal_cfg = cfg.get('terminal', {}) + if isinstance(terminal_cfg, dict): + cwd = terminal_cfg.get('cwd', '') + if cwd and str(cwd) not in ('.', ''): + p = Path(str(cwd)).expanduser().resolve() + if p.is_dir(): + return str(p) except (ImportError, Exception): pass return str(_BOOT_DEFAULT_WORKSPACE) diff --git a/static/style.css b/static/style.css index b13bfda..e5c39ed 100644 --- a/static/style.css +++ b/static/style.css @@ -345,7 +345,7 @@ /* ── Workspace dropdown (topbar) ── */ .ws-chip{user-select:none;} -.ws-dropdown{display:none;position:absolute;top:calc(100% + 4px);left:0;right:0;min-width:200px;background:#1a2535;border:1px solid var(--border2);border-radius:10px;box-shadow:0 8px 24px rgba(0,0,0,.4);z-index:200;overflow:hidden;max-height:320px;overflow-y:auto;} +.ws-dropdown{display:none;position:absolute;bottom:calc(100% + 4px);left:0;right:0;min-width:200px;background:#1a2535;border:1px solid var(--border2);border-radius:10px;box-shadow:0 -4px 24px rgba(0,0,0,.4);z-index:200;overflow:hidden;max-height:320px;overflow-y:auto;} .ws-dropdown.open{display:block;} .ws-opt{padding:9px 14px;cursor:pointer;transition:background .12s;} .ws-opt:hover{background:rgba(255,255,255,.07);}