circle-ir-ai 2.103.0 → 2.104.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/dist/cache/classification-cache.d.ts +14 -0
- package/dist/cache/classification-cache.d.ts.map +1 -1
- package/dist/cache/classification-cache.js +44 -2
- package/dist/cache/classification-cache.js.map +1 -1
- package/dist/cache/file-cache.d.ts +13 -0
- package/dist/cache/file-cache.d.ts.map +1 -1
- package/dist/cache/file-cache.js +32 -3
- package/dist/cache/file-cache.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,44 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.104.1] - 2026-08-10
|
|
9
|
+
|
|
10
|
+
### Fixed — unbounded in-memory cache → server OOM after ~680 scans (cognium-ai#282 / skillsregistry#58)
|
|
11
|
+
|
|
12
|
+
The `memoryCache` Map inside both `ClassificationCache` (tree / verify /
|
|
13
|
+
discovery / classifier / cluster namespaces) and `FileCache` grew **without
|
|
14
|
+
bound** — one entry per unique content digest, never evicted — and the cache
|
|
15
|
+
instances are module-level singletons that live for the whole process. In the
|
|
16
|
+
long-lived `circle-pack` server this climbed until the process **OOM-crashed at
|
|
17
|
+
a fixed ceiling (~650–680 cumulative skill scans, independent of client
|
|
18
|
+
concurrency)** — the memory-leak-hitting-a-ceiling signature in #282. The
|
|
19
|
+
short-lived `cognium-ai` CLI never hit it (one scan, then exit), which is why
|
|
20
|
+
only the server crashed.
|
|
21
|
+
|
|
22
|
+
**Regression window (v1.38→v1.41):** the leak existed all along, but circle-ir-ai
|
|
23
|
+
2.98→2.101 added more per-scan classifier calls (new skills detectors +
|
|
24
|
+
marketplace scan), so more unique digests accrued per scan and the OOM ceiling
|
|
25
|
+
was reached sooner (~656 on v1.41 vs ~1000 clean on v1.38).
|
|
26
|
+
|
|
27
|
+
**Fix:** both caches now cap `memoryCache` with a **bounded LRU** — evict the
|
|
28
|
+
least-recently-used entry once over `maxMemoryEntries` (default **5000** per
|
|
29
|
+
`(namespace, model)` singleton; override via `LLM_CACHE_MAX_MEM_ENTRIES`; `0`
|
|
30
|
+
restores the pre-fix uncapped behavior). Hits re-insert to the MRU position, so
|
|
31
|
+
hot within-scan / recent-scan entries survive; steady-state memory is now
|
|
32
|
+
`O(cap)` instead of `O(total unique inputs)`. The on-disk backend is unchanged
|
|
33
|
+
(TTL-bounded already), so cross-run hit rates are unaffected.
|
|
34
|
+
|
|
35
|
+
Guards: `tests/classification-cache.test.ts` (+3) and `tests/file-cache.test.ts`
|
|
36
|
+
(+2) — cap invariant, LRU eviction order, and the `0`-disables-cap escape hatch.
|
|
37
|
+
Full suite **1801 pass / 3 skip**. No new LLM call sites.
|
|
38
|
+
|
|
39
|
+
## [2.104.0] - 2026-08-10
|
|
40
|
+
|
|
41
|
+
### Changed — bump circle-ir 3.215.0 → 3.216.0
|
|
42
|
+
|
|
43
|
+
Engine pin bump to stay current. No circle-ir-ai source changes. Full suite
|
|
44
|
+
1796 pass / 3 skip on 3.216.0; single circle-ir copy verified.
|
|
45
|
+
|
|
8
46
|
## [2.103.0] - 2026-08-10
|
|
9
47
|
|
|
10
48
|
### Changed — bump circle-ir 3.214.0 → 3.215.0
|
|
@@ -95,6 +95,12 @@ export interface ClassificationCacheOptions {
|
|
|
95
95
|
negativeMaxAge?: number;
|
|
96
96
|
/** Enable/disable cache (default: true) */
|
|
97
97
|
enabled?: boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Max entries in the process-local `memoryCache` before LRU eviction
|
|
100
|
+
* (cognium-ai#282). Default 5000; `0` disables the cap. Override via
|
|
101
|
+
* `LLM_CACHE_MAX_MEM_ENTRIES`.
|
|
102
|
+
*/
|
|
103
|
+
maxMemoryEntries?: number;
|
|
98
104
|
/**
|
|
99
105
|
* Per-phase model identity for cache namespacing (cognium-ai#151 / #158 D2).
|
|
100
106
|
* Tree-cache passes the discovery+verify joint fingerprint; verify-cache
|
|
@@ -139,6 +145,7 @@ export declare class ClassificationCache<T = unknown> {
|
|
|
139
145
|
private modelFingerprint;
|
|
140
146
|
private backend;
|
|
141
147
|
private memoryCache;
|
|
148
|
+
private maxMemoryEntries;
|
|
142
149
|
private hits;
|
|
143
150
|
private misses;
|
|
144
151
|
private positiveHits;
|
|
@@ -150,6 +157,13 @@ export declare class ClassificationCache<T = unknown> {
|
|
|
150
157
|
getBackendKind(): string;
|
|
151
158
|
/** Logical namespace (`tree` | `verify` | `discovery`). Observability. */
|
|
152
159
|
getNamespace(): CacheNamespace;
|
|
160
|
+
/**
|
|
161
|
+
* cognium-ai#282 — insert into the bounded-LRU memory cache. Deleting an
|
|
162
|
+
* existing key before re-setting moves it to the Map's MRU (last) position;
|
|
163
|
+
* eviction always removes from the front (LRU). Steady-state size is capped
|
|
164
|
+
* at `maxMemoryEntries` (0 = uncapped, pre-#282 behavior).
|
|
165
|
+
*/
|
|
166
|
+
private setMemory;
|
|
153
167
|
private computeDigest;
|
|
154
168
|
private toCacheKey;
|
|
155
169
|
private isValid;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classification-cache.d.ts","sourceRoot":"","sources":["../../src/cache/classification-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAY,cAAc,EAAE,MAAM,cAAc,CAAC;AAE3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIzD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,WAAW,CAAC;AAEnC;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,MAAM,WAAW,0BAA0B;IACzC;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B;oEACgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAiBD;;;;;;GAMG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAGrC;
|
|
1
|
+
{"version":3,"file":"classification-cache.d.ts","sourceRoot":"","sources":["../../src/cache/classification-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -86,6 +86,24 @@ export function cacheBaseDir() {
|
|
|
86
86
|
return override && override.length > 0 ? override : path.join(process.cwd(), '.cognium', 'cache');
|
|
87
87
|
}
|
|
88
88
|
const DEFAULT_NEGATIVE_MAX_AGE = 24 * 60 * 60 * 1000; // 24 hours (#180)
|
|
89
|
+
/**
|
|
90
|
+
* cognium-ai#282 / skillsregistry#58 — hard cap on the process-local
|
|
91
|
+
* `memoryCache` Map. The cache instances are module-level singletons that
|
|
92
|
+
* live for the whole process, so in a long-lived server (circle-pack) the
|
|
93
|
+
* in-memory mirror grew **unbounded** — one entry per unique content digest,
|
|
94
|
+
* never evicted. Under a sustained batch of skill scans this climbed until
|
|
95
|
+
* the process OOM-crashed at a fixed ceiling (~650–680 cumulative scans,
|
|
96
|
+
* independent of client concurrency). The short-lived cognium-ai CLI never
|
|
97
|
+
* hit it (one scan, then exit), which is why only the server crashed.
|
|
98
|
+
*
|
|
99
|
+
* A bounded LRU (evict least-recently-used once over the cap) keeps the hot
|
|
100
|
+
* within-scan / recent-scan entries — where nearly all the hit value is —
|
|
101
|
+
* while making steady-state memory O(cap) instead of O(total unique inputs).
|
|
102
|
+
* Default 5000 per (namespace, model) singleton; override via
|
|
103
|
+
* `LLM_CACHE_MAX_MEM_ENTRIES`. Set to `0` to disable the cap (pre-#282
|
|
104
|
+
* behavior — not recommended for a long-lived process).
|
|
105
|
+
*/
|
|
106
|
+
const DEFAULT_MAX_MEM_ENTRIES = 5000;
|
|
89
107
|
/**
|
|
90
108
|
* Non-negative integer from env, or undefined when unset/invalid. `0` is
|
|
91
109
|
* accepted for the negative TTL — it means "expire immediately" (a kill-switch
|
|
@@ -107,6 +125,7 @@ export class ClassificationCache {
|
|
|
107
125
|
modelFingerprint;
|
|
108
126
|
backend;
|
|
109
127
|
memoryCache = new Map();
|
|
128
|
+
maxMemoryEntries;
|
|
110
129
|
hits = 0;
|
|
111
130
|
misses = 0;
|
|
112
131
|
positiveHits = 0;
|
|
@@ -120,6 +139,10 @@ export class ClassificationCache {
|
|
|
120
139
|
envNonNegativeInt('LLM_NEGATIVE_CACHE_TTL_MS') ??
|
|
121
140
|
DEFAULT_NEGATIVE_MAX_AGE;
|
|
122
141
|
this.enabled = options.enabled ?? true;
|
|
142
|
+
this.maxMemoryEntries =
|
|
143
|
+
options.maxMemoryEntries ??
|
|
144
|
+
envNonNegativeInt('LLM_CACHE_MAX_MEM_ENTRIES') ??
|
|
145
|
+
DEFAULT_MAX_MEM_ENTRIES;
|
|
123
146
|
this.modelFingerprint = options.modelFingerprint ?? '';
|
|
124
147
|
this.backend = options.backend ?? makeBackend(this.cacheDir, this.namespace);
|
|
125
148
|
}
|
|
@@ -135,6 +158,24 @@ export class ClassificationCache {
|
|
|
135
158
|
getNamespace() {
|
|
136
159
|
return this.namespace;
|
|
137
160
|
}
|
|
161
|
+
/**
|
|
162
|
+
* cognium-ai#282 — insert into the bounded-LRU memory cache. Deleting an
|
|
163
|
+
* existing key before re-setting moves it to the Map's MRU (last) position;
|
|
164
|
+
* eviction always removes from the front (LRU). Steady-state size is capped
|
|
165
|
+
* at `maxMemoryEntries` (0 = uncapped, pre-#282 behavior).
|
|
166
|
+
*/
|
|
167
|
+
setMemory(digest, entry) {
|
|
168
|
+
this.memoryCache.delete(digest);
|
|
169
|
+
this.memoryCache.set(digest, entry);
|
|
170
|
+
if (this.maxMemoryEntries > 0) {
|
|
171
|
+
while (this.memoryCache.size > this.maxMemoryEntries) {
|
|
172
|
+
const oldest = this.memoryCache.keys().next().value;
|
|
173
|
+
if (oldest === undefined)
|
|
174
|
+
break;
|
|
175
|
+
this.memoryCache.delete(oldest);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
138
179
|
computeDigest(content, classifier, coordinate) {
|
|
139
180
|
// Coordinate hash-prefix only applies to the `tree` namespace.
|
|
140
181
|
// Including it in the digest (not just the path) is what guarantees
|
|
@@ -208,6 +249,7 @@ export class ClassificationCache {
|
|
|
208
249
|
// Memory cache (process-local hot path)
|
|
209
250
|
const memEntry = this.memoryCache.get(digest);
|
|
210
251
|
if (memEntry && this.isValid(memEntry)) {
|
|
252
|
+
this.setMemory(digest, memEntry); // #282: LRU touch — mark most-recently-used
|
|
211
253
|
this.recordHit(memEntry);
|
|
212
254
|
this.emitEvent('hit', digest, Date.now() - memEntry.timestamp, opts?.coordinate, memEntry.negative);
|
|
213
255
|
return memEntry.result;
|
|
@@ -218,7 +260,7 @@ export class ClassificationCache {
|
|
|
218
260
|
if (raw !== null) {
|
|
219
261
|
const entry = JSON.parse(raw);
|
|
220
262
|
if (this.isValid(entry)) {
|
|
221
|
-
this.
|
|
263
|
+
this.setMemory(digest, entry);
|
|
222
264
|
this.recordHit(entry);
|
|
223
265
|
this.emitEvent('hit', digest, Date.now() - entry.timestamp, opts?.coordinate, entry.negative);
|
|
224
266
|
return entry.result;
|
|
@@ -253,7 +295,7 @@ export class ClassificationCache {
|
|
|
253
295
|
// (undefined stays off the wire for positive entries).
|
|
254
296
|
if (opts?.negative)
|
|
255
297
|
entry.negative = true;
|
|
256
|
-
this.
|
|
298
|
+
this.setMemory(digest, entry);
|
|
257
299
|
this.emitEvent('set', digest, null, opts?.coordinate, entry.negative);
|
|
258
300
|
try {
|
|
259
301
|
await this.backend.set(cacheKey, JSON.stringify(entry));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classification-cache.js","sourceRoot":"","sources":["../../src/cache/classification-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAyB,MAAM,yBAAyB,CAAC;AAElF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AAEnC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAAC,gBAAwB;IACxD,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC;
|
|
1
|
+
{"version":3,"file":"classification-cache.js","sourceRoot":"","sources":["../../src/cache/classification-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,13 +20,26 @@ export interface FileCacheOptions {
|
|
|
20
20
|
maxAge?: number;
|
|
21
21
|
/** Whether to enable the cache (default: true) */
|
|
22
22
|
enabled?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Max entries in the process-local `memoryCache` before LRU eviction
|
|
25
|
+
* (cognium-ai#282). Default 5000; `0` disables the cap. Override via
|
|
26
|
+
* `LLM_CACHE_MAX_MEM_ENTRIES`.
|
|
27
|
+
*/
|
|
28
|
+
maxMemoryEntries?: number;
|
|
23
29
|
}
|
|
24
30
|
export declare class FileCache<T = unknown> {
|
|
25
31
|
private cacheDir;
|
|
26
32
|
private maxAge;
|
|
27
33
|
private enabled;
|
|
28
34
|
private memoryCache;
|
|
35
|
+
private maxMemoryEntries;
|
|
29
36
|
constructor(options?: FileCacheOptions);
|
|
37
|
+
/**
|
|
38
|
+
* cognium-ai#282 — bounded-LRU insert into the process-local memory mirror.
|
|
39
|
+
* See classification-cache.ts for the rationale (unbounded growth in the
|
|
40
|
+
* long-lived server caused OOM crashes at ~650–680 cumulative scans).
|
|
41
|
+
*/
|
|
42
|
+
private setMemory;
|
|
30
43
|
/**
|
|
31
44
|
* Compute SHA-256 hash of content
|
|
32
45
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-cache.d.ts","sourceRoot":"","sources":["../../src/cache/file-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,CAAC,CAAC;CACX;AAED,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"file-cache.d.ts","sourceRoot":"","sources":["../../src/cache/file-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,CAAC,CAAC;CACX;AAED,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAYD,qBAAa,SAAS,CAAC,CAAC,GAAG,OAAO;IAChC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,gBAAgB,CAAS;gBAErB,OAAO,GAAE,gBAAqB;IAY1C;;;;OAIG;IACH,OAAO,CAAC,SAAS;IAYjB;;OAEG;IACH;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAepB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;;;;;;OAOG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAmChE;;;;;;OAMG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAoCvE;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAI/D;;OAEG;IACH,KAAK,IAAI,IAAI;IAab;;OAEG;IACH,KAAK,IAAI;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAmB1E;AAKD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAKtE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
|
package/dist/cache/file-cache.js
CHANGED
|
@@ -22,19 +22,47 @@ catch {
|
|
|
22
22
|
circleIrVersion = 'unknown';
|
|
23
23
|
}
|
|
24
24
|
const DEFAULT_MAX_AGE = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
25
|
+
const DEFAULT_MAX_MEM_ENTRIES = 5000; // cognium-ai#282 — bound the in-memory mirror
|
|
26
|
+
function envMaxMemEntries() {
|
|
27
|
+
const raw = process.env.LLM_CACHE_MAX_MEM_ENTRIES;
|
|
28
|
+
if (raw === undefined || raw === '')
|
|
29
|
+
return undefined;
|
|
30
|
+
const n = Number.parseInt(raw, 10);
|
|
31
|
+
return Number.isFinite(n) && n >= 0 ? n : undefined;
|
|
32
|
+
}
|
|
25
33
|
export class FileCache {
|
|
26
34
|
cacheDir;
|
|
27
35
|
maxAge;
|
|
28
36
|
enabled;
|
|
29
37
|
memoryCache = new Map();
|
|
38
|
+
maxMemoryEntries;
|
|
30
39
|
constructor(options = {}) {
|
|
31
40
|
this.cacheDir = options.cacheDir || path.join(process.cwd(), '.circle-ir-cache');
|
|
32
41
|
this.maxAge = options.maxAge ?? DEFAULT_MAX_AGE;
|
|
33
42
|
this.enabled = options.enabled ?? true;
|
|
43
|
+
this.maxMemoryEntries =
|
|
44
|
+
options.maxMemoryEntries ?? envMaxMemEntries() ?? DEFAULT_MAX_MEM_ENTRIES;
|
|
34
45
|
if (this.enabled) {
|
|
35
46
|
this.ensureCacheDir();
|
|
36
47
|
}
|
|
37
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* cognium-ai#282 — bounded-LRU insert into the process-local memory mirror.
|
|
51
|
+
* See classification-cache.ts for the rationale (unbounded growth in the
|
|
52
|
+
* long-lived server caused OOM crashes at ~650–680 cumulative scans).
|
|
53
|
+
*/
|
|
54
|
+
setMemory(hash, entry) {
|
|
55
|
+
this.memoryCache.delete(hash);
|
|
56
|
+
this.memoryCache.set(hash, entry);
|
|
57
|
+
if (this.maxMemoryEntries > 0) {
|
|
58
|
+
while (this.memoryCache.size > this.maxMemoryEntries) {
|
|
59
|
+
const oldest = this.memoryCache.keys().next().value;
|
|
60
|
+
if (oldest === undefined)
|
|
61
|
+
break;
|
|
62
|
+
this.memoryCache.delete(oldest);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
38
66
|
/**
|
|
39
67
|
* Compute SHA-256 hash of content
|
|
40
68
|
*/
|
|
@@ -103,6 +131,7 @@ export class FileCache {
|
|
|
103
131
|
// Check memory cache first
|
|
104
132
|
const memEntry = this.memoryCache.get(hash);
|
|
105
133
|
if (memEntry && this.isValidEntry(memEntry)) {
|
|
134
|
+
this.setMemory(hash, memEntry); // #282: LRU touch
|
|
106
135
|
return memEntry.result;
|
|
107
136
|
}
|
|
108
137
|
// Check disk cache
|
|
@@ -113,7 +142,7 @@ export class FileCache {
|
|
|
113
142
|
const entry = JSON.parse(data);
|
|
114
143
|
if (this.isValidEntry(entry)) {
|
|
115
144
|
// Populate memory cache
|
|
116
|
-
this.
|
|
145
|
+
this.setMemory(hash, entry);
|
|
117
146
|
return entry.result;
|
|
118
147
|
}
|
|
119
148
|
else {
|
|
@@ -144,8 +173,8 @@ export class FileCache {
|
|
|
144
173
|
timestamp: Date.now(),
|
|
145
174
|
result,
|
|
146
175
|
};
|
|
147
|
-
// Store in memory cache
|
|
148
|
-
this.
|
|
176
|
+
// Store in memory cache (bounded LRU — #282)
|
|
177
|
+
this.setMemory(hash, entry);
|
|
149
178
|
// Store on disk. #31: write to a unique temp file then rename — POSIX
|
|
150
179
|
// rename is atomic, so concurrent scans against the same target can't
|
|
151
180
|
// corrupt each other's cache files (which would otherwise produce
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-cache.js","sourceRoot":"","sources":["../../src/cache/file-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,+CAA+C;AAC/C,IAAI,eAAe,GAAkB,IAAI,CAAC;AAC1C,IAAI,CAAC;IACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,iCAAiC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC7F,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,eAAe,GAAG,WAAW,CAAC,OAAO,CAAC;AACxC,CAAC;AAAC,MAAM,CAAC;IACP,0CAA0C;IAC1C,eAAe,GAAG,SAAS,CAAC;AAC9B,CAAC;
|
|
1
|
+
{"version":3,"file":"file-cache.js","sourceRoot":"","sources":["../../src/cache/file-cache.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "circle-ir-ai",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.104.1",
|
|
4
4
|
"description": "LLM-enhanced SAST analysis built on circle-ir",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
"@ax-llm/ax": "^20.0.0",
|
|
99
99
|
"@cognium/project-profile-detect": "^1.1.0",
|
|
100
100
|
"@mastra/core": "^1.18.0",
|
|
101
|
-
"circle-ir": "3.
|
|
101
|
+
"circle-ir": "3.216.0",
|
|
102
102
|
"minimatch": "^10.2.5",
|
|
103
103
|
"p-queue": "^9.1.0"
|
|
104
104
|
},
|