import { mkdir, rm, writeFile } from 'fs/promises'; import { join } from 'path'; import { beforeEach, describe, expect, it, vi } from 'vitest'; const { testHome, testUserData } = vi.hoisted(() => { const suffix = Math.random().toString(36).slice(2); return { testHome: `/tmp/clawx-token-usage-${suffix}`, testUserData: `/tmp/clawx-token-usage-user-data-${suffix}`, }; }); vi.mock('os', async () => { const actual = await vi.importActual('os'); const mocked = { ...actual, homedir: () => testHome, }; return { ...mocked, default: mocked, }; }); vi.mock('electron', () => ({ app: { isPackaged: false, getPath: () => testUserData, getVersion: () => '0.0.0-test', }, })); describe('token usage session scan', () => { beforeEach(async () => { vi.resetModules(); vi.restoreAllMocks(); await rm(testHome, { recursive: true, force: true }); await rm(testUserData, { recursive: true, force: true }); }); it('includes transcripts from agent directories that exist on disk but are not configured', async () => { const openclawDir = join(testHome, '.openclaw'); await mkdir(openclawDir, { recursive: true }); await writeFile(join(openclawDir, 'openclaw.json'), JSON.stringify({ agents: { list: [ { id: 'main', name: 'Main', default: true }, ], }, }, null, 2), 'utf8'); const diskOnlySessionsDir = join(openclawDir, 'agents', 'custom-custom25', 'sessions'); await mkdir(diskOnlySessionsDir, { recursive: true }); await writeFile( join(diskOnlySessionsDir, 'f8e66f77-0125-4e2f-b750-9c4de01e8f5a.jsonl'), [ JSON.stringify({ type: 'message', timestamp: '2026-03-12T12:19:00.000Z', message: { role: 'assistant', model: 'gpt-5.2-2025-12-11', provider: 'openai', usage: { input: 17649, output: 107, total: 17756, }, }, }), ].join('\n'), 'utf8', ); const { getRecentTokenUsageHistory } = await import('@electron/utils/token-usage'); const entries = await getRecentTokenUsageHistory(); expect(entries).toEqual( expect.arrayContaining([ expect.objectContaining({ agentId: 'custom-custom25', sessionId: 'f8e66f77-0125-4e2f-b750-9c4de01e8f5a', model: 'gpt-5.2-2025-12-11', totalTokens: 17756, }), ]), ); }); });