stablyai/orca · error · Error

Unable to reach host

Error message

Unable to reach host

What it means

Capability-gating error in the mobile agent-history hook: it calls `status.get` first to (a) confirm the host is reachable and (b) read capabilities before attempting the AI-vault-specific RPC. If status.get returns ok=false and the host supplied no message, this generic 'Unable to reach host' is thrown and surfaces as an error screen state.

Source

Thrown at mobile/src/agent-history/use-mobile-agent-history-state.ts:96

          // (connState flips re-run the load effect) instead of tearing it
          // down to a full-screen error, matching the host list screen.
          setScreenState((prev) =>
            prev.kind === 'ready' ? prev : { kind: 'error', message: 'Waiting for host…' }
          )
        }
        return
      }

      setScreenState((prev) => (prev.kind === 'ready' ? prev : { kind: 'loading' }))
      try {
        // Gate on the capability so older hosts lacking the method are detected
        // and we never call a missing RPC.
        const statusResponse = await client.sendRequest('status.get')
        if (!isCurrent()) {
          return
        }
        if (!statusResponse.ok) {
          throw new Error(statusResponse.error?.message || 'Unable to reach host')
        }
        const status = (statusResponse as RpcSuccess).result as StatusWithCapabilities
        setHostStatusResult(status)
        if (!status.capabilities?.includes(MOBILE_AI_VAULT_CAPABILITY)) {
          setScreenState({ kind: 'unsupported' })
          return
        }

        // Why: a scoped tab needs the active worktree's path to narrow. Until the
        // worktree list has loaded, hold loading rather than firing an unscoped
        // fetch that would briefly show unrelated host history. Once loaded we
        // proceed even if the worktree isn't found, to avoid a stuck spinner.
        if (options.scope !== 'all' && !activeWorktree && !worktreesLoaded) {
          if (isCurrent()) {
            setScreenState((prev) => (prev.kind === 'ready' ? prev : { kind: 'loading' }))
          }
          return
        }

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Verify the Orca host is running and reachable (check the connection/relay).
  2. Retry — the hook sets an error screen state and the user can pull to refresh.
  3. Upgrade an old host that lacks status.get.
  4. Inspect the host logs for the underlying status.get failure reason.

Example fix

// before
if (!statusResponse.ok) {
  throw new Error(statusResponse.error?.message || 'Unable to reach host')
}

// after — distinguish transport failure from explicit host error
if (!statusResponse.ok) {
  const detail = statusResponse.error?.message
  throw new Error(detail ? `Host unreachable: ${detail}` : 'Unable to reach host')
}
Defensive patterns

Strategy: try-catch

Validate before calling

// Cheap liveness probe before status.get
// (the hook already does status.get; just ensure the client is connected)
if (!client?.connected) { setScreenState({ kind: 'error', message: 'Not connected' }); return }

Type guard

function isStatusSuccess(r: RpcSuccess | RpcFailure): r is RpcSuccess & { result: StatusWithCapabilities } {
  return r.ok
}

Try / catch

try {
  const statusResponse = await client.sendRequest('status.get')
  if (!isCurrent()) return
  if (!statusResponse.ok) throw new Error(statusResponse.error?.message || 'Unable to reach host')
} catch (err) {
  if (!isCurrent()) return
  setScreenState({ kind: 'error', message: (err as Error).message })
}

Prevention

When it happens

Trigger: status.get RPC fails (transport down, host process crashed, version too old to implement status.get), or returns ok=false with an empty error.message. An isCurrent() guard short-circuits if the request became stale.

Common situations: Host went offline between screen mount and the status probe, an SSH relay disconnect, an older host that predates status.get, or a firewall/network issue blocking the RPC channel.

Related errors


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