From 34a4434cfb3b6d083259f27dde065e78d4e0054f Mon Sep 17 00:00:00 2001 From: brother7 <7brother7@gmail.com> Date: Mon, 24 Aug 2026 22:04:56 +0800 Subject: [PATCH] fix(proxy): strip client fetch metadata upstream --- electron/api/routes/ai-proxy.ts | 1 + scripts/run-pi-subagent-packaged-smoke.mjs | 13 +++++++++---- tests/unit/ai-proxy-routes.test.ts | 5 ++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/electron/api/routes/ai-proxy.ts b/electron/api/routes/ai-proxy.ts index c2f7ee0..66415b0 100644 --- a/electron/api/routes/ai-proxy.ts +++ b/electron/api/routes/ai-proxy.ts @@ -22,6 +22,7 @@ const SKIPPED_REQUEST_HEADERS = new Set([ 'keep-alive', 'proxy-authenticate', 'proxy-authorization', + 'sec-fetch-mode', 'te', 'trailer', 'transfer-encoding', diff --git a/scripts/run-pi-subagent-packaged-smoke.mjs b/scripts/run-pi-subagent-packaged-smoke.mjs index 7aae072..57b9238 100644 --- a/scripts/run-pi-subagent-packaged-smoke.mjs +++ b/scripts/run-pi-subagent-packaged-smoke.mjs @@ -20,6 +20,7 @@ function parseArgs(argv, projectRoot = process.cwd()) { }; for (let index = 0; index < argv.length; index += 1) { const argument = argv[index]; + if (argument === '--') continue; const value = argv[index + 1]; if (!value || value.startsWith('--')) throw new Error(`${argument} requires a value`); if (argument === '--runtime-root') options.runtimeRoot = resolve(value); @@ -306,11 +307,15 @@ export async function runPackagedProductProof(options) { || beforeSubmitText.includes('正在重新连接本地 Agent')) { throw new Error(`Packaged proxy first Conversation exposed a runtime banner: ${beforeSubmitText}`); } - await page.getByTestId('coding-message-composer').evaluate( - (form) => form.requestSubmit(), - ); + await page.getByRole('button', { name: '发送' }).click({ timeout: 30_000 }); - const proxyStatus = await waitForActiveProxyProof(electronApplication); + let proxyStatus; + try { + proxyStatus = await waitForActiveProxyProof(electronApplication); + } catch (error) { + const bodyText = await page.locator('body').innerText().catch(() => ''); + throw new Error(`${error instanceof Error ? error.message : String(error)}; UI=${bodyText}`); + } assertPackagedMain(proxyStatus); assertProxyStatus(proxyStatus.proxy); await evaluateProof(electronApplication, 'proxy.release-child'); diff --git a/tests/unit/ai-proxy-routes.test.ts b/tests/unit/ai-proxy-routes.test.ts index 78854a7..f0c4d9e 100644 --- a/tests/unit/ai-proxy-routes.test.ts +++ b/tests/unit/ai-proxy-routes.test.ts @@ -134,7 +134,9 @@ describe('ai proxy routes', () => { const response = createResponse(); const handled = await handleAiProxyRoutes( - createRequest('POST', { model: 'deepseek-chat', messages: [] }), + createRequest('POST', { model: 'deepseek-chat', messages: [] }, { + 'sec-fetch-mode': 'cors', + }), response.res, new URL('http://127.0.0.1:13210/api/ai-proxy/v1/chat/completions?trace=1'), {} as never, @@ -155,6 +157,7 @@ describe('ai proxy routes', () => { const forwardedHeaders = fetchMock.mock.calls[0][1].headers as Record; expect(forwardedHeaders.authorization).toBeUndefined(); expect(forwardedHeaders.host).toBeUndefined(); + expect(forwardedHeaders['sec-fetch-mode']).toBeUndefined(); expect(response.statusCode).toBe(200); expect(response.header('content-type')).toBe('application/json'); expect(response.body()).toBe(JSON.stringify({ id: 'chatcmpl_1' }));