diff --git a/src/server/__tests__/conversation-service.test.ts b/src/server/__tests__/conversation-service.test.ts index 265c125f3..919ca1bee 100644 --- a/src/server/__tests__/conversation-service.test.ts +++ b/src/server/__tests__/conversation-service.test.ts @@ -290,6 +290,14 @@ describe('ConversationService', () => { ) expect(env.CC_HAHA_DESKTOP_SERVER_URL).toBe('http://127.0.0.1:3456') expect(env.CLAUDE_CODE_ENABLE_SDK_FILE_CHECKPOINTING).toBe('1') + expect(env.CLAUDE_CODE_RESUME_INTERRUPTED_TURN).toBe('1') + }) + + test('buildChildEnv does not force interrupted-turn resume for non-SDK sessions', async () => { + const service = new ConversationService() as any + const env = (await service.buildChildEnv('/tmp')) as Record + + expect(env.CLAUDE_CODE_RESUME_INTERRUPTED_TURN).toBeUndefined() }) test('uses bun entrypoint fallback on Windows dev mode', () => { diff --git a/src/server/services/conversationService.ts b/src/server/services/conversationService.ts index 70389b5e7..9af3d1bea 100644 --- a/src/server/services/conversationService.ts +++ b/src/server/services/conversationService.ts @@ -900,6 +900,16 @@ export class ConversationService { CLAUDE_CODE_ENABLE_TASKS: '1', CLAUDE_CODE_ENABLE_SDK_FILE_CHECKPOINTING: '1', CLAUDE_CODE_DIAGNOSTICS_FILE: cliDiagnosticsPath, + // Desktop frequently restarts the SDK CLI in-place (stop generation, + // runtime/model switch, reconnect). When the previous turn was + // interrupted, print.ts only re-enqueues that interrupted user prompt if + // this env flag is enabled. Without it, the resumed transcript keeps the + // synthetic "[Request interrupted by user]" / "No response requested." + // pair, but the interrupted prompt is not actively resumed on restart, + // which can make follow-up turns appear to "forget" earlier user input. + ...(sdkUrl + ? { CLAUDE_CODE_RESUME_INTERRUPTED_TURN: '1' } + : {}), CALLER_DIR: workDir, PWD: workDir, ...(sdkUrl