diff --git a/apps/server/src/routes/agent/common.ts b/apps/server/src/routes/agent/common.ts index 82cc0648..4257bee1 100644 --- a/apps/server/src/routes/agent/common.ts +++ b/apps/server/src/routes/agent/common.ts @@ -3,19 +3,13 @@ */ import { createLogger } from "../../lib/logger.js"; +import { + getErrorMessage as getErrorMessageShared, + createLogError, +} from "../common.js"; const logger = createLogger("Agent"); -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} - -/** - * Log error details consistently - */ -export function logError(error: unknown, context: string): void { - logger.error(`❌ ${context}:`, error); -} +// Re-export shared utilities +export { getErrorMessageShared as getErrorMessage }; +export const logError = createLogError(logger); diff --git a/apps/server/src/routes/agent/routes/send.ts b/apps/server/src/routes/agent/routes/send.ts index dbaa2204..fa012e89 100644 --- a/apps/server/src/routes/agent/routes/send.ts +++ b/apps/server/src/routes/agent/routes/send.ts @@ -22,12 +22,10 @@ export function createSendHandler(agentService: AgentService) { }; if (!sessionId || !message) { - res - .status(400) - .json({ - success: false, - error: "sessionId and message are required", - }); + res.status(400).json({ + success: false, + error: "sessionId and message are required", + }); return; } @@ -41,7 +39,7 @@ export function createSendHandler(agentService: AgentService) { model, }) .catch((error) => { - logger.error("[Agent Route] Error sending message:", error); + logError(error, "Send message failed (background)"); }); // Return immediately - responses come via WebSocket diff --git a/apps/server/src/routes/app-spec/common.ts b/apps/server/src/routes/app-spec/common.ts index 79decd80..9c651d29 100644 --- a/apps/server/src/routes/app-spec/common.ts +++ b/apps/server/src/routes/app-spec/common.ts @@ -3,6 +3,7 @@ */ import { createLogger } from "../../lib/logger.js"; +import { getErrorMessage as getErrorMessageShared } from "../common.js"; const logger = createLogger("SpecRegeneration"); @@ -65,9 +66,7 @@ export function logError(error: unknown, context: string): void { ); } -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} +import { getErrorMessage as getErrorMessageShared } from "../common.js"; + +// Re-export shared utility +export { getErrorMessageShared as getErrorMessage }; diff --git a/apps/server/src/routes/app-spec/routes/create.ts b/apps/server/src/routes/app-spec/routes/create.ts index 5ed1583f..3fcb48c1 100644 --- a/apps/server/src/routes/app-spec/routes/create.ts +++ b/apps/server/src/routes/app-spec/routes/create.ts @@ -87,8 +87,7 @@ export function createCreateHandler(events: EventEmitter) { ); res.json({ success: true }); } catch (error) { - logger.error("❌ Route handler exception:"); - logger.error("Error:", error); + logError(error, "Create spec route handler failed"); res.status(500).json({ success: false, error: getErrorMessage(error) }); } }; diff --git a/apps/server/src/routes/app-spec/routes/generate-features.ts b/apps/server/src/routes/app-spec/routes/generate-features.ts index 4bb8535a..12a7e2f2 100644 --- a/apps/server/src/routes/app-spec/routes/generate-features.ts +++ b/apps/server/src/routes/app-spec/routes/generate-features.ts @@ -62,8 +62,7 @@ export function createGenerateFeaturesHandler(events: EventEmitter) { ); res.json({ success: true }); } catch (error) { - logger.error("❌ Route handler exception:"); - logger.error("Error:", error); + logError(error, "Generate features route handler failed"); res.status(500).json({ success: false, error: getErrorMessage(error) }); } }; diff --git a/apps/server/src/routes/app-spec/routes/generate.ts b/apps/server/src/routes/app-spec/routes/generate.ts index 3cd6b889..5a73aa93 100644 --- a/apps/server/src/routes/app-spec/routes/generate.ts +++ b/apps/server/src/routes/app-spec/routes/generate.ts @@ -90,8 +90,7 @@ export function createGenerateHandler(events: EventEmitter) { ); res.json({ success: true }); } catch (error) { - logger.error("❌ Route handler exception:"); - logger.error("Error:", error); + logError(error, "Generate spec route handler failed"); res.status(500).json({ success: false, error: getErrorMessage(error) }); } }; diff --git a/apps/server/src/routes/auto-mode/common.ts b/apps/server/src/routes/auto-mode/common.ts index caff463e..77082852 100644 --- a/apps/server/src/routes/auto-mode/common.ts +++ b/apps/server/src/routes/auto-mode/common.ts @@ -3,19 +3,13 @@ */ import { createLogger } from "../../lib/logger.js"; +import { + getErrorMessage as getErrorMessageShared, + createLogError, +} from "../common.js"; const logger = createLogger("AutoMode"); -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} - -/** - * Log error details consistently - */ -export function logError(error: unknown, context: string): void { - logger.error(`❌ ${context}:`, error); -} +// Re-export shared utilities +export { getErrorMessageShared as getErrorMessage }; +export const logError = createLogError(logger); diff --git a/apps/server/src/routes/common.ts b/apps/server/src/routes/common.ts new file mode 100644 index 00000000..8a1fcc68 --- /dev/null +++ b/apps/server/src/routes/common.ts @@ -0,0 +1,24 @@ +/** + * Common utilities shared across all route modules + */ + +import { createLogger } from "../lib/logger.js"; + +type Logger = ReturnType; + +/** + * Get error message from error object + */ +export function getErrorMessage(error: unknown): string { + return error instanceof Error ? error.message : "Unknown error"; +} + +/** + * Create a logError function for a specific logger + * This ensures consistent error logging format across all routes + */ +export function createLogError(logger: Logger) { + return (error: unknown, context: string): void => { + logger.error(`❌ ${context}:`, error); + }; +} diff --git a/apps/server/src/routes/features/common.ts b/apps/server/src/routes/features/common.ts index faf0d6b6..172008d6 100644 --- a/apps/server/src/routes/features/common.ts +++ b/apps/server/src/routes/features/common.ts @@ -3,19 +3,13 @@ */ import { createLogger } from "../../lib/logger.js"; +import { + getErrorMessage as getErrorMessageShared, + createLogError, +} from "../common.js"; const logger = createLogger("Features"); -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} - -/** - * Log error details consistently - */ -export function logError(error: unknown, context: string): void { - logger.error(`❌ ${context}:`, error); -} +// Re-export shared utilities +export { getErrorMessageShared as getErrorMessage }; +export const logError = createLogError(logger); diff --git a/apps/server/src/routes/fs/common.ts b/apps/server/src/routes/fs/common.ts index aa32e602..49649571 100644 --- a/apps/server/src/routes/fs/common.ts +++ b/apps/server/src/routes/fs/common.ts @@ -3,19 +3,13 @@ */ import { createLogger } from "../../lib/logger.js"; +import { + getErrorMessage as getErrorMessageShared, + createLogError, +} from "../common.js"; const logger = createLogger("FS"); -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} - -/** - * Log error details consistently - */ -export function logError(error: unknown, context: string): void { - logger.error(`❌ ${context}:`, error); -} +// Re-export shared utilities +export { getErrorMessageShared as getErrorMessage }; +export const logError = createLogError(logger); diff --git a/apps/server/src/routes/fs/routes/resolve-directory.ts b/apps/server/src/routes/fs/routes/resolve-directory.ts index 00e35c2f..9b165c42 100644 --- a/apps/server/src/routes/fs/routes/resolve-directory.ts +++ b/apps/server/src/routes/fs/routes/resolve-directory.ts @@ -31,10 +31,11 @@ export function createResolveDirectoryHandler() { const stats = await fs.stat(resolvedPath); if (stats.isDirectory()) { addAllowedPath(resolvedPath); - return res.json({ + res.json({ success: true, path: resolvedPath, }); + return; } } catch { // Not a valid absolute path, continue to search @@ -102,10 +103,11 @@ export function createResolveDirectoryHandler() { // Found matching directory addAllowedPath(candidatePath); - return res.json({ + res.json({ success: true, path: candidatePath, }); + return; } } catch { // Directory doesn't exist at this location, continue searching diff --git a/apps/server/src/routes/git/common.ts b/apps/server/src/routes/git/common.ts index da9f8dcc..1bde9f82 100644 --- a/apps/server/src/routes/git/common.ts +++ b/apps/server/src/routes/git/common.ts @@ -3,19 +3,13 @@ */ import { createLogger } from "../../lib/logger.js"; +import { + getErrorMessage as getErrorMessageShared, + createLogError, +} from "../common.js"; const logger = createLogger("Git"); -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} - -/** - * Log error details consistently - */ -export function logError(error: unknown, context: string): void { - logger.error(`❌ ${context}:`, error); -} +// Re-export shared utilities +export { getErrorMessageShared as getErrorMessage }; +export const logError = createLogError(logger); diff --git a/apps/server/src/routes/health/common.ts b/apps/server/src/routes/health/common.ts index 3d8071a2..c4104e3f 100644 --- a/apps/server/src/routes/health/common.ts +++ b/apps/server/src/routes/health/common.ts @@ -3,12 +3,13 @@ */ import { createLogger } from "../../lib/logger.js"; +import { + getErrorMessage as getErrorMessageShared, + createLogError, +} from "../common.js"; const logger = createLogger("Health"); -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} +// Re-export shared utilities +export { getErrorMessageShared as getErrorMessage }; +export const logError = createLogError(logger); diff --git a/apps/server/src/routes/models/common.ts b/apps/server/src/routes/models/common.ts index bd8b899c..06364bfc 100644 --- a/apps/server/src/routes/models/common.ts +++ b/apps/server/src/routes/models/common.ts @@ -3,19 +3,13 @@ */ import { createLogger } from "../../lib/logger.js"; +import { + getErrorMessage as getErrorMessageShared, + createLogError, +} from "../common.js"; const logger = createLogger("Models"); -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} - -/** - * Log error details consistently - */ -export function logError(error: unknown, context: string): void { - logger.error(`❌ ${context}:`, error); -} +// Re-export shared utilities +export { getErrorMessageShared as getErrorMessage }; +export const logError = createLogError(logger); diff --git a/apps/server/src/routes/running-agents/common.ts b/apps/server/src/routes/running-agents/common.ts index 24f1e4a7..2518453a 100644 --- a/apps/server/src/routes/running-agents/common.ts +++ b/apps/server/src/routes/running-agents/common.ts @@ -3,19 +3,13 @@ */ import { createLogger } from "../../lib/logger.js"; +import { + getErrorMessage as getErrorMessageShared, + createLogError, +} from "../common.js"; const logger = createLogger("RunningAgents"); -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} - -/** - * Log error details consistently - */ -export function logError(error: unknown, context: string): void { - logger.error(`❌ ${context}:`, error); -} +// Re-export shared utilities +export { getErrorMessageShared as getErrorMessage }; +export const logError = createLogError(logger); diff --git a/apps/server/src/routes/sessions/common.ts b/apps/server/src/routes/sessions/common.ts index 69a123d9..6e2a3171 100644 --- a/apps/server/src/routes/sessions/common.ts +++ b/apps/server/src/routes/sessions/common.ts @@ -3,19 +3,13 @@ */ import { createLogger } from "../../lib/logger.js"; +import { + getErrorMessage as getErrorMessageShared, + createLogError, +} from "../common.js"; const logger = createLogger("Sessions"); -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} - -/** - * Log error details consistently - */ -export function logError(error: unknown, context: string): void { - logger.error(`❌ ${context}:`, error); -} +// Re-export shared utilities +export { getErrorMessageShared as getErrorMessage }; +export const logError = createLogError(logger); diff --git a/apps/server/src/routes/setup/common.ts b/apps/server/src/routes/setup/common.ts index a1103007..55918c03 100644 --- a/apps/server/src/routes/setup/common.ts +++ b/apps/server/src/routes/setup/common.ts @@ -5,6 +5,10 @@ import { createLogger } from "../../lib/logger.js"; import path from "path"; import fs from "fs/promises"; +import { + getErrorMessage as getErrorMessageShared, + createLogError, +} from "../common.js"; const logger = createLogger("Setup"); @@ -53,16 +57,6 @@ export async function persistApiKeyToEnv( } } -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} - -/** - * Log error details consistently - */ -export function logError(error: unknown, context: string): void { - logger.error(`❌ ${context}:`, error); -} +// Re-export shared utilities +export { getErrorMessageShared as getErrorMessage }; +export const logError = createLogError(logger); diff --git a/apps/server/src/routes/suggestions/common.ts b/apps/server/src/routes/suggestions/common.ts index 7dcc8e54..c63d0613 100644 --- a/apps/server/src/routes/suggestions/common.ts +++ b/apps/server/src/routes/suggestions/common.ts @@ -3,6 +3,10 @@ */ import { createLogger } from "../../lib/logger.js"; +import { + getErrorMessage as getErrorMessageShared, + createLogError, +} from "../common.js"; const logger = createLogger("Suggestions"); @@ -21,16 +25,6 @@ export function setRunningState( currentAbortController = controller; } -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} - -/** - * Log error details consistently - */ -export function logError(error: unknown, context: string): void { - logger.error(`❌ ${context}:`, error); -} +// Re-export shared utilities +export { getErrorMessageShared as getErrorMessage }; +export const logError = createLogError(logger); diff --git a/apps/server/src/routes/suggestions/routes/generate.ts b/apps/server/src/routes/suggestions/routes/generate.ts index d02fd3fe..0e7998a9 100644 --- a/apps/server/src/routes/suggestions/routes/generate.ts +++ b/apps/server/src/routes/suggestions/routes/generate.ts @@ -43,7 +43,7 @@ export function createGenerateHandler(events: EventEmitter) { // Start generation in background generateSuggestions(projectPath, suggestionType, events, abortController) .catch((error) => { - logger.error("[Suggestions] Error:", error); + logError(error, "Generate suggestions failed (background)"); events.emit("suggestions:event", { type: "suggestions_error", error: getErrorMessage(error), diff --git a/apps/server/src/routes/templates/common.ts b/apps/server/src/routes/templates/common.ts index d2337a42..b4c06132 100644 --- a/apps/server/src/routes/templates/common.ts +++ b/apps/server/src/routes/templates/common.ts @@ -3,19 +3,13 @@ */ import { createLogger } from "../../lib/logger.js"; +import { + getErrorMessage as getErrorMessageShared, + createLogError, +} from "../common.js"; -const logger = createLogger("Templates"); +export const logger = createLogger("Templates"); -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} - -/** - * Log error details consistently - */ -export function logError(error: unknown, context: string): void { - logger.error(`❌ ${context}:`, error); -} +// Re-export shared utilities +export { getErrorMessageShared as getErrorMessage }; +export const logError = createLogError(logger); diff --git a/apps/server/src/routes/templates/routes/clone.ts b/apps/server/src/routes/templates/routes/clone.ts index fe7b0460..11e9bf45 100644 --- a/apps/server/src/routes/templates/routes/clone.ts +++ b/apps/server/src/routes/templates/routes/clone.ts @@ -7,10 +7,7 @@ import { spawn } from "child_process"; import path from "path"; import fs from "fs/promises"; import { addAllowedPath } from "../../../lib/security.js"; -import { createLogger } from "../../../lib/logger.js"; -import { getErrorMessage, logError } from "../common.js"; - -const logger = createLogger("Templates"); +import { logger, getErrorMessage, logError } from "../common.js"; export function createCloneHandler() { return async (req: Request, res: Response): Promise => { @@ -59,10 +56,11 @@ export function createCloneHandler() { const resolvedProject = path.resolve(projectPath); const relativePath = path.relative(resolvedParent, resolvedProject); if (relativePath.startsWith("..") || path.isAbsolute(relativePath)) { - return res.status(400).json({ + res.status(400).json({ success: false, error: "Invalid project name; potential path traversal attempt.", }); + return; } // Check if directory already exists @@ -199,7 +197,6 @@ export function createCloneHandler() { projectName: sanitizedName, }); } catch (error) { - logger.error("[Templates] Clone error:", error); logError(error, "Clone template failed"); res.status(500).json({ success: false, error: getErrorMessage(error) }); } diff --git a/apps/server/src/routes/terminal/common.ts b/apps/server/src/routes/terminal/common.ts index 0b401113..1a2861a7 100644 --- a/apps/server/src/routes/terminal/common.ts +++ b/apps/server/src/routes/terminal/common.ts @@ -129,9 +129,11 @@ export function getTokenExpiryMs(): number { return TOKEN_EXPIRY_MS; } -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} +import { + getErrorMessage as getErrorMessageShared, + createLogError, +} from "../common.js"; + +// Re-export shared utilities +export { getErrorMessageShared as getErrorMessage }; +export const logError = createLogError(logger); diff --git a/apps/server/src/routes/terminal/routes/sessions.ts b/apps/server/src/routes/terminal/routes/sessions.ts index 7325e681..1c1138c0 100644 --- a/apps/server/src/routes/terminal/routes/sessions.ts +++ b/apps/server/src/routes/terminal/routes/sessions.ts @@ -5,7 +5,7 @@ import type { Request, Response } from "express"; import { getTerminalService } from "../../../services/terminal-service.js"; -import { getErrorMessage } from "../common.js"; +import { getErrorMessage, logError } from "../common.js"; import { createLogger } from "../../../lib/logger.js"; const logger = createLogger("Terminal"); @@ -44,7 +44,7 @@ export function createSessionsCreateHandler() { }, }); } catch (error) { - logger.error("[Terminal] Error creating session:", error); + logError(error, "Create terminal session failed"); res.status(500).json({ success: false, error: "Failed to create terminal session", diff --git a/apps/server/src/routes/workspace/common.ts b/apps/server/src/routes/workspace/common.ts index 5219ca77..80c1f99b 100644 --- a/apps/server/src/routes/workspace/common.ts +++ b/apps/server/src/routes/workspace/common.ts @@ -3,19 +3,13 @@ */ import { createLogger } from "../../lib/logger.js"; +import { + getErrorMessage as getErrorMessageShared, + createLogError, +} from "../common.js"; const logger = createLogger("Workspace"); -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} - -/** - * Log error details consistently - */ -export function logError(error: unknown, context: string): void { - logger.error(`❌ ${context}:`, error); -} +// Re-export shared utilities +export { getErrorMessageShared as getErrorMessage }; +export const logError = createLogError(logger); diff --git a/apps/server/src/routes/worktree/common.ts b/apps/server/src/routes/worktree/common.ts index 7cf981ca..60a81038 100644 --- a/apps/server/src/routes/worktree/common.ts +++ b/apps/server/src/routes/worktree/common.ts @@ -5,6 +5,10 @@ import { createLogger } from "../../lib/logger.js"; import { exec } from "child_process"; import { promisify } from "util"; +import { + getErrorMessage as getErrorMessageShared, + createLogError, +} from "../common.js"; const logger = createLogger("Worktree"); const execAsync = promisify(exec); @@ -21,16 +25,6 @@ export async function isGitRepo(repoPath: string): Promise { } } -/** - * Get error message from error object - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : "Unknown error"; -} - -/** - * Log error details consistently - */ -export function logError(error: unknown, context: string): void { - logger.error(`❌ ${context}:`, error); -} +// Re-export shared utilities +export { getErrorMessageShared as getErrorMessage }; +export const logError = createLogError(logger);