


















@@ -28,6 +28,7 @@ import {
2828createUserTurnTranscriptRecorder,
2929type UserTurnTranscriptRecorder,
3030} from "../sessions/user-turn-transcript.js";
31+import { runSkillResearchAutoCapture } from "../skills/research/autocapture.js";
3132import { captureEnv, setTestEnvValue } from "../test-utils/env.js";
3233import { runPreparedCliAgent } from "./cli-runner.js";
3334import {
@@ -50,11 +51,16 @@ vi.mock("../plugins/hook-runner-global.js", () => ({
5051getGlobalHookRunner: vi.fn(() => null),
5152}));
525354+vi.mock("../skills/research/autocapture.js", () => ({
55+runSkillResearchAutoCapture: vi.fn(async () => undefined),
56+}));
57+5358vi.mock("../tts/tts.js", () => ({
5459buildTtsSystemPromptHint: vi.fn(() => undefined),
5560}));
56615762const mockGetGlobalHookRunner = vi.mocked(getGlobalHookRunner);
63+const mockAutoCapture = vi.mocked(runSkillResearchAutoCapture);
5864const hookRunnerGlobalStateKey = Symbol.for("openclaw.plugins.hook-runner-global-state");
5965let sessionFileEnvSnapshot: ReturnType<typeof captureEnv> | undefined;
6066@@ -292,6 +298,8 @@ describe("runCliAgent reliability", () => {
292298afterEach(() => {
293299replyRunTesting.resetReplyRunRegistry();
294300mockGetGlobalHookRunner.mockReset();
301+mockAutoCapture.mockReset();
302+mockAutoCapture.mockResolvedValue(undefined);
295303setHookRunnerForTest(null);
296304vi.unstubAllEnvs();
297305sessionFileEnvSnapshot?.restore();
@@ -2019,6 +2027,71 @@ describe("runCliAgent reliability", () => {
20192027expect(resolved).toBe(true);
20202028});
202120292030+it("waits for eligible Skill Research auto-capture before resolving direct CLI runs", async () => {
2031+let releaseAutoCapture: () => void = () => undefined;
2032+const autoCaptureSettled = new Promise<void>((resolve) => {
2033+releaseAutoCapture = resolve;
2034+});
2035+mockAutoCapture.mockReturnValueOnce(autoCaptureSettled);
2036+2037+supervisorSpawnMock.mockResolvedValueOnce(
2038+createManagedRun({
2039+reason: "exit",
2040+exitCode: 0,
2041+exitSignal: null,
2042+durationMs: 50,
2043+stdout: "hello from cli",
2044+stderr: "",
2045+timedOut: false,
2046+noOutputTimedOut: false,
2047+}),
2048+);
2049+2050+const context = buildPreparedContext({ sessionKey: "agent:main:main" });
2051+let resolved = false;
2052+const run = runPreparedCliAgent({
2053+ ...context,
2054+params: {
2055+ ...context.params,
2056+agentId: "main",
2057+trigger: "user",
2058+config: {
2059+skills: {
2060+workshop: {
2061+autonomous: {
2062+enabled: true,
2063+},
2064+},
2065+},
2066+},
2067+},
2068+}).then((result) => {
2069+resolved = true;
2070+return result;
2071+});
2072+2073+await vi.waitFor(() => {
2074+expect(mockAutoCapture).toHaveBeenCalledTimes(1);
2075+});
2076+await Promise.resolve();
2077+expect(resolved).toBe(false);
2078+expect(mockAutoCapture).toHaveBeenCalledWith(
2079+expect.objectContaining({
2080+ctx: expect.objectContaining({
2081+agentId: "main",
2082+sessionKey: "agent:main:main",
2083+trigger: "user",
2084+}),
2085+}),
2086+);
2087+2088+releaseAutoCapture();
2089+await expect(run).resolves.toMatchObject({
2090+payloads: [{ text: "hello from cli" }],
2091+});
2092+expect(resolved).toBe(true);
2093+});
2094+20222095it("does not wait for agent_end hooks before resolving channel-backed CLI runs", async () => {
20232096let releaseAgentEnd: () => void = () => undefined;
20242097const agentEndSettled = new Promise<void>((resolve) => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。