instar 1.3.250 → 1.3.252
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/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +50 -0
- package/dist/commands/server.js.map +1 -1
- package/dist/core/SelfNicknameResolver.d.ts +40 -0
- package/dist/core/SelfNicknameResolver.d.ts.map +1 -0
- package/dist/core/SelfNicknameResolver.js +50 -0
- package/dist/core/SelfNicknameResolver.js.map +1 -0
- package/dist/providers/adapters/gemini-cli/observability/geminiCapacityPolicy.d.ts +10 -0
- package/dist/providers/adapters/gemini-cli/observability/geminiCapacityPolicy.d.ts.map +1 -1
- package/dist/providers/adapters/gemini-cli/observability/geminiCapacityPolicy.js +58 -2
- package/dist/providers/adapters/gemini-cli/observability/geminiCapacityPolicy.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +6 -1
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +46 -46
- package/upgrades/1.3.251.md +37 -0
- package/upgrades/1.3.252.md +56 -0
- package/upgrades/side-effects/gemini-model-fallback-on-exhaustion.md +81 -0
- package/upgrades/side-effects/mm-self-nickname.md +23 -0
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-06-
|
|
5
|
-
"instarVersion": "1.3.
|
|
4
|
+
"generatedAt": "2026-06-04T23:01:14.429Z",
|
|
5
|
+
"instarVersion": "1.3.252",
|
|
6
6
|
"entryCount": 198,
|
|
7
7
|
"entries": {
|
|
8
8
|
"hook:session-start": {
|
|
@@ -418,7 +418,7 @@
|
|
|
418
418
|
"type": "route-group",
|
|
419
419
|
"domain": "monitoring",
|
|
420
420
|
"sourcePath": "src/server/routes.ts",
|
|
421
|
-
"contentHash": "
|
|
421
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
422
422
|
"since": "2025-01-01"
|
|
423
423
|
},
|
|
424
424
|
"route-group:agents": {
|
|
@@ -426,7 +426,7 @@
|
|
|
426
426
|
"type": "route-group",
|
|
427
427
|
"domain": "sessions",
|
|
428
428
|
"sourcePath": "src/server/routes.ts",
|
|
429
|
-
"contentHash": "
|
|
429
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
430
430
|
"since": "2025-01-01"
|
|
431
431
|
},
|
|
432
432
|
"route-group:backups": {
|
|
@@ -434,7 +434,7 @@
|
|
|
434
434
|
"type": "route-group",
|
|
435
435
|
"domain": "operations",
|
|
436
436
|
"sourcePath": "src/server/routes.ts",
|
|
437
|
-
"contentHash": "
|
|
437
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
438
438
|
"since": "2025-01-01"
|
|
439
439
|
},
|
|
440
440
|
"route-group:git": {
|
|
@@ -442,7 +442,7 @@
|
|
|
442
442
|
"type": "route-group",
|
|
443
443
|
"domain": "coordination",
|
|
444
444
|
"sourcePath": "src/server/routes.ts",
|
|
445
|
-
"contentHash": "
|
|
445
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
446
446
|
"since": "2025-01-01"
|
|
447
447
|
},
|
|
448
448
|
"route-group:memory": {
|
|
@@ -450,7 +450,7 @@
|
|
|
450
450
|
"type": "route-group",
|
|
451
451
|
"domain": "memory",
|
|
452
452
|
"sourcePath": "src/server/routes.ts",
|
|
453
|
-
"contentHash": "
|
|
453
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
454
454
|
"since": "2025-01-01"
|
|
455
455
|
},
|
|
456
456
|
"route-group:semantic": {
|
|
@@ -458,7 +458,7 @@
|
|
|
458
458
|
"type": "route-group",
|
|
459
459
|
"domain": "memory",
|
|
460
460
|
"sourcePath": "src/server/routes.ts",
|
|
461
|
-
"contentHash": "
|
|
461
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
462
462
|
"since": "2025-01-01"
|
|
463
463
|
},
|
|
464
464
|
"route-group:status": {
|
|
@@ -466,7 +466,7 @@
|
|
|
466
466
|
"type": "route-group",
|
|
467
467
|
"domain": "monitoring",
|
|
468
468
|
"sourcePath": "src/server/routes.ts",
|
|
469
|
-
"contentHash": "
|
|
469
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
470
470
|
"since": "2025-01-01"
|
|
471
471
|
},
|
|
472
472
|
"route-group:capabilities": {
|
|
@@ -474,7 +474,7 @@
|
|
|
474
474
|
"type": "route-group",
|
|
475
475
|
"domain": "mapping",
|
|
476
476
|
"sourcePath": "src/server/routes.ts",
|
|
477
|
-
"contentHash": "
|
|
477
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
478
478
|
"since": "2025-01-01"
|
|
479
479
|
},
|
|
480
480
|
"route-group:project-map": {
|
|
@@ -482,7 +482,7 @@
|
|
|
482
482
|
"type": "route-group",
|
|
483
483
|
"domain": "mapping",
|
|
484
484
|
"sourcePath": "src/server/routes.ts",
|
|
485
|
-
"contentHash": "
|
|
485
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
486
486
|
"since": "2025-01-01"
|
|
487
487
|
},
|
|
488
488
|
"route-group:coherence": {
|
|
@@ -490,7 +490,7 @@
|
|
|
490
490
|
"type": "route-group",
|
|
491
491
|
"domain": "coherence",
|
|
492
492
|
"sourcePath": "src/server/routes.ts",
|
|
493
|
-
"contentHash": "
|
|
493
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
494
494
|
"since": "2025-01-01"
|
|
495
495
|
},
|
|
496
496
|
"route-group:topic-bindings": {
|
|
@@ -498,7 +498,7 @@
|
|
|
498
498
|
"type": "route-group",
|
|
499
499
|
"domain": "sessions",
|
|
500
500
|
"sourcePath": "src/server/routes.ts",
|
|
501
|
-
"contentHash": "
|
|
501
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
502
502
|
"since": "2025-01-01"
|
|
503
503
|
},
|
|
504
504
|
"route-group:context": {
|
|
@@ -506,7 +506,7 @@
|
|
|
506
506
|
"type": "route-group",
|
|
507
507
|
"domain": "context",
|
|
508
508
|
"sourcePath": "src/server/routes.ts",
|
|
509
|
-
"contentHash": "
|
|
509
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
510
510
|
"since": "2025-01-01"
|
|
511
511
|
},
|
|
512
512
|
"route-group:scope-coherence": {
|
|
@@ -514,7 +514,7 @@
|
|
|
514
514
|
"type": "route-group",
|
|
515
515
|
"domain": "coherence",
|
|
516
516
|
"sourcePath": "src/server/routes.ts",
|
|
517
|
-
"contentHash": "
|
|
517
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
518
518
|
"since": "2025-01-01"
|
|
519
519
|
},
|
|
520
520
|
"route-group:canonical-state": {
|
|
@@ -522,7 +522,7 @@
|
|
|
522
522
|
"type": "route-group",
|
|
523
523
|
"domain": "state",
|
|
524
524
|
"sourcePath": "src/server/routes.ts",
|
|
525
|
-
"contentHash": "
|
|
525
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
526
526
|
"since": "2025-01-01"
|
|
527
527
|
},
|
|
528
528
|
"route-group:ci": {
|
|
@@ -530,7 +530,7 @@
|
|
|
530
530
|
"type": "route-group",
|
|
531
531
|
"domain": "monitoring",
|
|
532
532
|
"sourcePath": "src/server/routes.ts",
|
|
533
|
-
"contentHash": "
|
|
533
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
534
534
|
"since": "2025-01-01"
|
|
535
535
|
},
|
|
536
536
|
"route-group:sessions": {
|
|
@@ -538,7 +538,7 @@
|
|
|
538
538
|
"type": "route-group",
|
|
539
539
|
"domain": "sessions",
|
|
540
540
|
"sourcePath": "src/server/routes.ts",
|
|
541
|
-
"contentHash": "
|
|
541
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
542
542
|
"since": "2025-01-01"
|
|
543
543
|
},
|
|
544
544
|
"route-group:jobs": {
|
|
@@ -546,7 +546,7 @@
|
|
|
546
546
|
"type": "route-group",
|
|
547
547
|
"domain": "scheduling",
|
|
548
548
|
"sourcePath": "src/server/routes.ts",
|
|
549
|
-
"contentHash": "
|
|
549
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
550
550
|
"since": "2025-01-01"
|
|
551
551
|
},
|
|
552
552
|
"route-group:skip-ledger": {
|
|
@@ -554,7 +554,7 @@
|
|
|
554
554
|
"type": "route-group",
|
|
555
555
|
"domain": "scheduling",
|
|
556
556
|
"sourcePath": "src/server/routes.ts",
|
|
557
|
-
"contentHash": "
|
|
557
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
558
558
|
"since": "2025-01-01"
|
|
559
559
|
},
|
|
560
560
|
"route-group:telegram": {
|
|
@@ -562,7 +562,7 @@
|
|
|
562
562
|
"type": "route-group",
|
|
563
563
|
"domain": "communication",
|
|
564
564
|
"sourcePath": "src/server/routes.ts",
|
|
565
|
-
"contentHash": "
|
|
565
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
566
566
|
"since": "2025-01-01"
|
|
567
567
|
},
|
|
568
568
|
"route-group:attention": {
|
|
@@ -570,7 +570,7 @@
|
|
|
570
570
|
"type": "route-group",
|
|
571
571
|
"domain": "communication",
|
|
572
572
|
"sourcePath": "src/server/routes.ts",
|
|
573
|
-
"contentHash": "
|
|
573
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
574
574
|
"since": "2025-01-01"
|
|
575
575
|
},
|
|
576
576
|
"route-group:relationships": {
|
|
@@ -578,7 +578,7 @@
|
|
|
578
578
|
"type": "route-group",
|
|
579
579
|
"domain": "relationships",
|
|
580
580
|
"sourcePath": "src/server/routes.ts",
|
|
581
|
-
"contentHash": "
|
|
581
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
582
582
|
"since": "2025-01-01"
|
|
583
583
|
},
|
|
584
584
|
"route-group:feedback": {
|
|
@@ -586,7 +586,7 @@
|
|
|
586
586
|
"type": "route-group",
|
|
587
587
|
"domain": "feedback",
|
|
588
588
|
"sourcePath": "src/server/routes.ts",
|
|
589
|
-
"contentHash": "
|
|
589
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
590
590
|
"since": "2025-01-01"
|
|
591
591
|
},
|
|
592
592
|
"route-group:updates": {
|
|
@@ -594,7 +594,7 @@
|
|
|
594
594
|
"type": "route-group",
|
|
595
595
|
"domain": "updates",
|
|
596
596
|
"sourcePath": "src/server/routes.ts",
|
|
597
|
-
"contentHash": "
|
|
597
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
598
598
|
"since": "2025-01-01"
|
|
599
599
|
},
|
|
600
600
|
"route-group:dispatches": {
|
|
@@ -602,7 +602,7 @@
|
|
|
602
602
|
"type": "route-group",
|
|
603
603
|
"domain": "dispatches",
|
|
604
604
|
"sourcePath": "src/server/routes.ts",
|
|
605
|
-
"contentHash": "
|
|
605
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
606
606
|
"since": "2025-01-01"
|
|
607
607
|
},
|
|
608
608
|
"route-group:quota": {
|
|
@@ -610,7 +610,7 @@
|
|
|
610
610
|
"type": "route-group",
|
|
611
611
|
"domain": "monitoring",
|
|
612
612
|
"sourcePath": "src/server/routes.ts",
|
|
613
|
-
"contentHash": "
|
|
613
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
614
614
|
"since": "2025-01-01"
|
|
615
615
|
},
|
|
616
616
|
"route-group:publishing": {
|
|
@@ -618,7 +618,7 @@
|
|
|
618
618
|
"type": "route-group",
|
|
619
619
|
"domain": "publishing",
|
|
620
620
|
"sourcePath": "src/server/routes.ts",
|
|
621
|
-
"contentHash": "
|
|
621
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
622
622
|
"since": "2025-01-01"
|
|
623
623
|
},
|
|
624
624
|
"route-group:private-views": {
|
|
@@ -626,7 +626,7 @@
|
|
|
626
626
|
"type": "route-group",
|
|
627
627
|
"domain": "publishing",
|
|
628
628
|
"sourcePath": "src/server/routes.ts",
|
|
629
|
-
"contentHash": "
|
|
629
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
630
630
|
"since": "2025-01-01"
|
|
631
631
|
},
|
|
632
632
|
"route-group:tunnel": {
|
|
@@ -634,7 +634,7 @@
|
|
|
634
634
|
"type": "route-group",
|
|
635
635
|
"domain": "networking",
|
|
636
636
|
"sourcePath": "src/server/routes.ts",
|
|
637
|
-
"contentHash": "
|
|
637
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
638
638
|
"since": "2025-01-01"
|
|
639
639
|
},
|
|
640
640
|
"route-group:events": {
|
|
@@ -642,7 +642,7 @@
|
|
|
642
642
|
"type": "route-group",
|
|
643
643
|
"domain": "networking",
|
|
644
644
|
"sourcePath": "src/server/routes.ts",
|
|
645
|
-
"contentHash": "
|
|
645
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
646
646
|
"since": "2025-01-01"
|
|
647
647
|
},
|
|
648
648
|
"route-group:evolution": {
|
|
@@ -650,7 +650,7 @@
|
|
|
650
650
|
"type": "route-group",
|
|
651
651
|
"domain": "evolution",
|
|
652
652
|
"sourcePath": "src/server/routes.ts",
|
|
653
|
-
"contentHash": "
|
|
653
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
654
654
|
"since": "2025-01-01"
|
|
655
655
|
},
|
|
656
656
|
"route-group:watchdog": {
|
|
@@ -658,7 +658,7 @@
|
|
|
658
658
|
"type": "route-group",
|
|
659
659
|
"domain": "monitoring",
|
|
660
660
|
"sourcePath": "src/server/routes.ts",
|
|
661
|
-
"contentHash": "
|
|
661
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
662
662
|
"since": "2025-01-01"
|
|
663
663
|
},
|
|
664
664
|
"route-group:topic-memory": {
|
|
@@ -666,7 +666,7 @@
|
|
|
666
666
|
"type": "route-group",
|
|
667
667
|
"domain": "memory",
|
|
668
668
|
"sourcePath": "src/server/routes.ts",
|
|
669
|
-
"contentHash": "
|
|
669
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
670
670
|
"since": "2025-01-01"
|
|
671
671
|
},
|
|
672
672
|
"route-group:state-sync": {
|
|
@@ -674,7 +674,7 @@
|
|
|
674
674
|
"type": "route-group",
|
|
675
675
|
"domain": "coordination",
|
|
676
676
|
"sourcePath": "src/server/routes.ts",
|
|
677
|
-
"contentHash": "
|
|
677
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
678
678
|
"since": "2025-01-01"
|
|
679
679
|
},
|
|
680
680
|
"route-group:intent": {
|
|
@@ -682,7 +682,7 @@
|
|
|
682
682
|
"type": "route-group",
|
|
683
683
|
"domain": "intent",
|
|
684
684
|
"sourcePath": "src/server/routes.ts",
|
|
685
|
-
"contentHash": "
|
|
685
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
686
686
|
"since": "2025-01-01"
|
|
687
687
|
},
|
|
688
688
|
"route-group:triage": {
|
|
@@ -690,7 +690,7 @@
|
|
|
690
690
|
"type": "route-group",
|
|
691
691
|
"domain": "safety",
|
|
692
692
|
"sourcePath": "src/server/routes.ts",
|
|
693
|
-
"contentHash": "
|
|
693
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
694
694
|
"since": "2025-01-01"
|
|
695
695
|
},
|
|
696
696
|
"route-group:operations": {
|
|
@@ -698,7 +698,7 @@
|
|
|
698
698
|
"type": "route-group",
|
|
699
699
|
"domain": "safety",
|
|
700
700
|
"sourcePath": "src/server/routes.ts",
|
|
701
|
-
"contentHash": "
|
|
701
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
702
702
|
"since": "2025-01-01"
|
|
703
703
|
},
|
|
704
704
|
"route-group:sentinel": {
|
|
@@ -706,7 +706,7 @@
|
|
|
706
706
|
"type": "route-group",
|
|
707
707
|
"domain": "safety",
|
|
708
708
|
"sourcePath": "src/server/routes.ts",
|
|
709
|
-
"contentHash": "
|
|
709
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
710
710
|
"since": "2025-01-01"
|
|
711
711
|
},
|
|
712
712
|
"route-group:trust": {
|
|
@@ -714,7 +714,7 @@
|
|
|
714
714
|
"type": "route-group",
|
|
715
715
|
"domain": "safety",
|
|
716
716
|
"sourcePath": "src/server/routes.ts",
|
|
717
|
-
"contentHash": "
|
|
717
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
718
718
|
"since": "2025-01-01"
|
|
719
719
|
},
|
|
720
720
|
"route-group:monitoring": {
|
|
@@ -722,7 +722,7 @@
|
|
|
722
722
|
"type": "route-group",
|
|
723
723
|
"domain": "monitoring",
|
|
724
724
|
"sourcePath": "src/server/routes.ts",
|
|
725
|
-
"contentHash": "
|
|
725
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
726
726
|
"since": "2025-01-01"
|
|
727
727
|
},
|
|
728
728
|
"route-group:commitments": {
|
|
@@ -730,7 +730,7 @@
|
|
|
730
730
|
"type": "route-group",
|
|
731
731
|
"domain": "commitments",
|
|
732
732
|
"sourcePath": "src/server/routes.ts",
|
|
733
|
-
"contentHash": "
|
|
733
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
734
734
|
"since": "2025-01-01"
|
|
735
735
|
},
|
|
736
736
|
"route-group:episodes": {
|
|
@@ -738,7 +738,7 @@
|
|
|
738
738
|
"type": "route-group",
|
|
739
739
|
"domain": "memory",
|
|
740
740
|
"sourcePath": "src/server/routes.ts",
|
|
741
|
-
"contentHash": "
|
|
741
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
742
742
|
"since": "2025-01-01"
|
|
743
743
|
},
|
|
744
744
|
"route-group:messages": {
|
|
@@ -746,7 +746,7 @@
|
|
|
746
746
|
"type": "route-group",
|
|
747
747
|
"domain": "coordination",
|
|
748
748
|
"sourcePath": "src/server/routes.ts",
|
|
749
|
-
"contentHash": "
|
|
749
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
750
750
|
"since": "2025-01-01"
|
|
751
751
|
},
|
|
752
752
|
"route-group:system-reviews": {
|
|
@@ -754,7 +754,7 @@
|
|
|
754
754
|
"type": "route-group",
|
|
755
755
|
"domain": "monitoring",
|
|
756
756
|
"sourcePath": "src/server/routes.ts",
|
|
757
|
-
"contentHash": "
|
|
757
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
758
758
|
"since": "2025-01-01"
|
|
759
759
|
},
|
|
760
760
|
"route-group:machine-mesh": {
|
|
@@ -770,7 +770,7 @@
|
|
|
770
770
|
"type": "route-group",
|
|
771
771
|
"domain": "security",
|
|
772
772
|
"sourcePath": "src/server/routes.ts",
|
|
773
|
-
"contentHash": "
|
|
773
|
+
"contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
|
|
774
774
|
"since": "2025-01-01"
|
|
775
775
|
},
|
|
776
776
|
"cli:init": {
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
Completes the multi-machine relocation fix: a machine now resolves its OWN nickname.
|
|
9
|
+
|
|
10
|
+
- **Root cause (live-caught on real hardware):** `updateNickname` is local-only, so a
|
|
11
|
+
machine rename applied on a peer's registry never reached the owning machine — its own
|
|
12
|
+
capacity entry was `nickname=None` while peers saw the name. The relocation check runs on
|
|
13
|
+
the holder, so it couldn't resolve its own nickname and "move it back to <this machine>"
|
|
14
|
+
silently failed.
|
|
15
|
+
- **`SelfNicknameResolver`** (pure) — resolves self-nickname: local view → peer view → derive.
|
|
16
|
+
- **Convergence task** — at boot and on a timer, if the local self-nickname is missing, it
|
|
17
|
+
adopts the name a peer authoritatively reports and persists it, making `getCapacities()`
|
|
18
|
+
symmetric so the recognizer, transfer route, and `/pool` all resolve self.
|
|
19
|
+
- **Transfer route** resolves the self-nickname via the resolver (was capacity-only).
|
|
20
|
+
|
|
21
|
+
## What to Tell Your User
|
|
22
|
+
|
|
23
|
+
- **"Move it back here" works now.** When a conversation is on one of your machines and you
|
|
24
|
+
ask to move it back to the machine you're on, that used to silently do nothing in some
|
|
25
|
+
setups — your agent didn't know its own name. It learns its own name from its other
|
|
26
|
+
machines now, so moving things back and forth just works.
|
|
27
|
+
|
|
28
|
+
## Summary of New Capabilities
|
|
29
|
+
|
|
30
|
+
- A machine resolves its own user-facing nickname (from peers when its local copy is missing).
|
|
31
|
+
- Reliable "move this to the machine it's already on" — the last gap in nickname transfers.
|
|
32
|
+
|
|
33
|
+
## Evidence
|
|
34
|
+
|
|
35
|
+
Live-caught on the real laptop+mini pair (laptop returned 404 "unknown machine: Laptop" for
|
|
36
|
+
its own name). 7 unit tests incl. the asymmetry regression + an e2e proving self-nickname
|
|
37
|
+
transfer resolves through the real AgentServer. Spec: MULTI-MACHINE-SESSION-POOL-SPEC §L4.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
When a Gemini call hit a per-model capacity limit (e.g. "You have exhausted your
|
|
9
|
+
capacity on this model. Quota resets after 46m"), instar's Gemini capacity policy
|
|
10
|
+
globally deferred on that model and wrote a `quota-state.json` snapshot with
|
|
11
|
+
`recommendation: 'stop'` / `fiveHourPercent: 100`. But the known Gemini models
|
|
12
|
+
(`gemini-2.5-flash`, `gemini-2.5-pro`) draw on SEPARATE quotas, so one model
|
|
13
|
+
exhausting was mis-recorded as a full account-wide block — and every reader of that
|
|
14
|
+
file (the agent, the mentor, the escalation monitor) concluded the whole Gemini
|
|
15
|
+
agent was down, even when the account had headroom on the other model. This produced
|
|
16
|
+
repeated false "agent is blocked" reports.
|
|
17
|
+
|
|
18
|
+
The policy now switches to a known model with headroom and retries before deferring
|
|
19
|
+
(mirroring the codex auto-swap-on-limit policy). Only when EVERY known model is
|
|
20
|
+
exhausted does it globally defer and write the stop-state — now tagged
|
|
21
|
+
`scope: 'account'`. The per-model exhaustion windows are tracked time-based and
|
|
22
|
+
self-clear, so there is no switch loop and no stale state. The model switch uses a
|
|
23
|
+
short 250ms backoff (a different model needs no wait).
|
|
24
|
+
|
|
25
|
+
## What to Tell Your User
|
|
26
|
+
|
|
27
|
+
If you run a Gemini-backed agent: when one Gemini model hits its limit, the agent now
|
|
28
|
+
quietly switches to the other model and keeps working, instead of going dark for the
|
|
29
|
+
length of that model's reset window. It only reports itself as out of capacity when
|
|
30
|
+
every model is genuinely exhausted. Nothing to do — it just stops the false "blocked"
|
|
31
|
+
reports and keeps the agent productive.
|
|
32
|
+
|
|
33
|
+
## Summary of New Capabilities
|
|
34
|
+
|
|
35
|
+
Gemini agents auto-fall-back across models on a per-model capacity limit (parity with
|
|
36
|
+
the codex auto-swap), and the durable quota-state now distinguishes a single-model
|
|
37
|
+
deferral from a genuine account-wide block (`scope: 'account'`).
|
|
38
|
+
|
|
39
|
+
## Evidence
|
|
40
|
+
|
|
41
|
+
- **Reproduction (live this session):** a Gemini agent's `gemini -p` probe returned
|
|
42
|
+
"You have exhausted your capacity on this model. Your quota will reset after 46m11s"
|
|
43
|
+
while the account `/stats` showed 20% remaining on the Auto model — i.e. one model
|
|
44
|
+
exhausted, account fine. The old policy wrote `recommendation: 'stop'` for this,
|
|
45
|
+
which read as a full block.
|
|
46
|
+
- **Before:** single-model exhaustion → global defer + `recommendation:'stop'` /
|
|
47
|
+
`fiveHourPercent:100`; the agent appeared fully blocked for the whole reset window.
|
|
48
|
+
- **After:** single-model exhaustion → switch to the model with headroom and keep
|
|
49
|
+
working; global stop-state (now `scope:'account'`) is written ONLY when every known
|
|
50
|
+
model is exhausted.
|
|
51
|
+
- **Tests:** 21 across three tiers — `tests/unit/geminiCapacityPolicy.test.ts`
|
|
52
|
+
(switch-then-defer, single-model-no-global-stop, `pickGeminiFallbackModel`,
|
|
53
|
+
self-clearing windows), `tests/integration/gemini-capacity-policy-integration.test.ts`,
|
|
54
|
+
and `tests/e2e/gemini-capacity-policy-lifecycle.test.ts` (both updated to assert the
|
|
55
|
+
two-model attempt + account scope), plus the escalation-monitor suite. `tsc --noEmit`
|
|
56
|
+
clean.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Side-Effects Review — Gemini per-model exhaustion switches model before deferring
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `gemini-model-fallback-on-exhaustion`
|
|
4
|
+
**Date:** `2026-06-04`
|
|
5
|
+
**Author:** `echo`
|
|
6
|
+
**Second-pass reviewer:** `required (LLM-routing behavior change)`
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
When a Gemini call hit a capacity limit, `decideGeminiCapacityPolicy` (after its
|
|
11
|
+
short-window immediate-retry path) went straight to a GLOBAL `defer` on the SAME
|
|
12
|
+
model, and `recordGeminiCapacityDeferral` wrote a `quota-state.json` snapshot with
|
|
13
|
+
`fiveHourPercent: 100` / `recommendation: 'stop'`. But the known Gemini models —
|
|
14
|
+
`gemini-2.5-flash` and `gemini-2.5-pro` — draw on **separate** quotas. So one model
|
|
15
|
+
exhausting (e.g. "You have exhausted your capacity on this model. Quota resets after
|
|
16
|
+
46m") was recorded as a full account-wide block, and any reader of `quota-state.json`
|
|
17
|
+
(including the agent itself, the mentor, the escalation monitor) saw `recommendation:
|
|
18
|
+
'stop'` and concluded the whole Gemini agent was down — even when the account had
|
|
19
|
+
headroom on the other model. This caused repeated false "Gemi is blocked" reports
|
|
20
|
+
(confirmed live this session: a `gemini -p` probe returned that exact error while
|
|
21
|
+
`/stats` showed the account at 20% remaining on Auto).
|
|
22
|
+
|
|
23
|
+
The fix (mirrors the existing codex auto-swap-on-limit policy, #31): on per-model
|
|
24
|
+
exhaustion, record the exhausted model's reset window, then switch to a known model
|
|
25
|
+
with headroom and retry. Only when **every** known model is exhausted do we globally
|
|
26
|
+
defer and write the stop-state — now tagged `scope: 'account'`. Because the caller
|
|
27
|
+
records a deferral only on `action: 'defer'`, switching models also means a single-
|
|
28
|
+
model exhaustion no longer writes a global stop at all.
|
|
29
|
+
|
|
30
|
+
## Decision-point inventory
|
|
31
|
+
|
|
32
|
+
1. **`decideGeminiCapacityPolicy` (long-reset branch):** record `model` as exhausted
|
|
33
|
+
(time-based, `now + deferMs`); pick a fallback via `pickGeminiFallbackModel`; if
|
|
34
|
+
one exists → `retry` with that model; else → `defer`.
|
|
35
|
+
2. **`pickGeminiFallbackModel`:** a candidate qualifies when known, ≠ the exhausted
|
|
36
|
+
model, and not itself inside a recorded exhaustion window at `now`. Prefers an
|
|
37
|
+
operator-configured `fallbackModel`, else the first known model with headroom.
|
|
38
|
+
|
|
39
|
+
## 1. Over-block (what still defers / blocks)
|
|
40
|
+
|
|
41
|
+
- When ALL known models are in an exhaustion window → `defer` + the global stop-state
|
|
42
|
+
(now `scope: 'account'`). That is the genuine account-wide block and still gates
|
|
43
|
+
scheduler spawns exactly as before. (tests: "defers once ALL models exhausted",
|
|
44
|
+
integration "defers after a long quota reset", e2e lifecycle.)
|
|
45
|
+
- The short-window immediate-retry path (attempt < maxImmediateRetries, small reset)
|
|
46
|
+
is unchanged.
|
|
47
|
+
- Non-capacity errors are unchanged — `decide` returns `none` and the error surfaces.
|
|
48
|
+
|
|
49
|
+
## 2. Under-block (what it now allows that it didn't)
|
|
50
|
+
|
|
51
|
+
- A single model exhausting now triggers ONE extra Gemini spawn on the other model
|
|
52
|
+
(the switch) before any deferral. Worst-case cost when BOTH models are exhausted:
|
|
53
|
+
two spawns instead of one (flash then pro) before the global defer — bounded at 2
|
|
54
|
+
(one per known model; each is recorded exhausted so it is never retried within its
|
|
55
|
+
window). The model-switch retry uses a 250ms backoff (not the 5s same-model
|
|
56
|
+
backoff) since a different model needs no wait.
|
|
57
|
+
- Loop-safety: `modelExhaustedUntil` is time-based and self-clears once a window
|
|
58
|
+
passes, so there is no permanent state and no A→B→A switch loop (each model is
|
|
59
|
+
recorded before fallback selection; once both are recorded, `pickGeminiFallbackModel`
|
|
60
|
+
returns undefined → defer). (tests: "returns undefined once both exhausted",
|
|
61
|
+
"windows self-clear once the reset passes".)
|
|
62
|
+
|
|
63
|
+
## 3. Blast radius
|
|
64
|
+
|
|
65
|
+
- One file of logic: `src/providers/adapters/gemini-cli/observability/geminiCapacityPolicy.ts`
|
|
66
|
+
(new module state `modelExhaustedUntil`, new export `pickGeminiFallbackModel`, a
|
|
67
|
+
`now?` param on `decide`, the switch-before-defer branch, `scope` on the stop-state,
|
|
68
|
+
reset clears the map).
|
|
69
|
+
- NO consumer signature changes: both callers (`transport/oneShotCompletion.ts`,
|
|
70
|
+
`core/GeminiCliIntelligenceProvider.ts`) already switch to `decision.model` on
|
|
71
|
+
`action:'retry'` and record a deferral only on `action:'defer'`.
|
|
72
|
+
- Affects only Gemini-CLI agents. Claude / codex paths untouched. The added
|
|
73
|
+
`scope` field is additive (readers that don't know it are unaffected).
|
|
74
|
+
|
|
75
|
+
## 4. Reversibility
|
|
76
|
+
|
|
77
|
+
Fully reversible: revert the one policy file + the test updates. Module state is
|
|
78
|
+
in-process and time-based (no persistence); the `quota-state.json` shape only gains
|
|
79
|
+
an additive `scope` field. Verified: `tsc --noEmit` clean; 21 tests green across
|
|
80
|
+
unit + integration + e2e + escalation tiers (both the switch path and the genuine
|
|
81
|
+
all-models-defer path).
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Self-Nickname Convergence — Plain-English Overview
|
|
2
|
+
|
|
3
|
+
> One line: a machine now learns its OWN user-facing nickname from its peers, so "move it back to <this machine>" finally works.
|
|
4
|
+
|
|
5
|
+
## The problem in one breath
|
|
6
|
+
|
|
7
|
+
We shipped placement/transfer robustness, but live-testing on the real laptop+mini pair exposed that the fix was incomplete: the laptop couldn't resolve its OWN name "Laptop". Root cause — `updateNickname` (the dashboard rename) is local-only, so a rename applied on a peer's registry never reached the owning machine. The laptop's own capacity entry was `nickname=None` while peers correctly saw "Laptop". The relocation check runs on the holder (laptop), so it couldn't match "Laptop" → "move it back to the laptop" silently failed.
|
|
8
|
+
|
|
9
|
+
## What this adds
|
|
10
|
+
|
|
11
|
+
- **`SelfNicknameResolver` (pure)** — resolves this machine's own nickname: local capacity view → any PEER's view that names it (the drift backstop) → deterministic derive. Unit-tested incl. the exact asymmetry (self absent locally, present in a peer view).
|
|
12
|
+
- **Self-nickname convergence task (server)** — periodically (and at boot), if the local self-entry has no nickname, it fetches an online peer's `/pool`, finds what the peer calls this machine, and persists it via `updateNickname`. This makes `getCapacities()` SYMMETRIC, so the recognizer, the transfer route, and `/pool` all resolve self. No-ops once known.
|
|
13
|
+
- **Transfer route** now resolves the self-nickname via the resolver (was caps-only).
|
|
14
|
+
|
|
15
|
+
## The safeguards
|
|
16
|
+
|
|
17
|
+
- **Best-effort, never blocks** — convergence catches all errors (annotated `@silent-fallback-ok`); a failed peer fetch just retries on the timer.
|
|
18
|
+
- **No mis-routing** — adoption only happens when the local nickname is missing and a peer authoritatively names this machineId; `updateNickname` still enforces pool-uniqueness.
|
|
19
|
+
- **Tests** — Tier 1 (7 unit on the resolver incl. the regression), Tier 3 (e2e: transfer to THIS machine's own nickname resolves through the real AgentServer — 404'd before). `tsc` clean.
|
|
20
|
+
|
|
21
|
+
## Spec lineage
|
|
22
|
+
|
|
23
|
+
§L4 of the approved `docs/specs/MULTI-MACHINE-SESSION-POOL-SPEC.md` (nickname-based placement/transfer). No new authority — a convergence read-model over existing nickname state.
|