micro-models-agent 2.14.0 → 2.16.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.
@@ -54,6 +54,12 @@
54
54
  --checker-border: #2e2e2e;
55
55
  --ph-light: #eaeef2;
56
56
  --track: #262626;
57
+ /* Context-breakdown segments (system/tools/history/reserve/free). */
58
+ --seg-system: #a78bfa;
59
+ --seg-tools: #38bdf8;
60
+ --seg-history: #34d399;
61
+ --seg-reserve: #fbbf24;
62
+ --seg-free: #3f3f46;
57
63
  --plan-line: #2e2e2e;
58
64
  --plan-bar-fg: #a3a3a3;
59
65
  --sec-h: #a3a3a3;
@@ -124,6 +130,12 @@ body.light {
124
130
  --checker-border: #d0d7de;
125
131
  --ph-light: #eaeef2;
126
132
  --track: #eaeef2;
133
+ /* Context-breakdown segments (system/tools/history/reserve/free). */
134
+ --seg-system: #7c3aed;
135
+ --seg-tools: #0284c7;
136
+ --seg-history: #059669;
137
+ --seg-reserve: #d97706;
138
+ --seg-free: #d0d7de;
127
139
  --plan-line: #d0d7de;
128
140
  --plan-bar-fg: #57606a;
129
141
  --sec-h: #57606a;
@@ -167,6 +179,8 @@ body[data-font="large"] { font-size: 17px; }
167
179
  #openSettings { margin-left: auto; margin-right: 6px; }
168
180
  #toggleSidebar { display: none; }
169
181
  .conn { color: var(--dim-a); font-size: 11.5px; white-space: nowrap; }
182
+ .conn.stale { color: var(--yellow); }
183
+ .conn.stale .linkbtn { font-size: 11.5px; }
170
184
  .tabstrip {
171
185
  display: flex; gap: 4px; align-items: center; overflow-x: auto;
172
186
  flex: 1; min-width: 0;
@@ -230,11 +244,14 @@ body[data-font="large"] { font-size: 17px; }
230
244
 
231
245
  /* chat */
232
246
  .chat { flex: 1; display: flex; flex-direction: column; min-width: 0; position: relative; }
233
- .msgs { flex: 1; overflow-y: auto; overflow-x: hidden; padding: 18px 22px; display: flex; flex-direction: column; gap: 11px; }
247
+ .msgs { flex: 1; overflow-y: auto; overflow-x: hidden; padding: 0 22px; display: flex; flex-direction: column; gap: 11px; }
234
248
  .msgs > * { flex-shrink: 0; min-height: fit-content; }
235
249
  /* messages live inside a per-tab `.feed` wrapper; it must mirror the `.msgs`
236
- column gap so turns are separated instead of running together */
237
- .feed { display: flex; flex-direction: column; gap: 11px; }
250
+ column gap so turns are separated instead of running together.
251
+ Vertical breathing lives on `.feed`, NOT on the scroller: sticky edge fades
252
+ are constrained to the content box, so scroller padding would offset them
253
+ from the header/composer edges. */
254
+ .feed { display: flex; flex-direction: column; gap: 11px; padding: 18px 0; }
238
255
  .feed > * { flex-shrink: 0; min-height: fit-content; }
239
256
  .u {
240
257
  color: var(--u-fg); background: var(--u-bg); border-left: 2px solid var(--u-border);
@@ -256,7 +273,7 @@ body[data-font="large"] { font-size: 17px; }
256
273
  font-size: 12.5px; overflow-wrap: anywhere;
257
274
  }
258
275
  .metaln.warn { color: var(--yellow); }
259
- .act { display: flex; gap: 8px; min-width: 0; }
276
+ .act { display: flex; gap: 8px; min-width: 0; line-height: 1.35; }
260
277
  .act .lab { white-space: nowrap; }
261
278
  .act .args { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
262
279
  .act.recon .g, .act.recon .lab { color: var(--cyan); }
@@ -297,7 +314,15 @@ body.light .code { border: 1px solid var(--border); }
297
314
  .toolout .more { color: var(--dim-b); cursor: pointer; font-size: 12px; }
298
315
  .toolout .more:hover { color: var(--dim-a); }
299
316
 
300
- /* markdown answers (streamed by md.js) — lines and glyphs, no boxes */
317
+ /* markdown answers (streamed by md.js) — lines and glyphs, no boxes.
318
+ Top-level answers carry a quiet accent rail (mirrors the user's `> ` block),
319
+ so the finished message reads instantly apart from the dim work process
320
+ (tool/think rows stay plain). Scoped to `.feed >` — code blocks inside keep
321
+ their own styling. */
322
+ .feed > .md, .feed > .ans {
323
+ border-left: 2px solid var(--accent);
324
+ padding-left: 12px;
325
+ }
301
326
  .md { color: var(--ans); overflow-wrap: anywhere; }
302
327
  .md > * { flex-shrink: 0; }
303
328
  .md p { margin: 4px 0; white-space: pre-wrap; }
@@ -377,7 +402,14 @@ body.light .codeblock { border: 1px solid var(--border); }
377
402
  }
378
403
  body.light .imgcard .ph { background: var(--ph-light); }
379
404
  .imgcard .cap { padding: 6px 10px; color: var(--dim-a); font-size: 12px; }
380
- .filerow { margin-left: 26px; display: flex; gap: 8px; align-items: baseline; min-width: 0; font-size: 12.5px; color: var(--muted); }
405
+ .filerow { margin-left: 26px; display: flex; gap: 8px; align-items: baseline; min-width: 0; font-size: 12.5px; line-height: 1.35; color: var(--muted); }
406
+ /* Compact tool lists: consecutive action/file rows sit tight (~4px visual),
407
+ // while turns keep the airy 11px feed gap. Negative margin compensates the
408
+ // `.feed { gap: 11px }` only between siblings in a run. */
409
+ .feed > .filerow + .filerow,
410
+ .feed > .act + .act,
411
+ .feed > .filerow + .act,
412
+ .feed > .act + .filerow { margin-top: -7px; }
381
413
  .filerow .g { flex: 0 0 auto; }
382
414
  .filerow.recon .g, .filerow.recon .lab { color: var(--cyan); }
383
415
  .filerow.mutate .g, .filerow.mutate .lab { color: var(--magenta); }
@@ -390,10 +422,6 @@ body.light .imgcard .ph { background: var(--ph-light); }
390
422
  @media (pointer: coarse) { .filerow .copy-btn { opacity: 1; } }
391
423
  .filerow .copy-btn:focus-visible { opacity: 1; outline: 2px solid var(--accent); outline-offset: 1px; }
392
424
  .filerow .copy-btn .svg-icon { width: 14px; height: 14px; }
393
- .filegroup { margin-left: 26px; font-size: 12.5px; color: var(--muted); }
394
- .filegroup .head { background: transparent; border: 0; color: inherit; font: inherit; cursor: pointer; display: flex; gap: 6px; align-items: baseline; padding: 0; }
395
- .filegroup .items.hidden { display: none; }
396
- .filegroup .items > .filerow { margin-left: 0; }
397
425
  .linkline { margin-left: 26px; min-width: 0; overflow-wrap: anywhere; }
398
426
  .linkline a { color: var(--accent); text-decoration: none; overflow-wrap: anywhere; word-break: break-word; }
399
427
  .linkline a:hover { text-decoration: underline; }
@@ -508,6 +536,16 @@ body.light .sel > button { border: 1px solid var(--border); }
508
536
  color: var(--fg); font: inherit; font-size: 12.5px; padding: 4px 8px;
509
537
  }
510
538
  .menu .ctx-custom .linkbtn { flex: 0 0 auto; }
539
+ /* Dropdown search fields (composer model menu, sessions menu): sticky on top
540
+ so the query stays visible while the list scrolls underneath. */
541
+ .menu .searchbox {
542
+ margin-bottom: 4px; position: sticky; top: 0; z-index: 1;
543
+ }
544
+ .model-menu-list { display: contents; }
545
+ .dd-menu .searchbox {
546
+ margin: 2px 2px 6px; width: calc(100% - 4px);
547
+ position: sticky; top: 0; z-index: 1;
548
+ }
511
549
 
512
550
  .inp {
513
551
  width: 100%; padding: 12px 14px; resize: none; display: block;
@@ -605,7 +643,7 @@ body.light .sel > button { border: 1px solid var(--border); }
605
643
 
606
644
  /* new rows rise in softly (a bulk history render animates once as a whole —
607
645
  one shared fade, still cheap: opacity/transform only) */
608
- .feed > :is(.u, .md, .act, .think, .q, .filerow, .filegroup, .planblock, .imgcard, .linkline,
646
+ .feed > :is(.u, .md, .act, .think, .q, .filerow, .planblock, .imgcard, .linkline,
609
647
  .toolout, .metric, .detail, .metaln, .warnline, .errline, .cmdout, .sysline,
610
648
  .startbanner, .grouped, .msg-actions, .busy) {
611
649
  animation: rise .18s ease-out;
@@ -632,20 +670,25 @@ body.light .sel > button { border: 1px solid var(--border); }
632
670
  .overlay.open .modal { animation: rise .18s ease-out; }
633
671
 
634
672
  /* hover/active blends */
635
- .sel > button, .menu .mi, .stab, .q .qopt, .q .qsend, .filerow, .filegroup, .icon-btn,
673
+ .sel > button, .menu .mi, .stab, .q .qopt, .q .qsend, .filerow, .icon-btn,
636
674
  .btn, .linkbtn, .chip, .cb-copy, .act-btn, .copy-btn, .composer .attach-btn,
637
675
  .composer .send-btn, .dd-menu .si, .dd-menu .act, .cmdk-item, .toggle {
638
676
  transition: background-color .12s, color .12s, border-color .12s;
639
677
  }
640
678
  .composer { transition: border-color .15s, box-shadow .15s; }
641
679
 
642
- /* scroll edge fades on the transcript (classes from the feed scroll hook) */
680
+ /* scroll edge fades on the transcript (classes from the feed scroll hook).
681
+ Sticky in-flow pseudos glued exactly to the scrollport edges: they sit in
682
+ the scroller's padding-free content box (breathing lives on `.feed`), so
683
+ `top: 0` / `bottom: 0` meet the header above and the composer below with
684
+ no visible offset. Negative margins neutralize their flow height plus the
685
+ flex gap, so hidden fades take no space. */
643
686
  .msgs::before, .msgs::after {
644
687
  content: ""; position: sticky; display: block; height: 22px; flex: 0 0 auto;
645
688
  pointer-events: none; z-index: 5; opacity: 0; transition: opacity .25s;
646
689
  }
647
- .msgs::before { top: 0; margin-bottom: -22px; background: linear-gradient(var(--bg), transparent); }
648
- .msgs::after { bottom: 0; margin-top: -22px; background: linear-gradient(transparent, var(--bg)); }
690
+ .msgs::before { top: 0; margin-bottom: -33px; background: linear-gradient(var(--bg), transparent); }
691
+ .msgs::after { bottom: 0; margin-top: -33px; background: linear-gradient(transparent, var(--bg)); }
649
692
  .msgs.scrolled::before { opacity: 1; }
650
693
  .msgs.unfollowed::after { opacity: 1; }
651
694
 
@@ -720,12 +763,16 @@ body.light .sel > button { border: 1px solid var(--border); }
720
763
  @keyframes rlFlash { 0% { filter: brightness(1.9); } 100% { filter: brightness(1); } }
721
764
 
722
765
  /* ---- sidebar — plan / usage / environment sections ---- */
766
+ /* Sidebar never scrolls horizontally, in any tab: long paths / model names /
767
+ ids wrap or ellipsize inside their rows, never widening the pane. */
723
768
  .sb {
724
769
  width: 340px; min-width: 340px; display: flex; flex-direction: column;
725
770
  border-left: 1px solid var(--border); background: var(--sb-bg); min-height: 0;
771
+ overflow-x: hidden;
726
772
  }
727
773
  .sec {
728
- display: flex; flex-direction: column; min-height: 0;
774
+ display: flex; flex-direction: column; min-height: 0; min-width: 0;
775
+ max-width: 100%; overflow-x: hidden;
729
776
  border-bottom: 1px solid var(--border);
730
777
  }
731
778
  .sec:last-child { border-bottom: none; }
@@ -737,8 +784,8 @@ body.light .sel > button { border: 1px solid var(--border); }
737
784
  .sec-h:hover { color: var(--sec-h-hover); }
738
785
  .sec-h .n { margin-left: auto; color: var(--dim-b); }
739
786
  .sec-body {
740
- overflow-y: auto; padding: 0 16px 12px;
741
- min-height: 0;
787
+ overflow-y: auto; overflow-x: hidden; padding: 0 16px 12px;
788
+ min-height: 0; min-width: 0; max-width: 100%;
742
789
  }
743
790
  .sec-body.collapsed { display: none; }
744
791
  /* plan section takes the lion's share and scrolls */
@@ -772,7 +819,7 @@ body.light .sel > button { border: 1px solid var(--border); }
772
819
  }
773
820
  .sb-name .sb-ico svg { width: 14px; height: 14px; color: var(--accent); }
774
821
 
775
- .sb-pane { display: flex; flex-direction: column; flex: 1; min-height: 0; }
822
+ .sb-pane { display: flex; flex-direction: column; flex: 1; min-height: 0; min-width: 0; max-width: 100%; overflow-x: hidden; }
776
823
  .sb-pane[hidden] { display: none; }
777
824
 
778
825
  /* master-detail expansion */
@@ -780,25 +827,26 @@ body.light .sel > button { border: 1px solid var(--border); }
780
827
  .sb.sb-expanded { width: 680px; min-width: 680px; }
781
828
  #pane-trace { flex-direction: row; }
782
829
  .sb-expanded #pane-trace { position: relative; }
783
- .trace-list { flex: 1; min-width: 0; overflow-y: auto; padding: 6px 10px 12px; display: flex; flex-direction: column; gap: 1px; }
784
- .trace-turn { color: var(--dim-c); font-size: 11px; margin: 8px 6px 2px; }
785
- .trc { display: flex; gap: 8px; align-items: baseline; padding: 4px 6px; font-size: 12px; color: var(--muted); border-radius: 4px; cursor: pointer; }
830
+ .trace-list { flex: 1; min-width: 0; max-width: 100%; overflow-y: auto; overflow-x: hidden; padding: 6px 10px 12px; display: flex; flex-direction: column; gap: 1px; }
831
+ .trace-turn { color: var(--dim-c); font-size: 11px; margin: 8px 6px 2px; overflow-wrap: anywhere; }
832
+ .trc { display: flex; gap: 8px; align-items: baseline; padding: 4px 6px; font-size: 12px; color: var(--muted); border-radius: 4px; cursor: pointer; min-width: 0; max-width: 100%; overflow: hidden; }
786
833
  .trc:hover { background: var(--hover-bg); }
787
834
  .trc.sel { background: var(--accent-bg); }
788
835
  .trc .g { flex: 0 0 auto; }
789
836
  .trc.recon .g { color: var(--cyan); } .trc.mutate .g { color: var(--purple); }
790
837
  .trc.execute .g { color: var(--accent); } .trc.meta .g { color: var(--meta); } .trc.phase .g { color: var(--think); }
791
- .trc .lab { color: var(--fg); white-space: nowrap; }
838
+ .trc .lab { color: var(--fg); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; flex: 0 1 auto; }
792
839
  .trc .args { color: var(--args); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; flex: 1; }
793
840
  .trc .t { color: var(--dim-b); margin-left: auto; flex: 0 0 auto; }
794
841
  .trc.warn .g, .trc.warn .lab { color: var(--yellow); }
795
842
  .trc.phase .lab { color: var(--think); }
796
- .trc-detail { display: flex; flex-direction: column; flex: 0 0 340px; min-width: 0; border-left: 1px solid var(--border); }
843
+ .trc-detail { display: flex; flex-direction: column; flex: 0 0 340px; min-width: 0; max-width: 100%; overflow-x: hidden; border-left: 1px solid var(--border); }
797
844
  .trc-detail[hidden] { display: none; }
798
- .detail-h { display: flex; gap: 8px; align-items: center; padding: 10px 14px; border-bottom: 1px solid var(--border); color: var(--fg); font-size: 12.5px; flex-shrink: 0; }
845
+ .detail-h { display: flex; gap: 8px; align-items: center; padding: 10px 14px; border-bottom: 1px solid var(--border); color: var(--fg); font-size: 12.5px; flex-shrink: 0; min-width: 0; max-width: 100%; overflow: hidden; }
799
846
  .detail-h .g { color: var(--accent); }
800
847
  .detail-h .x { margin-left: auto; color: var(--dim-b); cursor: pointer; }
801
- .detail-b { padding: 10px 14px; display: flex; flex-direction: column; gap: 12px; overflow-y: auto; }
848
+ .detail-b { padding: 10px 14px; display: flex; flex-direction: column; gap: 12px; overflow-y: auto; overflow-x: hidden; min-width: 0; max-width: 100%; }
849
+ .detail-b .code { max-width: 100%; }
802
850
  .detail-b h5 { margin: 0 0 4px; font-size: 10.5px; text-transform: uppercase; letter-spacing: .06em; color: var(--sec-h); font-weight: 600; }
803
851
  .map-sec { flex: 1 1 auto; }
804
852
  .map-reindex { margin-top: 10px; font: inherit; font-size: 12px; color: var(--accent); background: transparent; border: 1px solid var(--border-2); border-radius: 5px; padding: 4px 10px; cursor: pointer; width: fit-content; }
@@ -818,8 +866,15 @@ body.light .sel > button { border: 1px solid var(--border); }
818
866
  .plan-step::before { content: ""; position: absolute; left: 4px; top: 0; bottom: 0; width: 1px; background: var(--plan-line); }
819
867
  .plan-step .sub { display: block; color: var(--dim-b); font-size: 11.5px; padding-left: 0; }
820
868
 
821
- .kv { display: flex; justify-content: space-between; padding: 2px 0; color: var(--muted); gap: 10px; }
822
- .kv b { font-weight: 400; color: var(--fg); text-align: right; }
869
+ .kv { display: flex; justify-content: space-between; padding: 2px 0; color: var(--muted); gap: 10px; min-width: 0; max-width: 100%; }
870
+ .kv > * { min-width: 0; }
871
+ /* Подпись строки никогда не сжимается — иначе её текст наезжает на значение. */
872
+ .kv > span:first-child { flex-shrink: 0; }
873
+ .kv b { font-weight: 400; color: var(--fg); text-align: right; overflow-wrap: anywhere; word-break: break-word; min-width: 0; max-width: 100%; }
874
+ /* Корень карты: подпись сверху, длинный путь снизу на всю ширину. */
875
+ .map-path { display: flex; flex-direction: column; gap: 2px; padding: 2px 0; min-width: 0; max-width: 100%; color: var(--muted); }
876
+ .map-path .dim { color: var(--dim-a); }
877
+ .map-path b { font-weight: 400; color: var(--fg); overflow-wrap: anywhere; word-break: break-word; min-width: 0; max-width: 100%; }
823
878
  body.light .kv b { color: var(--fg); }
824
879
  .kv .dim { color: var(--dim-a); }
825
880
  .kv .wn { color: var(--yellow); }
@@ -841,6 +896,26 @@ body.light .kv .wn { color: var(--yellow); }
841
896
  .bar { height: 4px; background: var(--track); border-radius: 2px; margin-top: 6px; overflow: hidden; }
842
897
  .bar i { display: block; height: 100%; width: 0; background: var(--green-fill); transition: width .2s; }
843
898
 
899
+ /* Segmented context bar: flex row so widths add up to the full window. */
900
+ .bar.segbar { display: flex; }
901
+ .bar.segbar i { width: auto; flex: 0 0 auto; transition: width .25s; }
902
+ .bar.segbar .seg-system { background: var(--seg-system); }
903
+ .bar.segbar .seg-tools { background: var(--seg-tools); }
904
+ .bar.segbar .seg-history { background: var(--seg-history); }
905
+ .bar.segbar .seg-reserve { background: var(--seg-reserve); }
906
+ .bar.segbar .seg-free { background: var(--seg-free); }
907
+ /* Legend of context parts (dim dot + label + tokens): rows, no boxes. */
908
+ .seglegend { display: flex; flex-wrap: wrap; gap: 4px 10px; margin-top: 5px; }
909
+ .segl-item { display: inline-flex; align-items: center; gap: 4px; font-size: 11px; color: var(--dim-b); }
910
+ .segl-dot { width: 7px; height: 7px; border-radius: 2px; flex: 0 0 auto; }
911
+ .segl-dot.seg-system { background: var(--seg-system); }
912
+ .segl-dot.seg-tools { background: var(--seg-tools); }
913
+ .segl-dot.seg-history { background: var(--seg-history); }
914
+ .segl-dot.seg-reserve { background: var(--seg-reserve); }
915
+ .segl-dot.seg-free { background: var(--seg-free); }
916
+ .segl-item b { color: var(--muted); font-weight: 600; }
917
+ .segl-label { color: var(--dim-b); }
918
+
844
919
  /* ---- settings modal + nested dialogs (provider, confirm) ---- */
845
920
  .overlay {
846
921
  display: none; position: fixed; inset: 0; z-index: 50;
@@ -1338,7 +1413,8 @@ button.toggle:disabled { opacity: .5; cursor: default; }
1338
1413
  border-left: 1px solid var(--border); border-top: none;
1339
1414
  box-shadow: var(--shadow-dd);
1340
1415
  }
1341
- .msgs { padding: 14px; }
1416
+ .msgs { padding: 0 14px; }
1417
+ .feed { padding: 14px 0; }
1342
1418
  .input-area { margin: 10px 14px 12px; }
1343
1419
  .inp-meta { flex-wrap: wrap; gap: 8px; }
1344
1420
  }
@@ -1361,7 +1437,8 @@ button.toggle:disabled { opacity: .5; cursor: default; }
1361
1437
  .content-col { padding: 14px; }
1362
1438
  .row { font-size: 12.5px; }
1363
1439
  .input-area { margin: 8px 10px 10px; }
1364
- .msgs { padding: 12px 10px; }
1440
+ .msgs { padding: 0 10px; }
1441
+ .feed { padding: 12px 0; }
1365
1442
  /* narrow phones: rail stacks vertically, track takes the full row */
1366
1443
  .rail-wrap.l-line, .rail-wrap.l-meta {
1367
1444
  flex-direction: column; align-items: stretch; gap: 6px;
package/dist/i18n/en.json CHANGED
@@ -592,6 +592,9 @@
592
592
  "repl.model": "Model:",
593
593
  "repl.provider": "Provider:",
594
594
  "repl.context": "Context:",
595
+ "repl.ctx_part_system": "system",
596
+ "repl.ctx_part_reserve": "reserve",
597
+ "repl.ctx_part_history": "history",
595
598
  "repl.sysprompt_label": "System prompt:",
596
599
  "repl.sysprompt_size": "{used} / {budget} tokens",
597
600
  "repl.sysprompt_desc": "System prompt size and blocks (use --full for the text)",
@@ -1052,6 +1055,8 @@
1052
1055
  "web.sessbar.prev": "previous session",
1053
1056
  "web.sessbar.next": "next session",
1054
1057
  "web.conn.reconnecting": "reconnecting…",
1058
+ "web.i18n.stale": "translations updated — restart the server",
1059
+ "web.i18n.reload": "reload page",
1055
1060
  "web.sidebar.plan": "plan",
1056
1061
  "web.sidebar.session": "session",
1057
1062
  "web.sidebar.usage": "usage",
@@ -1082,6 +1087,18 @@
1082
1087
  "web.sidebar.trace_text": "composing… {count} chars",
1083
1088
  "web.sidebar.trace_plan": "plan update",
1084
1089
  "web.sidebar.trace_question": "question",
1090
+ "web.sidebar.trace_status": "status",
1091
+ "web.sidebar.trace_log": "log · {level}",
1092
+ "web.sidebar.trace_retract": "draft retracted",
1093
+ "web.sidebar.trace_index": "index · {phase}",
1094
+ "web.sidebar.trace_critic": "critic · {status}",
1095
+ "web.sidebar.trace_moe": "moe",
1096
+ "web.sidebar.trace_compaction": "compaction",
1097
+ "web.sidebar.trace_probe": "context probe",
1098
+ "web.sidebar.trace_usage": "llm usage",
1099
+ "web.sidebar.trace_audit": "audit",
1100
+ "web.sidebar.trace_claim": "claim retry · {kind}",
1101
+ "web.sidebar.trace_output": "output",
1085
1102
  "web.sidebar.detail_metadata": "metadata",
1086
1103
  "web.sidebar.detail_arguments": "arguments",
1087
1104
  "web.sidebar.detail_output": "output",
@@ -1096,6 +1113,10 @@
1096
1113
  "web.sidebar.detail_time": "time",
1097
1114
  "web.sidebar.detail_tool_call": "tool call",
1098
1115
  "web.sidebar.detail_session": "session",
1116
+ "web.sidebar.detail_turn": "turn",
1117
+ "web.sidebar.detail_iteration": "iteration",
1118
+ "web.sidebar.detail_provenance": "session-log provenance",
1119
+ "web.sidebar.detail_provenance_count": "{n} assistant messages in log",
1099
1120
  "web.env.dir": "dir",
1100
1121
  "web.env.agents": "AGENTS.md",
1101
1122
  "web.env.map": "map",
@@ -1118,6 +1139,11 @@
1118
1139
  "web.usage.cache": "cache",
1119
1140
  "web.usage.cost": "cost",
1120
1141
  "web.usage.compactions": "compactions",
1142
+ "web.usage.part_system": "instructions",
1143
+ "web.usage.part_tools": "tools",
1144
+ "web.usage.part_history": "dialogue",
1145
+ "web.usage.part_reserve": "response reserve",
1146
+ "web.usage.part_free": "free",
1121
1147
  "web.usage.quality": "quality",
1122
1148
  "web.usage.probe": "probe",
1123
1149
  "web.usage.probe_loaded": "{actual} loaded",
@@ -1410,9 +1436,10 @@
1410
1436
  "web.input.shift_enter": "Shift+Enter — newline",
1411
1437
  "web.input.esc": "Esc — stop",
1412
1438
  "web.input.attach": "Ctrl+V — attach",
1413
- "web.input.busy": "still working — Esc to stop",
1414
1439
  "web.input.send": "send",
1415
1440
  "web.input.stop": "stop",
1441
+ "web.input.queued": "queued · position {n}",
1442
+ "web.input.queue_full": "message queue is full — wait for the turn to end",
1416
1443
  "web.empty.title": "new chat",
1417
1444
  "web.empty.hint": "type a message below · / — commands · model and context are chosen above the input",
1418
1445
  "web.attach.title": "attach image",
@@ -1429,6 +1456,7 @@
1429
1456
  "web.sessions.none_active": "— no active session —",
1430
1457
  "web.sessions.none": "— none —",
1431
1458
  "web.sessions.delete": "delete",
1459
+ "web.sessions.search": "search sessions…",
1432
1460
  "web.sessions.create_failed": "session create failed",
1433
1461
  "web.sessions.delete_failed": "delete failed",
1434
1462
  "web.sessions.confirm_title": "Delete session?",
@@ -1441,6 +1469,7 @@
1441
1469
  "web.selectors.switch_busy": "switch in progress, please wait",
1442
1470
  "web.selectors.reasoning_off": "off (backend ignores it)",
1443
1471
  "web.selectors.no_models": "no models",
1472
+ "web.selectors.search_models": "search models…",
1444
1473
  "web.selectors.refresh_list": "↻ refresh list",
1445
1474
  "web.selectors.custom": "custom…",
1446
1475
  "web.selectors.current": "current",
package/dist/i18n/ru.json CHANGED
@@ -589,6 +589,9 @@
589
589
  "repl.model": "Модель:",
590
590
  "repl.provider": "Провайдер:",
591
591
  "repl.context": "Контекст:",
592
+ "repl.ctx_part_system": "система",
593
+ "repl.ctx_part_reserve": "резерв",
594
+ "repl.ctx_part_history": "история",
592
595
  "repl.sysprompt_label": "Системный промпт:",
593
596
  "repl.sysprompt_size": "{used} / {budget} токенов",
594
597
  "repl.sysprompt_desc": "Размер системного промпта и блоки (текст — через --full)",
@@ -1055,6 +1058,8 @@
1055
1058
  "web.sessbar.prev": "предыдущая сессия",
1056
1059
  "web.sessbar.next": "следующая сессия",
1057
1060
  "web.conn.reconnecting": "переподключение…",
1061
+ "web.i18n.stale": "переводы обновлены — перезапустите сервер",
1062
+ "web.i18n.reload": "обновить страницу",
1058
1063
  "web.sidebar.plan": "план",
1059
1064
  "web.sidebar.session": "сессия",
1060
1065
  "web.sidebar.usage": "использование",
@@ -1085,6 +1090,18 @@
1085
1090
  "web.sidebar.trace_text": "печатает… {count} симв.",
1086
1091
  "web.sidebar.trace_plan": "обновление плана",
1087
1092
  "web.sidebar.trace_question": "вопрос",
1093
+ "web.sidebar.trace_status": "статус",
1094
+ "web.sidebar.trace_log": "лог · {level}",
1095
+ "web.sidebar.trace_retract": "черновик отозван",
1096
+ "web.sidebar.trace_index": "индекс · {phase}",
1097
+ "web.sidebar.trace_critic": "критик · {status}",
1098
+ "web.sidebar.trace_moe": "moe",
1099
+ "web.sidebar.trace_compaction": "компакция",
1100
+ "web.sidebar.trace_probe": "проба контекста",
1101
+ "web.sidebar.trace_usage": "расход llm",
1102
+ "web.sidebar.trace_audit": "аудит",
1103
+ "web.sidebar.trace_claim": "перепроверка · {kind}",
1104
+ "web.sidebar.trace_output": "вывод",
1088
1105
  "web.sidebar.detail_metadata": "метаданные",
1089
1106
  "web.sidebar.detail_arguments": "аргументы",
1090
1107
  "web.sidebar.detail_output": "вывод",
@@ -1099,6 +1116,10 @@
1099
1116
  "web.sidebar.detail_time": "время",
1100
1117
  "web.sidebar.detail_tool_call": "вызов тула",
1101
1118
  "web.sidebar.detail_session": "сессия",
1119
+ "web.sidebar.detail_turn": "ход",
1120
+ "web.sidebar.detail_iteration": "итерация",
1121
+ "web.sidebar.detail_provenance": "сверка с логом",
1122
+ "web.sidebar.detail_provenance_count": "assistant-сообщений в логе: {n}",
1102
1123
  "web.env.dir": "директория",
1103
1124
  "web.env.agents": "AGENTS.md",
1104
1125
  "web.env.map": "карта",
@@ -1121,6 +1142,11 @@
1121
1142
  "web.usage.cache": "кеш",
1122
1143
  "web.usage.cost": "стоимость",
1123
1144
  "web.usage.compactions": "сжатия",
1145
+ "web.usage.part_system": "инструкции",
1146
+ "web.usage.part_tools": "инструменты",
1147
+ "web.usage.part_history": "диалог",
1148
+ "web.usage.part_reserve": "резерв ответа",
1149
+ "web.usage.part_free": "свободно",
1124
1150
  "web.usage.quality": "качество",
1125
1151
  "web.usage.probe": "проб",
1126
1152
  "web.usage.probe_loaded": "загружено {actual}",
@@ -1386,9 +1412,10 @@
1386
1412
  "web.input.shift_enter": "Shift+Enter — новая строка",
1387
1413
  "web.input.esc": "Esc — стоп",
1388
1414
  "web.input.attach": "Ctrl+V — вложить",
1389
- "web.input.busy": "ещё работаю — Esc для остановки",
1390
1415
  "web.input.send": "отправить",
1391
1416
  "web.input.stop": "остановить",
1417
+ "web.input.queued": "в очереди · позиция {n}",
1418
+ "web.input.queue_full": "очередь сообщений полна — дождись конца хода",
1392
1419
  "web.empty.title": "новый чат",
1393
1420
  "web.empty.hint": "введи сообщение ниже · / — команды · модель и контекст выбираются над полем",
1394
1421
  "web.attach.title": "прикрепить изображение",
@@ -1405,6 +1432,7 @@
1405
1432
  "web.sessions.none_active": "— нет активной сессии —",
1406
1433
  "web.sessions.none": "— нет —",
1407
1434
  "web.sessions.delete": "удалить",
1435
+ "web.sessions.search": "поиск сессий…",
1408
1436
  "web.sessions.create_failed": "не удалось создать сессию",
1409
1437
  "web.sessions.delete_failed": "не удалось удалить",
1410
1438
  "web.sessions.confirm_title": "Удалить сессию?",
@@ -1417,6 +1445,7 @@
1417
1445
  "web.selectors.switch_busy": "переключение уже идёт, подождите",
1418
1446
  "web.selectors.reasoning_off": "выкл (бэкенд игнорирует)",
1419
1447
  "web.selectors.no_models": "нет моделей",
1448
+ "web.selectors.search_models": "поиск моделей…",
1420
1449
  "web.selectors.refresh_list": "↻ обновить список",
1421
1450
  "web.selectors.custom": "другое…",
1422
1451
  "web.selectors.current": "текущее",