From 36e203b7d0ff715af20c4ce34d79059a4028e86f Mon Sep 17 00:00:00 2001 From: Nik Shevchenko Date: Tue, 24 Mar 2026 01:09:48 -0400 Subject: [PATCH] fix(desktop): send raw error to analytics for chat agent failures Previously only the sanitized user-friendly message was sent to PostHog, making it impossible to diagnose failures remotely. Now sends the raw BridgeError alongside so we can see the actual cause (API key errors, connection issues, etc.) in analytics. Co-Authored-By: Claude Opus 4.6 (1M context) --- desktop/Desktop/Sources/AnalyticsManager.swift | 7 +++++-- desktop/Desktop/Sources/Providers/ChatProvider.swift | 9 ++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/desktop/Desktop/Sources/AnalyticsManager.swift b/desktop/Desktop/Sources/AnalyticsManager.swift index 6cce89c8121..fd0184ea07b 100644 --- a/desktop/Desktop/Sources/AnalyticsManager.swift +++ b/desktop/Desktop/Sources/AnalyticsManager.swift @@ -559,8 +559,11 @@ class AnalyticsManager { } /// Track when the Claude agent bridge fails to start or errors - func chatAgentError(error: String) { - let props: [String: Any] = ["error": error] + func chatAgentError(error: String, rawError: String? = nil) { + var props: [String: Any] = ["error": error] + if let raw = rawError, raw != error { + props["raw_error"] = String(raw.prefix(500)) + } MixpanelManager.shared.track( "Chat Agent Error", properties: props.compactMapValues { $0 as? MixpanelType }) PostHogManager.shared.track("chat_agent_error", properties: props) diff --git a/desktop/Desktop/Sources/Providers/ChatProvider.swift b/desktop/Desktop/Sources/Providers/ChatProvider.swift index d101b5424b7..ea7cac9c055 100644 --- a/desktop/Desktop/Sources/Providers/ChatProvider.swift +++ b/desktop/Desktop/Sources/Providers/ChatProvider.swift @@ -2191,7 +2191,14 @@ A screenshot may be attached — use it silently only if relevant. Never mention } logError("Failed to get AI response", error: error) - AnalyticsManager.shared.chatAgentError(error: error.localizedDescription) + // Send both user-friendly and raw error to analytics for remote debugging + let rawError: String + if let bridgeError = error as? BridgeError { + rawError = String(describing: bridgeError) + } else { + rawError = "\(error)" + } + AnalyticsManager.shared.chatAgentError(error: error.localizedDescription, rawError: rawError) // Show error to user (unless they intentionally stopped) if let bridgeError = error as? BridgeError, case .stopped = bridgeError {