can1357/oh-my-pi · error · Error
GitHub release asset ${binaryName} has an invalid size
Error message
GitHub release asset ${binaryName} has an invalid size What it means
The updater uses the asset's declared `size` for integrity checking of the downloaded binary. The size field must be a positive safe integer; anything else (missing, non-number, zero, negative, or exceeding Number.MAX_SAFE_INTEGER) means the metadata is unreliable and the download cannot be size-verified.
Source
Thrown at packages/coding-agent/src/cli/update-cli.ts:222
}
if (release.prerelease !== false && !options.allowPrerelease) {
throw new Error(`GitHub release ${expectedTag} is a prerelease; only canary updates install prerelease assets`);
}
if (!Array.isArray(release.assets)) {
throw new Error(`GitHub release ${expectedTag} has no asset list`);
}
const matches = release.assets.filter(asset => isRecord(asset) && asset.name === binaryName);
if (matches.length !== 1) {
throw new Error(`GitHub release ${expectedTag} has ${matches.length} assets named ${binaryName}`);
}
const asset = matches[0];
if (!isRecord(asset) || asset.state !== "uploaded") {
throw new Error(`GitHub release asset ${binaryName} is not fully uploaded`);
}
if (typeof asset.size !== "number" || !Number.isSafeInteger(asset.size) || asset.size <= 0) {
throw new Error(`GitHub release asset ${binaryName} has an invalid size`);
}
if (typeof asset.digest !== "string") {
throw new Error(`GitHub release asset ${binaryName} has no digest`);
}
const digest = /^sha256:([0-9a-f]{64})$/i.exec(asset.digest)?.[1];
if (!digest) {
throw new Error(`GitHub release asset ${binaryName} has an unsupported digest`);
}
const expectedUrl = `https://github.com/${REPO}/releases/download/${expectedTag}/${binaryName}`;
if (asset.browser_download_url !== expectedUrl) {
throw new Error(`GitHub release asset ${binaryName} has an unexpected download URL`);
}
return {
url: expectedUrl,
size: asset.size,
digest: `sha256:${digest.toLowerCase()}`,View on GitHub (pinned to 9690622007)
Solutions
- Refetch release metadata and retry; if it persists, inspect the raw API response for the asset's size field.
- Check whether a proxy/mirror is mangling the JSON response.
- Fix test stubs to include a realistic numeric size.
- If GitHub changed the field name or type, update resolveReleaseBinaryAsset.
Example fix
// before (stub asset without size)
{ name: "omp-linux-x64", state: "uploaded", digest: "sha256:...", browser_download_url: "..." }
// after
{ name: "omp-linux-x64", state: "uploaded", size: 52428800, digest: "sha256:...", browser_download_url: "..." } Defensive patterns
Strategy: type-guard
Validate before calling
const asset = release.assets?.find(a => a?.name === binaryName);
if (typeof asset?.size !== "number" || !Number.isSafeInteger(asset.size) || asset.size <= 0) {
throw new Error("Asset metadata missing valid size; refusing to download");
} Type guard
function hasValidSize(asset: unknown): asset is { size: number } {
const size = (asset as { size?: unknown })?.size;
return typeof size === "number" && Number.isSafeInteger(size) && size > 0;
} Try / catch
try {
await update();
} catch (err) {
if (err instanceof Error && err.message.includes("has an invalid size")) {
console.error("Release asset metadata is corrupt; refetch and retry.");
} else throw err;
} Prevention
- Validate every field of release metadata you consume — never trust the shape blindly.
- Keep API-version headers pinned so schema drift is detected deliberately.
- In test stubs, always include realistic size values.
When it happens
Trigger: resolveReleaseBinaryAsset throws when the matched asset fails `typeof asset.size !== "number" || !Number.isSafeInteger(asset.size) || asset.size <= 0`.
Common situations: A mocked release payload in tests missing the size field, a proxy rewriting the JSON, an API schema change, or (theoretically) an asset larger than Number.MAX_SAFE_INTEGER which cannot occur in practice.
Related errors
- GitHub release ${expectedTag} has ${matches.length} assets n
- GitHub release asset ${binaryName} is not fully uploaded
- GitHub release asset ${binaryName} has no digest
- GitHub release asset ${binaryName} has an unsupported digest
- GitHub release ${expectedTag} has no asset list
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/bbdee1ca62357a0f.
Report an issue: GitHub.