From 1c2211aefb6dae4075a2e6e33cc782f06e718c22 Mon Sep 17 00:00:00 2001 From: Vaayne Date: Fri, 19 Sep 2025 18:45:54 +0800 Subject: [PATCH] feat(agents): add ensurePathsExist method to validate and create accessible paths --- src/main/services/agents/BaseService.ts | 44 +++++++++++++++++++ .../services/agents/services/AgentService.ts | 6 +++ .../agents/services/SessionService.ts | 6 +++ 3 files changed, 56 insertions(+) diff --git a/src/main/services/agents/BaseService.ts b/src/main/services/agents/BaseService.ts index 65d326465b..0bf3a5ac18 100644 --- a/src/main/services/agents/BaseService.ts +++ b/src/main/services/agents/BaseService.ts @@ -161,6 +161,50 @@ export abstract class BaseService { return deserialized } + protected ensurePathsExist(paths?: string[]): void { + if (!paths?.length) { + return + } + + for (const rawPath of paths) { + if (!rawPath) { + continue + } + + const resolvedPath = path.resolve(rawPath) + + let stats: fs.Stats | null = null + try { + if (fs.existsSync(resolvedPath)) { + stats = fs.statSync(resolvedPath) + } + } catch (error) { + logger.warn('Failed to inspect accessible path', { + path: rawPath, + error: error instanceof Error ? error.message : String(error) + }) + } + + const looksLikeFile = + (stats && stats.isFile()) || + (!stats && path.extname(resolvedPath) !== '' && !resolvedPath.endsWith(path.sep)) + + const directoryToEnsure = looksLikeFile ? path.dirname(resolvedPath) : resolvedPath + + if (!fs.existsSync(directoryToEnsure)) { + try { + fs.mkdirSync(directoryToEnsure, { recursive: true }) + } catch (error) { + logger.error('Failed to create accessible path directory', { + path: directoryToEnsure, + error: error instanceof Error ? error.message : String(error) + }) + throw error + } + } + } + } + /** * Force re-initialization (for development/testing) */ diff --git a/src/main/services/agents/services/AgentService.ts b/src/main/services/agents/services/AgentService.ts index 03110cc55a..ff2dcb18f2 100644 --- a/src/main/services/agents/services/AgentService.ts +++ b/src/main/services/agents/services/AgentService.ts @@ -43,6 +43,8 @@ export class AgentService extends BaseService { req.accessible_paths = [defaultPath] } + this.ensurePathsExist(req.accessible_paths) + const serializedReq = this.serializeJsonFields(req) const insertData: InsertAgentRow = { @@ -126,6 +128,10 @@ export class AgentService extends BaseService { } const now = new Date().toISOString() + + if (updates.accessible_paths) { + this.ensurePathsExist(updates.accessible_paths) + } const serializedUpdates = this.serializeJsonFields(updates) const updateData: Partial = { diff --git a/src/main/services/agents/services/SessionService.ts b/src/main/services/agents/services/SessionService.ts index a422c6455b..eb1820cbd6 100644 --- a/src/main/services/agents/services/SessionService.ts +++ b/src/main/services/agents/services/SessionService.ts @@ -50,6 +50,8 @@ export class SessionService extends BaseService { ...req } + this.ensurePathsExist(sessionData.accessible_paths) + const serializedData = this.serializeJsonFields(sessionData) const insertData: InsertSessionRow = { @@ -168,6 +170,10 @@ export class SessionService extends BaseService { // We'll skip this validation for now to avoid circular dependencies const now = new Date().toISOString() + + if (updates.accessible_paths) { + this.ensurePathsExist(updates.accessible_paths) + } const serializedUpdates = this.serializeJsonFields(updates) const updateData: Partial = {