Skip to content

fix: restore persisted sessions from store in list_sessions - #220

Closed
Million-mo wants to merge 2 commits into
refactor/agentwolf_v1from
fix/session-restore-from-store
Closed

fix: restore persisted sessions from store in list_sessions#220
Million-mo wants to merge 2 commits into
refactor/agentwolf_v1from
fix/session-restore-from-store

Conversation

@Million-mo

Copy link
Copy Markdown
Owner

Problem

When session_pool is enabled, list_sessions only queried the in-memory SessionController — which is empty after a server restart. Persisted sessions in the SQLite store were never surfaced, so the OpenCode UI showed no historical sessions despite 1693+ records in the database.

Closes #179

Solution

Rewrote list_sessions to use a store-first with memory overlay approach:

  1. Query store first (list_session_ids(cwd=...)) for all persisted session IDs
  2. Batch load via load_sessions_batch(ids) — single SQL query
  3. Overlay in-memory sessions from SessionController for real-time status (busy/idle)
  4. Append in-memory-only sessions (newly created, not yet persisted), filtered by cwd
  5. Python-level cwd filter as defensive safety net (using Path.resolve())
  6. Re-sort merged list by time.updated descending
  7. Store exception degradation — never crash list_sessions, fall back to in-memory only
  8. Store=None guard — skip store queries when no persistent store configured

Design

Full OpenSpec change at openspec/changes/fix-session-restore-from-store/ with 9 design decisions (D1-D9), 9 spec scenarios, and 12 test cases. Reviewed by Oracle and Momus (3 review rounds, all passed).

Test Coverage

12 unit tests covering all spec scenarios:

  • Sessions restored after restart ✅
  • In-memory overrides store version ✅
  • Newly created in-memory session appears ✅
  • Python-level cwd filter catches other directories ✅
  • Legacy path preserved (no session_controller) ✅
  • SQL-level cwd filter on store-first path ✅
  • Store is None returns in-memory only ✅
  • Store query failure degrades gracefully ✅
  • Merged list sorted by recency ✅
  • In-memory-only with different cwd not appended ✅
  • Empty store returns empty ✅
  • state.sessions cache populated ✅

Verification

  • uv run ruff check — clean ✅
  • uv run mypy — clean ✅
  • uv run pytest tests/servers/opencode_server/test_list_sessions_restore.py — 12/12 passed ✅

备份迁移自 SRC-PR#181 · 作者 @Leoyzen · 创建于 2026-07-17T12:58:30Z · head=fix/session-restore-from-store base=refactor/agentwolf_v1
源状态: merged · merge_commit_sha=b8fded38aa8b242b54aa003235a8823c1f934d82

Leoyzen added 2 commits July 17, 2026 20:58
When session_pool is enabled, list_sessions only queried the in-memory
SessionController — empty after server restart. Now queries the store
first (source of truth), overlays in-memory active sessions, and handles
edge cases: store=None, store failure, cwd filtering, re-sorting.

Closes #179
- D4: only overlay in-memory sessions that exist in store results
  (fixes D5 dead code — review comment by gemini-code-assist)
- Run ruff format on both files
- Add noqa: PLR0915 for list_sessions statement count
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants