can1357/oh-my-pi · error · Error
Timed out downloading release binary after 15 minutes
Error message
Timed out downloading release binary after 15 minutes
What it means
Thrown by downloadVerifiedBinary when the fetch of the release binary is aborted by BINARY_DOWNLOAD_TIMEOUT_MS (15 minutes) before the response headers arrive. The abort is detected via isTimeoutError and rethrown with a human-readable message while preserving the original AbortError as `cause`. This prevents the updater from hanging indefinitely on a stalled connection.
Source
Thrown at packages/coding-agent/src/cli/update-cli.ts:306
fetchImpl?: Fetch;
}
/**
* Download a binary and verify its GitHub-reported size and SHA-256 digest.
*/
export async function downloadVerifiedBinary(options: VerifiedBinaryDownloadOptions): Promise<void> {
const fetchImpl = options.fetchImpl ?? fetch;
await unlinkIfExists(options.targetPath);
let response: Response;
try {
response = await fetchImpl(options.url, {
redirect: "follow",
signal: withTimeoutSignal(BINARY_DOWNLOAD_TIMEOUT_MS),
});
} catch (err) {
if (isTimeoutError(err)) {
throw new Error("Timed out downloading release binary after 15 minutes", { cause: err });
}
if (isUnsupportedProxyError(err)) throw new Error(unsupportedProxyMessage(), { cause: err });
throw err;
}
if (!response.ok || !response.body) {
throw new Error(`Download failed: ${response.statusText}`);
}
const hash = createHash("sha256");
let size = 0;
const verifier = new Transform({
transform(chunk, _encoding, callback) {
size += chunk.byteLength;
if (size > options.expectedSize) {
callback(
new Error(
`Downloaded binary size mismatch: expected ${options.expectedSize} bytes, received at least ${size}`,
),View on GitHub (pinned to 9690622007)
Solutions
- Re-run the update on a stable connection — the timeout is per-attempt, so a simple retry often succeeds.
- Check proxy/VPN interference: temporarily disable the VPN or try without HTTP(S)_PROXY set.
- Download the release asset manually from the GitHub releases page and install it by hand if the network to the CDN is persistently slow.
Example fix
// before: flaky network causes timeout $ omp update // after: pre-download asset manually, or retry on stable network $ omp update --force
Defensive patterns
Strategy: retry
Validate before calling
const proxy = process.env.HTTPS_PROXY ?? process.env.HTTP_PROXY;
if (proxy && proxy.startsWith("socks")) throw new Error("Unsupported SOCKS proxy would stall download"); Type guard
function isDownloadTimeout(err: unknown): boolean {
return err instanceof Error && err.message.includes("Timed out downloading release binary");
} Try / catch
try {
await runUpdate();
} catch (err) {
if (isDownloadTimeout(err)) {
await Bun.sleep(5000);
return runUpdate(); // fresh 15-minute budget per attempt
}
throw err;
} Prevention
- Run updates on wired/stable connections
- Avoid VPNs or throttling proxies for large binary downloads
- Prefer `omp update --check` first to gauge connectivity before committing to the download
When it happens
Trigger: fetchImpl(options.url) rejects with a timeout AbortError because the CDN/object-storage endpoint did not deliver response headers within 15 minutes — very slow or stalled network, a hanging proxy, or a black-holing connection to the release download host.
Common situations: Downloading on a constrained uplink (e.g. corporate VPN throttling GitHub's CDN); a misconfigured middlebox that accepts the TCP connection but never responds; laptop sleeping mid-download.
Understand the failure class
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- Download failed: ${response.statusText}
- Downloaded binary size mismatch: expected ${options.expected
- Download timed out: ${url}
- timed out: {command}
- AnthropicConnectionTimeoutError
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/b7dc35e39c0ef84a.
Report an issue: GitHub.