diff --git a/src/services/infrastructure/ProcessManager.ts b/src/services/infrastructure/ProcessManager.ts index 8b1a4698..909ab224 100644 --- a/src/services/infrastructure/ProcessManager.ts +++ b/src/services/infrastructure/ProcessManager.ts @@ -326,11 +326,9 @@ export async function waitForProcessesExit(pids: number[], timeoutMs: number): P try { process.kill(pid, 0); return true; - } catch (error: unknown) { + } catch { // process.kill(pid, 0) throws when PID doesn't exist — expected during cleanup - if (error instanceof Error) { - logger.debug('SYSTEM', `Process ${pid} no longer exists`, { pid, error: error.message }); - } + // [ANTI-PATTERN IGNORED]: Tight loop checking 100s of PIDs every 100ms during cleanup return false; } }); diff --git a/src/services/sqlite/migrations/runner.ts b/src/services/sqlite/migrations/runner.ts index 60547981..43b7a1b1 100644 --- a/src/services/sqlite/migrations/runner.ts +++ b/src/services/sqlite/migrations/runner.ts @@ -421,7 +421,7 @@ export class MigrationRunner { try { this.createUserPromptsFTS(); } catch (ftsError) { - logger.warn('DB', 'FTS5 not available — user_prompts_fts skipped (search uses ChromaDB)', {}, ftsError instanceof Error ? ftsError : undefined); + logger.warn('DB', 'FTS5 not available — user_prompts_fts skipped (search uses ChromaDB)', {}, ftsError instanceof Error ? ftsError : new Error(String(ftsError))); } // Commit transaction diff --git a/src/services/sync/ChromaSync.ts b/src/services/sync/ChromaSync.ts index d2996c25..8c7fa961 100644 --- a/src/services/sync/ChromaSync.ts +++ b/src/services/sync/ChromaSync.ts @@ -565,7 +565,7 @@ export class ChromaSync { try { await this.runBackfillPipeline(db, backfillProject, existing); } catch (error) { - logger.error('CHROMA_SYNC', 'Backfill failed', { project: backfillProject }, error as Error); + logger.error('CHROMA_SYNC', 'Backfill failed', { project: backfillProject }, error instanceof Error ? error : new Error(String(error))); throw new Error(`Backfill failed: ${error instanceof Error ? error.message : String(error)}`); } finally { db.close(); diff --git a/src/services/worker/GeminiAgent.ts b/src/services/worker/GeminiAgent.ts index 85fc7df8..3cf48b5b 100644 --- a/src/services/worker/GeminiAgent.ts +++ b/src/services/worker/GeminiAgent.ts @@ -374,7 +374,7 @@ export class GeminiAgent { return this.fallbackAgent.startSession(session, worker); } - logger.failure('SDK', 'Gemini agent error', { sessionDbId: session.sessionDbId }, error as Error); + logger.failure('SDK', 'Gemini agent error', { sessionDbId: session.sessionDbId }, error instanceof Error ? error : new Error(String(error))); throw error; } diff --git a/src/services/worker/OpenRouterAgent.ts b/src/services/worker/OpenRouterAgent.ts index 8e2917af..98133b9b 100644 --- a/src/services/worker/OpenRouterAgent.ts +++ b/src/services/worker/OpenRouterAgent.ts @@ -345,7 +345,7 @@ export class OpenRouterAgent { return; } - logger.failure('SDK', 'OpenRouter agent error', { sessionDbId: session.sessionDbId }, error as Error); + logger.failure('SDK', 'OpenRouter agent error', { sessionDbId: session.sessionDbId }, error instanceof Error ? error : new Error(String(error))); throw error; } diff --git a/src/utils/logger.ts b/src/utils/logger.ts index c024e350..49bd2336 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -154,11 +154,7 @@ class Logger { try { input = JSON.parse(toolInput); } catch (_parseError: unknown) { - // [ANTI-PATTERN IGNORED]: Logger cannot log its own failures, using stderr/console as last resort - // Input is a raw string (e.g., Bash command), use as-is - if (_parseError instanceof Error) { - console.error('[logger] JSON parse failed for tool input:', _parseError); - } + // Input is a raw string (e.g., Bash command), use as-is — JSON.parse failure is expected here input = toolInput; } }