refactor: rename resolve_herdr_workspace to resolve_herdr_session and use herdr_session database field consistently

This commit is contained in:
Antigravity
2026-07-20 11:13:17 +09:00
parent daa1476714
commit 87bb2780ac
12 changed files with 166 additions and 28 deletions
+4 -10
View File
@@ -495,9 +495,9 @@ herdr() {
}
# ---------------------------------------------------------------------------
# resolve_herdr_server <session_name>
# resolve_herdr_session <session_name>
#
# Query agent-sessions.yaml to find the herdr_server associated with a session.
# Query agent-sessions.yaml to find the herdr_session associated with a session.
# Fallback to HERDR_SERVER_NAME or 'default' if not registered or field is missing.
# Prints the resolved server name on stdout.
# ---------------------------------------------------------------------------
@@ -541,13 +541,7 @@ print(json.dumps(d, ensure_ascii=False))
PYEOF
}
# Despite the name (kept for caller compatibility — resume/stop/update_yaml_resumed
# all do `HERDR_SERVER_NAME="$(resolve_herdr_workspace "$SESSION_NAME")"`), this
# returns the isolated herdr *session* name to use for this MAM session row, not
# a workspace id. Real isolation is `--session <name>` (see `_MAM_SESSION` in the
# generated wrapper) — a workspace label match provides no actual isolation
# since agent/pane commands are server-global regardless of workspace.
resolve_herdr_workspace() {
resolve_herdr_session() {
local session_name="$1"
MAM_STATE_JSON="$(load_state_json)" SESSION_NAME="$session_name" python3 -c "
import sys, os, json
@@ -555,7 +549,7 @@ name = os.environ['SESSION_NAME']
d = json.loads(os.environ.get('MAM_STATE_JSON', '{}'))
for s in d.get('herdr_sessions', []):
if s.get('name') == name:
print(s.get('herdr_workspace') or s.get('herdr_server') or 'default')
print(s.get('herdr_session') or s.get('herdr_workspace') or s.get('herdr_server') or 'default')
sys.exit(0)
print(os.environ.get('HERDR_SERVER_NAME', 'default'))
"
@@ -310,7 +310,7 @@ entry = {
'role': role,
'herdr_session_created_at': os.environ['NOW_ISO'],
'herdr_session_epoch': int(epoch) if epoch.isdigit() else 0,
'herdr_server': server_name,
'herdr_session': server_name,
'delegate_job_id': os.environ.get('DELEGATE_JOB_ID', '') or None,
'pane': {
'index': 0,
@@ -440,7 +440,7 @@ run_agent() {
# the caller having exported HERDR_SERVER_NAME by hand. This is what lets
# delegation reach an agent living in an isolated herdr session (e.g. one
# created with --herdr-server) instead of silently looking in "default".
export HERDR_SERVER_NAME="$(resolve_herdr_workspace "$sess")"
export HERDR_SERVER_NAME="$(resolve_herdr_session "$sess")"
if ! herdr has-session -t "$sess" 2>/dev/null; then
echo "ERROR: 에이전트 세션 '$sess'이 존재하지 않습니다. 작업을 위임하기 전에 먼저 에이전트 세션을 기동해 주세요." >&2
@@ -121,7 +121,7 @@ _changed = False
for s in d.get('herdr_sessions', []):
if s.get('delegate_job_id') == _jid and s.get('status') == 'running':
_name = s.get('name')
_srv = s.get('herdr_workspace') or s.get('herdr_server') or 'default'
_srv = s.get('herdr_session') or s.get('herdr_workspace') or s.get('herdr_server') or 'default'
if _event == 'completed':
s['delegate_job_id'] = None
print('MQTT Monitor: job completed on ' + str(_name) + ' — session kept alive', flush=True)
@@ -345,7 +345,7 @@ unique_servers = {'default'}
if 'HERDR_SERVER_NAME' in os.environ:
unique_servers.add(os.environ['HERDR_SERVER_NAME'])
for s in d.get('herdr_sessions', []):
srv = s.get('herdr_workspace') or s.get('herdr_server') or 'default'
srv = s.get('herdr_session') or s.get('herdr_workspace') or s.get('herdr_server') or 'default'
unique_servers.add(srv)
try:
@@ -399,7 +399,7 @@ if herdr_confirmed:
# (없으면 herdr-dead stopped 세션을 'terminated' 로 덮어써 resumable 플래그가 소실됨)
if s.get('status') in ('terminated', 'archived', 'stopped'):
continue
srv = s.get('herdr_workspace') or s.get('herdr_server') or 'default'
srv = s.get('herdr_session') or s.get('herdr_workspace') or s.get('herdr_server') or 'default'
if (name, srv) not in alive_set:
s['status'] = 'terminated'
s['terminated_at'] = now_iso
@@ -37,7 +37,7 @@ if [ -z "$UUID" ]; then
exit 1
fi
HERDR_SERVER_NAME="$(resolve_herdr_workspace "$SESSION_NAME")"
HERDR_SERVER_NAME="$(resolve_herdr_session "$SESSION_NAME")"
export HERDR_SERVER_NAME
# 2. If herdr is alive, print warning or attach.
@@ -33,7 +33,7 @@ done
[ -n "$UUID" ] || { echo "ERROR: --uuid required" >&2; exit 2; }
[ -f "$AGENT_SESSIONS_YAML" ] || { echo "ERROR: $AGENT_SESSIONS_YAML not found" >&2; exit 1; }
HERDR_SERVER_NAME="$(resolve_herdr_workspace "$SESSION_NAME")"
HERDR_SERVER_NAME="$(resolve_herdr_session "$SESSION_NAME")"
export HERDR_SERVER_NAME
# --agent 미지정 시 이름 suffix 로 fallback (P1-F: 가능하면 --agent 명시)
@@ -93,7 +93,7 @@ def get_job_status(s):
sessions_detail = []
for s in d.get('herdr_sessions', []):
name = s.get('name', '?')
server = s.get('herdr_workspace') or s.get('herdr_server') or 'default'
server = s.get('herdr_session') or s.get('herdr_workspace') or s.get('herdr_server') or 'default'
jid, jstatus = get_job_status(s)
pane = s.get('pane') or {}
sessions_detail.append({
@@ -197,7 +197,7 @@ if not sessions:
print("(no sessions registered)")
for s in sessions:
name = s.get('name', '?')
server = s.get('herdr_workspace') or s.get('herdr_server') or 'default'
server = s.get('herdr_session') or s.get('herdr_workspace') or s.get('herdr_server') or 'default'
status = s.get('status', '?')
herdr = 'alive' if f"{name}|{server}" in alive else 'dead'
cmd = (s.get('pane') or {}).get('cmd', '?')
@@ -82,7 +82,7 @@ if [ "$PURGE" = "1" ]; then
trap 'rm -f "$WORKSPACE_ROOT/.mam/purging-$SESSION_NAME"' EXIT
fi
HERDR_SERVER_NAME="$(resolve_herdr_workspace "$SESSION_NAME")"
HERDR_SERVER_NAME="$(resolve_herdr_session "$SESSION_NAME")"
export HERDR_SERVER_NAME
# --agent 미지정 시 이름 suffix 로 fallback (P1-F)