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',