circle-ir-ai 2.44.0 → 2.46.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptive-concurrency.js","sourceRoot":"","sources":["../../src/llm/adaptive-concurrency.ts"],"names":[],"mappings":"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"}
@@ -53,6 +53,31 @@ export declare const correlatedPredicateSignature: AxSignature<Record<string, an
53
53
  */
54
54
  export declare const crossFileTaintSignature: AxSignature<Record<string, any>, Record<string, any>>;
55
55
  export type AxPhase = 'enrichment' | 'verification' | 'analysis';
56
+ /**
57
+ * cognium-ai#228 — reset ALL breaker state for a fresh scan. Called at the
58
+ * true top-level scan entry (scanner's file loop, single-file workflow) so a
59
+ * long-lived process (circle-pack) doesn't carry a tripped breaker across
60
+ * repos. The per-file `resetCircuitBreaker()` deliberately does NOT clear the
61
+ * project-dead state (#217); this does.
62
+ */
63
+ export declare function resetLLMBreakerForScan(): void;
64
+ /**
65
+ * cognium-ai#217 — reset only the PER-FILE breaker (consecutive-failure count
66
+ * + the soft disable) between files within a scan, so one bad file doesn't
67
+ * disable LLM for the whole run. Deliberately does NOT clear the project-dead
68
+ * state — that's the cross-file backstop that must survive per-file resets.
69
+ */
70
+ export declare function resetLLMPerFileBreaker(): void;
71
+ /** cognium-ai#217 — true once the project-dead breaker has tripped. Module
72
+ * accessor so callers (CLI degraded-status) don't need a client handle. */
73
+ export declare function isLLMEndpointDead(): boolean;
74
+ /** cognium-ai#228 — test/inspection accessor for the shared breaker state. */
75
+ export declare function getLLMBreakerState(): {
76
+ consecutiveFailures: number;
77
+ llmDisabled: boolean;
78
+ projectDeadCalls: number;
79
+ llmProjectDead: boolean;
80
+ };
56
81
  export declare const MAX_CODE_CONTEXT_LENGTH: number;
57
82
  /**
58
83
  * Compute the delay to wait before retrying a rate-limited request.
@@ -124,9 +149,6 @@ export declare class AxLLMClient {
124
149
  private config;
125
150
  private ai;
126
151
  private generators;
127
- private consecutiveFailures;
128
- private llmDisabled;
129
- private connectionFailureWarned;
130
152
  /**
131
153
  * Set by `_chatJSONImpl` on failure so the outer `chatJSON` wrapper
132
154
  * can write a categorical reason to the JSONL log without
@@ -188,13 +210,32 @@ export declare class AxLLMClient {
188
210
  */
189
211
  resetCircuitBreaker(): void;
190
212
  /**
191
- * Reset failure counter (call when LLM succeeds)
213
+ * cognium-ai#217 — true once the project-level dead-endpoint breaker has
214
+ * tripped (the LLM endpoint returned empty/timeout/connection failures on
215
+ * ~4 files' worth of calls with no intervening success). The scan then
216
+ * runs static-only; callers can surface a `degraded: llm-unavailable`
217
+ * status instead of reporting a plain size timeout.
218
+ */
219
+ isLLMProjectDead(): boolean;
220
+ /**
221
+ * Reset the per-file failure counter. Called on any HTTP 200 — note an
222
+ * HTTP-200-but-empty body is NOT a genuine success (it's the #217
223
+ * dead-endpoint signature), so the project-dead counter is reset elsewhere
224
+ * (on genuine content success in `chatJSON`), not here.
192
225
  */
193
226
  private resetFailures;
194
227
  /**
195
228
  * Track a failure and potentially disable LLM
196
229
  */
197
230
  private trackFailure;
