stablyai/orca · warning · Error

${response.error.message}

Error message

${response.error.message}

What it means

Inside the NewWorktreeModal, a useEffect fires `ssh.getState` for the selected repo connection to read the current SSH connection state when the modal becomes visible. If the RPC returns ok=false, it throws the host's error.message; the chained .catch() maps that into an sshState with status 'error' and the thrown message as the error field.

Solutions

  1. Verify the SSH target still exists on the host (re-open repo settings).
  2. Upgrade the host to support ssh.getState.
  3. Let the modal's error state guide the user; the catch already sets status 'error'.
  4. Retry by closing/reopening the modal (the effect re-fires on visible toggle).

Example fix

// before
if (!response.ok) {
  throw new Error(response.error.message)
}

// after — treat missing-method as disconnected rather than error
if (!response.ok) {
  if ((response as RpcFailure).error.code === 'METHOD_NOT_FOUND') {
    setSshState({ targetId: selectedRepoConnectionId, status: 'disconnected', error: null, reconnectAttempt: 0 })
    return
  }
  throw new Error((response as RpcFailure).error.message)
}
Defensive patterns

Strategy: try-catch

Validate before calling

// Skip the probe if the host likely lacks ssh.* methods
const caps = await client.sendRequest('status.get').catch(() => null)
const supportsSsh = (caps as any)?.result?.capabilities?.includes('ssh')
if (!supportsSsh) { setSshState({ targetId: selectedRepoConnectionId, status: 'disconnected', error: null, reconnectAttempt: 0 }); return }

Type guard

function isSshStateSuccess(r: RpcSuccess | RpcFailure): r is RpcSuccess & { result: { state?: SshConnectionState | null } } {
  return r.ok
}

Try / catch

.then((response) => {
  if (stale) return
  if (!response.ok) throw new Error((response as RpcFailure).error.message)
  // ...
}).catch((err) => {
  if (!stale) setSshState({ targetId: selectedRepoConnectionId, status: 'error', error: err instanceof Error ? err.message : 'Failed to read SSH connection state.', reconnectAttempt: 0 })
})

Prevention

When it happens

Trigger: ssh.getState fails — the SSH target was deleted, the host's SSH subsystem errored, the connection id is unknown to the host, or the host predates the ssh.getState method.

Common situations: Selecting an SSH-backed repo whose target was removed server-side, a host restart that lost SSH state, an older host without ssh.* methods, or a transient relay error.

Related errors


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

Appendix: source

Thrown at mobile/src/components/NewWorktreeModal.tsx:413

    })()
    return () => {
      stale = true
    }
  }, [visible, client, hostId])

  useEffect(() => {
    if (!visible || !client || !selectedRepoConnectionId) {
      return
    }
    let stale = false
    void client
      .sendRequest('ssh.getState', { targetId: selectedRepoConnectionId })
      .then((response) => {
        if (stale) {
          return
        }
        if (!response.ok) {
          throw new Error(response.error.message)
        }
        const state = (response as RpcSuccess).result as { state?: SshConnectionState | null }
        setSshState(
          state.state ?? {
            targetId: selectedRepoConnectionId,
            status: 'disconnected',
            error: null,
            reconnectAttempt: 0
          }
        )
      })
      .catch((err) => {
        if (!stale) {
          setSshState({
            targetId: selectedRepoConnectionId,
            status: 'error',
            error: err instanceof Error ? err.message : 'Failed to read SSH connection state.',
            reconnectAttempt: 0

View on GitHub (pinned to 1136503c6a)