···9898 con.close()
9999 return dict(row) if row else None
100100101101+ def list_sessions(self) -> list[dict]:
102102+ """Return all stored sessions, newest first (by insertion order)."""
103103+ con = self._connect()
104104+ rows = con.execute(
105105+ "SELECT * FROM oauth_session ORDER BY rowid DESC"
106106+ ).fetchall()
107107+ con.close()
108108+ return [dict(r) for r in rows]
109109+110110+ def get_active_session(self) -> dict | None:
111111+ """Return the most recently stored session, if any."""
112112+ sessions = self.list_sessions()
113113+ return sessions[0] if sessions else None
114114+101115 ALLOWED_FIELDS = {
102116 "dpop_pds_nonce",
103117 "dpop_authserver_nonce",
+8-15
tui/app.py
···8484 def _restore_session(self) -> None:
8585 """Load the stored session. The TUI is single-user: if stale extra
8686 rows exist from a previous version, keep the newest and drop the rest."""
8787- import sqlite3
8888-8987 try:
9090- con = sqlite3.connect(self.session_store.db_path)
9191- con.row_factory = sqlite3.Row
9292- rows = con.execute(
9393- "SELECT * FROM oauth_session ORDER BY rowid DESC"
9494- ).fetchall()
9595- con.close()
9696- if not rows:
9797- return
9898- self.user_session = dict(rows[0])
9999- self.sub_title = self.user_session.get("handle", "")
100100- for extra in rows[1:]:
101101- self.session_store.delete_session(extra["did"])
8888+ sessions = self.session_store.list_sessions()
10289 except Exception:
103103- pass
9090+ return
9191+ if not sessions:
9292+ return
9393+ self.user_session = sessions[0]
9494+ self.sub_title = self.user_session.get("handle", "")
9595+ for extra in sessions[1:]:
9696+ self.session_store.delete_session(extra["did"])
1049710598 def action_login(self) -> None:
10699 if self.user_session: