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
- Verify the Orca host is running and reachable (check the connection/relay).
- Retry — the hook sets an error screen state and the user can pull to refresh.
- Upgrade an old host that lacks status.get.
- 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
- Use the isCurrent() stale-guard on every async checkpoint.
- Retry on transient transport errors via a pull-to-refresh.
- Detect METHOD_NOT_FOUND to show 'unsupported' rather than 'error'.
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
- Unable to create untitled markdown note
- Unable to load workspace metadata.
- Unable to load agent sessions
- ${response.error.message}
- ${response.error.message}
AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12).
Data as JSON: /api/errors/5303f115a39003f0.
Report an issue: GitHub.