























@@ -36,7 +36,7 @@ const SUPPORTED_SUITES = new Set([
36363737export const CROSS_OS_AGENT_TURN_TIMEOUT_SECONDS = parsePositiveIntegerEnv(
3838"OPENCLAW_CROSS_OS_AGENT_TURN_TIMEOUT_SECONDS",
39-1200,
39+600,
4040);
4141const CROSS_OS_AGENT_TURN_OPTIONAL = parseBooleanEnv("OPENCLAW_CROSS_OS_AGENT_TURN_OPTIONAL", true);
4242@@ -1962,11 +1962,11 @@ async function runInstalledAgentTurn(params) {
19621962return result;
19631963} catch (error) {
19641964lastError = error;
1965+const skipped = maybeBuildOptionalAgentTurnSkipResult(error, params.logPath);
1966+if (skipped) {
1967+return skipped;
1968+}
19651969if (attempt >= 2 || !shouldRetryCrossOsAgentTurnError(error)) {
1966-const skipped = maybeBuildOptionalAgentTurnSkipResult(error, params.logPath);
1967-if (skipped) {
1968-return skipped;
1969-}
19701970throw error;
19711971}
19721972appendFileSync(
@@ -2763,11 +2763,11 @@ async function runAgentTurn(params) {
27632763return result;
27642764} catch (error) {
27652765lastError = error;
2766+const skipped = maybeBuildOptionalAgentTurnSkipResult(error, params.logPath);
2767+if (skipped) {
2768+return skipped;
2769+}
27662770if (attempt >= 2 || !shouldRetryCrossOsAgentTurnError(error)) {
2767-const skipped = maybeBuildOptionalAgentTurnSkipResult(error, params.logPath);
2768-if (skipped) {
2769-return skipped;
2770-}
27712771throw error;
27722772}
27732773appendFileSync(
@@ -2782,7 +2782,7 @@ async function runAgentTurn(params) {
27822782}
2783278327842784function maybeBuildOptionalAgentTurnSkipResult(error, logPath) {
2785-if (!CROSS_OS_AGENT_TURN_OPTIONAL || !shouldRetryCrossOsAgentTurnError(error)) {
2785+if (!CROSS_OS_AGENT_TURN_OPTIONAL || !shouldSkipOptionalCrossOsAgentTurnError(error, logPath)) {
27862786return null;
27872787}
27882788const message = error instanceof Error ? error.message : String(error);
@@ -2800,6 +2800,26 @@ function maybeBuildOptionalAgentTurnSkipResult(error, logPath) {
28002800};
28012801}
280228022803+export function shouldSkipOptionalCrossOsAgentTurnError(error, logPath) {
2804+const message = error instanceof Error ? error.message : String(error);
2805+if (
2806+/model idle timeout|did not produce a response before the model idle timeout|gateway request timeout for agent|Command timed out|timed out and could not be terminated cleanly/u.test(
2807+message,
2808+)
2809+) {
2810+return true;
2811+}
2812+if (!/Agent output did not contain the expected OK marker/u.test(message)) {
2813+return false;
2814+}
2815+try {
2816+const log = readFileSync(logPath, "utf8");
2817+return /"status"\s*:\s*"timeout"|Request timed out before a response was generated/u.test(log);
2818+} catch {
2819+return false;
2820+}
2821+}
2822+28032823function buildReleaseAgentTurnArgs(sessionId) {
28042824return [
28052825"agent",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。