Yeachan-Heo/oh-my-codex · error · Error

[native-assets] failed to fetch native release manifest (${r

Error message

[native-assets] failed to fetch native release manifest (${response.status} ${response.statusText}) from ${url}

What it means

Fetching the native release manifest (a JSON asset descriptor published with a GitHub release) returned a non-2xx status. The manifest URL is built from the resolved repository base plus the package version, so failures usually mean the release tag or manifest asset doesn't exist at that version, or the network/proxy rejected the request.

Source

Thrown at src/cli/native-assets.ts:243

    const rightRank = rightLibc ? (preferenceIndex.get(rightLibc) ?? preference.length + 1) : preference.length;
    if (leftRank !== rightRank) return leftRank - rightRank;
    return left.archive.localeCompare(right.archive);
  });
}

export function isRepositoryCheckout(packageRoot = getPackageRoot()): boolean {
  return existsSync(join(packageRoot, '.git'));
}

export async function loadNativeReleaseManifest(
  packageRoot = getPackageRoot(),
  version?: string,
  env: NodeJS.ProcessEnv = process.env,
): Promise<NativeReleaseManifest> {
  const url = await resolveNativeManifestUrl(packageRoot, version, env);
  const response = await fetch(url);
  if (!response.ok) {
    throw new Error(`[native-assets] failed to fetch native release manifest (${response.status} ${response.statusText}) from ${url}`);
  }
  const manifest = await response.json() as NativeReleaseManifest;
  validateNativeReleaseManifest(manifest as never);
  if (version && manifest.version !== version) throw new Error(`[native-assets] manifest version mismatch: expected ${version}, received ${manifest.version}`);
  return manifest;
}

function isUnavailableManifestError(error: unknown): boolean {
  if (!(error instanceof Error)) return false;
  return /\[native-assets\] failed to fetch native release manifest/i.test(error.message)
    || /fetch failed/i.test(error.message);
}

function isUnavailableArchiveError(error: unknown): boolean {
  if (!(error instanceof Error)) return false;
  return /\[native-assets\] failed to download /i.test(error.message)
    || /fetch failed/i.test(error.message);
}

View on GitHub (pinned to 3ad79a8a6f)

Solutions

  1. Verify the GitHub release 'v<packageVersion>' exists and includes the manifest asset.
  2. Check NATIVE_RELEASE_BASE_URL correctness and network/proxy reachability of the URL printed in the message.
  3. Pre-hydrate the native cache or vendor the binary via NATIVE_RELEASE_BASE_URL on an internal mirror.
  4. If rate-limited, wait/retry or authenticate the release host.
Defensive patterns

Strategy: retry

Validate before calling

async function manifestReachable(baseUrl: string, version: string): Promise<boolean> {
  const res = await fetch(`${baseUrl}/manifest.json`); // adjust asset name to your layout
  return res.ok;
}

Try / catch

try { await loadNativeReleaseManifest(root, version); } catch (e) { if (\[native-assets\] failed to fetch native release manifest/i.test(String(e))) { /* check release exists / proxy / rate limit */ } throw e; }

Prevention

When it happens

Trigger: loadNativeReleaseManifest / hydrateNativeBinary when the GitHub release for the pinned package version is not published yet, the manifest asset was renamed, a proxy returns 403/407, GitHub rate-limits (403/429), or a typo'd NATIVE_RELEASE_BASE_URL yields 404.

Common situations: Installing a version published to npm before the GitHub release assets finished uploading; air-gapped environments; corporate proxies; GitHub API rate limits in CI; NATIVE_RELEASE_BASE_URL pointing at a repo without the expected manifest.json asset.

Related errors


AI-assisted analysis of Yeachan-Heo/oh-my-codex@3ad79a8a6f (2026-08-27). Data as JSON: /api/errors/8e90564d84f4019d. Report an issue: GitHub.