Merge pull request #2152 from glifocat/fix/opencode-process-group-and-timeout

fix(opencode): kill server process group + configurable IDLE_TIMEOUT_MS
This commit is contained in:
gavrielc
2026-05-01 18:40:39 +03:00
committed by GitHub
@@ -16,6 +16,19 @@ const SESSION_STATUS_RETRY_ERROR_AFTER = 3;
const STALE_SESSION_RE =
/no conversation found|ENOENT.*\.jsonl|session.*not found|NotFoundError|connection reset|ECONNRESET|404|event timeout/i;
function killProcessTree(proc: ChildProcess): void {
if (!proc.pid) return;
try {
process.kill(-proc.pid, 'SIGKILL');
} catch {
try {
proc.kill('SIGKILL');
} catch {
/* ignore */
}
}
}
function spawnOpencodeServer(config: Record<string, unknown>, timeoutMs = 10_000): Promise<{ url: string; proc: ChildProcess }> {
return new Promise((resolve, reject) => {
const hostname = '127.0.0.1';
@@ -25,10 +38,11 @@ function spawnOpencodeServer(config: Record<string, unknown>, timeoutMs = 10_000
...process.env,
OPENCODE_CONFIG_CONTENT: JSON.stringify(config),
},
detached: true,
});
const id = setTimeout(() => {
proc.kill('SIGKILL');
killProcessTree(proc);
reject(new Error(`Timeout waiting for OpenCode server to start after ${timeoutMs}ms`));
}, timeoutMs);
@@ -180,11 +194,7 @@ export function destroySharedRuntime(): void {
} catch {
/* ignore */
}
try {
sharedRuntime.proc.kill('SIGKILL');
} catch {
/* ignore */
}
killProcessTree(sharedRuntime.proc);
sharedRuntime = null;
sharedConfigKey = null;
}
@@ -234,7 +244,7 @@ export class OpenCodeProvider implements AgentProvider {
};
const self = this;
const IDLE_TIMEOUT_MS = 90_000;
const IDLE_TIMEOUT_MS = Number(process.env.OPENCODE_IDLE_TIMEOUT_MS) || 300_000;
async function* gen(): AsyncGenerator<ProviderEvent> {
let initYielded = false;