From 7e3d825f0e4ded07bdb945107921717d8afac09a Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Fri, 5 Jun 2026 10:49:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20ACP=20prompt=20=E6=9C=AA=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E5=85=A8=E5=B1=80=20sessionId=20=E5=AF=BC=E8=87=B4=20?= =?UTF-8?q?transcript=20=E5=86=99=E5=85=A5=E9=94=99=E8=AF=AF=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit prompt() 在调用 submitMessage 前没有 switchSession,recordTranscript 依赖全局 getSessionId() 确定写入路径,多会话场景下新会话内容会覆盖旧会话。 --- src/services/acp/__tests__/agent.test.ts | 7 ++++--- src/services/acp/agent.ts | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/services/acp/__tests__/agent.test.ts b/src/services/acp/__tests__/agent.test.ts index 3aee6c52a..be1e87b5f 100644 --- a/src/services/acp/__tests__/agent.test.ts +++ b/src/services/acp/__tests__/agent.test.ts @@ -1226,19 +1226,20 @@ describe('AcpAgent', () => { ) }) - test('prompt does not trigger additional switchSession for multi-session', async () => { + test('prompt switches global sessionId to the correct session', async () => { const agent = new AcpAgent(makeConn()) await agent.newSession({ cwd: '/tmp' } as any) await agent.newSession({ cwd: '/tmp' } as any) mockSwitchSession.mockClear() - // Prompts should not call switchSession — alignment happens at session creation + // Prompts must switch global state so recordTranscript writes to + // the correct session file in multi-session scenarios. const s1 = agent.sessions.keys().next().value await agent.prompt({ sessionId: s1, prompt: [{ type: 'text', text: 'hello' }], } as any) - expect(mockSwitchSession).not.toHaveBeenCalled() + expect(mockSwitchSession).toHaveBeenCalledWith(s1, null) }) }) }) diff --git a/src/services/acp/agent.ts b/src/services/acp/agent.ts index 617879103..8868b7367 100644 --- a/src/services/acp/agent.ts +++ b/src/services/acp/agent.ts @@ -300,6 +300,10 @@ export class AcpAgent implements Agent { // After a previous interrupt(), the internal controller is stuck in // aborted state — without this, submitMessage() fails immediately. session.queryEngine.resetAbortController() + // Switch global session state so recordTranscript writes to the correct + // session file. Without this, multi-session scenarios (or creating a new + // session after another) write transcript data to the wrong file. + switchSession(params.sessionId as SessionId, getSessionProjectDir()) const sdkMessages = session.queryEngine.submitMessage(promptInput)