hotfix: preserve plus fallback state and guard variant updates

This commit is contained in:
Tam Nhu Tran committed 2026-04-22 08:45:05 -04:00
1 parent 7b1a7f3a09
commit 5b5f4a5ef5
11 files changed
+177 -90

No files matched your search

@@ -73,6 +73,32 @@ describe('installCliproxyVersion', () => {
expect(writes.join('')).toContain('backend: original');
});
it('reuses plus binary and pin state when local runtime falls back to original', async () => {
const { createEmptyUnifiedConfig } = await import('../../../src/config/unified-config-types');
const { saveUnifiedConfig } = await import('../../../src/config/unified-config-loader');
const { savePinnedVersion } = await import('../../../src/cliproxy/binary/version-cache');
const { getExecutableName } = await import('../../../src/cliproxy/platform-detector');
const binaryService = await import(
`../../../src/cliproxy/services/binary-service?binary-service-plus-migration=${Date.now()}`
);
const config = createEmptyUnifiedConfig();
config.cliproxy = { ...config.cliproxy, backend: 'plus' };
saveUnifiedConfig(config);
const plusBinDir = path.join(tempHome, '.ccs', 'cliproxy', 'bin', 'plus');
fs.mkdirSync(plusBinDir, { recursive: true });
fs.writeFileSync(path.join(plusBinDir, getExecutableName('plus')), 'fake-binary');
fs.writeFileSync(path.join(plusBinDir, '.version'), '6.6.80-0');
savePinnedVersion('6.6.80-0', 'plus');
const status = binaryService.getBinaryStatus();
expect(status.installed).toBe(true);
expect(status.pinnedVersion).toBe('6.6.80-0');
expect(status.binaryPath).toContain('/original/');
});
it('attempts to stop the proxy even when there is no tracked running session', async () => {
const calls = {
stopProxy: 0,
@@ -102,6 +102,19 @@ cliproxy:
expect(error).toContain('issues/1062');
});
it('leaves the settings file unchanged when a plus-only provider update is rejected', () => {
const settingsPath = path.join(tmpDir, 'gemini-demo.settings.json');
const before = fs.readFileSync(settingsPath, 'utf-8');
const result = updateVariant('demo', {
provider: 'ghcp',
model: 'gpt-5.4-mini',
});
expect(result.success).toBe(false);
expect(fs.readFileSync(settingsPath, 'utf-8')).toBe(before);
});
it('updates provider and regenerates provider-specific core env in same settings file', () => {
const result = updateVariant('demo', {
provider: 'codex',
@@ -31,16 +31,16 @@ beforeAll(async () => {
));
const ccsDir = path.join(tempHome, '.ccs');
const originalBinDir = path.join(ccsDir, 'cliproxy', 'bin', 'original');
fs.mkdirSync(originalBinDir, { recursive: true });
const plusBinDir = path.join(ccsDir, 'cliproxy', 'bin', 'plus');
fs.mkdirSync(plusBinDir, { recursive: true });
setGlobalConfigDir(ccsDir);
const config = createEmptyUnifiedConfig();
config.cliproxy = { backend: 'plus' };
saveUnifiedConfig(config);
writeInstalledVersion(originalBinDir, '6.6.80');
writeVersionCache('6.6.89', 'original');
writeInstalledVersion(plusBinDir, '6.6.80');
writeVersionCache('6.6.89', 'plus');
writeVersionListCache(
{
versions: ['6.6.89', '6.6.88', '6.6.81', '6.6.80'],
@@ -48,7 +48,7 @@ beforeAll(async () => {
latest: '6.6.89',
checkedAt: Date.now(),
},
'original'
'plus'
);
({ default: cliproxyStatsRoutes } = await import(