stablyai/orca · error · Error

GitHub request failed ${res.status} ${res.statusText}: ${bod

Error message

GitHub request failed ${res.status} ${res.statusText}: ${body.slice(0, 300)}

What it means

githubJson performs an authenticated GitHub API request (Bearer token, X-GitHub-Api-Version 2022-11-28) and throws when the response is not ok (non-2xx). The message includes status, statusText, and the first 300 chars of the body so the caller can see the GitHub error message without logging the full payload.

Source

Thrown at config/scripts/latest-stable-release.mjs:42

    .filter((release) => release?.draft !== true)
    .map((release) => parseDesktopStableTag(release?.tag_name ?? release?.tagName ?? ''))
    .filter(Boolean)
    .sort((a, b) => a.major - b.major || a.minor - b.minor || a.patch - b.patch)

  return stableTags.at(-1)?.tag ?? ''
}

async function githubJson(fetchImpl, url, token) {
  const res = await fetchImpl(url, {
    headers: {
      Accept: 'application/vnd.github+json',
      Authorization: `Bearer ${token}`,
      'X-GitHub-Api-Version': API_VERSION
    }
  })
  if (!res.ok) {
    const body = await res.text().catch(() => '')
    throw new Error(`GitHub request failed ${res.status} ${res.statusText}: ${body.slice(0, 300)}`)
  }
  return res.json()
}

export async function fetchReleases(repo, token, fetchImpl = fetch) {
  if (!repo) {
    throw new Error('repo is required')
  }
  if (!token) {
    throw new Error('token is required')
  }

  const releases = []
  for (let page = 1; ; page += 1) {
    const pageReleases = await githubJson(
      fetchImpl,
      `https://api.github.com/repos/${repo}/releases?per_page=100&page=${page}`,
      token

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Verify the token is set, valid, and has the needed scopes (repo / public_repo).
  2. Check the rate limit with 'gh api rate_limit' and back off if near the ceiling.
  3. Confirm the repo slug is correct and accessible to the token.
  4. Retry on 5xx with exponential backoff.

Example fix

// before
const releases = await fetchReleases(repo, token)

// after
if (!token) throw new Error('GH_TOKEN required')
let releases
try {
  releases = await fetchReleases(repo, token)
} catch (err) {
  throw new Error(`Could not fetch releases for ${repo}: ${err.message}`)
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (!token) throw new Error('GitHub token is required')
if (!repo || !/^[^/\s]+\/[^/\s]+$/.test(repo)) throw new Error(`Invalid repo slug: ${repo}`)

Try / catch

try {
  releases = await fetchReleases(repo, token)
} catch (err) {
  if (/401|403/.test(err.message)) throw new Error(`Auth failed for ${repo}; check token scopes`)
  if (/429|rate limit/i.test(err.message)) throw new Error(`Rate limited; back off and retry`)
  throw err
}

Prevention

When it happens

Trigger: Missing/invalid/expired token (401/403); rate or secondary rate limit (403/429); repo not found or no access (404); GitHub server error (5xx); wrong API version header.

Common situations: GH_TOKEN/GITHUB_TOKEN not injected in CI or expired; token lacking repo read scope; rate limit exhausted by other jobs; GITHUB_REPOSITORY pointing at a private fork the token can't read.

Related errors


AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12). Data as JSON: /api/errors/eb54f0f7859cfcba. Report an issue: GitHub.