From f345cf441e474e1fecbef95fbff8c95351079721 Mon Sep 17 00:00:00 2001 From: Wooseong Kim Date: Mon, 20 Apr 2026 14:09:31 +0900 Subject: [PATCH] fix(proxy): ignore legacy singleton session file --- src/proxy/proxy-daemon-state.ts | 12 +++++-- tests/unit/proxy/proxy-daemon-state.test.ts | 37 +++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 tests/unit/proxy/proxy-daemon-state.test.ts diff --git a/src/proxy/proxy-daemon-state.ts b/src/proxy/proxy-daemon-state.ts index 98899e47..fd05c12c 100644 --- a/src/proxy/proxy-daemon-state.ts +++ b/src/proxy/proxy-daemon-state.ts @@ -108,10 +108,18 @@ export function listOpenAICompatProxyProfileNames(): string[] { const entries = fs.readdirSync(getOpenAICompatProxyDir(), { withFileTypes: true }); const profileKeys = new Set(); for (const entry of entries) { - if (!entry.isFile() || !entry.name.endsWith('.session.json')) { + if ( + !entry.isFile() || + entry.name === 'session.json' || + !entry.name.endsWith('.session.json') + ) { continue; } - profileKeys.add(entry.name.slice(0, -'.session.json'.length)); + const profileKey = entry.name.slice(0, -'.session.json'.length); + if (!profileKey) { + continue; + } + profileKeys.add(profileKey); } return [...profileKeys].map((profileKey) => decodeURIComponent(profileKey)); } catch { diff --git a/tests/unit/proxy/proxy-daemon-state.test.ts b/tests/unit/proxy/proxy-daemon-state.test.ts new file mode 100644 index 00000000..01f9d7c0 --- /dev/null +++ b/tests/unit/proxy/proxy-daemon-state.test.ts @@ -0,0 +1,37 @@ +import { afterEach, beforeEach, describe, expect, it } from 'bun:test'; +import * as fs from 'fs'; +import * as os from 'os'; +import * as path from 'path'; +import { + getLegacyOpenAICompatProxySessionPath, + getOpenAICompatProxySessionPath, +} from '../../../src/proxy/proxy-daemon-paths'; +import { listOpenAICompatProxyProfileNames } from '../../../src/proxy/proxy-daemon-state'; + +let originalCcsHome: string | undefined; +let tempDir: string; + +beforeEach(() => { + originalCcsHome = process.env.CCS_HOME; + tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ccs-proxy-state-')); + process.env.CCS_HOME = tempDir; +}); + +afterEach(() => { + if (originalCcsHome !== undefined) { + process.env.CCS_HOME = originalCcsHome; + } else { + delete process.env.CCS_HOME; + } + fs.rmSync(tempDir, { recursive: true, force: true }); +}); + +describe('listOpenAICompatProxyProfileNames', () => { + it('ignores the legacy singleton session file', () => { + fs.mkdirSync(path.dirname(getLegacyOpenAICompatProxySessionPath()), { recursive: true }); + fs.writeFileSync(getLegacyOpenAICompatProxySessionPath(), '{}\n', 'utf8'); + fs.writeFileSync(getOpenAICompatProxySessionPath('ccg'), '{}\n', 'utf8'); + + expect(listOpenAICompatProxyProfileNames()).toEqual(['ccg']); + }); +});