import { afterEach, describe, expect, it, vi } from 'vitest' import { mkdtemp, mkdir, rm, writeFile } from 'fs/promises' import { tmpdir } from 'os' import { join } from 'path' import { performance } from 'perf_hooks' vi.mock('../../packages/server/src/services/hermes/hermes-process', () => ({ execHermesWithBin: vi.fn(() => { throw new Error('Inventory must not invoke CLI') }), spawnHermesWithBin: vi.fn(), })) import { listProfilesSnapshot } from '../../packages/server/src/services/hermes/hermes-cli' import { execHermesWithBin } from '../../packages/server/src/services/hermes/hermes-process' const originalHome = process.env.HERMES_HOME let home: string | undefined afterEach(async () => { if (originalHome === undefined) delete process.env.HERMES_HOME else process.env.HERMES_HOME = originalHome if (home) await rm(home, { recursive: true, force: true }) }) describe('disk profile inventory', () => { it('reads models and active selection for 20 profiles without scanning histories or skills', async () => { home = await mkdtemp(join(tmpdir(), 'hermes-profile-snapshot-')) process.env.HERMES_HOME = home await writeFile(join(home, 'config.yaml'), 'model: default-model\n') await writeFile(join(home, 'active_profile'), 'perf-19\n') for (let index = 0; index < 20; index++) { const dir = join(home, 'profiles', `perf-${index}`) await mkdir(dir, { recursive: true }) await writeFile(join(dir, 'config.yaml'), `model:\n default: model-${index}\n`) // These are deliberately invalid; inventory must not parse session history. await writeFile(join(dir, 'state.db'), 'not a database') } const started = performance.now() const profiles = listProfilesSnapshot() console.info(`Disk inventory for 21 profiles: ${(performance.now() - started).toFixed(2)} ms`) expect(profiles).toHaveLength(21) expect(profiles.find(profile => profile.name === 'perf-19')).toMatchObject({ model: 'model-19', active: true }) expect(profiles[0]).toMatchObject({ name: 'default', model: 'default-model', active: false }) expect(execHermesWithBin).not.toHaveBeenCalled() }) })