can1357/oh-my-pi · error
pr:// diff resolution failed: ${message}
Error message
pr:// diff resolution failed: ${message} What it means
Wrapper error thrown by PrProtocolHandler.resolve (packages/coding-agent/src/internal-urls/issue-pr-protocol.ts:583) around fetchAndRenderPrDiff for pr://.../diff URLs (full diff, per-file slice, or file listing). Any failure inside that helper — default-repo resolution, getOrFetchPrDiff, range errors, internal parser assertions — is re-thrown with the `pr:// diff resolution failed: ${message}` prefix, preserving the cause's message.
Source
Thrown at packages/coding-agent/src/internal-urls/issue-pr-protocol.ts:583
async resolve(url: InternalUrl, context?: ResolveContext): Promise<InternalResource> {
if (context?.signal?.aborted) {
throw new Error("aborted");
}
const parsed = parseUrl(url, "pr");
if (parsed.kind === "list") {
try {
return await fetchAndRenderList("pr", parsed, url, context);
} catch (err) {
const message = err instanceof Error ? err.message : String(err);
throw new Error(`pr:// listing failed: ${message}`);
}
}
if (parsed.kind === "pr-diff") {
try {
return await fetchAndRenderPrDiff(url, parsed, context);
} catch (err) {
const message = err instanceof Error ? err.message : String(err);
throw new Error(`pr:// diff resolution failed: ${message}`);
}
}
const cwd = resolveCwd(context);
let repo = parsed.repo;
if (!repo) {
try {
repo = await resolveDefaultRepoMemoized(cwd, context?.signal);
} catch (err) {
const message = err instanceof Error ? err.message : String(err);
throw new Error(
`pr://${parsed.number} could not resolve a default repo from the current session: ${message}\nUse pr://<owner>/<repo>/${parsed.number}.`,
);
}
}
try {
const lookup = await getOrFetchPr({
cwd,
repo,View on GitHub (pinned to 9690622007)
Solutions
- Read the inner message after `pr:// diff resolution failed: ` — out-of-range errors tell you the valid file count; use pr://owner/repo/<n>/diff to list indices.
- Verify the PR exists: `gh pr view <n> -R owner/repo`.
- Authenticate with `gh auth login` if the cause indicates auth/permission failure.
- Retry after backoff for transient network/rate-limit causes.
- Clear the cached diff for the PR if the payload appears stale or corrupt, then re-resolve.
Example fix
// before
const res = await prHandler.resolve(parse("pr://acme/widgets/12/diff/3"));
// after
try {
const res = await prHandler.resolve(parse("pr://acme/widgets/12/diff/3"));
} catch (err) {
const cause = String(err.message).replace("pr:// diff resolution failed: ", "");
if (/out of range/.test(cause)) {
const listing = await prHandler.resolve(parse("pr://acme/widgets/12/diff"));
} else throw err;
} Defensive patterns
Strategy: try-catch
Validate before calling
// Fetch the file listing first and bound your slice index:
const listing = await prHandler.resolve(parse(`pr://${repo}/${n}/diff`));
const m = listing.content.match(/\((\d+) files?\)/);
const count = Number(m?.[1] ?? 0);
if (!(i >= 1 && i <= count)) throw new RangeError(`diff/${i} out of range (1..${count})`); Type guard
function isPrDiffFailure(err: unknown): err is Error {
return err instanceof Error && err.message.startsWith("pr:// diff resolution failed: ");
} Try / catch
try {
return await prHandler.resolve(parse(`pr://${repo}/${n}/diff/${i}`), ctx);
} catch (err) {
if (err instanceof Error && err.message.startsWith("pr:// diff resolution failed: ")) {
if (/out of range/.test(err.message)) {
return await prHandler.resolve(parse(`pr://${repo}/${n}/diff`), ctx); // fall back to listing
}
throw err;
}
throw err;
} Prevention
- Resolve the diff listing first; only request slices within the reported count.
- Authenticate gh and confirm repo access before fetching diffs.
- Handle the nested out-of-range message explicitly — it embeds the valid file count.
- Retry transient network/rate-limit causes with backoff; clear corrupt cache entries.
When it happens
Trigger: Resolving pr://owner/repo/<n>/diff, /diff/all, or /diff/<i> when the PR diff cannot be fetched or rendered: PR number nonexistent, huge diff fetch failure, gh/network errors, index out of range (a nested out-of-range error), or a parser-bug assertion (error 1530).
Common situations: Wrong PR number; PR in a private repo without auth; offline; GitHub API failure; asking for diff/<i> with an i beyond the file count; corrupted or stale cached diff payload.
Related errors
- issue:// listing failed: ${message}
- issue:// resolution failed: ${message}
- pr:// listing failed: ${message}
- pr:// resolution failed: ${message}
- This share no longer exists (gist deleted?).
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/a162d3a8102916e5.
Report an issue: GitHub.