fix delegate timeout (#284)

* pin all CLI installations to explicit versions and use pro models by default

- codex: pin @openai/codex to 0.101.0 (was "latest")
- opencode: pin opencode-ai to 1.1.56 (was "latest")
- gemini: pin gemini-cli to v0.28.2 via new tag param on installFromGithub
- cursor: pin to 2026.01.28-fd13201 via direct tarball download (replaces curl install script)
- add installFromDirectTarball to install.ts for versioned tarball URLs
- gemini auto effort now uses pro-preview instead of flash-preview
- test runner model overrides updated to use pro-preview consistently

Co-authored-by: Cursor <cursoragent@cursor.com>

* increase activity timeout

* fix delegation timeout

* fix delegate timeouts

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
David Blass
2026-02-12 23:46:28 +00:00
committed by pullfrog[bot]
parent ceadb3120a
commit a8dde34531
8 changed files with 121 additions and 27 deletions
+8
View File
@@ -1,6 +1,7 @@
import { type } from "arktype";
import { Effort } from "../external.ts";
import type { Mode } from "../modes.ts";
import { markActivity } from "../utils/activity.ts";
import { log } from "../utils/cli.ts";
import { resolveSubagentInstructions } from "../utils/instructions.ts";
import type { ToolContext } from "./server.ts";
@@ -71,6 +72,12 @@ export function DelegateTool(ctx: ToolContext) {
`» delegating to ${selectedMode.name} mode (effort=${effort})${params.instructions ? " with orchestrator instructions" : ""}`
);
// keep the process-level activity timeout alive while the subagent runs.
// agent CLIs can have long silent thinking phases (>60s) with no stdout,
// which would trigger the activity timeout. the overall run timeout (default 1h)
// is the real safety net for stalled agents.
const keepAliveInterval = setInterval(markActivity, 30_000);
try {
// build subagent payload with effort override
const subagentPayload = { ...ctx.payload, effort };
@@ -112,6 +119,7 @@ export function DelegateTool(ctx: ToolContext) {
error: errorMessage,
};
} finally {
clearInterval(keepAliveInterval);
// always release the lock so the orchestrator can delegate again
ctx.toolState.delegationActive = false;
}