From 3e7e60a3a85f0fd3b4d51ecae33c18550301a6e6 Mon Sep 17 00:00:00 2001 From: simos Date: Tue, 12 Aug 2025 13:43:36 +0300 Subject: [PATCH] feat: Enhance session handling by adding cursor support and improving cursor messages order --- server/index.js | 43 +++++++++++++++++++++++++++++---------- server/routes/cursor.js | 14 ++++++++----- server/routes/git.js | 14 +++++++------ src/components/Shell.jsx | 1 + store.db-shm | Bin 0 -> 32768 bytes store.db-wal | 0 test.html | 3 +-- 7 files changed, 51 insertions(+), 24 deletions(-) create mode 100644 store.db-shm create mode 100644 store.db-wal diff --git a/server/index.js b/server/index.js index 727a5ce..fb617b7 100755 --- a/server/index.js +++ b/server/index.js @@ -546,14 +546,17 @@ function handleShellConnection(ws) { const projectPath = data.projectPath || process.cwd(); const sessionId = data.sessionId; const hasSession = data.hasSession; + const provider = data.provider || 'claude'; console.log('🚀 Starting shell in:', projectPath); console.log('📋 Session info:', hasSession ? `Resume session ${sessionId}` : 'New session'); + console.log('🤖 Provider:', provider); // First send a welcome message + const providerName = provider === 'cursor' ? 'Cursor' : 'Claude'; const welcomeMsg = hasSession ? - `\x1b[36mResuming Claude session ${sessionId} in: ${projectPath}\x1b[0m\r\n` : - `\x1b[36mStarting new Claude session in: ${projectPath}\x1b[0m\r\n`; + `\x1b[36mResuming ${providerName} session ${sessionId} in: ${projectPath}\x1b[0m\r\n` : + `\x1b[36mStarting new ${providerName} session in: ${projectPath}\x1b[0m\r\n`; ws.send(JSON.stringify({ type: 'output', @@ -561,20 +564,38 @@ function handleShellConnection(ws) { })); try { - // Prepare the shell command adapted to the platform + // Prepare the shell command adapted to the platform and provider let shellCommand; - if (os.platform() === 'win32') { - if (hasSession && sessionId) { - // Try to resume session, but with fallback to new session if it fails - shellCommand = `Set-Location -Path "${projectPath}"; claude --resume ${sessionId}; if ($LASTEXITCODE -ne 0) { claude }`; + if (provider === 'cursor') { + // Use cursor-agent command + if (os.platform() === 'win32') { + if (hasSession && sessionId) { + shellCommand = `Set-Location -Path "${projectPath}"; cursor-agent --resume="${sessionId}"`; + } else { + shellCommand = `Set-Location -Path "${projectPath}"; cursor-agent`; + } } else { - shellCommand = `Set-Location -Path "${projectPath}"; claude`; + if (hasSession && sessionId) { + shellCommand = `cd "${projectPath}" && cursor-agent --resume="${sessionId}"`; + } else { + shellCommand = `cd "${projectPath}" && cursor-agent`; + } } } else { - if (hasSession && sessionId) { - shellCommand = `cd "${projectPath}" && claude --resume ${sessionId} || claude`; + // Use claude command (default) + if (os.platform() === 'win32') { + if (hasSession && sessionId) { + // Try to resume session, but with fallback to new session if it fails + shellCommand = `Set-Location -Path "${projectPath}"; claude --resume ${sessionId}; if ($LASTEXITCODE -ne 0) { claude }`; + } else { + shellCommand = `Set-Location -Path "${projectPath}"; claude`; + } } else { - shellCommand = `cd "${projectPath}" && claude`; + if (hasSession && sessionId) { + shellCommand = `cd "${projectPath}" && claude --resume ${sessionId} || claude`; + } else { + shellCommand = `cd "${projectPath}" && claude`; + } } } diff --git a/server/routes/cursor.js b/server/routes/cursor.js index 5ff5da5..9de9951 100644 --- a/server/routes/cursor.js +++ b/server/routes/cursor.js @@ -351,7 +351,6 @@ router.get('/sessions', async (req, res) => { const cwdId = crypto.createHash('md5').update(projectPath || process.cwd()).digest('hex'); const cursorChatsPath = path.join(os.homedir(), '.cursor', 'chats', cwdId); - console.log(`🔍 Looking for Cursor sessions in: ${cursorChatsPath}`); // Check if the directory exists try { @@ -465,7 +464,7 @@ router.get('/sessions', async (req, res) => { // Get the most recent blob for preview const lastBlob = await db.get(` SELECT data FROM blobs - ORDER BY id DESC + ORDER BY rowid DESC LIMIT 1 `); @@ -593,9 +592,10 @@ router.get('/sessions/:sessionId', async (req, res) => { }); // Get all blobs (conversation data) + // Use rowid for chronological ordering (it's an auto-incrementing integer) const blobs = await db.all(` - SELECT id, data FROM blobs - ORDER BY id ASC + SELECT rowid, id, data FROM blobs + ORDER BY rowid ASC `); // Get metadata from meta table @@ -659,7 +659,11 @@ router.get('/sessions/:sessionId', async (req, res) => { if (role === 'system') { continue; // Skip only system messages } - messages.push({ id: blob.id, content: parsed }); + messages.push({ + id: blob.id, + rowid: blob.rowid, + content: parsed + }); } // Skip non-JSON blobs (binary data) completely } catch (e) { diff --git a/server/routes/git.js b/server/routes/git.js index b56b3e4..cfc1eec 100755 --- a/server/routes/git.js +++ b/server/routes/git.js @@ -56,7 +56,6 @@ router.get('/status', async (req, res) => { try { const projectPath = await getActualProjectPath(project); - console.log('Git status for project:', project, '-> path:', projectPath); // Validate git repository await validateGitRepository(projectPath); @@ -136,13 +135,16 @@ router.get('/diff', async (req, res) => { lines.map(line => `+${line}`).join('\n'); } else { // Get diff for tracked files - const { stdout } = await execAsync(`git diff HEAD -- "${file}"`, { cwd: projectPath }); - diff = stdout || ''; + // First check for unstaged changes (working tree vs index) + const { stdout: unstagedDiff } = await execAsync(`git diff -- "${file}"`, { cwd: projectPath }); - // If no unstaged changes, check for staged changes - if (!diff) { + if (unstagedDiff) { + // Show unstaged changes if they exist + diff = unstagedDiff; + } else { + // If no unstaged changes, check for staged changes (index vs HEAD) const { stdout: stagedDiff } = await execAsync(`git diff --cached -- "${file}"`, { cwd: projectPath }); - diff = stagedDiff; + diff = stagedDiff || ''; } } diff --git a/src/components/Shell.jsx b/src/components/Shell.jsx index 7864812..03d2bfd 100644 --- a/src/components/Shell.jsx +++ b/src/components/Shell.jsx @@ -436,6 +436,7 @@ function Shell({ selectedProject, selectedSession, isActive }) { projectPath: selectedProject.fullPath || selectedProject.path, sessionId: selectedSession?.id, hasSession: !!selectedSession, + provider: selectedSession?.__provider || 'claude', cols: terminal.current.cols, rows: terminal.current.rows }; diff --git a/store.db-shm b/store.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10 GIT binary patch literal 32768 zcmeIuAr62r3