From 2be05a55cfc5235aed340a9cac36c2fca9eab925 Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Sat, 6 Jun 2026 15:23:08 +0800 Subject: [PATCH] case-run: honor async timeout options --- tools/hwlab-cli/caserun.test.ts | 12 +++++++++++- tools/src/hwlab-caserun-lib.ts | 5 +++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/tools/hwlab-cli/caserun.test.ts b/tools/hwlab-cli/caserun.test.ts index 3293acd4..5bda7644 100644 --- a/tools/hwlab-cli/caserun.test.ts +++ b/tools/hwlab-cli/caserun.test.ts @@ -121,6 +121,7 @@ test("case run start returns immediately and status/result/logs are short pollin try { await createCaseRepo(caseRepo, caseId); await mkdir(cwd, { recursive: true }); + let workerArgs: string[] = []; const started = await runHwlabCli([ "case", "run", @@ -129,11 +130,16 @@ test("case run start returns immediately and status/result/logs are short pollin "--case-repo", caseRepo, "--run-id", - "run-async" + "run-async", + "--agent-timeout-ms", + "180000", + "--job-timeout-ms", + "70000" ], { cwd, now: () => "2026-06-05T00:00:00.000Z", startProcess: async (input) => { + workerArgs = input.args; await writeFile(input.stdoutPath, "worker accepted\n", "utf8"); await writeFile(input.stderrPath, "", "utf8"); return { pid: 4242 }; @@ -148,6 +154,10 @@ test("case run start returns immediately and status/result/logs are short pollin assert.match(started.payload.statusCommand, /case run status run-async/u); assert.match(started.payload.resultCommand, /case run result run-async/u); assert.match(started.payload.logsCommand, /case run logs run-async/u); + assert.equal(workerArgs.includes("--agent-timeout-ms"), true); + assert.equal(workerArgs[workerArgs.indexOf("--agent-timeout-ms") + 1], "180000"); + assert.equal(workerArgs.includes("--job-timeout-ms"), true); + assert.equal(workerArgs[workerArgs.indexOf("--job-timeout-ms") + 1], "70000"); const status = await runHwlabCli(["case", "run", "status", "run-async"], { cwd, now: () => "2026-06-05T00:00:01.000Z" }); assert.equal(status.exitCode, 0); diff --git a/tools/src/hwlab-caserun-lib.ts b/tools/src/hwlab-caserun-lib.ts index b65cfa84..c0c16779 100644 --- a/tools/src/hwlab-caserun-lib.ts +++ b/tools/src/hwlab-caserun-lib.ts @@ -10,8 +10,9 @@ const DEFAULT_API_URL = "http://74.48.78.17:19667"; const DEFAULT_WEB_URL = "http://74.48.78.17:19666"; const DEFAULT_POLL_INTERVAL_MS = 1000; const DEFAULT_JOB_TIMEOUT_MS = 50000; -const MAX_JOB_TIMEOUT_MS = 50000; +const MAX_JOB_TIMEOUT_MS = 300000; const DEFAULT_AGENT_TIMEOUT_MS = 120000; +const MAX_AGENT_TIMEOUT_MS = 600000; const MAX_AGENT_TRACE_COMMANDS = 30; const HWLAB_API_KEY_PREFIX = "hwl_live_"; const STANDARD_CASE_REPO_PATH = "/root/hwlab-case-registry"; @@ -748,7 +749,7 @@ async function submitAgentTask(context: CaseContext, input: { baseUrl: string; p async function pollAgentResult(context: CaseContext, input: { baseUrl: string; traceId: string; acceptedBody: any; resultUrl?: string; run?: PreparedCaseRun; agent?: AgentRunStage }) { const requestedTimeoutMs = numberOption(context.parsed.agentTimeoutMs ?? context.parsed.timeoutMs) ?? DEFAULT_AGENT_TIMEOUT_MS; - const timeoutMs = Math.max(Math.min(requestedTimeoutMs, DEFAULT_AGENT_TIMEOUT_MS), 1000); + const timeoutMs = Math.max(Math.min(requestedTimeoutMs, MAX_AGENT_TIMEOUT_MS), 1000); const pollIntervalMs = Math.max(numberOption(context.parsed.agentPollIntervalMs ?? context.parsed.pollIntervalMs) ?? DEFAULT_POLL_INTERVAL_MS, 250); const startedAt = Date.now(); const resultPath = text(input.acceptedBody?.resultUrl) || `/v1/agent/chat/result/${encodeURIComponent(input.traceId)}`;