Co-authored-by: Quentin Torroba <quentin.torroba@mistral.ai>
Co-authored-by: Clément Siriex <clement.sirieix@mistral.ai>
Co-authored-by: Kim-Adeline Miguel <kimadeline.miguel@mistral.ai>
Co-authored-by: Michel Thomazo <michel.thomazo@mistral.ai>
Co-authored-by: Clément Drouin <clement.drouin@mistral.ai>
This commit is contained in:
Mathias Gesbert 2026-02-17 16:23:28 +01:00 committed by GitHub
parent 51fecc67d9
commit ec7f3b25ea
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
107 changed files with 8002 additions and 535 deletions

View file

@ -1,8 +1,9 @@
from __future__ import annotations
from datetime import UTC, datetime
import json
from pathlib import Path
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING, Any, TypedDict
from vibe.core.session.session_logger import MESSAGES_FILENAME, METADATA_FILENAME
from vibe.core.types import LLMMessage
@ -11,6 +12,13 @@ if TYPE_CHECKING:
from vibe.core.config import SessionLoggingConfig
class SessionInfo(TypedDict):
session_id: str
cwd: str
title: str | None
end_time: str | None
class SessionLoader:
@staticmethod
def _is_valid_session(session_dir: Path) -> bool:
@ -106,6 +114,63 @@ class SessionLoader:
short_id = session_id[:8]
return list(save_dir.glob(f"{config.session_prefix}_*_{short_id}"))
@staticmethod
def _convert_to_utc_iso(date_str: str) -> str:
dt = datetime.fromisoformat(date_str)
if dt.tzinfo is None:
dt = dt.astimezone()
utc_dt = dt.astimezone(UTC)
return utc_dt.isoformat()
@staticmethod
def list_sessions(
config: SessionLoggingConfig, cwd: str | None = None
) -> list[SessionInfo]:
save_dir = Path(config.save_dir)
if not save_dir.exists():
return []
pattern = f"{config.session_prefix}_*"
session_dirs = list(save_dir.glob(pattern))
sessions: list[SessionInfo] = []
for session_dir in session_dirs:
if not SessionLoader._is_valid_session(session_dir):
continue
metadata_path = session_dir / METADATA_FILENAME
try:
with metadata_path.open("r", encoding="utf-8") as f:
metadata = json.load(f)
except (OSError, json.JSONDecodeError):
continue
session_id = metadata.get("session_id")
if not session_id:
continue
environment = metadata.get("environment", {})
session_cwd = environment.get("working_directory", "")
if cwd is not None and session_cwd != cwd:
continue
end_time = metadata.get("end_time")
if end_time:
try:
end_time = SessionLoader._convert_to_utc_iso(end_time)
except (ValueError, OSError):
end_time = None
sessions.append({
"session_id": session_id,
"cwd": session_cwd,
"title": metadata.get("title"),
"end_time": end_time,
})
return sessions
@staticmethod
def load_session(filepath: Path) -> tuple[list[LLMMessage], dict[str, Any]]:
# Load session messages from MESSAGES_FILENAME