mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-15 12:55:51 +00:00
fix: 为 cacheWarningStateBySource Map 设置上限防止内存泄漏
Map 以 querySource 为 key 存储每个来源的缓存命中率历史状态, 但 querySource 类型为 `any`,长时间会话中可能产生大量唯一值, Map 持续增长永不清理。 新增 MAX_SOURCE_ENTRIES = 50 上限,新增条目时若达到上限则 逐出最早插入的条目(Map 按插入顺序迭代)。 同时也新增 _resetCacheWarningStateForTest() 用于测试隔离。 Co-Authored-By: deepseek-v4-pro[1m] <deepseek-ai@claude-code-best.win>
This commit is contained in:
@@ -24,6 +24,12 @@ interface CacheWarningState {
|
||||
// 模块级状态,每个 querySource 独立跟踪
|
||||
const cacheWarningStateBySource = new Map<string, CacheWarningState>()
|
||||
|
||||
// Limit the number of tracked sources to prevent unbounded Map growth.
|
||||
// querySource strings are effectively unbounded (typed as `any`), so a
|
||||
// long-running session that spawns many subagents could leak memory.
|
||||
// Evict the oldest entry (by insertion order) when the limit is exceeded.
|
||||
const MAX_SOURCE_ENTRIES = 50
|
||||
|
||||
const DEFAULT_CACHE_THRESHOLD = 80
|
||||
|
||||
/**
|
||||
@@ -81,6 +87,13 @@ export function shouldShowCacheWarning(
|
||||
let state = cacheWarningStateBySource.get(querySource)
|
||||
if (!state) {
|
||||
state = { lastHitRate: null, lastTimestamp: null }
|
||||
// Evict oldest entry when at capacity so the Map stays bounded
|
||||
if (cacheWarningStateBySource.size >= MAX_SOURCE_ENTRIES) {
|
||||
const oldestKey = cacheWarningStateBySource.keys().next().value
|
||||
if (oldestKey !== undefined) {
|
||||
cacheWarningStateBySource.delete(oldestKey)
|
||||
}
|
||||
}
|
||||
cacheWarningStateBySource.set(querySource, state)
|
||||
}
|
||||
|
||||
@@ -132,3 +145,10 @@ export function createCacheWarningMessage(info: CacheHitRateInfo): Message {
|
||||
isMeta: false,
|
||||
} as Message
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset the per-source tracking state — only used in tests.
|
||||
*/
|
||||
export function _resetCacheWarningStateForTest(): void {
|
||||
cacheWarningStateBySource.clear()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user