diff --git a/server/cursor-cli.js b/server/cursor-cli.js index 66af16ef..1d5a7d79 100644 --- a/server/cursor-cli.js +++ b/server/cursor-cli.js @@ -150,7 +150,6 @@ async function spawnCursor(command, options = {}, ws) { try { const response = JSON.parse(line); - console.log('Parsed JSON response:', response); // Handle different message types switch (response.type) { @@ -159,7 +158,6 @@ async function spawnCursor(command, options = {}, ws) { // Capture session ID if (response.session_id && !capturedSessionId) { capturedSessionId = response.session_id; - console.log('Captured session ID:', capturedSessionId); // Update process key with captured session ID if (processKey !== capturedSessionId) { @@ -197,7 +195,6 @@ async function spawnCursor(command, options = {}, ws) { case 'result': { // Session complete — send stream end + lifecycle complete with result payload - console.log('Cursor session result:', response); const resultText = typeof response.result === 'string' ? response.result : ''; ws.send(createNormalizedMessage({ kind: 'complete', @@ -213,8 +210,6 @@ async function spawnCursor(command, options = {}, ws) { // Unknown message types — ignore. } } catch (parseError) { - console.log('Non-JSON response:', line); - if (shouldSuppressForTrustRetry(line)) { return; } @@ -228,7 +223,6 @@ async function spawnCursor(command, options = {}, ws) { // Handle stdout (streaming JSON responses) cursorProcess.stdout.on('data', (data) => { const rawOutput = data.toString(); - console.log('Cursor CLI stdout:', rawOutput); // Stream chunks can split JSON objects across packets; keep trailing partial line. stdoutLineBuffer += rawOutput; @@ -254,8 +248,6 @@ async function spawnCursor(command, options = {}, ws) { // Handle process completion cursorProcess.on('close', async (code) => { - console.log(`Cursor CLI process exited with code ${code}`); - const finalSessionId = capturedSessionId || sessionId || processKey; activeCursorProcesses.delete(finalSessionId); diff --git a/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts b/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts index 4be02dee..d5ea9b3c 100644 --- a/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +++ b/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts @@ -45,44 +45,28 @@ export class CursorSessionSynchronizer implements IProviderSessionSynchronizer { */ async synchronize(since?: Date): Promise { const projectsDir = path.join(this.cursorHome, 'projects'); - const projectEntries = await listDirectoryEntriesSafe(projectsDir); - const seenProjectPaths = new Set(); let processed = 0; - for (const entry of projectEntries) { - if (!entry.isDirectory()) { + + const files = await findFilesRecursivelyCreatedAfter(projectsDir, '.jsonl', since ?? null); + + for (const filePath of files) { + const parsed = await this.processSessionFile(filePath); + if (!parsed) { continue; } - const workerLogPath = path.join(projectsDir, entry.name, 'worker.log'); - const projectPath = await this.extractProjectPathFromWorkerLog(workerLogPath); - if (!projectPath || seenProjectPaths.has(projectPath)) { - continue; - } - - seenProjectPaths.add(projectPath); - const projectHash = this.md5(projectPath); - const chatsDir = path.join(this.cursorHome, 'chats', projectHash); - const files = await findFilesRecursivelyCreatedAfter(chatsDir, '.jsonl', since ?? null); - - for (const filePath of files) { - const parsed = await this.processSessionFile(filePath); - if (!parsed) { - continue; - } - - const timestamps = await readFileTimestamps(filePath); - sessionsDb.createSession( - parsed.sessionId, - this.provider, - parsed.projectPath, - parsed.sessionName, - timestamps.createdAt, - timestamps.updatedAt, - filePath - ); - processed += 1; - } + const timestamps = await readFileTimestamps(filePath); + sessionsDb.createSession( + parsed.sessionId, + this.provider, + parsed.projectPath, + parsed.sessionName, + timestamps.createdAt, + timestamps.updatedAt, + filePath + ); + processed += 1; } return processed; @@ -113,13 +97,6 @@ export class CursorSessionSynchronizer implements IProviderSessionSynchronizer { ); } - /** - * Produces the same project hash Cursor uses in chat directory names. - */ - private md5(input: string): string { - return crypto.createHash('md5').update(input).digest('hex'); - } - /** * Extracts project path from Cursor worker.log. */ @@ -149,7 +126,7 @@ export class CursorSessionSynchronizer implements IProviderSessionSynchronizer { */ private async processSessionFile(filePath: string): Promise { const sessionId = path.basename(filePath, '.jsonl'); - const grandparentDir = path.dirname(path.dirname(filePath)); + const grandparentDir = path.dirname(path.dirname(path.dirname(filePath))); const workerLogPath = path.join(grandparentDir, 'worker.log'); const projectPath = await this.extractProjectPathFromWorkerLog(workerLogPath); diff --git a/server/modules/providers/services/sessions-watcher.service.ts b/server/modules/providers/services/sessions-watcher.service.ts index 3a7348ed..c6fdcceb 100644 --- a/server/modules/providers/services/sessions-watcher.service.ts +++ b/server/modules/providers/services/sessions-watcher.service.ts @@ -18,7 +18,7 @@ const PROVIDER_WATCH_PATHS: Array<{ provider: LLMProvider; rootPath: string }> = }, { provider: 'cursor', - rootPath: path.join(os.homedir(), '.cursor', 'chats'), + rootPath: path.join(os.homedir(), '.cursor', 'projects'), }, { provider: 'codex',