stablyai/orca · error

${RPC error message}

Error message

${RPC error message}

What it means

Re-thrown host error when the paired desktop returns an RPC failure (ok:false) for `settings.get`, the first leg of the mobile new-tab agent loader. The loader fans out `settings.get` and an agent-detection request concurrently via Promise.all and propagates the host's `error.message` verbatim so the new-tab screen can surface it. It is a passthrough of a host-side or transport failure, not a client bug.

Source

Thrown at mobile/src/session/mobile-new-tab-agent-loader.ts:30

  id: string
  connectionId?: string | null
}

export async function loadMobileNewTabAgentOptions(args: {
  client: RpcClient
  worktreeId: string
}): Promise<MobileNewTabAgentOption[]> {
  const { client, worktreeId } = args
  // Why: the floating workspace runs on the paired host, so it has no repo connection to resolve.
  const detectedAgentsRequest = isFloatingWorkspaceWorktreeId(worktreeId)
    ? client.sendRequest('preflight.detectAgents')
    : loadWorkspaceDetectedAgents(client, worktreeId)
  const [settingsResponse, detectedResponse] = await Promise.all([
    client.sendRequest('settings.get'),
    detectedAgentsRequest
  ])
  if (!settingsResponse.ok) {
    throw new Error((settingsResponse as RpcFailure).error.message)
  }
  if (!detectedResponse.ok) {
    throw new Error((detectedResponse as RpcFailure).error.message)
  }
  const settings = (
    (settingsResponse as RpcSuccess).result as {
      settings?: MobileNewTabAgentSettings
    }
  ).settings
  return buildMobileNewTabAgentOptions(
    settings,
    (detectedResponse as RpcSuccess).result as unknown[]
  )
}

async function loadWorkspaceDetectedAgents(client: RpcClient, worktreeId: string) {
  const repoResponse = await client.sendRequest('repo.list')
  if (!repoResponse.ok) {

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Reconnect to the host (usually transient).
  2. Check desktop host logs for the settings.get error code/message.
  3. Verify client/host version compatibility (remote wire compat).
  4. Inspect the host settings store if persistent.

Example fix

// before
const [settingsResponse, detectedResponse] = await Promise.all([...])
if (!settingsResponse.ok) {
  throw new Error((settingsResponse as RpcFailure).error.message)
}
// after - preserve the host error code so the screen can branch
if (!settingsResponse.ok) {
  const f = settingsResponse as RpcFailure
  throw new MobileRpcError('settings.get', f.error.code, f.error.message)
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (connState !== 'connected' || !client) return // defer until connected

Type guard

function isRpcFailure(r: RpcResponse): r is RpcFailure {
  return r.ok === false
}

Try / catch

try {
  const options = await loadMobileNewTabAgentOptions({ client, worktreeId })
} catch (err) {
  setNewTabError(err instanceof Error ? err.message : 'Could not load agents')
}

Prevention

When it happens

Trigger: Opening the mobile new-tab sheet while the host rejects `settings.get` (settings store read error, permission failure, host shutting down); or the relay/direct socket drops mid-Promise.all and the host returns an error envelope.

Common situations: Host just restarted or is mid-shutdown when the user taps new tab; relay->direct cutover rejects the in-flight one-shot; host settings file corrupt/unreadable; mixed client/host versions where the desktop does not yet implement `settings.get`.

Related errors


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