231
+ /**
232
+ * cognium-ai#217 — track an *endpoint-dead* failure (empty response,
233
+ * timeout, or connection error). Unlike {@link trackFailure}, this counter
234
+ * survives the per-file `resetCircuitBreaker()`, so a wholesale endpoint
235
+ * stall trips a project-level breaker and the scan finishes static-only
236
+ * rather than re-paying dead time on every file to the wall-clock cap.
237
+ */
238
+ private trackDeadCall;
198
239
  /**
199
240
  * Detect connection-class errors (endpoint unreachable, DNS failure,
200
241
  * connection refused, etc.). These should immediately trip the
@@ -1 +1 @@
1
- {"version":3,"file":"ax-client.d.ts","sourceRoot":"","sources":["../../src/llm/ax-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ax-client.d.ts","sourceRoot":"","sources":["../../src/llm/ax-client.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import { AxAIOpenAI, AxGen, AxSignature, } from '@ax-llm/ax';
8
8
  import PQueue from 'p-queue';
9
+ import { AdaptiveConcurrency, parseConcurrencySetting, resolveAdaptiveConfig, } from './adaptive-concurrency.js';
9
10
  import { getDefaultLLMConfig, validateLLMConfig, buildChatCompletionBody } from './config.js';
10
11
  import { RoleClassificationResponseSchema, SourceDiscoveryResponseSchema, SinkDiscoveryResponseSchema, VerificationResponseSchema, } from './schemas.js';
11
12
  import { sanitizeCodeForPrompt, sanitizeListForPrompt, formatSystemPrompt, logInjectionAttempt, } from './prompt-security.js';
@@ -104,6 +105,86 @@ export const crossFileTaintSignature = AxSignature.create(`
104
105
  * Maximum consecutive LLM failures before skipping further calls
105
106
  */
106
107
  const MAX_CONSECUTIVE_FAILURES = 5;
