Skip to content

Commit 29fc2d3

Browse files
jlobue10claude
andcommitted
Keep the default cache limit for a stored legacy zero size
Older builds stored the cache limit under the legacy cacheLimitSize key and rejected zero at startup, keeping the 1GB default. Accepting zero from that key would silently turn those prefs files into an unlimited cache after upgrade. Only the current maxCacheSize key may carry zero (unlimited); a legacy zero falls through to the default. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016Q2tBCuePZJeeCkDDxu1m3
1 parent 76f908b commit 29fc2d3

3 files changed

Lines changed: 63 additions & 6 deletions

File tree

packages/gui/src/electron/main.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ import {
8080
addBypassCommand,
8181
} from './utils/pairStore';
8282
import * as privatePreferences from './utils/privatePreferences';
83+
import resolveStoredMaxCacheSize from './utils/resolveStoredMaxCacheSize';
8384
import toCamelCase from './utils/toCamelCase';
8485
import { setUserDataDir } from './utils/userData';
8586
import webSocketBridgeBindEvents from './utils/webSocketBridge';
@@ -118,12 +119,7 @@ const prefs = readPrefs();
118119
const defaultCacheFolder = path.join(app.getPath('cache'), app.getName());
119120
const cacheDirectory: string = prefs.cacheFolder || defaultCacheFolder;
120121

121-
// `cacheLimitSize` is the legacy preference key older versions of the
122-
// settings UI stored the value under. Invalid values are ignored because the
123-
// CacheManager constructor rejects negative sizes; zero means unlimited.
124-
const storedMaxCacheSize: number | undefined = [prefs.maxCacheSize, prefs.cacheLimitSize].find(
125-
(size) => typeof size === 'number' && Number.isFinite(size) && size >= 0,
126-
);
122+
const storedMaxCacheSize: number | undefined = resolveStoredMaxCacheSize(prefs);
127123

128124
const cacheManager = new CacheManager({
129125
cacheDirectory,
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import resolveStoredMaxCacheSize from './resolveStoredMaxCacheSize';
2+
3+
describe('resolveStoredMaxCacheSize', () => {
4+
it('accepts a positive size from the current key', () => {
5+
expect(resolveStoredMaxCacheSize({ maxCacheSize: 2048 })).toBe(2048);
6+
});
7+
8+
it('accepts zero (unlimited) from the current key', () => {
9+
expect(resolveStoredMaxCacheSize({ maxCacheSize: 0 })).toBe(0);
10+
});
11+
12+
it('accepts a positive size from the legacy key', () => {
13+
expect(resolveStoredMaxCacheSize({ cacheLimitSize: 1024 })).toBe(1024);
14+
});
15+
16+
it('ignores a legacy zero so the default limit still applies after upgrade', () => {
17+
// older builds rejected a stored zero at startup and kept the default
18+
// limit, so a migrated zero must not silently become unlimited
19+
expect(resolveStoredMaxCacheSize({ cacheLimitSize: 0 })).toBeUndefined();
20+
});
21+
22+
it('prefers the current key over the legacy key', () => {
23+
expect(resolveStoredMaxCacheSize({ maxCacheSize: 512, cacheLimitSize: 1024 })).toBe(512);
24+
});
25+
26+
it('falls back to a valid legacy size when the current key is invalid', () => {
27+
expect(resolveStoredMaxCacheSize({ maxCacheSize: -1, cacheLimitSize: 1024 })).toBe(1024);
28+
});
29+
30+
it('ignores invalid values', () => {
31+
expect(resolveStoredMaxCacheSize({})).toBeUndefined();
32+
expect(resolveStoredMaxCacheSize({ maxCacheSize: -5 })).toBeUndefined();
33+
expect(resolveStoredMaxCacheSize({ maxCacheSize: Number.NaN })).toBeUndefined();
34+
expect(resolveStoredMaxCacheSize({ maxCacheSize: Number.POSITIVE_INFINITY })).toBeUndefined();
35+
expect(resolveStoredMaxCacheSize({ maxCacheSize: '1024', cacheLimitSize: '2048' })).toBeUndefined();
36+
});
37+
});
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
type StoredCacheSizePrefs = {
2+
maxCacheSize?: unknown;
3+
cacheLimitSize?: unknown;
4+
};
5+
6+
const isStoredCacheSize = (size: unknown): size is number => typeof size === 'number' && Number.isFinite(size);
7+
8+
// `cacheLimitSize` is the legacy preference key older versions of the
9+
// settings UI stored the value under. Invalid values are ignored because the
10+
// CacheManager constructor rejects negative sizes. Zero means unlimited, but
11+
// only under the current key: builds that wrote `cacheLimitSize` rejected
12+
// zero at startup and kept the default limit, so a stored legacy zero must
13+
// keep falling through to the default instead of disabling eviction.
14+
export default function resolveStoredMaxCacheSize(prefs: StoredCacheSizePrefs): number | undefined {
15+
if (isStoredCacheSize(prefs.maxCacheSize) && prefs.maxCacheSize >= 0) {
16+
return prefs.maxCacheSize;
17+
}
18+
19+
if (isStoredCacheSize(prefs.cacheLimitSize) && prefs.cacheLimitSize > 0) {
20+
return prefs.cacheLimitSize;
21+
}
22+
23+
return undefined;
24+
}

0 commit comments

Comments
 (0)