From fdc155d8fac37be76d6cadf3f2ec07fe4f04e0d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 1 Sep 2026 15:22:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=BC=BA=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=97=A5=E5=BF=97=E8=84=B1=E6=95=8F=E4=B8=8E?= =?UTF-8?q?=E6=8C=87=E7=BA=B9=E7=A8=B3=E5=AE=9A=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 覆盖 Bearer 授权值并在 WebView 日志桥接处执行二次脱敏 使用首个调用点参与指纹,避免相同消息合并不同调用位置 --- .../src/services/errorReporting.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/apps/ai-game-creator-shell/src/services/errorReporting.ts b/apps/ai-game-creator-shell/src/services/errorReporting.ts index ca25b51b2..bf828e26e 100644 --- a/apps/ai-game-creator-shell/src/services/errorReporting.ts +++ b/apps/ai-game-creator-shell/src/services/errorReporting.ts @@ -40,7 +40,10 @@ function normalizeMessage(value: string) { function normalizeDiagnosticText(value: string) { return value - .replace(/authorization\s*:\s*\S+/giu, 'authorization: [REDACTED]') + .replace( + /authorization\s*:\s*(?:bearer\s+)?\S+/giu, + 'authorization: [REDACTED]', + ) .replace(/bearer\s+\S+/giu, 'Bearer [REDACTED]') .replace(/(?:api[_-]?key|token)\s*[=:]\s*\S+/giu, '[REDACTED]') .replace(/https?:\/\/\S+/giu, '') @@ -70,13 +73,17 @@ export async function captureClientError( const stack = errorValue.stack ? normalizeDiagnosticText(errorValue.stack).slice(0, 8_000) : undefined; - // 只用栈的首行参与指纹,避免同一错误因调用位置行号变化而无法合并。 + const callSite = stack + ?.split('\n') + .find((line) => /^\s*at\s+/u.test(line)) + ?.replace(/:\d+(?::\d+)?\)?$/u, '') + .trim(); const fingerprintInput = [ context.source ?? 'client', context.action, context.page, message, - stack?.split('\n')[0], + callSite, ] .filter(Boolean) .join('|'); @@ -124,7 +131,9 @@ function formatConsoleArgument(value: unknown) { } export function appendWebviewLog(level: WebviewLogLevel, values: unknown[]) { - const message = values.map(formatConsoleArgument).join(' ').slice(0, 8_000); + const message = normalizeDiagnosticText( + values.map(formatConsoleArgument).join(' ').slice(0, 8_000), + ); void invoke('append_application_log', { level, source: 'webview',