diff --git a/backend/internal/acp/manager/manager.go b/backend/internal/acp/manager/manager.go index b7e3d7e..1d76ec2 100644 --- a/backend/internal/acp/manager/manager.go +++ b/backend/internal/acp/manager/manager.go @@ -731,11 +731,15 @@ var uuidLikeRe = regexp.MustCompile(`[0-9a-f]{8,}`) // - omp(pi 系):`{"code":-32603,...,"details":"Unsupported ACP session: "}` // - reasonix 等:`session/: unknown session ` // - qoder 等:`{"code":-32603,...,"details":"Session not found: "}` +// - grok(x.ai):`{"code":-32602,...,"data":"unknown session id"}`(措辞里没有 +// session id 本身,无法满足下面的 id 共现条件,故在函数体内单独放行) // // 判定前置条件:错误文本必须同时含 "session" 与 session id(uuid / hex 前缀)。 // 已知 agent 的失效错误都带 id,要求 id 共现可排除无 id 的误伤文本,例如: // - "unsupported session config option: foo"(会话正常,参数问题) // - "write /workspace/session.json: no such file or directory"(文件路径) +// 唯一例外是 grok 的固定短语 "unknown session id":该短语本身已唯一指向 +// 「会话 id 未知」,不存在上述歧义,因此无需 id 共现。 // // 误判代价可控:至多触发一次 session/load(失败则重建)重试;对支持 load 的 // agent(如 omp 可从磁盘恢复)误判也只是多一次无害的 load + 重试。 @@ -746,6 +750,12 @@ func IsUnknownSessionErr(err error) bool { return false } msg := strings.ToLower(err.Error()) + // grok(x.ai):`{"code":-32602,"message":"Invalid params","data":"unknown session id"}`。 + // 该措辞不含 session id 本身,uuid 共现条件永远无法满足,故单独放行; + // 短语唯一指向「会话 id 未知」,不存在误伤(见下方前置条件说明)。 + if strings.Contains(msg, "unknown session id") { + return true + } if !strings.Contains(msg, "session") || !uuidLikeRe.MatchString(msg) { return false }