From 601468fe3de06ca1aa6c1d3e6f3d3ce41c7a485e Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 23 Oct 2025 11:10:07 -0500 Subject: [PATCH] Don't log errors for known app password issues in chat --- src/lib/strings/errors.ts | 9 +++++++++ src/state/messages/convo/agent.ts | 15 +++++++++------ src/state/messages/events/agent.ts | 9 ++++++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/lib/strings/errors.ts b/src/lib/strings/errors.ts index ee57bfc31e..35b8b39ac4 100644 --- a/src/lib/strings/errors.ts +++ b/src/lib/strings/errors.ts @@ -1,3 +1,4 @@ +import {XRPCError} from '@atproto/xrpc' import {t} from '@lingui/macro' export function cleanError(str: any): string { @@ -43,3 +44,11 @@ export function isNetworkError(e: unknown) { } return false } + +export function isErrorMaybeAppPasswordPermissions(e: unknown) { + if (e instanceof XRPCError && e.error === 'TokenInvalid') { + return true + } + const str = String(e) + return str.includes('Bad token scope') || str.includes('Bad token method') +} diff --git a/src/state/messages/convo/agent.ts b/src/state/messages/convo/agent.ts index 168002b1f5..c5fd8f017c 100644 --- a/src/state/messages/convo/agent.ts +++ b/src/state/messages/convo/agent.ts @@ -11,7 +11,10 @@ import {nanoid} from 'nanoid/non-secure' import {networkRetry} from '#/lib/async/retry' import {DM_SERVICE_HEADERS} from '#/lib/constants' -import {isNetworkError} from '#/lib/strings/errors' +import { + isErrorMaybeAppPasswordPermissions, + isNetworkError, +} from '#/lib/strings/errors' import {Logger} from '#/logger' import {isNative} from '#/platform/detection' import { @@ -485,7 +488,7 @@ export class Convo { this.dispatch({event: ConvoDispatchEvent.Ready}) } } catch (e: any) { - if (!isNetworkError(e)) { + if (!isNetworkError(e) && !isErrorMaybeAppPasswordPermissions(e)) { logger.error('setup failed', { safeMessage: e.message, }) @@ -594,7 +597,7 @@ export class Convo { this.sender = sender || this.sender this.recipients = recipients || this.recipients } catch (e: any) { - if (!isNetworkError(e)) { + if (!isNetworkError(e) && !isErrorMaybeAppPasswordPermissions(e)) { logger.error(`failed to refresh convo`, { safeMessage: e.message, }) @@ -662,7 +665,7 @@ export class Convo { } } } catch (e: any) { - if (!isNetworkError(e)) { + if (!isNetworkError(e) && !isErrorMaybeAppPasswordPermissions(e)) { logger.error('failed to fetch message history', { safeMessage: e.message, }) @@ -938,7 +941,7 @@ export class Convo { } else { this.pendingMessageFailure = 'unrecoverable' - if (!isNetworkError(e)) { + if (!isNetworkError(e) && !isErrorMaybeAppPasswordPermissions(e)) { logger.error(`handleSendMessageFailure received unknown error`, { safeMessage: e.message, }) @@ -1014,7 +1017,7 @@ export class Convo { ) }) } catch (e: any) { - if (!isNetworkError(e)) { + if (!isNetworkError(e) && !isErrorMaybeAppPasswordPermissions(e)) { logger.error(`failed to delete message`, { safeMessage: e.message, }) diff --git a/src/state/messages/events/agent.ts b/src/state/messages/events/agent.ts index e54ea1c77e..e8404fd000 100644 --- a/src/state/messages/events/agent.ts +++ b/src/state/messages/events/agent.ts @@ -4,7 +4,10 @@ import {nanoid} from 'nanoid/non-secure' import {networkRetry} from '#/lib/async/retry' import {DM_SERVICE_HEADERS} from '#/lib/constants' -import {isNetworkError} from '#/lib/strings/errors' +import { + isErrorMaybeAppPasswordPermissions, + isNetworkError, +} from '#/lib/strings/errors' import {Logger} from '#/logger' import { BACKGROUND_POLL_INTERVAL, @@ -260,7 +263,7 @@ export class MessagesEventBus { this.dispatch({event: MessagesEventBusDispatchEvent.Ready}) } catch (e: any) { - if (!isNetworkError(e)) { + if (!isNetworkError(e) && !isErrorMaybeAppPasswordPermissions(e)) { logger.error(`init failed`, { safeMessage: e.message, }) @@ -375,7 +378,7 @@ export class MessagesEventBus { this.emitter.emit('event', {type: 'logs', logs: batch}) } } catch (e: any) { - if (!isNetworkError(e)) { + if (!isNetworkError(e) && !isErrorMaybeAppPasswordPermissions(e)) { logger.error(`poll events failed`, { safeMessage: e.message, })