nexus-agents 2.92.5 → 2.94.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.
- package/dist/{child-mcp-config-PIDVHWJ7.js → child-mcp-config-PPFHJZSO.js} +2 -2
- package/dist/{chunk-MBK6P4VV.js → chunk-24WC4XO2.js} +2 -2
- package/dist/{chunk-G55LVPNH.js → chunk-2YMRRZRM.js} +9 -12
- package/dist/chunk-2YMRRZRM.js.map +1 -0
- package/dist/{chunk-PIDABDFE.js → chunk-43UDRX3N.js} +9 -127
- package/dist/chunk-43UDRX3N.js.map +1 -0
- package/dist/{chunk-DNSBKQ7I.js → chunk-4QESFYGV.js} +4 -4
- package/dist/{chunk-QQMYKFG7.js → chunk-5B4VLSMP.js} +3 -3
- package/dist/{chunk-3TU3RJNK.js → chunk-5ZB3MTA7.js} +3 -3
- package/dist/{chunk-FL3AXIUL.js → chunk-63OGXDHS.js} +4 -4
- package/dist/{chunk-BG4WK4UP.js → chunk-76535ZNP.js} +15 -6
- package/dist/chunk-76535ZNP.js.map +1 -0
- package/dist/{chunk-QXGLZETS.js → chunk-77JUKFTG.js} +7 -7
- package/dist/{chunk-GKFFRRS4.js → chunk-ADRTAUJA.js} +4 -4
- package/dist/{chunk-VBIAMMZZ.js → chunk-EB43BGAR.js} +2 -2
- package/dist/{chunk-EI2E43HI.js → chunk-EDPDH5YT.js} +3 -3
- package/dist/{chunk-YQAS2EGR.js → chunk-EJR6U67L.js} +2 -2
- package/dist/{chunk-2QJJYCPD.js → chunk-FUGPKYEJ.js} +2 -2
- package/dist/{chunk-P646QQYW.js → chunk-G5EBHQ2L.js} +5 -5
- package/dist/chunk-G5EBHQ2L.js.map +1 -0
- package/dist/{chunk-YJUHVQSG.js → chunk-GMZDRTVJ.js} +20 -3
- package/dist/chunk-GMZDRTVJ.js.map +1 -0
- package/dist/{chunk-U4RLBLNO.js → chunk-KSJPDQSG.js} +2 -2
- package/dist/{chunk-DSERRMPX.js → chunk-L7I55FAN.js} +2 -2
- package/dist/{chunk-OXLXVSN3.js → chunk-LCLVSNST.js} +2 -2
- package/dist/{chunk-VU54VB6K.js → chunk-OKGHHCS5.js} +3 -3
- package/dist/{chunk-DQEREDUW.js → chunk-OSSGG7KW.js} +2 -2
- package/dist/{chunk-L5BXCSMP.js → chunk-OT6V5ROA.js} +406 -16
- package/dist/chunk-OT6V5ROA.js.map +1 -0
- package/dist/{chunk-TOQJ3UN5.js → chunk-Q3NUA7CW.js} +3 -3
- package/dist/{chunk-QADQ4LN4.js → chunk-R2NKJPUX.js} +2 -2
- package/dist/{chunk-WXEMTPML.js → chunk-ROAANOOB.js} +2 -2
- package/dist/{chunk-NYWZI46K.js → chunk-TNBWHOPY.js} +52 -132
- package/dist/chunk-TNBWHOPY.js.map +1 -0
- package/dist/{chunk-KTJUMU2A.js → chunk-UC3PVIN4.js} +179 -48
- package/dist/chunk-UC3PVIN4.js.map +1 -0
- package/dist/{chunk-ZYYU26YH.js → chunk-XBPFVWA2.js} +2 -2
- package/dist/{chunk-SIICMKBA.js → chunk-YDXGYKZJ.js} +2 -2
- package/dist/chunk-YDXGYKZJ.js.map +1 -0
- package/dist/{chunk-3XC5LFWH.js → chunk-ZY2EMD72.js} +5 -5
- package/dist/{cli-circuit-breaker-HFSOBCPK.js → cli-circuit-breaker-BAERQZ3H.js} +4 -4
- package/dist/cli.js +135 -38
- package/dist/cli.js.map +1 -1
- package/dist/{composite-router-T2XYCQOU.js → composite-router-EONKFRDD.js} +2 -2
- package/dist/{consensus-vote-IDHQVKX2.js → consensus-vote-TO5575P3.js} +12 -12
- package/dist/{context-retriever-5BJYPAX7.js → context-retriever-JM564MOV.js} +6 -6
- package/dist/{doctor-deep-OVGRBG3Z.js → doctor-deep-VFBQ7TY4.js} +3 -3
- package/dist/{expert-bridge-JPTHFWPW.js → expert-bridge-OXME7FES.js} +4 -4
- package/dist/{factory-734UWF4C.js → factory-FVZLVIYH.js} +5 -5
- package/dist/{factory-NE7SNW7V.js → factory-MDT5CFA5.js} +5 -5
- package/dist/index.d.ts +240 -189
- package/dist/index.js +198 -55
- package/dist/index.js.map +1 -1
- package/dist/{init-opencode-2ZBDJILW.js → init-opencode-Y6XKR6WS.js} +5 -5
- package/dist/{issue-triage-AGGTH767.js → issue-triage-2XVD4JQ7.js} +5 -5
- package/dist/{pr-reviewer-helpers-WGPLUXPU.js → pr-reviewer-helpers-JLWEQIN6.js} +4 -4
- package/dist/{registry-command-CZZM5SF2.js → registry-command-FYVOMCBG.js} +2 -2
- package/dist/{repo-security-plan-X42KXHT2.js → repo-security-plan-JRDHWI2R.js} +3 -3
- package/dist/{research-helpers-synthesize-C7YGRQI6.js → research-helpers-synthesize-F7L7M7FJ.js} +3 -3
- package/dist/{routing-memory-2FYZDQUC.js → routing-memory-JAV2ICXR.js} +2 -2
- package/dist/{session-memory-53NZRZB6.js → session-memory-2XAGY3PX.js} +3 -3
- package/dist/{setup-command-ZV6VZLP4.js → setup-command-6WVEOE4Q.js} +11 -11
- package/dist/{setup-config-CYRK4UFF.js → setup-config-KUZU2GFI.js} +3 -3
- package/dist/{setup-custom-api-GXHPYLDR.js → setup-custom-api-3M7CU3TF.js} +4 -4
- package/dist/{tool-memory-AX5G67J6.js → tool-memory-YWX4FTIQ.js} +5 -5
- package/dist/{weather-report-AUMNGHYZ.js → weather-report-ZZM5EU7N.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-BG4WK4UP.js.map +0 -1
- package/dist/chunk-G55LVPNH.js.map +0 -1
- package/dist/chunk-KTJUMU2A.js.map +0 -1
- package/dist/chunk-L5BXCSMP.js.map +0 -1
- package/dist/chunk-NYWZI46K.js.map +0 -1
- package/dist/chunk-P646QQYW.js.map +0 -1
- package/dist/chunk-PIDABDFE.js.map +0 -1
- package/dist/chunk-SIICMKBA.js.map +0 -1
- package/dist/chunk-YJUHVQSG.js.map +0 -1
- /package/dist/{child-mcp-config-PIDVHWJ7.js.map → child-mcp-config-PPFHJZSO.js.map} +0 -0
- /package/dist/{chunk-MBK6P4VV.js.map → chunk-24WC4XO2.js.map} +0 -0
- /package/dist/{chunk-DNSBKQ7I.js.map → chunk-4QESFYGV.js.map} +0 -0
- /package/dist/{chunk-QQMYKFG7.js.map → chunk-5B4VLSMP.js.map} +0 -0
- /package/dist/{chunk-3TU3RJNK.js.map → chunk-5ZB3MTA7.js.map} +0 -0
- /package/dist/{chunk-FL3AXIUL.js.map → chunk-63OGXDHS.js.map} +0 -0
- /package/dist/{chunk-QXGLZETS.js.map → chunk-77JUKFTG.js.map} +0 -0
- /package/dist/{chunk-GKFFRRS4.js.map → chunk-ADRTAUJA.js.map} +0 -0
- /package/dist/{chunk-VBIAMMZZ.js.map → chunk-EB43BGAR.js.map} +0 -0
- /package/dist/{chunk-EI2E43HI.js.map → chunk-EDPDH5YT.js.map} +0 -0
- /package/dist/{chunk-YQAS2EGR.js.map → chunk-EJR6U67L.js.map} +0 -0
- /package/dist/{chunk-2QJJYCPD.js.map → chunk-FUGPKYEJ.js.map} +0 -0
- /package/dist/{chunk-U4RLBLNO.js.map → chunk-KSJPDQSG.js.map} +0 -0
- /package/dist/{chunk-DSERRMPX.js.map → chunk-L7I55FAN.js.map} +0 -0
- /package/dist/{chunk-OXLXVSN3.js.map → chunk-LCLVSNST.js.map} +0 -0
- /package/dist/{chunk-VU54VB6K.js.map → chunk-OKGHHCS5.js.map} +0 -0
- /package/dist/{chunk-DQEREDUW.js.map → chunk-OSSGG7KW.js.map} +0 -0
- /package/dist/{chunk-TOQJ3UN5.js.map → chunk-Q3NUA7CW.js.map} +0 -0
- /package/dist/{chunk-QADQ4LN4.js.map → chunk-R2NKJPUX.js.map} +0 -0
- /package/dist/{chunk-WXEMTPML.js.map → chunk-ROAANOOB.js.map} +0 -0
- /package/dist/{chunk-ZYYU26YH.js.map → chunk-XBPFVWA2.js.map} +0 -0
- /package/dist/{chunk-3XC5LFWH.js.map → chunk-ZY2EMD72.js.map} +0 -0
- /package/dist/{cli-circuit-breaker-HFSOBCPK.js.map → cli-circuit-breaker-BAERQZ3H.js.map} +0 -0
- /package/dist/{composite-router-T2XYCQOU.js.map → composite-router-EONKFRDD.js.map} +0 -0
- /package/dist/{consensus-vote-IDHQVKX2.js.map → consensus-vote-TO5575P3.js.map} +0 -0
- /package/dist/{context-retriever-5BJYPAX7.js.map → context-retriever-JM564MOV.js.map} +0 -0
- /package/dist/{doctor-deep-OVGRBG3Z.js.map → doctor-deep-VFBQ7TY4.js.map} +0 -0
- /package/dist/{expert-bridge-JPTHFWPW.js.map → expert-bridge-OXME7FES.js.map} +0 -0
- /package/dist/{factory-734UWF4C.js.map → factory-FVZLVIYH.js.map} +0 -0
- /package/dist/{factory-NE7SNW7V.js.map → factory-MDT5CFA5.js.map} +0 -0
- /package/dist/{init-opencode-2ZBDJILW.js.map → init-opencode-Y6XKR6WS.js.map} +0 -0
- /package/dist/{issue-triage-AGGTH767.js.map → issue-triage-2XVD4JQ7.js.map} +0 -0
- /package/dist/{pr-reviewer-helpers-WGPLUXPU.js.map → pr-reviewer-helpers-JLWEQIN6.js.map} +0 -0
- /package/dist/{registry-command-CZZM5SF2.js.map → registry-command-FYVOMCBG.js.map} +0 -0
- /package/dist/{repo-security-plan-X42KXHT2.js.map → repo-security-plan-JRDHWI2R.js.map} +0 -0
- /package/dist/{research-helpers-synthesize-C7YGRQI6.js.map → research-helpers-synthesize-F7L7M7FJ.js.map} +0 -0
- /package/dist/{routing-memory-2FYZDQUC.js.map → routing-memory-JAV2ICXR.js.map} +0 -0
- /package/dist/{session-memory-53NZRZB6.js.map → session-memory-2XAGY3PX.js.map} +0 -0
- /package/dist/{setup-command-ZV6VZLP4.js.map → setup-command-6WVEOE4Q.js.map} +0 -0
- /package/dist/{setup-config-CYRK4UFF.js.map → setup-config-KUZU2GFI.js.map} +0 -0
- /package/dist/{setup-custom-api-GXHPYLDR.js.map → setup-custom-api-3M7CU3TF.js.map} +0 -0
- /package/dist/{tool-memory-AX5G67J6.js.map → tool-memory-YWX4FTIQ.js.map} +0 -0
- /package/dist/{weather-report-AUMNGHYZ.js.map → weather-report-ZZM5EU7N.js.map} +0 -0
|
@@ -335,6 +335,238 @@ function extractJsonObject(text) {
|
|
|
335
335
|
return text.slice(start, end + 1);
|
|
336
336
|
}
|
|
337
337
|
|
|
338
|
+
// src/core/circular-buffer.ts
|
|
339
|
+
var CircularBuffer = class {
|
|
340
|
+
/**
|
|
341
|
+
* Creates a new circular buffer with the specified capacity.
|
|
342
|
+
*
|
|
343
|
+
* @param capacity - Maximum number of items to store
|
|
344
|
+
* @throws Error if capacity is less than 1
|
|
345
|
+
*/
|
|
346
|
+
constructor(capacity) {
|
|
347
|
+
this.capacity = capacity;
|
|
348
|
+
if (capacity < 1) {
|
|
349
|
+
throw new Error("CircularBuffer capacity must be at least 1");
|
|
350
|
+
}
|
|
351
|
+
this.buffer = new Array(capacity);
|
|
352
|
+
}
|
|
353
|
+
buffer;
|
|
354
|
+
head = 0;
|
|
355
|
+
// Points to oldest item (or next write position when empty)
|
|
356
|
+
tail = 0;
|
|
357
|
+
// Points to next write position
|
|
358
|
+
_size = 0;
|
|
359
|
+
/**
|
|
360
|
+
* Returns the number of items currently in the buffer.
|
|
361
|
+
*/
|
|
362
|
+
get size() {
|
|
363
|
+
return this._size;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Returns true if the buffer is empty.
|
|
367
|
+
*/
|
|
368
|
+
get isEmpty() {
|
|
369
|
+
return this._size === 0;
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Returns true if the buffer is at capacity.
|
|
373
|
+
*/
|
|
374
|
+
get isFull() {
|
|
375
|
+
return this._size === this.capacity;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Adds an item to the buffer.
|
|
379
|
+
*
|
|
380
|
+
* If the buffer is full, the oldest item is overwritten.
|
|
381
|
+
* This operation is O(1).
|
|
382
|
+
*
|
|
383
|
+
* @param item - Item to add
|
|
384
|
+
*/
|
|
385
|
+
push(item) {
|
|
386
|
+
this.buffer[this.tail] = item;
|
|
387
|
+
this.tail = (this.tail + 1) % this.capacity;
|
|
388
|
+
if (this._size < this.capacity) {
|
|
389
|
+
this._size++;
|
|
390
|
+
} else {
|
|
391
|
+
this.head = (this.head + 1) % this.capacity;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Removes all items from the buffer.
|
|
396
|
+
* This operation is O(n) to allow garbage collection of items.
|
|
397
|
+
*/
|
|
398
|
+
clear() {
|
|
399
|
+
for (let i = 0; i < this.capacity; i++) {
|
|
400
|
+
this.buffer[i] = void 0;
|
|
401
|
+
}
|
|
402
|
+
this.head = 0;
|
|
403
|
+
this.tail = 0;
|
|
404
|
+
this._size = 0;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Returns all items in insertion order (oldest to newest).
|
|
408
|
+
* This operation is O(n) where n is the number of items.
|
|
409
|
+
*
|
|
410
|
+
* @returns Array of items in insertion order
|
|
411
|
+
*/
|
|
412
|
+
toArray() {
|
|
413
|
+
if (this._size === 0) {
|
|
414
|
+
return [];
|
|
415
|
+
}
|
|
416
|
+
const result = [];
|
|
417
|
+
let readIndex = this.head;
|
|
418
|
+
for (let i = 0; i < this._size; i++) {
|
|
419
|
+
result.push(this.buffer[readIndex]);
|
|
420
|
+
readIndex = (readIndex + 1) % this.capacity;
|
|
421
|
+
}
|
|
422
|
+
return result;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Iterates over items in insertion order (oldest to newest).
|
|
426
|
+
*/
|
|
427
|
+
*[Symbol.iterator]() {
|
|
428
|
+
let readIndex = this.head;
|
|
429
|
+
for (let i = 0; i < this._size; i++) {
|
|
430
|
+
yield this.buffer[readIndex];
|
|
431
|
+
readIndex = (readIndex + 1) % this.capacity;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Returns the most recently added item, or undefined if empty.
|
|
436
|
+
* This operation is O(1).
|
|
437
|
+
*/
|
|
438
|
+
peekNewest() {
|
|
439
|
+
if (this._size === 0) {
|
|
440
|
+
return void 0;
|
|
441
|
+
}
|
|
442
|
+
const newestIndex = (this.tail - 1 + this.capacity) % this.capacity;
|
|
443
|
+
return this.buffer[newestIndex];
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Returns the oldest item in the buffer, or undefined if empty.
|
|
447
|
+
* This operation is O(1).
|
|
448
|
+
*/
|
|
449
|
+
peekOldest() {
|
|
450
|
+
if (this._size === 0) {
|
|
451
|
+
return void 0;
|
|
452
|
+
}
|
|
453
|
+
return this.buffer[this.head];
|
|
454
|
+
}
|
|
455
|
+
};
|
|
456
|
+
|
|
457
|
+
// src/core/bounded-lru-cache.ts
|
|
458
|
+
var BoundedLRUCache = class {
|
|
459
|
+
/**
|
|
460
|
+
* @param capacity Maximum entries retained before LRU eviction (>= 1).
|
|
461
|
+
* @throws Error if capacity < 1.
|
|
462
|
+
*/
|
|
463
|
+
constructor(capacity) {
|
|
464
|
+
this.capacity = capacity;
|
|
465
|
+
if (capacity < 1) {
|
|
466
|
+
throw new Error("BoundedLRUCache capacity must be at least 1");
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
entries = /* @__PURE__ */ new Map();
|
|
470
|
+
/** Number of entries currently held. */
|
|
471
|
+
get size() {
|
|
472
|
+
return this.entries.size;
|
|
473
|
+
}
|
|
474
|
+
/** True if `key` is present (does not affect recency). */
|
|
475
|
+
has(key) {
|
|
476
|
+
return this.entries.has(key);
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Get the value for `key`, or undefined. Side effect: bumps `key` to
|
|
480
|
+
* most-recently-used.
|
|
481
|
+
*/
|
|
482
|
+
get(key) {
|
|
483
|
+
const value = this.entries.get(key);
|
|
484
|
+
if (value === void 0 && !this.entries.has(key)) return void 0;
|
|
485
|
+
this.entries.delete(key);
|
|
486
|
+
this.entries.set(key, value);
|
|
487
|
+
return value;
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
490
|
+
* Store `value` under `key`, bumping recency. Evicts the least-recently-used
|
|
491
|
+
* entry when at capacity.
|
|
492
|
+
*/
|
|
493
|
+
set(key, value) {
|
|
494
|
+
if (this.entries.has(key)) {
|
|
495
|
+
this.entries.delete(key);
|
|
496
|
+
} else if (this.entries.size >= this.capacity) {
|
|
497
|
+
const oldest = this.entries.keys().next().value;
|
|
498
|
+
if (oldest !== void 0) this.entries.delete(oldest);
|
|
499
|
+
}
|
|
500
|
+
this.entries.set(key, value);
|
|
501
|
+
}
|
|
502
|
+
/** Remove `key`. Returns true if it was present. */
|
|
503
|
+
delete(key) {
|
|
504
|
+
return this.entries.delete(key);
|
|
505
|
+
}
|
|
506
|
+
/** Remove all entries. */
|
|
507
|
+
clear() {
|
|
508
|
+
this.entries.clear();
|
|
509
|
+
}
|
|
510
|
+
};
|
|
511
|
+
|
|
512
|
+
// src/core/tune-adjustment-store.ts
|
|
513
|
+
var TUNE_DEMOTION_FLOOR = 0.5;
|
|
514
|
+
var TUNE_MAX_STEP = 0.2;
|
|
515
|
+
var TUNE_DECAY_WINDOW_MS = 30 * 6e4;
|
|
516
|
+
var TuneAdjustmentStore = class {
|
|
517
|
+
adjustments = /* @__PURE__ */ new Map();
|
|
518
|
+
/**
|
|
519
|
+
* Apply a bounded demotion to `cli`. `magnitude` is the requested reduction
|
|
520
|
+
* (capped to {@link TUNE_MAX_STEP}); compounds on any current (decayed) value
|
|
521
|
+
* but never below {@link TUNE_DEMOTION_FLOOR}. Non-positive magnitudes are a
|
|
522
|
+
* no-op. Returns the resulting adjustment (or undefined for a no-op).
|
|
523
|
+
*/
|
|
524
|
+
demote(cli, magnitude, reason) {
|
|
525
|
+
if (magnitude <= 0) return void 0;
|
|
526
|
+
const step = Math.min(TUNE_MAX_STEP, magnitude);
|
|
527
|
+
const current = this.effectiveMultiplier(cli);
|
|
528
|
+
const next = Math.max(TUNE_DEMOTION_FLOOR, current - step);
|
|
529
|
+
const adjustment = {
|
|
530
|
+
cli,
|
|
531
|
+
multiplier: next,
|
|
532
|
+
appliedAt: getTimeProvider().now(),
|
|
533
|
+
reason
|
|
534
|
+
};
|
|
535
|
+
this.adjustments.set(cli, adjustment);
|
|
536
|
+
return adjustment;
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Current effective multiplier for `cli` — the stored multiplier decayed
|
|
540
|
+
* linearly back toward 1.0 over {@link TUNE_DECAY_WINDOW_MS}. Returns 1.0
|
|
541
|
+
* (no effect) when there is no active adjustment. Fully-decayed entries are
|
|
542
|
+
* evicted lazily.
|
|
543
|
+
*/
|
|
544
|
+
effectiveMultiplier(cli) {
|
|
545
|
+
const adjustment = this.adjustments.get(cli);
|
|
546
|
+
if (adjustment === void 0) return 1;
|
|
547
|
+
const elapsed = getTimeProvider().now() - adjustment.appliedAt;
|
|
548
|
+
if (elapsed >= TUNE_DECAY_WINDOW_MS || elapsed < 0) {
|
|
549
|
+
this.adjustments.delete(cli);
|
|
550
|
+
return 1;
|
|
551
|
+
}
|
|
552
|
+
const decayFraction = elapsed / TUNE_DECAY_WINDOW_MS;
|
|
553
|
+
return adjustment.multiplier + (1 - adjustment.multiplier) * decayFraction;
|
|
554
|
+
}
|
|
555
|
+
/** Snapshot of active (non-evicted) adjustments — for observability/audit. */
|
|
556
|
+
list() {
|
|
557
|
+
return [...this.adjustments.values()];
|
|
558
|
+
}
|
|
559
|
+
/** Remove all adjustments. */
|
|
560
|
+
clear() {
|
|
561
|
+
this.adjustments.clear();
|
|
562
|
+
}
|
|
563
|
+
};
|
|
564
|
+
var singleton;
|
|
565
|
+
function getTuneAdjustmentStore() {
|
|
566
|
+
singleton ??= new TuneAdjustmentStore();
|
|
567
|
+
return singleton;
|
|
568
|
+
}
|
|
569
|
+
|
|
338
570
|
// src/core/step-events.ts
|
|
339
571
|
var STEP_SUMMARY_MAX_LEN = 120;
|
|
340
572
|
function truncateSummary(s) {
|
|
@@ -8178,18 +8410,18 @@ function groupBy(outcomes, keyFn) {
|
|
|
8178
8410
|
var logger7 = createLogger({ component: "EventBus" });
|
|
8179
8411
|
var DEFAULT_MAX_BUFFER = 1e4;
|
|
8180
8412
|
var EventBus = class {
|
|
8181
|
-
buffer
|
|
8182
|
-
maxBuffer;
|
|
8413
|
+
buffer;
|
|
8183
8414
|
subs = [];
|
|
8184
8415
|
emitCount = 0;
|
|
8185
8416
|
constructor(options) {
|
|
8186
|
-
|
|
8417
|
+
const maxBuffer = Math.max(1, options?.maxBufferSize ?? DEFAULT_MAX_BUFFER);
|
|
8418
|
+
this.buffer = new CircularBuffer(maxBuffer);
|
|
8187
8419
|
}
|
|
8188
8420
|
get totalEmitted() {
|
|
8189
8421
|
return this.emitCount;
|
|
8190
8422
|
}
|
|
8191
8423
|
get bufferSize() {
|
|
8192
|
-
return this.buffer.
|
|
8424
|
+
return this.buffer.size;
|
|
8193
8425
|
}
|
|
8194
8426
|
/** Number of active subscriptions (for observability/testing). */
|
|
8195
8427
|
get subscriptionCount() {
|
|
@@ -8209,7 +8441,7 @@ var EventBus = class {
|
|
|
8209
8441
|
};
|
|
8210
8442
|
}
|
|
8211
8443
|
query(filter, limit) {
|
|
8212
|
-
let results = this.buffer.filter((e) => matchesFilter(e, filter));
|
|
8444
|
+
let results = this.buffer.toArray().filter((e) => matchesFilter(e, filter));
|
|
8213
8445
|
if (limit !== void 0) {
|
|
8214
8446
|
results = results.slice(0, limit);
|
|
8215
8447
|
}
|
|
@@ -8219,9 +8451,6 @@ var EventBus = class {
|
|
|
8219
8451
|
// Internal
|
|
8220
8452
|
// ==========================================================================
|
|
8221
8453
|
addToBuffer(event) {
|
|
8222
|
-
if (this.buffer.length >= this.maxBuffer) {
|
|
8223
|
-
this.buffer.shift();
|
|
8224
|
-
}
|
|
8225
8454
|
this.buffer.push(event);
|
|
8226
8455
|
}
|
|
8227
8456
|
notifySubscribers(event) {
|
|
@@ -8669,6 +8898,130 @@ async function fetchCapacityData(adapters) {
|
|
|
8669
8898
|
return result;
|
|
8670
8899
|
}
|
|
8671
8900
|
|
|
8901
|
+
// src/config/defaults-env.ts
|
|
8902
|
+
function parseIntEnv(envKey, fallback) {
|
|
8903
|
+
const envValue = process.env[envKey];
|
|
8904
|
+
if (envValue === void 0) {
|
|
8905
|
+
return fallback;
|
|
8906
|
+
}
|
|
8907
|
+
const parsed = parseInt(envValue, 10);
|
|
8908
|
+
return isNaN(parsed) || parsed <= 0 ? fallback : parsed;
|
|
8909
|
+
}
|
|
8910
|
+
function parseFloatEnv(envKey, fallback) {
|
|
8911
|
+
const envValue = process.env[envKey];
|
|
8912
|
+
if (envValue === void 0) {
|
|
8913
|
+
return fallback;
|
|
8914
|
+
}
|
|
8915
|
+
const parsed = parseFloat(envValue);
|
|
8916
|
+
return isNaN(parsed) || !isFinite(parsed) ? fallback : parsed;
|
|
8917
|
+
}
|
|
8918
|
+
function parseBoolEnv(envKey, fallback) {
|
|
8919
|
+
const envValue = process.env[envKey]?.toLowerCase();
|
|
8920
|
+
if (envValue === void 0) {
|
|
8921
|
+
return fallback;
|
|
8922
|
+
}
|
|
8923
|
+
if (envValue === "true" || envValue === "1") return true;
|
|
8924
|
+
if (envValue === "false" || envValue === "0") return false;
|
|
8925
|
+
return fallback;
|
|
8926
|
+
}
|
|
8927
|
+
function createGetTimeout(timeoutDefaults) {
|
|
8928
|
+
return (key) => {
|
|
8929
|
+
const envKey = `NEXUS_TIMEOUT_${key.replace(/Ms$/, "").toUpperCase()}`;
|
|
8930
|
+
return parseIntEnv(envKey, timeoutDefaults[key]);
|
|
8931
|
+
};
|
|
8932
|
+
}
|
|
8933
|
+
function createGetRetryConfig(retryDefaults) {
|
|
8934
|
+
return () => {
|
|
8935
|
+
return {
|
|
8936
|
+
maxRetries: parseIntEnv("NEXUS_RETRY_MAX_RETRIES", retryDefaults.maxRetries),
|
|
8937
|
+
baseDelayMs: parseIntEnv("NEXUS_RETRY_BASE_DELAY", retryDefaults.baseDelayMs),
|
|
8938
|
+
maxDelayMs: parseIntEnv("NEXUS_RETRY_MAX_DELAY", retryDefaults.maxDelayMs),
|
|
8939
|
+
jitterFactor: parseFloatEnv("NEXUS_RETRY_JITTER", retryDefaults.jitterFactor)
|
|
8940
|
+
};
|
|
8941
|
+
};
|
|
8942
|
+
}
|
|
8943
|
+
function createGetRateLimitConfig(rateLimitDefaults) {
|
|
8944
|
+
return () => {
|
|
8945
|
+
return {
|
|
8946
|
+
requestsPerMinute: parseIntEnv("NEXUS_RATE_LIMIT_RPM", rateLimitDefaults.requestsPerMinute),
|
|
8947
|
+
enabled: parseBoolEnv("NEXUS_RATE_LIMIT_ENABLED", rateLimitDefaults.enabled),
|
|
8948
|
+
maxConcurrent: parseIntEnv(
|
|
8949
|
+
"NEXUS_RATE_LIMIT_MAX_CONCURRENT",
|
|
8950
|
+
rateLimitDefaults.maxConcurrent
|
|
8951
|
+
),
|
|
8952
|
+
capacity: parseIntEnv("NEXUS_RATE_LIMIT_CAPACITY", rateLimitDefaults.capacity),
|
|
8953
|
+
refillRate: parseIntEnv("NEXUS_RATE_LIMIT_REFILL_RATE", rateLimitDefaults.refillRate),
|
|
8954
|
+
refillIntervalMs: parseIntEnv(
|
|
8955
|
+
"NEXUS_RATE_LIMIT_REFILL_INTERVAL",
|
|
8956
|
+
rateLimitDefaults.refillIntervalMs
|
|
8957
|
+
)
|
|
8958
|
+
};
|
|
8959
|
+
};
|
|
8960
|
+
}
|
|
8961
|
+
function createGetCircuitBreakerConfig(cbDefaults) {
|
|
8962
|
+
return () => {
|
|
8963
|
+
return {
|
|
8964
|
+
failureThreshold: parseIntEnv("NEXUS_CIRCUIT_BREAKER_THRESHOLD", cbDefaults.failureThreshold),
|
|
8965
|
+
resetTimeoutMs: parseIntEnv("NEXUS_CIRCUIT_BREAKER_RESET_TIMEOUT", cbDefaults.resetTimeoutMs),
|
|
8966
|
+
halfOpenSuccessThreshold: cbDefaults.halfOpenSuccessThreshold,
|
|
8967
|
+
countTimeoutsAsFailures: cbDefaults.countTimeoutsAsFailures,
|
|
8968
|
+
countAuthFailuresAsFailures: cbDefaults.countAuthFailuresAsFailures,
|
|
8969
|
+
countRateLimitsAsFailures: cbDefaults.countRateLimitsAsFailures,
|
|
8970
|
+
halfOpenMaxRequests: cbDefaults.halfOpenMaxRequests
|
|
8971
|
+
};
|
|
8972
|
+
};
|
|
8973
|
+
}
|
|
8974
|
+
function createGetToolRateLimit(toolRateLimits) {
|
|
8975
|
+
return (tool) => {
|
|
8976
|
+
return toolRateLimits[tool];
|
|
8977
|
+
};
|
|
8978
|
+
}
|
|
8979
|
+
function createGetEnvVarDocumentation(defaults) {
|
|
8980
|
+
return () => {
|
|
8981
|
+
const t = defaults.TIMEOUT_DEFAULTS;
|
|
8982
|
+
const r = defaults.RATE_LIMIT_DEFAULTS;
|
|
8983
|
+
const rt = defaults.RETRY_DEFAULTS;
|
|
8984
|
+
const cb = defaults.CIRCUIT_BREAKER_DEFAULTS;
|
|
8985
|
+
return `# Environment Variable Overrides
|
|
8986
|
+
|
|
8987
|
+
All defaults can be overridden via environment variables using the NEXUS_ prefix.
|
|
8988
|
+
|
|
8989
|
+
## Timeouts
|
|
8990
|
+
|
|
8991
|
+
| Variable | Default | Description |
|
|
8992
|
+
| -------- | ------- | ----------- |
|
|
8993
|
+
| NEXUS_TIMEOUT_CLI | ${String(t.cliMs)} | CLI execution timeout (ms) |
|
|
8994
|
+
| NEXUS_TIMEOUT_API | ${String(t.apiMs)} | API request timeout (ms) |
|
|
8995
|
+
| NEXUS_TIMEOUT_WORKFLOW | ${String(t.workflowMs)} | Workflow timeout (ms) |
|
|
8996
|
+
| NEXUS_TIMEOUT_MCP | ${String(t.mcpMs)} | MCP operation timeout (ms) |
|
|
8997
|
+
|
|
8998
|
+
## Rate Limits
|
|
8999
|
+
|
|
9000
|
+
| Variable | Default | Description |
|
|
9001
|
+
| -------- | ------- | ----------- |
|
|
9002
|
+
| NEXUS_RATE_LIMIT_RPM | ${String(r.requestsPerMinute)} | Requests per minute |
|
|
9003
|
+
| NEXUS_RATE_LIMIT_ENABLED | ${String(r.enabled)} | Enable rate limiting |
|
|
9004
|
+
| NEXUS_RATE_LIMIT_CAPACITY | ${String(r.capacity)} | Token bucket capacity |
|
|
9005
|
+
|
|
9006
|
+
## Retries
|
|
9007
|
+
|
|
9008
|
+
| Variable | Default | Description |
|
|
9009
|
+
| -------- | ------- | ----------- |
|
|
9010
|
+
| NEXUS_RETRY_MAX_RETRIES | ${String(rt.maxRetries)} | Maximum retry attempts |
|
|
9011
|
+
| NEXUS_RETRY_BASE_DELAY | ${String(rt.baseDelayMs)} | Base delay (ms) |
|
|
9012
|
+
| NEXUS_RETRY_MAX_DELAY | ${String(rt.maxDelayMs)} | Maximum delay (ms) |
|
|
9013
|
+
| NEXUS_RETRY_JITTER | ${String(rt.jitterFactor)} | Jitter factor (0-1) |
|
|
9014
|
+
|
|
9015
|
+
## Circuit Breaker
|
|
9016
|
+
|
|
9017
|
+
| Variable | Default | Description |
|
|
9018
|
+
| -------- | ------- | ----------- |
|
|
9019
|
+
| NEXUS_CIRCUIT_BREAKER_THRESHOLD | ${String(cb.failureThreshold)} | Failure threshold |
|
|
9020
|
+
| NEXUS_CIRCUIT_BREAKER_RESET_TIMEOUT | ${String(cb.resetTimeoutMs)} | Reset timeout (ms) |
|
|
9021
|
+
`;
|
|
9022
|
+
};
|
|
9023
|
+
}
|
|
9024
|
+
|
|
8672
9025
|
// src/mcp/tools/weather-report-types.ts
|
|
8673
9026
|
import { z as z12 } from "zod";
|
|
8674
9027
|
var WeatherReportInputSchema = z12.object({
|
|
@@ -10474,7 +10827,7 @@ async function runScoringStages(task, candidates, stagesExecuted, deps) {
|
|
|
10474
10827
|
candidates: filtered
|
|
10475
10828
|
};
|
|
10476
10829
|
}
|
|
10477
|
-
function aggregateStageScores(scoring, taskContent) {
|
|
10830
|
+
function aggregateStageScores(scoring, taskContent, candidates) {
|
|
10478
10831
|
const weatherScores = getWeatherBonusForTask(taskContent);
|
|
10479
10832
|
return mergeScoreMaps(
|
|
10480
10833
|
scoring.cascadeResult.scores,
|
|
@@ -10482,9 +10835,23 @@ function aggregateStageScores(scoring, taskContent) {
|
|
|
10482
10835
|
scoring.knnResult.scores,
|
|
10483
10836
|
scoring.distilledResult.scores,
|
|
10484
10837
|
scoring.resourceResult.scores,
|
|
10485
|
-
weatherScores
|
|
10838
|
+
weatherScores,
|
|
10839
|
+
getTuneAdjustmentScores(candidates)
|
|
10486
10840
|
);
|
|
10487
10841
|
}
|
|
10842
|
+
var TUNE_ENFORCE_ENV = "NEXUS_TUNE_ENFORCE";
|
|
10843
|
+
function getTuneAdjustmentScores(candidates) {
|
|
10844
|
+
const scores = /* @__PURE__ */ new Map();
|
|
10845
|
+
if (!parseBoolEnv(TUNE_ENFORCE_ENV, false)) return scores;
|
|
10846
|
+
const store = getTuneAdjustmentStore();
|
|
10847
|
+
for (const cli of candidates) {
|
|
10848
|
+
const multiplier = store.effectiveMultiplier(cli);
|
|
10849
|
+
if (multiplier < 1) {
|
|
10850
|
+
scores.set(cli, -(1 - multiplier) * 10);
|
|
10851
|
+
}
|
|
10852
|
+
}
|
|
10853
|
+
return scores;
|
|
10854
|
+
}
|
|
10488
10855
|
function getWeatherBonusForTask(taskContent) {
|
|
10489
10856
|
try {
|
|
10490
10857
|
const match = detectTaskCategory(taskContent);
|
|
@@ -10562,7 +10929,7 @@ async function runPipeline(task, taskProfile, stagesExecuted, cliNames, deps) {
|
|
|
10562
10929
|
const overrideResult = applyCategoryOverride(task, candidates, stagesExecuted);
|
|
10563
10930
|
if (!overrideResult.ok) return overrideResult;
|
|
10564
10931
|
candidates = overrideResult.value;
|
|
10565
|
-
const stageScores = aggregateStageScores(scoring, task.content);
|
|
10932
|
+
const stageScores = aggregateStageScores(scoring, task.content, candidates);
|
|
10566
10933
|
const topsisOpts = {
|
|
10567
10934
|
performanceData: getPerformanceDataForCategory(task.content)
|
|
10568
10935
|
};
|
|
@@ -10707,13 +11074,26 @@ function hasMinimumPreferenceData(deps) {
|
|
|
10707
11074
|
}
|
|
10708
11075
|
var QUALITY_HISTORY_LIMIT = 20;
|
|
10709
11076
|
var MAX_LATENCY_MS = 3e4;
|
|
11077
|
+
var QUALITY_RATE_CACHE_TTL_MS = 15e3;
|
|
11078
|
+
var qualityRateCache = /* @__PURE__ */ new Map();
|
|
11079
|
+
function getCachedCliSuccessRate(cli) {
|
|
11080
|
+
const now = getTimeProvider().now();
|
|
11081
|
+
const cached = qualityRateCache.get(cli);
|
|
11082
|
+
if (cached !== void 0 && now - cached.computedAt < QUALITY_RATE_CACHE_TTL_MS) {
|
|
11083
|
+
return cached.rate;
|
|
11084
|
+
}
|
|
11085
|
+
const recent = getOutcomeStore().query({ cli, limit: QUALITY_HISTORY_LIMIT });
|
|
11086
|
+
if (recent.length === 0) return void 0;
|
|
11087
|
+
const rate = recent.filter((o) => o.success).length / recent.length;
|
|
11088
|
+
qualityRateCache.set(cli, { rate, computedAt: now });
|
|
11089
|
+
return rate;
|
|
11090
|
+
}
|
|
10710
11091
|
function computeQualityReward(cli, success, durationMs2) {
|
|
10711
11092
|
if (!success) return 0.1;
|
|
10712
11093
|
let reward = 0.5;
|
|
10713
11094
|
try {
|
|
10714
|
-
const
|
|
10715
|
-
if (
|
|
10716
|
-
const rate = recent.filter((o) => o.success).length / recent.length;
|
|
11095
|
+
const rate = getCachedCliSuccessRate(cli);
|
|
11096
|
+
if (rate !== void 0) {
|
|
10717
11097
|
reward += rate * 0.3;
|
|
10718
11098
|
}
|
|
10719
11099
|
} catch (error) {
|
|
@@ -11008,7 +11388,7 @@ var CompositeRouter = class _CompositeRouter {
|
|
|
11008
11388
|
*/
|
|
11009
11389
|
async consultUnifiedContext(task) {
|
|
11010
11390
|
try {
|
|
11011
|
-
const { getContextForTask, inferTaskCategory } = await import("./context-retriever-
|
|
11391
|
+
const { getContextForTask, inferTaskCategory } = await import("./context-retriever-JM564MOV.js");
|
|
11012
11392
|
const ctx = await getContextForTask({
|
|
11013
11393
|
task: task.content,
|
|
11014
11394
|
category: inferTaskCategory(task.content),
|
|
@@ -12154,7 +12534,10 @@ export {
|
|
|
12154
12534
|
unwrapOr,
|
|
12155
12535
|
extractJsonArray,
|
|
12156
12536
|
extractJsonObject,
|
|
12537
|
+
CircularBuffer,
|
|
12538
|
+
BoundedLRUCache,
|
|
12157
12539
|
getTimeProvider,
|
|
12540
|
+
getTuneAdjustmentStore,
|
|
12158
12541
|
withStep,
|
|
12159
12542
|
sanitize,
|
|
12160
12543
|
setGlobalLogLevel,
|
|
@@ -12279,6 +12662,13 @@ export {
|
|
|
12279
12662
|
CompositeRouterConfigSchema,
|
|
12280
12663
|
DEFAULT_COMPOSITE_CONFIG,
|
|
12281
12664
|
CompositeRoutingError,
|
|
12665
|
+
parseBoolEnv,
|
|
12666
|
+
createGetTimeout,
|
|
12667
|
+
createGetRetryConfig,
|
|
12668
|
+
createGetRateLimitConfig,
|
|
12669
|
+
createGetCircuitBreakerConfig,
|
|
12670
|
+
createGetToolRateLimit,
|
|
12671
|
+
createGetEnvVarDocumentation,
|
|
12282
12672
|
WeatherReportInputSchema,
|
|
12283
12673
|
SECURITY_KEYWORDS,
|
|
12284
12674
|
ARCHITECTURE_KEYWORDS,
|
|
@@ -12329,4 +12719,4 @@ export {
|
|
|
12329
12719
|
ParseError,
|
|
12330
12720
|
OrchestratorError
|
|
12331
12721
|
};
|
|
12332
|
-
//# sourceMappingURL=chunk-
|
|
12722
|
+
//# sourceMappingURL=chunk-OT6V5ROA.js.map
|