stablyai/orca · warning · RuntimeClientError

accessibility_error

accessibility_error

Error message

computer sidecar queue was invalidated; retry the computer-use request

What it means

ComputerSidecarProcess serializes calls through queueTail and snapshots queueGeneration when enqueueing. shutdown(), handleExit, handleError, and failActiveChild all bump queueGeneration. When a queued request wakes and its captured generation no longer matches, it throws 'accessibility_error' ('computer sidecar queue was invalidated; retry the computer-use request') instead of dispatching onto a dead/replaced child.

Source

Thrown at src/main/computer/sidecar-client.ts:132

    return null
  }
}

class ComputerSidecarProcess {
  private child: ChildProcess | null = null
  private childListenerCleanup: (() => void) | null = null
  private nextId = 1
  private pending = new Map<number, PendingRequest>()
  private queueTail: Promise<void> | null = null
  private queueGeneration = 0

  constructor(private readonly entryPath: string) {}

  call(method: ComputerSidecarMethod, params: unknown): Promise<unknown> {
    const generation = this.queueGeneration
    const run = () => {
      if (generation !== this.queueGeneration) {
        throw new RuntimeClientError(
          'accessibility_error',
          'computer sidecar queue was invalidated; retry the computer-use request'
        )
      }
      return this.send(method, params)
    }
    const result = this.queueTail ? this.queueTail.then(run, run) : run()
    const tail = result.then(
      () => undefined,
      () => undefined
    )
    this.queueTail = tail
    void tail.finally(() => {
      if (this.queueTail === tail) {
        this.queueTail = null
      }
    })
    return result

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Retry the computer-use request — the next ensureStarted forks a fresh child.
  2. Inspect the sidecar child's stderr/stdout for the crash root cause if retries keep failing.
  3. If the crash is reproducible for a specific action, validate params (e.g. pasteText) before enqueueing via the public callComputerSidecar* wrappers.
Defensive patterns

Strategy: retry

Type guard

import { RuntimeClientError } from './runtime-client-error'

function isSidecarQueueInvalidated(e: unknown): e is RuntimeClientError {
  return (
    e instanceof RuntimeClientError &&
    e.code === 'accessibility_error' &&
    /queue was invalidated/.test(e.message)
  )
}

Try / catch

try {
  await callComputerSidecarAction('click', params)
} catch (e) {
  if (isSidecarQueueInvalidated(e)) {
    // queue was bumped because the child died; retry — ensureStarted forks fresh
  } else throw e
}

Prevention

When it happens

Trigger: Sidecar IPC child died (exit/error) or was explicitly shut down while one or more computer-use calls were queued behind an in-flight request; the next caller catches this rather than a raw IPC error.

Common situations: The sidecar child crashed mid-action and N requests were queued; an idle-shutdown or test reset killed the child; OOM or a native crash inside the forked process between two queued sends.

Related errors


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