108
+ /**
109
+ * cognium-ai#217 — project-level dead-endpoint breaker threshold.
110
+ *
111
+ * The per-file breaker (`MAX_CONSECUTIVE_FAILURES`) is reset between files
112
+ * (`resetCircuitBreaker`) so one bad file doesn't disable LLM for the whole
113
+ * project. But when the *endpoint itself* is dead (empty-body 60s hangs,
114
+ * timeouts, connection failures on every call — the #217 Gemma-vLLM stall),
115
+ * that per-file reset means each new file re-pays ~5×60s of dead time before
116
+ * re-tripping, consuming the entire per-repo wall-clock budget (16/72 Tier-1
117
+ * repos hit the 60-min cap with zero output).
118
+ *
119
+ * This counts *endpoint-dead* failures (empty/timeout/connection) that are
120
+ * NOT interrupted by a success, and — unlike the per-file breaker — is NOT
121
+ * cleared by `resetCircuitBreaker`. Once it trips, LLM stays off for the rest
122
+ * of the scan and the run finishes static-only. Set to 4× the per-file
123
+ * threshold so a single unlucky file can't project-kill, while a genuinely
124
+ * dead endpoint trips after ~4 files (~2 min wall-clock at concurrency 10,
125
+ * vs the 60-min cap). A single success resets the counter, so a healthy
126
+ * endpoint with scattered blips never trips.
127
+ */
128
+ const PROJECT_DEAD_THRESHOLD = 20;
129
+ // ---------------------------------------------------------------------------
130
+ // cognium-ai#228 — MODULE-LEVEL circuit-breaker state.
131
+ //
132
+ // `getAxLLMClient()` returns a FRESH `AxLLMClient` per request (intentional —
133
+ // the per-call `lastErrorCategory`/`lastUsage`/`lastAttemptCount` fields would
134
+ // race under concurrency if a client were shared). But that means an
135
+ // *instance*-level breaker never accumulates across the throwaway clients —
136
+ // discovery/enrichment/verification each spin up their own client, so the
137
+ // per-file breaker (#16) and the project-dead breaker (#217) were both no-ops
138
+ // in the real scan path (confirmed on apache/camel: 613 empty-response calls,
139
+ // breaker never tripped). The cap (#160) worked only because it lives in
140
+ // call-limiter.ts at module scope. So the breaker state lives here, shared
141
+ // across every client; the instance methods below are thin accessors.
142
+ let breakerConsecutiveFailures = 0;
143
+ let breakerLLMDisabled = false;
144
+ let breakerConnectionWarned = false;
145
+ let breakerProjectDeadCalls = 0;
146
+ let breakerLLMProjectDead = false;
147
+ let breakerProjectDeadWarned = false;
148
+ /**
149
+ * cognium-ai#228 — reset ALL breaker state for a fresh scan. Called at the
150
+ * true top-level scan entry (scanner's file loop, single-file workflow) so a
151
+ * long-lived process (circle-pack) doesn't carry a tripped breaker across
152
+ * repos. The per-file `resetCircuitBreaker()` deliberately does NOT clear the
153
+ * project-dead state (#217); this does.
154
+ */
155
+ export function resetLLMBreakerForScan() {
156
+ breakerConsecutiveFailures = 0;
157
+ breakerLLMDisabled = false;
158
+ breakerConnectionWarned = false;
159
+ breakerProjectDeadCalls = 0;
160
+ breakerLLMProjectDead = false;
161
+ breakerProjectDeadWarned = false;
162
+ }
163
+ /**
164
+ * cognium-ai#217 — reset only the PER-FILE breaker (consecutive-failure count
165
+ * + the soft disable) between files within a scan, so one bad file doesn't
166
+ * disable LLM for the whole run. Deliberately does NOT clear the project-dead
167
+ * state — that's the cross-file backstop that must survive per-file resets.
168
+ */
169
+ export function resetLLMPerFileBreaker() {
170
+ breakerConsecutiveFailures = 0;
171
+ breakerLLMDisabled = false;
172
+ breakerConnectionWarned = false;
173
+ }
174
+ /** cognium-ai#217 — true once the project-dead breaker has tripped. Module
175
+ * accessor so callers (CLI degraded-status) don't need a client handle. */
176
+ export function isLLMEndpointDead() {
177
+ return breakerLLMProjectDead;
178
+ }
179
+ /** cognium-ai#228 — test/inspection accessor for the shared breaker state. */
180
+ export function getLLMBreakerState() {
181
+ return {
182
+ consecutiveFailures: breakerConsecutiveFailures,
183
+ llmDisabled: breakerLLMDisabled,
184
+ projectDeadCalls: breakerProjectDeadCalls,
185
+ llmProjectDead: breakerLLMProjectDead,
186
+ };
187
+ }
107
188
  /**
108
189
  * Maximum code context length to send to LLM (in characters).
109
190
  * Prevents 400 errors from exceeding model context limits AND keeps
@@ -147,7 +228,19 @@ export const MAX_CODE_CONTEXT_LENGTH = parsePositiveInt(process.env.CP_MAX_CODE_
147
228
  // #159 (2026-07-02): `LLM_CONCURRENCY` is the canonical ticket name; the
148
229
  // pre-existing `LLM_MAX_CONCURRENT` is honored as a fallback so pre-2.32
149
230
  // deployments don't regress. First positive value wins.
150
- const LLM_MAX_CONCURRENT = Math.max(1, parseInt(process.env.LLM_CONCURRENCY || process.env.LLM_MAX_CONCURRENT || '10', 10));
231
+ // cognium-ai#229 — concurrency can be a fixed int OR adaptive (`-1`/`auto`).
232
+ // In adaptive mode an AIMD controller (see adaptive-concurrency.ts) tunes the
233
+ // p-queue live: halve on a 429, ramp +1 after a success streak, so the scan
234
+ // self-tunes to whatever rate limit the provider/plan actually enforces.
235
+ const concurrencySetting = parseConcurrencySetting(process.env.LLM_CONCURRENCY ?? process.env.LLM_MAX_CONCURRENT);
236
+ const adaptiveConcurrency = concurrencySetting?.mode === 'adaptive'
237
+ ? new AdaptiveConcurrency(resolveAdaptiveConfig())
238
+ : null;
239
+ const LLM_MAX_CONCURRENT = adaptiveConcurrency
240
+ ? adaptiveConcurrency.current // start point; the controller moves it live
241
+ : concurrencySetting?.mode === 'fixed'
242
+ ? concurrencySetting.value
243
+ : 10;
151
244
  const LLM_RATE_LIMIT = Math.max(0, parseInt(process.env.LLM_RATE_LIMIT || '20', 10));
152
245
  const llmQueue = new PQueue({
153
246
  concurrency: LLM_MAX_CONCURRENT,
@@ -156,6 +249,27 @@ const llmQueue = new PQueue({
156
249
  intervalCap: LLM_RATE_LIMIT,
157
250
  } : {}),
158
251
  });
252
+ if (adaptiveConcurrency) {
253
+ const cfg = adaptiveConcurrency.config;
254
+ console.error(`[info] cognium-ai#229: adaptive LLM concurrency ON ` +
255
+ `(start=${cfg.start}, min=${cfg.min}, max=${cfg.max}); tunes on 429s.`);
256
+ }
257
+ /**
258
+ * cognium-ai#229 — apply the adaptive controller's verdict to the live
259
+ * p-queue. p-queue supports changing `.concurrency` at runtime; raising it
260
+ * lets queued tasks start immediately, lowering it lets in-flight tasks drain
261
+ * before new ones start. No-op in fixed mode.
262
+ */
263
+ function applyAdaptiveConcurrency(next) {
264
+ if (!adaptiveConcurrency)
265
+ return;
266
+ if (next !== llmQueue.concurrency) {
267
+ const prev = llmQueue.concurrency;
268
+ llmQueue.concurrency = next;
269
+ console.error(`[info] cognium-ai#229: LLM concurrency ${prev} → ${next} ` +
270
+ `(${next < prev ? 'backing off after 429' : 'ramping up after success streak'}).`);
271
+ }
272
+ }
159
273
  /**
160
274
  * Maximum HTTP 429 (rate-limit) retries per call. Independent from the
161
275
  * parse-error retry budget — rate limits are transient and shouldn't
@@ -345,9 +459,9 @@ export class AxLLMClient {
345
459
  config;
346
460
  ai;
347
461
  generators = new Map();
348
- consecutiveFailures = 0;
349
- llmDisabled = false;
350
- connectionFailureWarned = false;
462
+ // cognium-ai#228 — circuit-breaker state is module-level (see top of file),
463
+ // NOT per-instance, because `getAxLLMClient()` hands out a fresh client per
464
+ // request. The breaker methods below read/write the shared `breaker*` vars.
351
465
  /**
352
466
  * Set by `_chatJSONImpl` on failure so the outer `chatJSON` wrapper
353
467
  * can write a categorical reason to the JSONL log without
@@ -433,7 +547,7 @@ export class AxLLMClient {
433
547
  * Check if LLM is currently available (not disabled due to failures)
434
548
  */
