fix(tui_gateway): enrich persisted session git metadata

This commit is contained in:
fangliquanflq
2026-09-12 11:40:14 +08:00
committed by ethernet
parent e1d7beb2af
commit ff3d829ad7
2 changed files with 45 additions and 1 deletions

View File

@@ -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()

View File

@@ -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)