diff --git a/cortex/routers/chat.py b/cortex/routers/chat.py index 9938318..f888253 100644 --- a/cortex/routers/chat.py +++ b/cortex/routers/chat.py @@ -8,7 +8,7 @@ from pydantic import BaseModel from context_loader import load_context from llm_client import complete from session_logger import log_turn -from session_store import load as load_session, save as save_session, list_all, generate_session_id, delete as delete_session, rename as rename_session +from session_store import load as load_session, save as save_session, list_all, generate_session_id, delete as delete_session, rename as rename_session, get_name as get_session_name from config import settings from persona import set_context, validate as validate_persona from auth_utils import COOKIE_NAME, decode_token @@ -264,7 +264,8 @@ async def get_history( persona: str = Query("inara"), ) -> dict: _set_ctx(user, persona) - return {"session_id": session_id, "messages": load_session(session_id)} + name = get_session_name(session_id) + return {"session_id": session_id, "name": name, "messages": load_session(session_id)} @router.get("/sessions") diff --git a/cortex/session_store.py b/cortex/session_store.py index 50dd3ad..283c1f5 100644 --- a/cortex/session_store.py +++ b/cortex/session_store.py @@ -73,6 +73,17 @@ def save(session_id: str, messages: list[dict]) -> None: path.write_text(json.dumps(data, indent=2)) +def get_name(session_id: str) -> str: + """Return the friendly name for a session, or '' if none set.""" + path = _path(session_id) + if not path.exists(): + return "" + try: + return json.loads(path.read_text()).get("name", "") + except Exception: + return "" + + def rename(session_id: str, name: str) -> bool: """Set (or clear) the friendly name on a session. Returns False if not found.""" path = _path(session_id) diff --git a/cortex/static/app.js b/cortex/static/app.js index 571821e..d1941b7 100644 --- a/cortex/static/app.js +++ b/cortex/static/app.js @@ -642,9 +642,13 @@ if (!res.ok) throw new Error(`HTTP ${res.status}`); const data = await res.json(); + // Prefer name from API response, fall back to sessionNames map, then raw ID + const displayName = data.name || sessionNames.get(id) || id; + sessionNames.set(id, displayName); + messagesEl.innerHTML = ''; sessionId = id; - sessionEl.textContent = `session: ${sessionNames.get(id) || id}`; + sessionEl.textContent = `session: ${displayName}`; currentHistory = []; for (let i = 0; i < data.messages.length; i++) { @@ -662,7 +666,7 @@ } } - if (!silent) addMessage('system', `Resumed session ${id}`); + if (!silent) addMessage('system', `Resumed session: ${displayName}`); scrollToBottom(); sessionsPanel.classList.remove('open'); sessionsBackdrop.classList.remove('open');