feat: improve session navigation

This commit is contained in:
2026-07-30 19:45:05 +02:00
parent 112ae6d1da
commit 43c1f76d84
7 changed files with 284 additions and 15 deletions
+46 -6
View File
@@ -14,6 +14,7 @@ from javis.config.settings import ConfigurationError, Settings
from javis.core.chat_service import ChatService, SessionProviderMismatchError
from javis.core.provider_router import HybridProvider
from javis.memory.sqlite_store import (
AmbiguousSessionReferenceError,
ChatSession,
SessionNotFoundError,
SessionStoreError,
@@ -34,7 +35,9 @@ StatusFunction = Callable[[], list[str]]
HELP_TEXT = """Befehle:
/new neue Sitzung beginnen
/sessions gespeicherte Sitzungen auflisten
/load <ID> frühere Sitzung laden und fortsetzen
/load <NR|ID> Sitzung per Listennummer oder eindeutigem ID-Anfang laden
/search <TEXT> Titel und eigene Nachrichten durchsuchen
/rename <TITEL> aktive Sitzung umbenennen
/clear Nachrichten der aktiven Sitzung leeren
/provider aktiven Providermodus anzeigen
/provider <MODUS> Modus auto, local oder gemini setzen
@@ -139,10 +142,11 @@ def _show_sessions(sessions: list[ChatSession], output: OutputFunction) -> None:
if not sessions:
output("Keine gespeicherten Sitzungen vorhanden.")
return
for session in sessions:
for number, session in enumerate(sessions, start=1):
date = session.updated_at[:10]
output(
f"{session.id} | {session.updated_at} | "
f"{session.provider}/{session.model} | {session.message_count} Nachrichten"
f"{number}. {session.id[:8]} | {session.title} | {date} | "
f"{session.message_count} Nachrichten | {session.last_provider}"
)
@@ -207,6 +211,7 @@ def run_chat(
return 2
output("Lokaler Javis-Chat. /help zeigt die Befehle.")
shown_sessions: list[ChatSession] = []
while True:
try:
@@ -232,10 +237,33 @@ def run_chat(
continue
if entered == "/sessions":
try:
_show_sessions(service.list_sessions(), output)
shown_sessions = service.list_sessions()
_show_sessions(shown_sessions, output)
except SessionStoreError as exc:
output(f"Fehler: {exc}")
continue
if entered.startswith("/search"):
parts = entered.split(maxsplit=1)
if len(parts) != 2 or not parts[1].strip():
output("Verwendung: /search <Text>")
continue
try:
shown_sessions = service.search_sessions(parts[1])
_show_sessions(shown_sessions, output)
except (SessionStoreError, ValueError) as exc:
output(f"Fehler: {exc}")
continue
if entered.startswith("/rename"):
parts = entered.split(maxsplit=1)
if len(parts) != 2 or not parts[1].strip():
output("Verwendung: /rename <neuer Titel>")
continue
try:
renamed = service.rename_session(active_id, parts[1])
output(f"Sitzung umbenannt: {renamed.title}")
except (SessionNotFoundError, SessionStoreError, ValueError) as exc:
output(f"Fehler: {exc}")
continue
if entered == "/clear":
try:
service.clear_session(active_id)
@@ -285,12 +313,24 @@ def run_chat(
output("Verwendung: /load <Sitzungs-ID>")
continue
try:
loaded = service.load_session(parts[1].strip())
reference = parts[1].strip()
if reference.isdecimal():
number = int(reference)
if not shown_sessions:
output("Zuerst /sessions oder /search anzeigen.")
continue
if number < 1 or number > len(shown_sessions):
output("Diese Listennummer ist nicht vorhanden.")
continue
loaded = service.load_session(shown_sessions[number - 1].id)
else:
loaded = service.resolve_session(reference)
active_id = loaded.session.id
output(f"Sitzung geladen: {active_id}")
_show_history(service, active_id, output)
except (
SessionNotFoundError,
AmbiguousSessionReferenceError,
SessionProviderMismatchError,
SessionStoreError,
) as exc: