Merge PR #713: scope sessions to workspace with migration and tool metadata
This commit is contained in:
commit
ce4f00529e
@ -42,8 +42,15 @@ class Session:
|
|||||||
self.updated_at = datetime.now()
|
self.updated_at = datetime.now()
|
||||||
|
|
||||||
def get_history(self, max_messages: int = 500) -> list[dict[str, Any]]:
|
def get_history(self, max_messages: int = 500) -> list[dict[str, Any]]:
|
||||||
"""Get recent messages in LLM format (role + content only)."""
|
"""Get recent messages in LLM format, preserving tool metadata."""
|
||||||
return [{"role": m["role"], "content": m["content"]} for m in self.messages[-max_messages:]]
|
out: list[dict[str, Any]] = []
|
||||||
|
for m in self.messages[-max_messages:]:
|
||||||
|
entry: dict[str, Any] = {"role": m["role"], "content": m.get("content", "")}
|
||||||
|
for k in ("tool_calls", "tool_call_id", "name"):
|
||||||
|
if k in m:
|
||||||
|
entry[k] = m[k]
|
||||||
|
out.append(entry)
|
||||||
|
return out
|
||||||
|
|
||||||
def clear(self) -> None:
|
def clear(self) -> None:
|
||||||
"""Clear all messages and reset session to initial state."""
|
"""Clear all messages and reset session to initial state."""
|
||||||
@ -61,13 +68,19 @@ class SessionManager:
|
|||||||
|
|
||||||
def __init__(self, workspace: Path):
|
def __init__(self, workspace: Path):
|
||||||
self.workspace = workspace
|
self.workspace = workspace
|
||||||
self.sessions_dir = ensure_dir(Path.home() / ".nanobot" / "sessions")
|
self.sessions_dir = ensure_dir(self.workspace / "sessions")
|
||||||
|
self.legacy_sessions_dir = Path.home() / ".nanobot" / "sessions"
|
||||||
self._cache: dict[str, Session] = {}
|
self._cache: dict[str, Session] = {}
|
||||||
|
|
||||||
def _get_session_path(self, key: str) -> Path:
|
def _get_session_path(self, key: str) -> Path:
|
||||||
"""Get the file path for a session."""
|
"""Get the file path for a session."""
|
||||||
safe_key = safe_filename(key.replace(":", "_"))
|
safe_key = safe_filename(key.replace(":", "_"))
|
||||||
return self.sessions_dir / f"{safe_key}.jsonl"
|
return self.sessions_dir / f"{safe_key}.jsonl"
|
||||||
|
|
||||||
|
def _get_legacy_session_path(self, key: str) -> Path:
|
||||||
|
"""Legacy global session path (~/.nanobot/sessions/)."""
|
||||||
|
safe_key = safe_filename(key.replace(":", "_"))
|
||||||
|
return self.legacy_sessions_dir / f"{safe_key}.jsonl"
|
||||||
|
|
||||||
def get_or_create(self, key: str) -> Session:
|
def get_or_create(self, key: str) -> Session:
|
||||||
"""
|
"""
|
||||||
@ -92,6 +105,12 @@ class SessionManager:
|
|||||||
def _load(self, key: str) -> Session | None:
|
def _load(self, key: str) -> Session | None:
|
||||||
"""Load a session from disk."""
|
"""Load a session from disk."""
|
||||||
path = self._get_session_path(key)
|
path = self._get_session_path(key)
|
||||||
|
if not path.exists():
|
||||||
|
legacy_path = self._get_legacy_session_path(key)
|
||||||
|
if legacy_path.exists():
|
||||||
|
import shutil
|
||||||
|
shutil.move(str(legacy_path), str(path))
|
||||||
|
logger.info(f"Migrated session {key} from legacy path")
|
||||||
|
|
||||||
if not path.exists():
|
if not path.exists():
|
||||||
return None
|
return None
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user