diff --git a/packages/acp-core/protocol/ClaudeCliProtocol.js b/packages/acp-core/protocol/ClaudeCliProtocol.js index 4050653..165c807 100644 --- a/packages/acp-core/protocol/ClaudeCliProtocol.js +++ b/packages/acp-core/protocol/ClaudeCliProtocol.js @@ -298,6 +298,22 @@ class ClaudeCliProtocol extends EventEmitter { case 'result': this.sessionId = event.session_id || this.sessionId; + + // 【核心发现】Claude CLI 会在自己内部重试(长达3分钟),最后如果依然失败, + // 会输出 result 事件,但带有 "is_error": true,并且 result 字段放着错误信息。 + if (event.is_error) { + if (this._idleTimer) { clearTimeout(this._idleTimer); this._idleTimer = null; } + const err = new Error(`API 请求失败 (内部重试后放弃): ${event.result || 'Unknown HTTP/RateLimit Error'}`); + console.error(`[ClaudeCliProtocol] 收到错误 result:`, err.message); + if (this._promptReject) { + this._promptReject(err); + this._promptResolve = null; + this._promptReject = null; + } + // 不要再发送正常 result notification + break; + } + this.emit('acp_event', { type: 'notification', method: 'session/result',