fix: ACP prompt 未切换全局 sessionId 导致 transcript 写入错误会话文件

prompt() 在调用 submitMessage 前没有 switchSession,recordTranscript
依赖全局 getSessionId() 确定写入路径,多会话场景下新会话内容会覆盖旧会话。
This commit is contained in:
claude-code-best
2026-06-05 10:49:37 +08:00
parent a077ec8d85
commit 7e3d825f0e
2 changed files with 8 additions and 3 deletions

View File

@@ -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)
})
})
})

View File

@@ -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)