From c3d9cc273fa661df1c303d738a88678c2bb5d5d2 Mon Sep 17 00:00:00 2001 From: bvandeusen Date: Mon, 16 Mar 2026 07:54:00 -0400 Subject: [PATCH] fix: quick capture incorrectly treated as offline on LLM timeout The global receiveTimeout is 30s but quick capture runs LLM inference that can take much longer. receiveTimeout fired, fell through to the NetworkException fallback in dioToApp, and the work queue queued it as an offline item. - quick_capture_api.dart: override receiveTimeout to 120s for the /api/quick-capture request - api_client.dart: handle receiveTimeout/sendTimeout explicitly in the error interceptor, converting them to AppException (not NetworkException) so slow responses are never mistaken for being offline Co-Authored-By: Claude Sonnet 4.6 --- lib/data/api/api_client.dart | 10 ++++++++++ lib/data/api/quick_capture_api.dart | 1 + 2 files changed, 11 insertions(+) diff --git a/lib/data/api/api_client.dart b/lib/data/api/api_client.dart index 1419f92..e88b917 100644 --- a/lib/data/api/api_client.dart +++ b/lib/data/api/api_client.dart @@ -44,6 +44,16 @@ class _ErrorInterceptor extends Interceptor { )); return; } + if (err.type == DioExceptionType.receiveTimeout || + err.type == DioExceptionType.sendTimeout) { + handler.reject(DioException( + requestOptions: err.requestOptions, + error: const AppException('Request timed out. The server is taking too long to respond.'), + type: err.type, + response: err.response, + )); + return; + } handler.next(err); } } diff --git a/lib/data/api/quick_capture_api.dart b/lib/data/api/quick_capture_api.dart index 19ca190..485b28c 100644 --- a/lib/data/api/quick_capture_api.dart +++ b/lib/data/api/quick_capture_api.dart @@ -40,6 +40,7 @@ class QuickCaptureApi { final response = await _dio.post( '/api/quick-capture', data: {'text': text}, + options: Options(receiveTimeout: const Duration(seconds: 120)), ); return CaptureResult.fromJson(response.data as Map); } on DioException catch (e) {