

























@@ -5,10 +5,11 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
55import type { SessionEntry } from "../../config/sessions.js";
66import type { OpenClawConfig } from "../../config/types.openclaw.js";
77import { FailoverError } from "../failover-error.js";
8-import type { EmbeddedPiRunResult } from "../pi-embedded.js";
8+import { runEmbeddedPiAgent, type EmbeddedPiRunResult } from "../pi-embedded.js";
99import { persistCliTurnTranscript, runAgentAttempt } from "./attempt-execution.js";
10101111const runCliAgentMock = vi.hoisted(() => vi.fn());
12+const runEmbeddedPiAgentMock = vi.hoisted(() => vi.fn());
1213const ORIGINAL_HOME = process.env.HOME;
13141415vi.mock("../cli-runner.js", () => ({
@@ -21,7 +22,7 @@ vi.mock("../model-selection.js", () => ({
2122}));
22232324vi.mock("../pi-embedded.js", () => ({
24-runEmbeddedPiAgent: vi.fn(),
25+runEmbeddedPiAgent: runEmbeddedPiAgentMock,
2526}));
26272728function makeCliResult(text: string): EmbeddedPiRunResult {
@@ -73,6 +74,7 @@ describe("CLI attempt execution", () => {
7374tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-cli-attempt-"));
7475storePath = path.join(tmpDir, "sessions.json");
7576runCliAgentMock.mockReset();
77+runEmbeddedPiAgentMock.mockReset();
7678});
77797880afterEach(async () => {
@@ -386,3 +388,102 @@ describe("CLI attempt execution", () => {
386388);
387389});
388390});
391+392+describe("embedded attempt harness pinning", () => {
393+let tmpDir: string;
394+395+beforeEach(async () => {
396+tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-embedded-attempt-"));
397+runEmbeddedPiAgentMock.mockReset();
398+});
399+400+afterEach(async () => {
401+await fs.rm(tmpDir, { recursive: true, force: true });
402+});
403+404+it("treats legacy sessions with history as PI-pinned", async () => {
405+const sessionEntry: SessionEntry = {
406+sessionId: "legacy-session",
407+updatedAt: Date.now(),
408+};
409+runEmbeddedPiAgentMock.mockResolvedValueOnce({
410+meta: { durationMs: 1 },
411+} satisfies EmbeddedPiRunResult);
412+413+await runAgentAttempt({
414+providerOverride: "openai",
415+modelOverride: "gpt-5.4",
416+cfg: {} as OpenClawConfig,
417+ sessionEntry,
418+sessionId: sessionEntry.sessionId,
419+sessionKey: "agent:main:main",
420+sessionAgentId: "main",
421+sessionFile: path.join(tmpDir, "session.jsonl"),
422+workspaceDir: tmpDir,
423+body: "continue",
424+isFallbackRetry: false,
425+resolvedThinkLevel: "medium",
426+timeoutMs: 1_000,
427+runId: "run-legacy-pi-pin",
428+opts: { senderIsOwner: false } as Parameters<typeof runAgentAttempt>[0]["opts"],
429+runContext: {} as Parameters<typeof runAgentAttempt>[0]["runContext"],
430+spawnedBy: undefined,
431+messageChannel: undefined,
432+skillsSnapshot: undefined,
433+resolvedVerboseLevel: undefined,
434+agentDir: tmpDir,
435+onAgentEvent: vi.fn(),
436+authProfileProvider: "openai",
437+sessionHasHistory: true,
438+});
439+440+expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
441+expect.objectContaining({
442+agentHarnessId: "pi",
443+}),
444+);
445+});
446+447+it("leaves a fresh unpinned session on config-selected harness resolution", async () => {
448+const sessionEntry: SessionEntry = {
449+sessionId: "fresh-session",
450+updatedAt: Date.now(),
451+};
452+runEmbeddedPiAgentMock.mockResolvedValueOnce({
453+meta: { durationMs: 1 },
454+} satisfies EmbeddedPiRunResult);
455+456+await runAgentAttempt({
457+providerOverride: "openai",
458+modelOverride: "gpt-5.4",
459+cfg: {} as OpenClawConfig,
460+ sessionEntry,
461+sessionId: sessionEntry.sessionId,
462+sessionKey: "agent:main:main",
463+sessionAgentId: "main",
464+sessionFile: path.join(tmpDir, "session.jsonl"),
465+workspaceDir: tmpDir,
466+body: "start",
467+isFallbackRetry: false,
468+resolvedThinkLevel: "medium",
469+timeoutMs: 1_000,
470+runId: "run-fresh-no-pin",
471+opts: { senderIsOwner: false } as Parameters<typeof runAgentAttempt>[0]["opts"],
472+runContext: {} as Parameters<typeof runAgentAttempt>[0]["runContext"],
473+spawnedBy: undefined,
474+messageChannel: undefined,
475+skillsSnapshot: undefined,
476+resolvedVerboseLevel: undefined,
477+agentDir: tmpDir,
478+onAgentEvent: vi.fn(),
479+authProfileProvider: "openai",
480+sessionHasHistory: false,
481+});
482+483+expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
484+expect.objectContaining({
485+agentHarnessId: undefined,
486+}),
487+);
488+});
489+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。