fix(lib): resolve workspace CWD mismatch in herdr new-session shim and enforce target workspace slug priority

This commit is contained in:
2026-08-13 08:37:51 +09:00
parent da92624273
commit 20e2e9bd2d
+25 -22
View File
@@ -265,13 +265,20 @@ print('\t'.join(env_flags) + '\n' + ' '.join(binary_tokens))
fi fi
# Check if there is an existing workspace inside this session (to reuse and split view) # Check if there is an existing workspace inside this session (to reuse and split view)
existing_ws=$(_real_herdr workspace list 2>/dev/null | python3 -c " existing_ws=$(_real_herdr workspace list 2>/dev/null | TARGET_CWD="${ws:-.}" python3 -c "
import sys, json import sys, json, os
target_ws = os.environ.get('TARGET_CWD', '')
try: try:
target_abs = os.path.realpath(target_ws) if target_ws else ''
d = json.loads(sys.stdin.read()) d = json.loads(sys.stdin.read())
wss = d.get('result', {}).get('workspaces', []) wss = d.get('result', {}).get('workspaces', [])
if wss: matched_id = ''
print(wss[0].get('workspace_id', '')) for w in wss:
w_cwd = os.path.realpath(w.get('cwd', '')) if w.get('cwd') else ''
if target_abs and w_cwd == target_abs:
matched_id = w.get('workspace_id', '')
break
print(matched_id)
except Exception: except Exception:
pass pass
") ")
@@ -745,24 +752,20 @@ for s in d.get('herdr_sessions', []):
if s.get('name') == name: if s.get('name') == name:
print(s.get('herdr_session') or s.get('herdr_server') or s.get('herdr_workspace') or 'default') print(s.get('herdr_session') or s.get('herdr_server') or s.get('herdr_workspace') or 'default')
sys.exit(0) sys.exit(0)
fallback = os.environ.get('HERDR_SESSION_NAME', '') fallback = ''
if not fallback or fallback == 'default': if ws:
legacy = os.environ.get('HERDR_SERVER_NAME', '') abs_ws = os.path.abspath(ws)
if legacy and legacy != 'default': parent = os.path.basename(os.path.dirname(abs_ws)) or 'workspace'
fallback = legacy work = os.path.basename(abs_ws) or 'root'
if not fallback or fallback == 'default': if parent in ('/', '.'): parent = 'workspace'
if ws: if work in ('/', '.'): work = 'root'
# derive_workspace_slug Equivalent in python slug = f'{parent}-{work}'.lower().replace('_', '-')
abs_ws = os.path.abspath(ws) import re
parent = os.path.basename(os.path.dirname(abs_ws)) or 'workspace' slug = re.sub(r'[^a-zA-Z0-9-]', '', slug).lstrip('-')
work = os.path.basename(abs_ws) or 'root' fallback = f'mam-{slug}' if slug else 'mam-ws'
if parent in ('/', '.'): parent = 'workspace' else:
if work in ('/', '.'): work = 'root' fallback = os.environ.get('HERDR_SESSION_NAME', '') or os.environ.get('HERDR_SERVER_NAME', '')
slug = f'{parent}-{work}'.lower().replace('_', '-') if not fallback or fallback == 'default':
import re
slug = re.sub(r'[^a-zA-Z0-9-]', '', slug).lstrip('-')
fallback = f'mam-{slug}' if slug else 'mam-ws'
else:
fallback = 'default' fallback = 'default'
print('WARN: resolve_herdr_session called without workspace parameter for unregistered session; falling back to default', file=sys.stderr) print('WARN: resolve_herdr_session called without workspace parameter for unregistered session; falling back to default', file=sys.stderr)
print(fallback or 'default') print(fallback or 'default')