refactor: rename session parser functions; move sessionData to a shared type

This commit is contained in:
Haileyesus
2026-03-25 11:09:08 +03:00
parent 3b7a9d35c2
commit 57d6ae59de
8 changed files with 27 additions and 31 deletions

View File

@@ -1,7 +1,8 @@
import os from 'os'; import os from 'os';
import path from 'path'; import path from 'path';
import { sessionsDb } from '@/shared/database/repositories/sessions.db.js'; import { sessionsDb } from '@/shared/database/repositories/sessions.db.js';
import { buildLookupMap, extractFirstValidJsonlData, findFilesRecursivelyCreatedAfterLastScan, SessionData } from '@/modules/sessions/sessions.utils.js'; import { buildLookupMap, extractFirstValidJsonlData, findFilesRecursivelyCreatedAfterLastScan } from '@/modules/providers/shared/session-parser.utils.js';
import { SessionData } from '@/shared/types/session.js';
export async function processClaudeSessionFile(file: string, nameMap?: Map<string, string>): Promise<SessionData | null> { export async function processClaudeSessionFile(file: string, nameMap?: Map<string, string>): Promise<SessionData | null> {
if (!nameMap) { if (!nameMap) {
@@ -17,7 +18,7 @@ export async function processClaudeSessionFile(file: string, nameMap?: Map<strin
})); }));
} }
export async function getClaudeSessions() { export async function processClaudeSessions() {
const base = path.join(os.homedir(), '.claude'); const base = path.join(os.homedir(), '.claude');
// Pre-load names from history index // Pre-load names from history index
const nameMap = await buildLookupMap(path.join(base, 'history.jsonl'), 'sessionId', 'display'); const nameMap = await buildLookupMap(path.join(base, 'history.jsonl'), 'sessionId', 'display');

View File

@@ -1,7 +1,8 @@
import os from 'os'; import os from 'os';
import path from 'path'; import path from 'path';
import { sessionsDb } from '@/shared/database/repositories/sessions.db.js'; import { sessionsDb } from '@/shared/database/repositories/sessions.db.js';
import { buildLookupMap, extractFirstValidJsonlData, findFilesRecursivelyCreatedAfterLastScan, SessionData } from '@/modules/sessions/sessions.utils.js'; import { buildLookupMap, extractFirstValidJsonlData, findFilesRecursivelyCreatedAfterLastScan } from '@/modules/providers/shared/session-parser.utils.js';
import { SessionData } from '@/shared/types/session.js';
export async function processCodexSessionFile(file: string, nameMap?: Map<string, string>): Promise<SessionData | null> { export async function processCodexSessionFile(file: string, nameMap?: Map<string, string>): Promise<SessionData | null> {
if (!nameMap) { if (!nameMap) {
@@ -17,7 +18,7 @@ export async function processCodexSessionFile(file: string, nameMap?: Map<string
})); }));
} }
export async function getCodexSessions() { export async function processCodexSessions() {
const base = path.join(os.homedir(), '.codex'); const base = path.join(os.homedir(), '.codex');
// Use the thread_name attribute as requested // Use the thread_name attribute as requested
const nameMap = await buildLookupMap(path.join(base, 'session_index.jsonl'), 'id', 'thread_name'); const nameMap = await buildLookupMap(path.join(base, 'session_index.jsonl'), 'id', 'thread_name');

View File

@@ -5,7 +5,8 @@ import fsp from 'node:fs/promises';
import readline from 'readline'; import readline from 'readline';
import crypto from 'node:crypto'; import crypto from 'node:crypto';
import { sessionsDb } from '@/shared/database/repositories/sessions.db.js'; import { sessionsDb } from '@/shared/database/repositories/sessions.db.js';
import { extractFirstValidJsonlData, findFilesRecursivelyCreatedAfterLastScan, SessionData } from '@/modules/sessions/sessions.utils.js'; import { extractFirstValidJsonlData, findFilesRecursivelyCreatedAfterLastScan } from '@/modules/providers/shared/session-parser.utils.js';
import { SessionData } from '@/shared/types/session.js';
function md5(input: string): string { function md5(input: string): string {
return crypto.createHash('md5').update(input).digest('hex'); return crypto.createHash('md5').update(input).digest('hex');
@@ -56,7 +57,7 @@ export async function processCursorSessionFile(file: string): Promise<SessionDat
}); });
} }
export async function getCursorSessions() { export async function processCursorSessions() {
try { try {
const cursorBase = path.join(os.homedir(), '.cursor'); const cursorBase = path.join(os.homedir(), '.cursor');
const projectsDir = path.join(cursorBase, 'projects'); const projectsDir = path.join(cursorBase, 'projects');

View File

@@ -2,7 +2,8 @@ import os from 'os';
import path from 'path'; import path from 'path';
import fsp from 'node:fs/promises'; import fsp from 'node:fs/promises';
import { sessionsDb } from '@/shared/database/repositories/sessions.db.js'; import { sessionsDb } from '@/shared/database/repositories/sessions.db.js';
import { findFilesRecursivelyCreatedAfterLastScan, SessionData } from '@/modules/sessions/sessions.utils.js'; import { findFilesRecursivelyCreatedAfterLastScan } from '@/modules/providers/shared/session-parser.utils.js';
import { SessionData } from '@/shared/types/session.js';
export async function processGeminiSessionFile(file: string): Promise<SessionData | null> { export async function processGeminiSessionFile(file: string): Promise<SessionData | null> {
try { try {
@@ -23,7 +24,7 @@ export async function processGeminiSessionFile(file: string): Promise<SessionDat
return null; return null;
} }
export async function getGeminiSessions() { export async function processGeminiSessions() {
const geminiPath = path.join(os.homedir(), '.gemini', 'sessions'); const geminiPath = path.join(os.homedir(), '.gemini', 'sessions');
const files = await findFilesRecursivelyCreatedAfterLastScan(geminiPath, '.json'); const files = await findFilesRecursivelyCreatedAfterLastScan(geminiPath, '.json');

View File

@@ -3,16 +3,7 @@ import fsp from 'node:fs/promises';
import readline from 'readline'; import readline from 'readline';
import path from 'path'; import path from 'path';
import { scanStateDb } from '@/shared/database/repositories/scan-state.db.js'; import { scanStateDb } from '@/shared/database/repositories/scan-state.db.js';
import { SessionData } from '@/shared/types/session.js';
// ============================================================================
// SHARED TYPES & UTILITIES
// ============================================================================
export type SessionData = {
sessionId: string;
workspacePath: string;
sessionName?: string;
}
/** /**
* Reads a JSONL file and builds a Map of Key -> Value. * Reads a JSONL file and builds a Map of Key -> Value.
@@ -39,7 +30,7 @@ export async function buildLookupMap(filePath: string, keyField: string, valueFi
/** /**
* Recursively walks a directory tree and returns a flat array of all files * Recursively walks a directory tree and returns a flat array of all files
* matching a specific extension (e.g., '.jsonl' or '.json'). * matching a specific extension (e.g., '.jsonl' or '.json').
* It will only find the files created after the last scan date. * It will only find the files created after
*/ */
export async function findFilesRecursivelyCreatedAfterLastScan( export async function findFilesRecursivelyCreatedAfterLastScan(
dirPath: string, dirPath: string,
@@ -61,6 +52,7 @@ export async function findFilesRecursivelyCreatedAfterLastScan(
const stats = await fsp.stat(fullPath); const stats = await fsp.stat(fullPath);
if (stats.birthtime > lastScanDate) { if (stats.birthtime > lastScanDate) {
fileList.push(fullPath); fileList.push(fullPath);
console.log("=====> full path is: ", fullPath)
} }
} else { } else {
fileList.push(fullPath); fileList.push(fullPath);

View File

@@ -1,10 +1,10 @@
import { scanStateDb } from '@/shared/database/repositories/scan-state.db.js'; import { scanStateDb } from '@/shared/database/repositories/scan-state.db.js';
import { getClaudeSessions } from '@/modules/providers/claude/claude.session-parser.js'; import { processClaudeSessions } from '@/modules/providers/claude/claude.session-parser.js';
import { getCodexSessions } from '@/modules/providers/codex/codex.session-parser.js'; import { processCodexSessions } from '@/modules/providers/codex/codex.session-parser.js';
import { getGeminiSessions } from '@/modules/providers/gemini/gemini.session-parser.js'; import { processGeminiSessions } from '@/modules/providers/gemini/gemini.session-parser.js';
import { getCursorSessions } from '@/modules/providers/cursor/cursor.session-parser.js'; import { processCursorSessions } from '@/modules/providers/cursor/cursor.session-parser.js';
export async function getSessions() { export async function processSessions() {
// 1. Start the timer with a unique label // 1. Start the timer with a unique label
console.time("🚀 Workspace sync total time"); console.time("🚀 Workspace sync total time");
@@ -13,10 +13,10 @@ export async function getSessions() {
try { try {
// Wrapping in Promise.all allows these to process concurrently, speeding up the boot time // Wrapping in Promise.all allows these to process concurrently, speeding up the boot time
await Promise.allSettled([ await Promise.allSettled([
getClaudeSessions(), processClaudeSessions(),
getCodexSessions(), processCodexSessions(),
getGeminiSessions(), processGeminiSessions(),
getCursorSessions() processCursorSessions()
]); ]);
scanStateDb.updateLastScannedAt(); scanStateDb.updateLastScannedAt();

View File

@@ -3,7 +3,7 @@ import path from "path";
import os from "os"; import os from "os";
import { promises as fsPromises } from "fs"; import { promises as fsPromises } from "fs";
import { logger } from "@/shared/utils/logger.js"; import { logger } from "@/shared/utils/logger.js";
import { getSessions } from "@/modules/sessions/sessions.service.js"; import { processSessions } from "@/modules/sessions/sessions.service.js";
import { processClaudeSessionFile } from "@/modules/providers/claude/claude.session-parser.js"; import { processClaudeSessionFile } from "@/modules/providers/claude/claude.session-parser.js";
import { processCodexSessionFile } from "@/modules/providers/codex/codex.session-parser.js"; import { processCodexSessionFile } from "@/modules/providers/codex/codex.session-parser.js";
import { processGeminiSessionFile } from "@/modules/providers/gemini/gemini.session-parser.js"; import { processGeminiSessionFile } from "@/modules/providers/gemini/gemini.session-parser.js";
@@ -117,7 +117,7 @@ const onUpdate = async (
export async function initializeWatcher() { export async function initializeWatcher() {
logger.info("Setting up project watchers for providers..."); logger.info("Setting up project watchers for providers...");
await getSessions(); await processSessions();
for (const { provider, rootPath } of PROVIDER_WATCH_PATHS) { for (const { provider, rootPath } of PROVIDER_WATCH_PATHS) {
try { try {

View File

@@ -2,4 +2,4 @@ export type SessionData = {
sessionId: string; sessionId: string;
workspacePath: string; workspacePath: string;
sessionName?: string; sessionName?: string;
} };