stablyai/orca · error · Error

Update the paired desktop Orca app to use mobile voice setti

Error message

Update the paired desktop Orca app to use mobile voice settings.

What it means

Mapped error from fetchDictationSetup when the paired desktop runtime is too old to know about the mobile speech API. isLegacyDesktopSpeechSetupError fires when the error message references speech.models.list AND the code is method_not_found (or the message says 'not available to mobile clients'). Rather than leak the raw denial, the client surfaces an upgrade instruction.

Source

Thrown at mobile/src/dictation/mobile-dictation-setup.ts:38

): boolean {
  const message = error?.message ?? ''
  return (
    message.includes('speech.models.list') &&
    (error?.code === 'method_not_found' || message.includes('not available to mobile clients'))
  )
}

export function isDictationSetupRequiredError(message: string): boolean {
  return SETUP_REQUIRED_CODES.has(message) || message.startsWith('voice_model_not_ready:')
}

export async function fetchDictationSetup(
  client: Pick<RpcClient, 'sendRequest'>
): Promise<MobileSpeechSetup> {
  const response = await fetchDictationSetupResponse(client)
  if (!response.ok) {
    if (isLegacyDesktopSpeechSetupError(response.error)) {
      throw new Error(LEGACY_DESKTOP_SPEECH_SETUP_MESSAGE)
    }
    throw new Error(response.error?.message || 'Failed to load dictation models')
  }
  return (response as RpcSuccess).result as MobileSpeechSetup
}

async function fetchDictationSetupResponse(client: Pick<RpcClient, 'sendRequest'>) {
  try {
    return await client.sendRequest('speech.models.list', null)
  } catch (error) {
    if (!(error instanceof LogicalClientCutoverError)) {
      throw error
    }
    // Why: this read can safely repeat on the authenticated replacement; mutation
    // RPCs must still surface cutover so callers never replay unknown commits.
    return client.sendRequest('speech.models.list', null)
  }
}

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Prompt the user to update the paired Orca desktop to a build that implements speech.models.list / speech.models.download / speech.models.delete / speech.dictation.setup.
  2. After the desktop updates, re-pair or reconnect the host so the capability negotiation re-runs, then call fetchDictationSetup again.
  3. If updating is not possible, disable the dictation entry point on that host via isLegacyDesktopSpeechSetupError so users do not hit a dead-end toast.

Example fix

// before — caller shows raw error
try { await fetchDictationSetup(client) } catch (e) { showError(e.message) }

// after — caller maps the legacy message to upgrade UX
try {
  await fetchDictationSetup(client)
} catch (e) {
  if (e.message === LEGACY_DESKTOP_SPEECH_SETUP_MESSAGE) {
    openDesktopUpgradeSheet()
  } else {
    showError(e.message)
  }
}
Defensive patterns

Strategy: validation

Validate before calling

// Probe capability before calling fetchDictationSetup
const status = await client.sendRequest('status.get', undefined)
if (!status.ok || !(status as any).result?.capabilities?.speech) {
  showDesktopUpgradePrompt()
  return
}

Type guard

function isLegacyDesktopSpeechError(err: unknown): boolean {
  return err instanceof Error && err.message === 'Update the paired desktop Orca app to use mobile voice settings.'
}

Try / catch

try {
  await fetchDictationSetup(client)
} catch (err) {
  if (isLegacyDesktopSpeechError(err)) {
    openDesktopUpgradeSheet()
    return
  }
  throw err
}

Prevention

When it happens

Trigger: client.sendRequest('speech.models.list', null) fails because the desktop host returns method_not_found for speech.models.list (the method predates the desktop build), or returns a message containing 'not available to mobile clients'. The mobile app is paired against an older Orca desktop that does not implement the speech.models.* allowlist.

Common situations: User upgraded the mobile app but not the desktop app; user paired against a desktop running a pre-speech-runtime build; the desktop's speech capability flag is off but the build is new enough to deny explicitly.

Related errors


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