435
549
  isAvailable() {
436
- return !this.llmDisabled;
550
+ return !breakerLLMDisabled;
437
551
  }
438
552
  /**
439
553
  * Reset the circuit breaker so LLM calls are re-enabled.
@@ -441,23 +555,55 @@ export class AxLLMClient {
441
555
  * LLM for the entire project analysis.
442
556
  */
443
557
  resetCircuitBreaker() {
444
- this.consecutiveFailures = 0;
445
- this.llmDisabled = false;
558
+ resetLLMPerFileBreaker();
559
+ }
560
+ /**
561
+ * cognium-ai#217 — true once the project-level dead-endpoint breaker has
562
+ * tripped (the LLM endpoint returned empty/timeout/connection failures on
563
+ * ~4 files' worth of calls with no intervening success). The scan then
564
+ * runs static-only; callers can surface a `degraded: llm-unavailable`
565
+ * status instead of reporting a plain size timeout.
566
+ */
567
+ isLLMProjectDead() {
568
+ return breakerLLMProjectDead;
446
569
  }
447
570
  /**
448
- * Reset failure counter (call when LLM succeeds)
571
+ * Reset the per-file failure counter. Called on any HTTP 200 — note an
572
+ * HTTP-200-but-empty body is NOT a genuine success (it's the #217
573
+ * dead-endpoint signature), so the project-dead counter is reset elsewhere
574
+ * (on genuine content success in `chatJSON`), not here.
449
575
  */
450
576
  resetFailures() {
451
- this.consecutiveFailures = 0;
577
+ breakerConsecutiveFailures = 0;
452
578
  }
453
579
  /**
454
580
  * Track a failure and potentially disable LLM
455
581
  */
