Agents: wire command poll backoff into process poll
This commit is contained in:
committed by
Peter Steinberger
parent
054745a7e0
commit
23f5cc80a4
@@ -7,9 +7,11 @@ import {
|
||||
resetProcessRegistryForTests,
|
||||
} from "./bash-process-registry.js";
|
||||
import { createProcessTool } from "./bash-tools.process.js";
|
||||
import { resetDiagnosticSessionStateForTest } from "../logging/diagnostic-session-state.js";
|
||||
|
||||
afterEach(() => {
|
||||
resetProcessRegistryForTests();
|
||||
resetDiagnosticSessionStateForTest();
|
||||
});
|
||||
|
||||
function createBackgroundSession(id: string): ProcessSession {
|
||||
@@ -98,3 +100,79 @@ test("process poll accepts string timeout values", async () => {
|
||||
vi.useRealTimers();
|
||||
}
|
||||
});
|
||||
|
||||
test("process poll exposes adaptive retryInMs for repeated no-output polls", async () => {
|
||||
const processTool = createProcessTool();
|
||||
const sessionId = "sess-retry";
|
||||
const session = createBackgroundSession(sessionId);
|
||||
addSession(session);
|
||||
|
||||
const poll1 = await processTool.execute("toolcall-1", {
|
||||
action: "poll",
|
||||
sessionId,
|
||||
});
|
||||
const poll2 = await processTool.execute("toolcall-2", {
|
||||
action: "poll",
|
||||
sessionId,
|
||||
});
|
||||
const poll3 = await processTool.execute("toolcall-3", {
|
||||
action: "poll",
|
||||
sessionId,
|
||||
});
|
||||
const poll4 = await processTool.execute("toolcall-4", {
|
||||
action: "poll",
|
||||
sessionId,
|
||||
});
|
||||
const poll5 = await processTool.execute("toolcall-5", {
|
||||
action: "poll",
|
||||
sessionId,
|
||||
});
|
||||
|
||||
expect((poll1.details as { retryInMs?: number }).retryInMs).toBe(5000);
|
||||
expect((poll2.details as { retryInMs?: number }).retryInMs).toBe(10000);
|
||||
expect((poll3.details as { retryInMs?: number }).retryInMs).toBe(30000);
|
||||
expect((poll4.details as { retryInMs?: number }).retryInMs).toBe(60000);
|
||||
expect((poll5.details as { retryInMs?: number }).retryInMs).toBe(60000);
|
||||
});
|
||||
|
||||
test("process poll resets retryInMs when output appears and clears on completion", async () => {
|
||||
const processTool = createProcessTool();
|
||||
const sessionId = "sess-reset";
|
||||
const session = createBackgroundSession(sessionId);
|
||||
addSession(session);
|
||||
|
||||
const poll1 = await processTool.execute("toolcall-1", {
|
||||
action: "poll",
|
||||
sessionId,
|
||||
});
|
||||
const poll2 = await processTool.execute("toolcall-2", {
|
||||
action: "poll",
|
||||
sessionId,
|
||||
});
|
||||
expect((poll1.details as { retryInMs?: number }).retryInMs).toBe(5000);
|
||||
expect((poll2.details as { retryInMs?: number }).retryInMs).toBe(10000);
|
||||
|
||||
appendOutput(session, "stdout", "step complete\n");
|
||||
const pollWithOutput = await processTool.execute("toolcall-output", {
|
||||
action: "poll",
|
||||
sessionId,
|
||||
});
|
||||
expect((pollWithOutput.details as { retryInMs?: number }).retryInMs).toBe(5000);
|
||||
|
||||
markExited(session, 0, null, "completed");
|
||||
const pollCompleted = await processTool.execute("toolcall-completed", {
|
||||
action: "poll",
|
||||
sessionId,
|
||||
});
|
||||
const completedDetails = pollCompleted.details as { status?: string; retryInMs?: number };
|
||||
expect(completedDetails.status).toBe("completed");
|
||||
expect(completedDetails.retryInMs).toBeUndefined();
|
||||
|
||||
const pollFinished = await processTool.execute("toolcall-finished", {
|
||||
action: "poll",
|
||||
sessionId,
|
||||
});
|
||||
const finishedDetails = pollFinished.details as { status?: string; retryInMs?: number };
|
||||
expect(finishedDetails.status).toBe("completed");
|
||||
expect(finishedDetails.retryInMs).toBeUndefined();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user