diff --git a/src/server/service/project/getProjectMeta.ts b/src/server/service/project/getProjectMeta.ts index eaa3c7d..7867f6d 100644 --- a/src/server/service/project/getProjectMeta.ts +++ b/src/server/service/project/getProjectMeta.ts @@ -50,11 +50,11 @@ export const getProjectMeta = async ( .map( (d) => ({ - fullPath: resolve(d.parentPath, d.name), - stats: statSync(resolve(d.parentPath, d.name)), + fullPath: resolve(claudeProjectPath, d.name), + stats: statSync(resolve(claudeProjectPath, d.name)), }) as const, ) - .toSorted((a, b) => { + .sort((a, b) => { return a.stats.ctime.getTime() - b.stats.ctime.getTime(); }); diff --git a/src/server/service/project/getProjects.ts b/src/server/service/project/getProjects.ts index ee24322..49e4a3a 100644 --- a/src/server/service/project/getProjects.ts +++ b/src/server/service/project/getProjects.ts @@ -1,4 +1,5 @@ -import { readdir } from "node:fs/promises"; +import { constants } from "node:fs"; +import { access, readdir } from "node:fs/promises"; import { resolve } from "node:path"; import { claudeProjectPath } from "../paths"; @@ -7,28 +8,42 @@ import { getProjectMeta } from "./getProjectMeta"; import { encodeProjectId } from "./id"; export const getProjects = async (): Promise<{ projects: Project[] }> => { - const dirents = await readdir(claudeProjectPath, { withFileTypes: true }); - const projects = await Promise.all( - dirents - .filter((d) => d.isDirectory()) - .map(async (d) => { - const fullPath = resolve(d.parentPath, d.name); - const id = encodeProjectId(fullPath); + try { + // Check if the claude projects directory exists + await access(claudeProjectPath, constants.F_OK); + } catch (_error) { + // Directory doesn't exist, return empty array + console.warn(`Claude projects directory not found at ${claudeProjectPath}`); + return { projects: [] }; + } - return { - id, - claudeProjectPath: fullPath, - meta: await getProjectMeta(fullPath), - }; + try { + const dirents = await readdir(claudeProjectPath, { withFileTypes: true }); + const projects = await Promise.all( + dirents + .filter((d) => d.isDirectory()) + .map(async (d) => { + const fullPath = resolve(claudeProjectPath, d.name); + const id = encodeProjectId(fullPath); + + return { + id, + claudeProjectPath: fullPath, + meta: await getProjectMeta(fullPath), + }; + }), + ); + + return { + projects: projects.sort((a, b) => { + return ( + (b.meta.lastModifiedAt?.getTime() ?? 0) - + (a.meta.lastModifiedAt?.getTime() ?? 0) + ); }), - ); - - return { - projects: projects.sort((a, b) => { - return ( - (b.meta.lastModifiedAt?.getTime() ?? 0) - - (a.meta.lastModifiedAt?.getTime() ?? 0) - ); - }), - }; + }; + } catch (error) { + console.error("Error reading projects:", error); + return { projects: [] }; + } }; diff --git a/src/server/service/session/getSessions.ts b/src/server/service/session/getSessions.ts index 9f4be4b..5927429 100644 --- a/src/server/service/session/getSessions.ts +++ b/src/server/service/session/getSessions.ts @@ -15,24 +15,29 @@ export const getSessions = async ( ): Promise<{ sessions: Session[] }> => { const claudeProjectPath = decodeProjectId(projectId); - const dirents = await readdir(claudeProjectPath, { withFileTypes: true }); - const sessions = await Promise.all( - dirents - .filter((d) => d.isFile() && d.name.endsWith(".jsonl")) - .map(async (d): Promise => { - const fullPath = resolve(d.parentPath, d.name); + try { + const dirents = await readdir(claudeProjectPath, { withFileTypes: true }); + const sessions = await Promise.all( + dirents + .filter((d) => d.isFile() && d.name.endsWith(".jsonl")) + .map(async (d): Promise => { + const fullPath = resolve(claudeProjectPath, d.name); - return { - id: basename(fullPath, extname(fullPath)), - jsonlFilePath: fullPath, - meta: await getSessionMeta(fullPath), - }; + return { + id: basename(fullPath, extname(fullPath)), + jsonlFilePath: fullPath, + meta: await getSessionMeta(fullPath), + }; + }), + ); + + return { + sessions: sessions.sort((a, b) => { + return getTime(b.meta.lastModifiedAt) - getTime(a.meta.lastModifiedAt); }), - ); - - return { - sessions: sessions.sort((a, b) => { - return getTime(b.meta.lastModifiedAt) - getTime(a.meta.lastModifiedAt); - }), - }; + }; + } catch (error) { + console.warn(`Failed to read sessions for project ${projectId}:`, error); + return { sessions: [] }; + } };