456
582
  trackFailure() {
457
- this.consecutiveFailures++;
458
- if (this.consecutiveFailures >= MAX_CONSECUTIVE_FAILURES) {
583
+ breakerConsecutiveFailures++;
584
+ if (breakerConsecutiveFailures >= MAX_CONSECUTIVE_FAILURES) {
459
585
  console.warn(`LLM disabled after ${MAX_CONSECUTIVE_FAILURES} consecutive failures`);
460
- this.llmDisabled = true;
586
+ breakerLLMDisabled = true;
587
+ }
588
+ }
589
+ /**
590
+ * cognium-ai#217 — track an *endpoint-dead* failure (empty response,
591
+ * timeout, or connection error). Unlike {@link trackFailure}, this counter
592
+ * survives the per-file `resetCircuitBreaker()`, so a wholesale endpoint
593
+ * stall trips a project-level breaker and the scan finishes static-only
594
+ * rather than re-paying dead time on every file to the wall-clock cap.
595
+ */
596
+ trackDeadCall() {
597
+ breakerProjectDeadCalls++;
598
+ if (!breakerLLMProjectDead &&
599
+ breakerProjectDeadCalls >= PROJECT_DEAD_THRESHOLD) {
600
+ breakerLLMProjectDead = true;
601
+ if (!breakerProjectDeadWarned) {
602
+ breakerProjectDeadWarned = true;
603
+ console.warn(`\nLLM endpoint appears dead: ${breakerProjectDeadCalls} empty/timeout/connection ` +
604
+ `failures with no success (${this.config.baseUrl}). Disabling LLM for the rest ` +
605
+ `of this scan and continuing static-only. Use --no-llm to silence.\n`);
606
+ }
461
607
  }
462
608
  }
463
609
  /**
@@ -497,14 +643,15 @@ export class AxLLMClient {
497
643
  * default LLM endpoint isn't reachable).
498
644
  */
499
645
  tripBreakerOnConnectionFailure(err) {
500
- if (!this.connectionFailureWarned) {
501
- this.connectionFailureWarned = true;
646
+ if (!breakerConnectionWarned) {
647
+ breakerConnectionWarned = true;
502
648
  const msg = err instanceof Error ? err.message : String(err);
503
649
  console.warn(`\nLLM endpoint unreachable (${this.config.baseUrl}): ${msg}`);
504
650
  console.warn('Falling back to static analysis. Use --no-llm to silence, or set LLM_BASE_URL/LLM_API_KEY.\n');
505
651
  }
506
- this.consecutiveFailures = MAX_CONSECUTIVE_FAILURES;
507
- this.llmDisabled = true;
652
+ breakerConsecutiveFailures = MAX_CONSECUTIVE_FAILURES;
653
+ breakerLLMDisabled = true;
654
+ this.trackDeadCall(); // #217: also counts toward the project-dead breaker
508
655
  }
509
656
  /**
510
657
  * Get or create a generator for a signature.
@@ -830,6 +977,19 @@ INFORMATION EXPOSURE (CWE-200/209) SPECIFIC:
830
977
  catch (e) {
831
978
  errorMsg = e instanceof Error ? e.message : String(e);
832
979
  }
980
+ // cognium-ai#217 — a genuine content success proves the endpoint is
981
+ // alive: reset the project-dead counter so scattered failures on a
982
+ // healthy endpoint never accumulate to the trip. (An HTTP-200-but-empty
983
+ // body returns null here, so it does NOT reset — that's the dead
984
+ // signature the breaker is counting.)
985
+ if (result !== null && errorMsg === undefined) {
986
+ breakerProjectDeadCalls = 0;
987
+ // cognium-ai#229 — AIMD: a clean success feeds the ramp-up. After a
988
+ // streak (outside the post-429 cooldown) the controller nudges
989
+ // concurrency +1 toward the provider's real ceiling. No-op in fixed mode.
990
+ if (adaptiveConcurrency)
991
+ applyAdaptiveConcurrency(adaptiveConcurrency.onSuccess());
992
+ }
833
993
  // Derive the category: thrown exceptions take precedence; otherwise
834
994
  // use whatever `_chatJSONImpl` recorded. A null result with no
835
995
  // category is the historical "parse_error" path (no closer cause).
@@ -898,8 +1058,9 @@ INFORMATION EXPOSURE (CWE-200/209) SPECIFIC:
898
1058
  * consecutive-failure circuit breaker (rate limits are transient).
899
1059
  */
900
1060
  async _chatJSONImpl(systemPrompt, userPrompt, phase = 'enrichment', retryCount = 0, rateLimitRetryCount = 0) {
901
- // Skip if LLM has been disabled due to repeated failures
902
- if (this.llmDisabled) {
1061
+ // Skip if LLM has been disabled due to repeated failures (per-file
1062
+ // breaker) or the endpoint is dead across the whole scan (#217).
1063
+ if (breakerLLMDisabled || breakerLLMProjectDead) {
903
1064
  return null;
904
1065
  }
905
1066
  // Use the correct phase config
@@ -955,13 +1116,13 @@ INFORMATION EXPOSURE (CWE-200/209) SPECIFIC:
955
1116
  // error, so retrying is just burning the failure budget. One clear
956
1117
  // diagnostic on stderr, then static-only for the rest of the run.
957
1118
  const stripped = phaseConfig.model.replace(/^[a-z]+\//, '');
958
- if (/-pro$/i.test(stripped) && !this.llmDisabled) {
1119
+ if (/-pro$/i.test(stripped) && !breakerLLMDisabled) {
959
1120
  console.error(`LLM model '${phaseConfig.model}' is not a chat-completions model ` +
960
1121
  `(OpenAI rejects */chat/completions for *-pro variants). ` +
961
1122
  `Use a chat-capable model — gpt-5-nano, gpt-4o-mini, gpt-4o, or claude-*-latest. ` +
962
1123
  `Falling back to static analysis. Use --no-llm to silence.`);
963
1124
  this.lastErrorCategory = 'http_error';
964
- this.llmDisabled = true;
1125
+ breakerLLMDisabled = true;
965
1126
  return null;
966
1127
  }
967
1128
  // All LLM requests go through the shared throttled queue.
@@ -1050,6 +1211,7 @@ INFORMATION EXPOSURE (CWE-200/209) SPECIFIC:
1050
1211
  this.lastErrorCategory = 'connection_error';
1051
1212
  }
1052
1213
  this.trackFailure();
1214
+ this.trackDeadCall(); // #217: timeout / network error = endpoint-dead
1053
1215
  return null;
1054
1216
  }
1055
1217
  if (!response.ok) {
@@ -1058,6 +1220,11 @@ INFORMATION EXPOSURE (CWE-200/209) SPECIFIC:
1058
1220
  // wrong response to throttling) and without `trackFailure`
1059
1221
  // (rate limits are transient, not endpoint failures).
1060
1222
  if (response.status === 429 && rateLimitAttempt < maxRateLimitRetries) {
1223
+ // cognium-ai#229 — AIMD: back off the shared p-queue on a 429.
1224
+ // The controller's cooldown collapses a burst of 429s into one
1225
+ // halving, so calling it per-429 here is safe. No-op in fixed mode.
1226
+ if (adaptiveConcurrency)
1227
+ applyAdaptiveConcurrency(adaptiveConcurrency.onRateLimited());
1061
1228
  const sleepMs = parseRetryAfterMs(response.headers.get('Retry-After'), rateLimitAttempt);
1062
1229
  console.error(`LLM rate limited (HTTP 429); sleeping ${sleepMs}ms before retry ${rateLimitAttempt + 1}/${maxRateLimitRetries}`);
1063
1230
  emitAttempt('rate_limited', attemptStart, {
@@ -1176,6 +1343,7 @@ INFORMATION EXPOSURE (CWE-200/209) SPECIFIC:
1176
1343
  this.lastErrorCategory = 'empty_response';
1177
1344
  emitAttempt('empty_response', attemptStart, { httpStatus: response.status });
1178
1345
  this.trackFailure();
1346
+ this.trackDeadCall(); // #217: empty body = endpoint-dead (the 60s stall)
1179
1347
  return null;
1180
1348
  }
1181
1349
  // Parse JSON from response (handle markdown code blocks)