stablyai/orca · warning · Error

Waiting for desktop...

Error message

Waiting for desktop...

What it means

Guard thrown by `persistMetadata` (saves diff comments + review state via `worktree.set`) when the mobile client has no live RPC client or is not `connected`. It blocks the optimistic write so the host is not called with a dead transport.

Source

Thrown at mobile/src/session/use-mobile-diff-review-comment-actions.ts:67

    currentItem,
    queue,
    filteredQueue,
    filter,
    currentIndex,
    composer,
    composerBody,
    setScreenState,
    setCurrentIndex,
    setComposer,
    setComposerBody,
    setActionError,
    setShowCompletion
  } = input

  const persistMetadata = useCallback(
    async (comments: readonly DiffComment[], reviewState: MobileDiffReviewState) => {
      if (!client || connState !== 'connected') {
        throw new Error('Waiting for desktop...')
      }
      const response = await client.sendRequest('worktree.set', {
        worktree: `id:${worktreeId}`,
        diffComments: comments,
        mobileDiffReview: reviewState
      })
      if (!response.ok) {
        throw new Error(response.error?.message || 'Failed to save review state')
      }
    },
    [client, connState, worktreeId]
  )

  const updateReadyState = useCallback(
    (updater: (state: Extract<ReviewScreenState, { kind: 'ready' }>) => ReviewScreenState) => {
      setScreenState((prev) => (prev.kind === 'ready' ? updater(prev) : prev))
    },
    [setScreenState]

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Wait for the connection to return to 'connected'.
  2. The optimistic UI change will have been rolled back - re-apply after reconnect.
  3. Re-pair if auth-failed.
  4. Check network/relay reachability.

Example fix

// before
if (!client || connState !== 'connected') {
  throw new Error('Waiting for desktop...')
}
// after - queue the write and replay once connected
if (!client || connState !== 'connected') {
  enqueuePendingMetadata(comments, reviewState)
  throw new Error('Waiting for desktop...')
}
Defensive patterns

Strategy: validation

Validate before calling

if (!client || connState !== 'connected') {
  setActionError('Waiting for desktop...')
  return
}

Try / catch

try {
  await saveCommentsAndReviewState(comments, reviewState)
} catch (err) {
  if ((err as Error).message === 'Waiting for desktop...') {
    // keep local optimistic change; UI already shows waiting
  } else throw err
}

Prevention

When it happens

Trigger: client is null (never paired / disconnected) or connState is anything other than 'connected' (connecting, handshaking, reconnecting, auth-failed, disconnected). Any comment add/edit/delete or mark-reviewed that triggers persistence while in those states.

Common situations: User edits a comment during a brief reconnect window; relay dropped and connState is reconnecting; first-paint before the transport finished handshaking; auth-failed after token expiry.

Related errors


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