stablyai/orca · error · Error

ETIMEDOUT

ETIMEDOUT

Error message

security timed out after ${KEYCHAIN_COMMAND_TIMEOUT_MS}ms

What it means

Rejected by execSecurityCommand() when the macOS `security` child process does not settle within KEYCHAIN_COMMAND_TIMEOUT_MS (3000 ms). The timer kills the child and rejects with code 'ETIMEDOUT'. It guards against a stuck `security` binary (e.g. waiting on a Keychain unlock prompt) that would otherwise leave auth/keychain operations hanging indefinitely.

Source

Thrown at src/main/claude-accounts/keychain.ts:192

          (error as { message?: unknown }).message ?? ''
        )}`.toLowerCase()
      : String(error).toLowerCase()
  return code === 44 || message.includes('could not be found') || message.includes('not be found')
}

function execSecurityCommand(args: string[]): Promise<SecurityCommandResult> {
  return new Promise((resolve, reject) => {
    let settled = false
    let child: ReturnType<typeof execFile> | undefined
    const timer = setTimeout(() => {
      if (settled) {
        return
      }
      settled = true
      child?.kill()
      reject(
        Object.assign(new Error(`security timed out after ${KEYCHAIN_COMMAND_TIMEOUT_MS}ms`), {
          code: 'ETIMEDOUT',
          stderr: ''
        })
      )
    }, KEYCHAIN_COMMAND_TIMEOUT_MS)

    const settle = (callback: () => void): void => {
      if (settled) {
        return
      }
      settled = true
      clearTimeout(timer)
      callback()
    }

    // Why: Node's execFile timeout only signals the `security` process; a
    // stuck callback would otherwise leave auth/keychain operations pending.
    try {
      child = execFile(

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Unlock the login Keychain first (Keychain Access, or `security unlock-keychain`) and retry.
  2. Repair the Keychain with Keychain First Aid / Keychain Access > Keychain Repair.
  3. Increase KEYCHAIN_COMMAND_TIMEOUT_MS only if the environment legitimately needs longer (rare).
  4. Ensure no GUI dialog is pending approval for Orca/security to access the item.
Defensive patterns

Strategy: retry

Type guard

function isKeychainTimeout(error: unknown): boolean {
  return (
    error instanceof Error &&
    (error as NodeJS.ErrnoException).code === 'ETIMEDOUT' &&
    error.message.includes('security timed out')
  )
}

Try / catch

try {
  return await execSecurityCommand(args)
} catch (error) {
  if (isKeychainTimeout(error)) {
    // Likely locked Keychain — surface a user action, then retry once
    throw new Error('Keychain appears locked. Unlock the login Keychain and retry.')
  }
  throw error
}

Prevention

When it happens

Trigger: The Keychain is locked and macOS shows a GUI unlock dialog that `security` (non-interactive) waits on. A system prompt for permission is blocking the process. The security binary is hung due to a corrupted Keychain. Slow/inaccessible iCloud Keychain sync.

Common situations: Fresh login after restart where the login Keychain is still locked. MDM policies that require approval for security CLI access. Corrupted login.keychain-db. iCloud Keychain desync causing long stalls.

Understand the failure class

Related errors


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