From ff3d829ad770f653483ce40c4a8d52daf320a99d Mon Sep 17 00:00:00 2001 From: fangliquanflq Date: Sat, 12 Sep 2026 11:40:14 +0800 Subject: [PATCH] fix(tui_gateway): enrich persisted session git metadata --- .../test_session_git_metadata_generation.py | 34 +++++++++++++++++++ tui_gateway/server.py | 12 ++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/tests/tui_gateway/test_session_git_metadata_generation.py b/tests/tui_gateway/test_session_git_metadata_generation.py index 91cd7d7106..8dbcec1120 100644 --- a/tests/tui_gateway/test_session_git_metadata_generation.py +++ b/tests/tui_gateway/test_session_git_metadata_generation.py @@ -3,6 +3,7 @@ from __future__ import annotations import tui_gateway.server as server +from hermes_state import SessionDB class _ImmediateThread: @@ -70,3 +71,36 @@ def test_missing_db_claim_never_starts_git_probe(monkeypatch): assert generation is None assert probed == [] + + +def test_lazy_desktop_row_with_explicit_cwd_is_enriched_on_hydration(monkeypatch, tmp_path): + db = SessionDB(db_path=tmp_path / "state.db") + repo = tmp_path / "repo" + repo.mkdir() + session = { + "session_key": "desktop-session", + "source": "desktop", + "cwd": str(repo), + "explicit_cwd": True, + } + sid = "live-desktop-session" + + monkeypatch.setattr(server, "_get_db", lambda: db) + monkeypatch.setattr(server, "_resolve_model", lambda: "test-model") + monkeypatch.setattr(server.threading, "Thread", _ImmediateThread) + monkeypatch.setattr(server.git_probe, "branch", lambda _cwd: "feature/session-metadata") + monkeypatch.setattr(server.git_probe, "common_repo_root", lambda _cwd: str(repo)) + server._sessions[sid] = session + try: + assert server._ensure_session_db_row(session) is True + assert db.get_session("desktop-session")["git_branch"] is None + + server._hydrate_session_cwd(sid, "desktop-session", db, None) + + row = db.get_session("desktop-session") + assert row["cwd"] == str(repo) + assert row["git_branch"] == "feature/session-metadata" + assert row["git_repo_root"] == str(repo) + finally: + server._sessions.pop(sid, None) + db.close() diff --git a/tui_gateway/server.py b/tui_gateway/server.py index e220f83aef..1e0d39eac8 100644 --- a/tui_gateway/server.py +++ b/tui_gateway/server.py @@ -2643,7 +2643,7 @@ def _make_agent( def _hydrate_session_cwd(sid: str, key: str, session_db, profile_home: str | None) -> None: - """Adopt the stored row's cwd, or persist the fresh session's cwd (+ schedule git meta) when the row has none.""" + """Adopt the stored row's cwd and fill missing Git metadata, or persist a fresh cwd.""" owns_db, db = False, session_db if db is None and not profile_home: db = _get_db() @@ -2668,6 +2668,16 @@ def _hydrate_session_cwd(sid: str, key: str, session_db, profile_home: str | Non _sessions[sid]["cwd"] = row["cwd"] if remote: _sessions[sid]["explicit_cwd"] = True + # Lazy desktop rows already carry their explicitly chosen cwd, so they never reach the fresh-cwd + # branch below. Claim a generation before probing to keep an older probe from overwriting a later + # workspace move; complete rows do not need another probe on every resume. + if (not row.get("git_branch") or not row.get("git_repo_root")) and hasattr( + db, "update_session_cwd" + ): + try: + _persist_session_cwd_and_schedule_git_meta(_sessions[sid], row["cwd"], db=db) + except Exception: + logger.debug("failed to enrich resumed session git metadata", exc_info=True) elif hasattr(db, "update_session_cwd"): try: _persist_session_cwd_and_schedule_git_meta(_sessions[sid], _sessions[sid]["cwd"], db=db)