mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-15 12:55:51 +00:00
fix: ACP prompt 未切换全局 sessionId 导致 transcript 写入错误会话文件
prompt() 在调用 submitMessage 前没有 switchSession,recordTranscript 依赖全局 getSessionId() 确定写入路径,多会话场景下新会话内容会覆盖旧会话。
This commit is contained in:
@@ -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())
|
const agent = new AcpAgent(makeConn())
|
||||||
await agent.newSession({ cwd: '/tmp' } as any)
|
await agent.newSession({ cwd: '/tmp' } as any)
|
||||||
await agent.newSession({ cwd: '/tmp' } as any)
|
await agent.newSession({ cwd: '/tmp' } as any)
|
||||||
mockSwitchSession.mockClear()
|
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
|
const s1 = agent.sessions.keys().next().value
|
||||||
await agent.prompt({
|
await agent.prompt({
|
||||||
sessionId: s1,
|
sessionId: s1,
|
||||||
prompt: [{ type: 'text', text: 'hello' }],
|
prompt: [{ type: 'text', text: 'hello' }],
|
||||||
} as any)
|
} as any)
|
||||||
expect(mockSwitchSession).not.toHaveBeenCalled()
|
expect(mockSwitchSession).toHaveBeenCalledWith(s1, null)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -300,6 +300,10 @@ export class AcpAgent implements Agent {
|
|||||||
// After a previous interrupt(), the internal controller is stuck in
|
// After a previous interrupt(), the internal controller is stuck in
|
||||||
// aborted state — without this, submitMessage() fails immediately.
|
// aborted state — without this, submitMessage() fails immediately.
|
||||||
session.queryEngine.resetAbortController()
|
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)
|
const sdkMessages = session.queryEngine.submitMessage(promptInput)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user