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

  1. Tap the file again — the tab often appears on the second attempt since the first open primed it.
  2. Reduce host load / close unused tabs to speed session tab creation.
  3. Switch to a direct (non-relay) connection to cut latency.
  4. 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

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


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