stablyai/orca · warning · Error
The file opened, but its tab isn't ready yet. Try again.
Error message
The file opened, but its tab isn't ready yet. Try again.
What it means
Thrown by `openFile` when `revealMobileSourceControlSessionDiff` returns `'timeout'`. That helper polls `session.tabs.list` at 0/300/600/900ms looking for a newly created file tab matching the path and mode; if no matching tab appears (or it appears but cannot be activated) across all four attempts, it returns timeout. The message is user-actionable — the file did open, just the session tab wasn't ready in time.
Source
Thrown at mobile/src/source-control/use-mobile-source-control-openers.ts:146
throw new Error(response.error?.message || 'Unable to open diff')
}
if (!mountedRef.current) {
return
}
const revealResult = await revealMobileSourceControlSessionDiff({
client,
worktreeId,
relativePath: entry.path,
tabMode: openedTabMode,
staged: entry.area === 'staged',
onOpenedFileDiff,
isCurrent: () => mountedRef.current && openingPathRef.current === entry.path
})
if (revealResult === 'cancelled') {
return
}
if (revealResult === 'timeout') {
throw new Error("The file opened, but its tab isn't ready yet. Try again.")
}
triggerSelection()
// Why: when launched from the session screen, opening a file dismisses
// this surface back to the session. In embedded mode there is nothing
// to pop (the panel docks beside the terminal), so close the dock
// instead of calling router.back() — falling back to router.back() when
// no close handler is wired, mirroring MobileSourceControlPanel, so the
// panel never sits on top of the activated diff tab.
if (embedded) {
;(onRequestClose ?? (() => router.back()))()
} else {
router.back()
}
} catch (err) {
if (!mountedRef.current) {
return
}
triggerError()View on GitHub (pinned to 1136503c6a)
Solutions
- Tap the file again — the tab often appears on the second attempt since the first open primed it.
- Reduce host load / close unused tabs to speed session tab creation.
- Switch to a direct (non-relay) connection to cut latency.
- If it persists, check that the desktop tab mode matches 'diff'/'edit' the mobile filter expects.
Defensive patterns
Strategy: retry
Try / catch
// The timeout is recoverable — the file tab usually lands on a second tap.
try {
await openFile(entry)
} catch (err) {
if (err instanceof Error && err.message.includes("isn't ready yet")) {
await openFile(entry) // retry once; first open primed the tab
} else throw err
} Prevention
- Retry once on timeout — the tab was created, just not yet visible.
- Reduce host load / open-tab latency to stay within the ~1.8s poll budget.
- Switch to direct connection to cut relay round-trips on each poll.
When it happens
Trigger: Tapping a file to open a diff where `files.openDiff`/`files.open` succeeded but the resulting session tab never became visible within ~1.8s — slow host, tab creation delayed, the tab list RPC kept failing, or the tab was created with a mode/path that didn't match the filter.
Common situations: Host under load (tab creation slow); relay latency inflating each poll round; the desktop opened the tab in a different mode than expected so the matcher skipped it; the user navigated away (cancelled) but timing landed as timeout.
Related errors
- Unable to open diff
- Unable to load committed diff
- Binary branch diff preview unavailable on mobile
- Timed out while selecting the IBus Hangul engine
- Timed out waiting for ${description}
AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12).
Data as JSON: /api/errors/71dce83fd21a0d52.
Report an issue: GitHub.