jackwener/OpenCLI · error · AuthRequiredError

result.detail (auth required from Claude probe)

Error message

result.detail (auth required from Claude probe)

What it means

The sessionKey cookie exists, but the in-page probe of /api/organizations returned kind 'auth', meaning Claude's server rejected the request as unauthenticated. verifyClaudeIdentity() surfaces the probe's detail via AuthRequiredError — the cookie is present but stale/invalid.

Source

Thrown at clis/claude/auth.js:34

    try {
      const res = await fetch('/api/organizations', { credentials: 'include' });
      if (res.status === 401 || res.status === 403) {
        return { kind: 'auth', detail: 'Claude /api/organizations HTTP ' + res.status };
      }
      if (!res.ok) return { kind: 'http', httpStatus: res.status };
      const d = await res.json();
      if (!Array.isArray(d) || d.length === 0) {
        return { kind: 'auth', detail: 'Claude /api/organizations empty' };
      }
      const userIdCookie = (document.cookie.split('; ').find(c => c.startsWith('ajs_user_id=')) || '').split('=')[1] || '';
      const activeOrgCookie = (document.cookie.split('; ').find(c => c.startsWith('lastActiveOrg=')) || '').split('=')[1] || '';
      const activeOrg = d.find(o => o.uuid === activeOrgCookie) || d[0];
      return { ok: true, user_id: userIdCookie, org_name: activeOrg.name || '', org_uuid: activeOrg.uuid || '' };
    } catch (e) {
      return { kind: 'exception', detail: String(e && e.message || e) };
    }
  })()`);
  if (result?.kind === 'auth') throw new AuthRequiredError('claude.ai', result.detail);
  if (result?.kind === 'http') throw new CommandExecutionError(`HTTP ${result.httpStatus} from /api/organizations`);
  if (result?.kind === 'exception') throw new CommandExecutionError(`Claude whoami failed: ${result.detail}`);
  if (!result?.ok) throw new CommandExecutionError(`Unexpected Claude probe: ${JSON.stringify(result)}`);
  if (!result.user_id) throw new AuthRequiredError('claude.ai', 'Claude session incomplete — ajs_user_id cookie missing');
  return { user_id: String(result.user_id), org_name: String(result.org_name), org_uuid: String(result.org_uuid) };
}

registerSiteAuthCommands({
  site: 'claude',
  domain: 'claude.ai',
  loginUrl: 'https://claude.ai/login',
  columns: ['user_id', 'org_name', 'org_uuid'],
  quickCheck: hasClaudeSessionCookie,
  verify: verifyClaudeIdentity,
  poll: async (page) => {
    if (!await hasClaudeSessionCookie(page)) {
      throw new AuthRequiredError('claude.ai', 'Waiting for Claude sessionKey cookie');
    }

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Re-authenticate: log into claude.ai again in the automation profile, then retry.
  2. Clear claude.ai cookies for the profile and log in fresh.
  3. If it persists, verify the account wasn't logged out remotely (password change, other devices) and re-run the opencli auth flow.
Defensive patterns

Strategy: try-catch

Validate before calling

// Verify the full identity (not just the cookie) before heavy commands
try {
  await opencli.claude.whoami();
} catch {
  await opencli.claude.login();
  await opencli.claude.whoami();
}

Try / catch

try {
  return await opencli.claude.ask(prompt);
} catch (e) {
  if (e.name === 'AuthRequiredError' || /auth required from Claude probe/.test(e.message)) {
    await opencli.claude.login();
    return await opencli.claude.ask(prompt);
  }
  throw e;
}

Prevention

When it happens

Trigger: sessionKey cookie present but revoked/expired server-side; fetch('/api/organizations') responds 401/redirect-to-login inside the page context; account logged out elsewhere invalidating the session.

Common situations: Password change or forced logout invalidating cookies; Claude rotating session keys; clock/profile issues leaving half-valid cookie state (sessionKey without ajs_user_id).

Related errors


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/1ebdb97062fb5b66. Report an issue: GitHub.