Fix session persistence after page refresh
Root cause: loadManuallyCreatedProjects() was restoring projects with stale session arrays from localStorage. When loadProjects() tried to merge with fresh API data, the stale sessions would override. Fix 1: In loadManuallyCreatedProjects(), reset the sessions array to empty for each loaded project. This ensures sessions always come from the API (authoritative source) rather than localStorage. Fix 2: In createSessionInFolder(), remove the redundant initialize() call after loadProjects(). initialize() would reload stale localStorage data, undoing the fresh data fetched by loadProjects(). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,65 +1,39 @@
|
||||
# Project Isolation Bug - Scratchpad
|
||||
# Session Persistence Bug - Scratchpad
|
||||
|
||||
## Task Overview
|
||||
Fix project isolation bug where ALL sessions appear in every project's left sidebar instead of only that project's sessions.
|
||||
|
||||
## Files to Modify
|
||||
- /home/uroma/obsidian-web-interface/public/claude-ide/project-manager.js (main logic)
|
||||
- /home/uroma/obsidian-web-interface/public/claude-ide/chat-enhanced.js (left sidebar)
|
||||
Fix bug where sessions disappear from manually created projects after page refresh.
|
||||
|
||||
## Root Cause Analysis
|
||||
|
||||
After analyzing the code:
|
||||
When a session is created in a manually created project:
|
||||
1. `createSessionInFolder()` creates the session via API
|
||||
2. It calls `await this.loadProjects()` - fetches fresh session data from API
|
||||
3. **BUG**: It then calls `await this.initialize()`
|
||||
4. `initialize()` calls `loadManuallyCreatedProjects()` which RESTores projects with STALE session data from localStorage
|
||||
5. Then `loadProjects()` is called again, but the damage is done
|
||||
|
||||
1. **project-manager.js line 365**: `switchProject()` calls `loadChatHistory(project.sessions)` - this passes the correct sessions
|
||||
2. **chat-enhanced.js line 52**: `loadChatHistory()` accepts `sessionsToRender` parameter
|
||||
3. **BUT** - When `loadChatHistory()` is called without parameters (initial load), it fetches ALL sessions from API
|
||||
The problem is that `saveManuallyCreatedProjects()` saves the entire project object including its sessions array. When the page refreshes:
|
||||
1. `loadManuallyCreatedProjects()` restores projects with their saved (stale) sessions
|
||||
2. The merge logic in `loadProjects()` tries to add virtual sessions to these projects
|
||||
3. BUT the session array from localStorage already exists and may be empty/stale
|
||||
|
||||
The issue: The left sidebar `loadChatHistory` function is being called in multiple places:
|
||||
1. Initial page load (no filter) - loads ALL sessions
|
||||
2. When switching projects (with filter) - should load only project sessions
|
||||
3. When sessions are created/updated
|
||||
4. After archiving/unarchiving sessions
|
||||
5. After resuming sessions
|
||||
## The Fix
|
||||
|
||||
The problem is that `loadChatHistory` caches and reuses all sessions, and the filtering mechanism wasn't working correctly.
|
||||
The session arrays stored in localStorage for manually created projects are stale and should be ignored. The `loadManuallyCreatedProjects()` function should:
|
||||
1. Load the project metadata (name, id, workingDir, manuallyCreated flag)
|
||||
2. **NOT** load the sessions array - it should start empty
|
||||
3. Let `loadProjects()` populate the sessions from the API
|
||||
|
||||
## Progress
|
||||
This ensures sessions always come from the authoritative source (the backend API) rather than stale localStorage data.
|
||||
|
||||
### Iteration 1 - Analysis & Initial Fix - COMPLETED ✅
|
||||
## Implementation
|
||||
|
||||
**Changes Made:**
|
||||
Remove the `await this.initialize()` call from `createSessionInFolder()` after `loadProjects()`. The `loadProjects()` call already refreshes the data from the API, so we don't need to re-initialize.
|
||||
|
||||
1. **Modified `loadChatHistory()` in chat-enhanced.js** (lines 71-100):
|
||||
- Added check for `window.projectManager.activeProjectId`
|
||||
- If active project exists, use `activeProject.sessions` instead of fetching from API
|
||||
- This ensures that even when `loadChatHistory()` is called without parameters, it respects the active project
|
||||
## Testing Steps
|
||||
|
||||
2. **Added detailed console logging** (lines 107-115):
|
||||
- Logs which sessions are being rendered
|
||||
- Shows workingDir, project metadata, and status for each session
|
||||
- Helps debug any remaining issues
|
||||
|
||||
**Commit:** `55aafba` - "Fix project isolation: Make loadChatHistory respect active project sessions"
|
||||
|
||||
### Testing Required
|
||||
|
||||
1. Create a new project (e.g., 'roman')
|
||||
2. Add a session to 'roman' project
|
||||
3. Check if only 'roman' sessions appear in left sidebar
|
||||
4. Switch to another project
|
||||
5. Verify only that project's sessions appear
|
||||
|
||||
### Potential Issues to Watch
|
||||
|
||||
1. **Initial page load**: If project manager hasn't initialized yet, we might load all sessions briefly
|
||||
2. **Session creation**: New sessions might not appear until project manager refreshes
|
||||
3. **Project switching timing**: Race conditions between loadChatHistory calls
|
||||
|
||||
### Next Steps
|
||||
|
||||
1. Test the current fix in browser
|
||||
2. If issues remain, may need to:
|
||||
- Add loading state to prevent showing wrong sessions during initialization
|
||||
- Ensure project manager initializes before loadChatHistory runs
|
||||
- Add event-based updates instead of polling
|
||||
1. Create new project named 'test'
|
||||
2. Start new session in 'test' project
|
||||
3. Check that session appears in left sidebar
|
||||
4. Refresh page
|
||||
5. Verify session still appears in 'test' project
|
||||
|
||||
Reference in New Issue
Block a user