






















@@ -86,6 +86,43 @@ describe("CLI attempt execution", () => {
8686await fs.rm(tmpDir, { recursive: true, force: true });
8787});
888889+async function runClaudeCliAttempt(params: {
90+sessionKey: string;
91+sessionEntry: SessionEntry;
92+sessionStore: Record<string, SessionEntry>;
93+body: string;
94+runId: string;
95+}) {
96+await runAgentAttempt({
97+providerOverride: "claude-cli",
98+modelOverride: "opus",
99+cfg: {} as OpenClawConfig,
100+sessionEntry: params.sessionEntry,
101+sessionId: params.sessionEntry.sessionId,
102+sessionKey: params.sessionKey,
103+sessionAgentId: "main",
104+sessionFile: path.join(tmpDir, "session.jsonl"),
105+workspaceDir: tmpDir,
106+body: params.body,
107+isFallbackRetry: false,
108+resolvedThinkLevel: "medium",
109+timeoutMs: 1_000,
110+runId: params.runId,
111+opts: { senderIsOwner: false } as Parameters<typeof runAgentAttempt>[0]["opts"],
112+runContext: {} as Parameters<typeof runAgentAttempt>[0]["runContext"],
113+spawnedBy: undefined,
114+messageChannel: undefined,
115+skillsSnapshot: undefined,
116+resolvedVerboseLevel: undefined,
117+agentDir: tmpDir,
118+onAgentEvent: vi.fn(),
119+authProfileProvider: "claude-cli",
120+sessionStore: params.sessionStore,
121+ storePath,
122+sessionHasHistory: false,
123+});
124+}
125+89126it("clears stale Claude CLI session IDs before retrying after session expiration", async () => {
90127const sessionKey = "agent:main:subagent:cli-expired";
91128const homeDir = path.join(tmpDir, "home");
@@ -183,33 +220,12 @@ describe("CLI attempt execution", () => {
183220await fs.writeFile(storePath, JSON.stringify(sessionStore, null, 2), "utf-8");
184221runCliAgentMock.mockResolvedValueOnce(makeCliResult("fresh cli response"));
185222186-await runAgentAttempt({
187-providerOverride: "claude-cli",
188-modelOverride: "opus",
189-cfg: {} as OpenClawConfig,
190- sessionEntry,
191-sessionId: sessionEntry.sessionId,
223+await runClaudeCliAttempt({
192224 sessionKey,
193-sessionAgentId: "main",
194-sessionFile: path.join(tmpDir, "session.jsonl"),
195-workspaceDir: tmpDir,
225+ sessionEntry,
226+ sessionStore,
196227body: "remember me",
197-isFallbackRetry: false,
198-resolvedThinkLevel: "medium",
199-timeoutMs: 1_000,
200228runId: "run-cli-missing-transcript",
201-opts: { senderIsOwner: false } as Parameters<typeof runAgentAttempt>[0]["opts"],
202-runContext: {} as Parameters<typeof runAgentAttempt>[0]["runContext"],
203-spawnedBy: undefined,
204-messageChannel: undefined,
205-skillsSnapshot: undefined,
206-resolvedVerboseLevel: undefined,
207-agentDir: tmpDir,
208-onAgentEvent: vi.fn(),
209-authProfileProvider: "claude-cli",
210- sessionStore,
211- storePath,
212-sessionHasHistory: false,
213229});
214230215231expect(runCliAgentMock).toHaveBeenCalledTimes(1);
@@ -262,33 +278,12 @@ describe("CLI attempt execution", () => {
262278await fs.writeFile(storePath, JSON.stringify(sessionStore, null, 2), "utf-8");
263279runCliAgentMock.mockResolvedValueOnce(makeCliResult("resumed cli response"));
264280265-await runAgentAttempt({
266-providerOverride: "claude-cli",
267-modelOverride: "opus",
268-cfg: {} as OpenClawConfig,
269- sessionEntry,
270-sessionId: sessionEntry.sessionId,
281+await runClaudeCliAttempt({
271282 sessionKey,
272-sessionAgentId: "main",
273-sessionFile: path.join(tmpDir, "session.jsonl"),
274-workspaceDir: tmpDir,
283+ sessionEntry,
284+ sessionStore,
275285body: "continue",
276-isFallbackRetry: false,
277-resolvedThinkLevel: "medium",
278-timeoutMs: 1_000,
279286runId: "run-cli-transcript-present",
280-opts: { senderIsOwner: false } as Parameters<typeof runAgentAttempt>[0]["opts"],
281-runContext: {} as Parameters<typeof runAgentAttempt>[0]["runContext"],
282-spawnedBy: undefined,
283-messageChannel: undefined,
284-skillsSnapshot: undefined,
285-resolvedVerboseLevel: undefined,
286-agentDir: tmpDir,
287-onAgentEvent: vi.fn(),
288-authProfileProvider: "claude-cli",
289- sessionStore,
290- storePath,
291-sessionHasHistory: false,
292287});
293288294289expect(runCliAgentMock).toHaveBeenCalledTimes(1);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。