jackwener/OpenCLI · error · EmptyResultError

No Claude conversation history was visible on /recents.

Error message

No Claude conversation history was visible on /recents.

What it means

This EmptyResultError is thrown by the `claude history` command when the /recents page loads and the user is logged in, but getConversationList extracts zero conversations. Since any active account has recent conversations, the library treats an empty list as a failure — most likely a scraping/DOM mismatch or a genuinely empty account.

Source

Thrown at clis/claude/history.js:29

    strategy: Strategy.COOKIE,
    browser: true,
    siteSession: 'persistent',
    navigateBefore: false,
    args: [
        { name: 'limit', type: 'int', default: 20, help: 'Max conversations to show' },
    ],
    columns: ['Index', 'Id', 'Title', 'Url'],

    func: async (page, kwargs) => {
        const limit = requirePositiveInt(
            Number(kwargs.limit ?? 20),
            'claude history --limit',
            'Example: opencli claude history --limit 20',
        );
        const conversations = await getConversationList(page);
        await ensureClaudeLogin(page, 'Claude history requires a logged-in Claude session.');
        if (conversations.length === 0) {
            throw new EmptyResultError('claude history', 'No Claude conversation history was visible on /recents.');
        }
        return conversations.slice(0, limit);
    },
});

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Open https://claude.ai/recents in the browser and confirm conversations actually appear there
  2. Re-run the command — lazy-loaded lists often appear a moment later; a retry after full page load usually succeeds
  3. Send at least one message on claude.ai so the account has conversation history, then retry
  4. Update the library if Claude changed its recents DOM — newer selectors may be required
  5. Re-run `opencli claude auth` to ensure you're in the intended account/workspace

Example fix

// before
// brand-new account, /recents empty -> EmptyResultError
// after
// send one chat on claude.ai, then:
opencli claude history --limit 20
Defensive patterns

Strategy: retry

Validate before calling

// confirm the account actually has conversations before scraping history
// open https://claude.ai/recents in the browser and check the sidebar is non-empty
const cookies = await page.getCookies({ url: 'https://claude.ai' });
if (!cookies.some(c => c.name === 'sessionKey' && c.value)) {
  throw new Error('Run `opencli claude auth` first');
}

Type guard

function hasConversations(list) {
  return Array.isArray(list) && list.length > 0;
}

Try / catch

try {
  const conversations = await opencli.claude.history({ limit: 20 });
} catch (e) {
  if (e.message.includes('No Claude conversation history was visible')) {
    await sleep(3000);                       // allow lazy-loaded list to paint
    return opencli.claude.history({ limit: 20 });
  }
  throw e;
}

Prevention

When it happens

Trigger: getConversationList(page) returns [] after ensureClaudeLogin on /recents — a brand-new account with no conversations, Claude's sidebar/recents DOM changed so selectors match nothing, or the list rendered slowly (lazy loading) and wasn't present when scraped.

Common situations: Newly created Claude account with no history; Claude frontend update renaming sidebar elements; slow network so conversation items load after extraction; account region/workspace view where recents are empty; ad-blocker/extension altering the page structure.

Related errors


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