minovative-mind-cli 2.13.1 → 2.13.2
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.
|
@@ -118,6 +118,9 @@ export class InvestigationAgentRunner {
|
|
|
118
118
|
// Tool loop — mirrors the existing context agent loop in contextAgent.ts
|
|
119
119
|
while (!crashed && !abortSignal.aborted && !isFinished) {
|
|
120
120
|
this.pingHeartbeat();
|
|
121
|
+
if (onProgress) {
|
|
122
|
+
onProgress(`[${this.agentLabel}] Thinking...`);
|
|
123
|
+
}
|
|
121
124
|
let result;
|
|
122
125
|
try {
|
|
123
126
|
result = await this.chat.sendMessage(currentMessage, undefined, abortSignal, () => this.pingHeartbeat());
|
|
@@ -244,6 +244,9 @@ export class SubAgentRunner {
|
|
|
244
244
|
try {
|
|
245
245
|
// Send initial prompt
|
|
246
246
|
const prompt = `Begin execution for task: ${this.taskId}\nObjective: ${this.intent}\n\nFollow the 3-step workflow: 1) inspect file -> 2) modify code -> 3) respond with text summary. Do not repeat search tools once results are returned.`;
|
|
247
|
+
if (this.onProgress) {
|
|
248
|
+
this.onProgress('Thinking...');
|
|
249
|
+
}
|
|
247
250
|
let turnResult = await this.chat.sendMessage(prompt, undefined, signal);
|
|
248
251
|
this.updateUsage(turnResult);
|
|
249
252
|
// Tool Loop
|
|
@@ -302,6 +305,9 @@ export class SubAgentRunner {
|
|
|
302
305
|
this.compactOlderToolResponses(1);
|
|
303
306
|
}
|
|
304
307
|
this.pingHeartbeat();
|
|
308
|
+
if (this.onProgress) {
|
|
309
|
+
this.onProgress('Thinking...');
|
|
310
|
+
}
|
|
305
311
|
// Feed tool results back to the model
|
|
306
312
|
turnResult = await this.chat.sendMessage(toolResponses, undefined, signal);
|
|
307
313
|
this.updateUsage(turnResult);
|
|
@@ -178,6 +178,15 @@ export class ProxyClient {
|
|
|
178
178
|
}
|
|
179
179
|
if (!response.ok) {
|
|
180
180
|
const errorData = await response.json().catch(() => ({}));
|
|
181
|
+
const errorMsg = JSON.stringify(errorData) || response.statusText;
|
|
182
|
+
if (errorMsg.includes('is expired') || errorMsg.includes('Cache content')) {
|
|
183
|
+
if (attempt < MAX_RETRIES) {
|
|
184
|
+
debugLog(`Gemini Context Cache expired on server. Retrying request to refresh cache (Attempt ${attempt + 1}/${MAX_RETRIES})...`);
|
|
185
|
+
await delay(500, abortSignal);
|
|
186
|
+
attempt++;
|
|
187
|
+
continue retryLoop;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
181
190
|
throw new Error(`Proxy error ${response.status}: ${errorData.error || response.statusText}`);
|
|
182
191
|
}
|
|
183
192
|
if (!response.body) {
|
|
@@ -269,6 +278,8 @@ export class ProxyClient {
|
|
|
269
278
|
err.name = 'AbortError';
|
|
270
279
|
throw err;
|
|
271
280
|
}
|
|
281
|
+
const isCacheExpired = streamError.message?.includes('is expired') ||
|
|
282
|
+
streamError.message?.includes('Cache content');
|
|
272
283
|
if (streamError.message?.includes('429') ||
|
|
273
284
|
streamError.message?.includes('502') ||
|
|
274
285
|
streamError.message?.includes('503') ||
|
|
@@ -276,13 +287,18 @@ export class ProxyClient {
|
|
|
276
287
|
streamError.message?.includes('504') ||
|
|
277
288
|
streamError.message?.includes('Bad Gateway') ||
|
|
278
289
|
streamError.message?.includes('RESOURCE_EXHAUSTED') ||
|
|
279
|
-
streamError.message?.includes('Too Many Requests')
|
|
290
|
+
streamError.message?.includes('Too Many Requests') ||
|
|
291
|
+
isCacheExpired) {
|
|
280
292
|
if (attempt < MAX_RETRIES) {
|
|
281
|
-
const exponentialDelay =
|
|
293
|
+
const exponentialDelay = isCacheExpired
|
|
294
|
+
? 500
|
|
295
|
+
: Math.min(MAX_DELAY_MS, BASE_DELAY_MS * Math.pow(2, attempt));
|
|
282
296
|
const delayTime = Math.round(exponentialDelay * (1.0 + Math.random() * 0.5));
|
|
283
297
|
if (isDebugOn()) {
|
|
284
298
|
process.stdout.write('\n');
|
|
285
|
-
console.warn(
|
|
299
|
+
console.warn(isCacheExpired
|
|
300
|
+
? `Gemini Context Cache expired on server. Refreshing and retrying in ${(delayTime / 1000).toFixed(1)}s... (Attempt ${attempt + 1}/${MAX_RETRIES})`
|
|
301
|
+
: `Server error or rate limit hit during stream. Retrying in ${(delayTime / 1000).toFixed(1)}s... (Attempt ${attempt + 1}/${MAX_RETRIES})`);
|
|
286
302
|
}
|
|
287
303
|
await delay(delayTime, abortSignal);
|
|
288
304
|
if (abortSignal?.aborted) {
|
|
@@ -400,7 +416,15 @@ export class ProxyClient {
|
|
|
400
416
|
catch {
|
|
401
417
|
// ignore parsing error
|
|
402
418
|
}
|
|
403
|
-
const errorMsg = errorData.error?.message || response.statusText;
|
|
419
|
+
const errorMsg = errorData.error?.message || JSON.stringify(errorData) || response.statusText;
|
|
420
|
+
if (errorMsg.includes('is expired') || errorMsg.includes('Cache content')) {
|
|
421
|
+
if (attempt < MAX_RETRIES) {
|
|
422
|
+
debugLog(`BYOK Gemini Context Cache expired on server. Retrying request to refresh cache (Attempt ${attempt + 1}/${MAX_RETRIES})...`);
|
|
423
|
+
await delay(500, abortSignal);
|
|
424
|
+
attempt++;
|
|
425
|
+
continue retryLoop;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
404
428
|
if (response.status === 401 ||
|
|
405
429
|
response.status === 403 ||
|
|
406
430
|
errorMsg.includes('API_KEY_INVALID') ||
|
|
@@ -484,6 +508,8 @@ export class ProxyClient {
|
|
|
484
508
|
err.name = 'AbortError';
|
|
485
509
|
throw err;
|
|
486
510
|
}
|
|
511
|
+
const isCacheExpired = streamError.message?.includes('is expired') ||
|
|
512
|
+
streamError.message?.includes('Cache content');
|
|
487
513
|
if (streamError.message?.includes('429') ||
|
|
488
514
|
streamError.message?.includes('502') ||
|
|
489
515
|
streamError.message?.includes('503') ||
|
|
@@ -491,13 +517,18 @@ export class ProxyClient {
|
|
|
491
517
|
streamError.message?.includes('504') ||
|
|
492
518
|
streamError.message?.includes('Bad Gateway') ||
|
|
493
519
|
streamError.message?.includes('RESOURCE_EXHAUSTED') ||
|
|
494
|
-
streamError.message?.includes('Too Many Requests')
|
|
520
|
+
streamError.message?.includes('Too Many Requests') ||
|
|
521
|
+
isCacheExpired) {
|
|
495
522
|
if (attempt < MAX_RETRIES) {
|
|
496
|
-
const exponentialDelay =
|
|
523
|
+
const exponentialDelay = isCacheExpired
|
|
524
|
+
? 500
|
|
525
|
+
: Math.min(MAX_DELAY_MS, BASE_DELAY_MS * Math.pow(2, attempt));
|
|
497
526
|
const delayTime = Math.round(exponentialDelay * (1.0 + Math.random() * 0.5));
|
|
498
527
|
if (isDebugOn()) {
|
|
499
528
|
process.stdout.write('\n');
|
|
500
|
-
console.warn(
|
|
529
|
+
console.warn(isCacheExpired
|
|
530
|
+
? `BYOK Gemini Context Cache expired on server. Refreshing and retrying in ${(delayTime / 1000).toFixed(1)}s... (Attempt ${attempt + 1}/${MAX_RETRIES})`
|
|
531
|
+
: `Server error or rate limit hit during BYOK stream. Retrying in ${(delayTime / 1000).toFixed(1)}s... (Attempt ${attempt + 1}/${MAX_RETRIES})`);
|
|
501
532
|
}
|
|
502
533
|
await delay(delayTime, abortSignal);
|
|
503
534
|
if (abortSignal?.aborted) {
|
package/oclif.manifest.json
CHANGED
package/package.json
CHANGED