micro-models-agent 2.10.0 → 2.11.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.
@@ -1,65 +1,64 @@
1
1
  /* ---- theme tokens (dark default; light override further below) ---- */
2
2
  :root {
3
- --bg: #12161d;
3
+ --bg: #141414;
4
4
  --fg: #e6edf3;
5
- --panel: #171b22;
6
- --sb-bg: #14181f;
7
- --stab-bg: #14181f;
8
- --stab-on-bg: #12161d;
9
- --surface: #1a1f27;
10
- --input-surface: #1a1f27;
11
- --inp-bg: #1b212a;
12
- --inp-border: #2ea04355;
13
- --inp-focus: #2ea043;
14
- --input-shadow: #2ea04333;
15
- --border: #252b34;
16
- --border-2: #2a313c;
17
- --border-3: #232a33;
18
- --muted: #b1bac4;
19
- --dim-a: #9198a1;
20
- --dim-b: #6e7681;
21
- --dim-c: #6e7681;
22
- --accent: #58a6ff;
23
- --accent-bg: #12233a;
24
- --green: #3fb950;
25
- --green-fill: #238636;
26
- --red: #ff7b72;
27
- --err: #ff7b72;
28
- --red-strong: #f85149;
29
- --yellow: #d29922;
30
- --purple: #d2a8ff;
31
- --cyan: #39c5cf;
32
- --think: #8b7bb8;
33
- --cmdout: #b1bac4;
34
- --meta: #9198a1;
35
- --args: #9198a1;
36
- --hover-bg: #252b34;
37
- --hover-bg-2: #252b34;
38
- --x-hover-bg: #2a313c;
39
- --u-fg: #79c0ff;
40
- --u-bg: #1a2633;
41
- --u-border: #388bfd;
5
+ --panel: #191919;
6
+ --sb-bg: #181818;
7
+ --stab-bg: #181818;
8
+ --surface: #1f1f1f;
9
+ --input-surface: #1f1f1f;
10
+ --inp-bg: #1d1d1d;
11
+ --inp-border: #c4a8ec44;
12
+ --inp-focus: #c4a8ec;
13
+ --input-shadow: #c4a8ec33;
14
+ --border: #262626;
15
+ --border-2: #2e2e2e;
16
+ --border-3: #262626;
17
+ --muted: #d4d4d4;
18
+ --dim-a: #a3a3a3;
19
+ --dim-b: #737373;
20
+ --dim-c: #737373;
21
+ --accent: #c4a8ec;
22
+ --accent-bg: #241e30;
23
+ --green: #c9c5bd;
24
+ --green-fill: #8a8781;
25
+ --red: #e08080;
26
+ --err: #e08080;
27
+ --red-strong: #e08080;
28
+ --yellow: #d9a45b;
29
+ --purple: #b8b0a6;
30
+ --cyan: #a8a29e;
31
+ --think: #9c9c9c;
32
+ --cmdout: #d4d4d4;
33
+ --meta: #a3a3a3;
34
+ --args: #a3a3a3;
35
+ --hover-bg: #262626;
36
+ --hover-bg-2: #222222;
37
+ --x-hover-bg: #2e2e2e;
38
+ --u-fg: #d3bdf2;
39
+ --u-bg: #221c2e;
40
+ --u-border: #c4a8ec;
42
41
  --ans: #a5adb6;
43
- --toggle-off: #30363d;
44
- --toggle-knob: #b1bac4;
42
+ --toggle-off: #2e2e2e;
43
+ --toggle-knob: #a3a3a3;
45
44
  --toggle-knob-on: #fff;
46
- --scroll-thumb: #2a313c;
47
- --scroll-thumb-hover: #6e7681;
48
- --stab-thumb: #3d444d;
49
- --stab-thumb-hover: #6e7681;
50
- --pipe: #3d444d;
51
- --rule: #3d444d;
52
- --checker-a: #232a33;
53
- --checker-b: #2a313c;
54
- --checker-base: #171b22;
55
- --checker-border: #3d444d;
45
+ --scroll-thumb: #2e2e2e;
46
+ --scroll-thumb-hover: #737373;
47
+ --stab-thumb: #2e2e2e;
48
+ --stab-thumb-hover: #737373;
49
+ --pipe: #2e2e2e;
50
+ --rule: #2e2e2e;
51
+ --checker-a: #222222;
52
+ --checker-b: #2e2e2e;
53
+ --checker-base: #191919;
54
+ --checker-border: #2e2e2e;
56
55
  --ph-light: #eaeef2;
57
- --track: #252b34;
58
- --plan-line: #2a313c;
59
- --plan-bar-fg: #b1bac4;
60
- --sec-h: #9198a1;
61
- --sec-h-hover: #b1bac4;
62
- --stab-fg: #9198a1;
56
+ --track: #262626;
57
+ --plan-line: #2e2e2e;
58
+ --plan-bar-fg: #a3a3a3;
59
+ --sec-h: #a3a3a3;
60
+ --sec-h-hover: #d4d4d4;
61
+ --stab-fg: #a3a3a3;
63
62
  --overlay: rgba(0,0,0,.55);
64
63
  --shadow-menu: 0 8px 24px rgba(0,0,0,.5);
65
64
  --shadow-dd: 0 12px 32px rgba(0,0,0,.55);
@@ -76,7 +75,6 @@ body.light {
76
75
  --panel: #ffffff;
77
76
  --sb-bg: #ffffff;
78
77
  --stab-bg: #f6f8fa;
79
- --stab-on-bg: #ffffff;
80
78
  --surface: #f6f8fa;
81
79
  --input-surface: #ffffff;
82
80
  --inp-bg: #ffffff;
@@ -142,8 +140,12 @@ html, body { height: 100%; }
142
140
  body {
143
141
  background: var(--bg); color: var(--fg);
144
142
  font-family: ui-monospace, "Cascadia Code", "JetBrains Mono", Consolas, monospace;
145
- font-size: 13px; display: flex; flex-direction: column; overflow: hidden;
143
+ font-size: 15px; display: flex; flex-direction: column; overflow: hidden;
146
144
  }
145
+ /* Chat font size (`ui.fontSize`): the base above is `comfortable` (default).
146
+ `compact` restores the old 13px, `large` steps up to 17px. */
147
+ body[data-font="compact"] { font-size: 13px; }
148
+ body[data-font="large"] { font-size: 17px; }
147
149
 
148
150
  /* ---- topbar: new chat, sessions dropdown, tabstrip, settings ---- */
149
151
  .bar-top {
@@ -157,6 +159,11 @@ body {
157
159
  }
158
160
  .icon-btn:hover { background: var(--hover-bg); color: var(--fg); }
159
161
  .icon-btn.primary { color: var(--accent); }
162
+ .icon-btn:disabled { opacity: .35; cursor: default; }
163
+ .icon-btn:disabled:hover { background: none; color: var(--muted); }
164
+ /* Mobile session sub-header (see #sessBar): hidden on desktop, flex ≤760px.
165
+ The + / list tools relocate into #sessTools (placeTopTools in tabs.js). */
166
+ .bar-sub { display: none; }
160
167
  #openSettings { margin-left: auto; margin-right: 6px; }
161
168
  #toggleSidebar { display: none; }
162
169
  .conn { color: var(--dim-a); font-size: 11.5px; white-space: nowrap; }
@@ -172,12 +179,12 @@ body {
172
179
  .tabstrip::-webkit-scrollbar-thumb:hover { background: var(--stab-thumb-hover); }
173
180
  .stab {
174
181
  display: flex; gap: 7px; align-items: center; white-space: nowrap;
175
- height: 24px; padding: 0 6px 0 10px; border-radius: 5px 5px 0 0; cursor: pointer;
182
+ height: 24px; padding: 0 6px 0 10px; border-radius: 7px; cursor: pointer;
176
183
  color: var(--stab-fg); font-size: 12.5px; background: var(--stab-bg);
177
- border: 1px solid transparent; border-bottom: none; max-width: 220px;
184
+ border: 1px solid transparent; max-width: 220px;
178
185
  }
179
186
  .stab:hover { color: var(--fg); }
180
- .stab.on { background: var(--stab-on-bg); color: var(--fg); border-color: var(--border); }
187
+ .stab.on { background: var(--accent-bg); color: var(--accent); border-color: transparent; }
181
188
  .stab .name { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
182
189
  .stab .stab-x {
183
190
  flex: 0 0 auto; width: 18px; height: 18px; padding: 0; justify-content: center;
@@ -392,6 +399,9 @@ body.light .imgcard .ph { background: var(--ph-light); }
392
399
  }
393
400
  .filecard .fc-open:hover { border-color: var(--accent); text-decoration: none; }
394
401
  .filecard .fc-open:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
402
+ .filecard button.fc-open { font: inherit; }
403
+ .filecard .fc-actions { display: flex; gap: 6px; align-items: center; margin-left: auto; flex: 0 0 auto; }
404
+ .filecard .fc-hint { color: var(--dim-a); font-size: 12px; }
395
405
  .linkline { margin-left: 26px; min-width: 0; overflow-wrap: anywhere; }
396
406
  .linkline a { color: var(--accent); text-decoration: none; overflow-wrap: anywhere; word-break: break-word; }
397
407
  .linkline a:hover { text-decoration: underline; }
@@ -444,16 +454,25 @@ body.light .imgcard .ph { background: var(--ph-light); }
444
454
 
445
455
  /* ---- composer: selectors, attachments, input, autocomplete ---- */
446
456
  .input-area { margin: 14px 22px 16px; position: relative; }
447
- .selectors { display: flex; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; }
448
- .sel { position: relative; }
457
+ .selectors { display: flex; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; min-width: 0; }
458
+ .sel { position: relative; min-width: 0; max-width: 100%; }
449
459
  .sel > button {
450
460
  font: inherit; font-size: 12.5px; cursor: pointer;
451
461
  background: var(--surface); color: var(--muted); border: none; border-radius: 4px;
452
462
  padding: 4px 10px; display: inline-flex; align-items: center; gap: 6px;
463
+ min-width: 0; max-width: 100%;
453
464
  }
454
465
  body.light .sel > button { border: 1px solid var(--border); }
455
- .sel > button b { font-weight: 400; color: var(--purple); }
466
+ .sel > button b { font-weight: 400; color: var(--purple); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
456
467
  .sel > button .svg-icon { width: 13px; height: 13px; color: var(--dim-a); }
468
+ /* Selector switch pending (boot + provider/model/context/reasoning writes):
469
+ buttons and menus go inert while the `⋯` mark shows. The mark is a static
470
+ glyph via `::after` — no animation, so `prefers-reduced-motion` needs no
471
+ special case and no label rewrites desync the DOM. */
472
+ .selectors[data-pending] .sel > button,
473
+ .selectors[data-pending] .menu { pointer-events: none; }
474
+ .sel > button.pending { cursor: wait; }
475
+ .sel > button.pending b::after { content: " ⋯"; color: var(--dim-b); }
457
476
  .menu {
458
477
  display: none; position: absolute; bottom: calc(100% + 4px); left: 0; z-index: 30;
459
478
  background: var(--panel); border: 1px solid var(--border-2); border-radius: 6px;
@@ -571,9 +590,79 @@ body.light .sel > button { border: 1px solid var(--border); }
571
590
  .input-area.dragover .composer { border-color: var(--accent); box-shadow: 0 0 0 2px var(--input-shadow); }
572
591
  @keyframes blink { 50% { opacity: 0; } }
573
592
 
593
+ /* ---- activity rail — indicator above the composer while a turn runs ----
594
+ Reproduces docs/design/ui/demo-activity-rail-chat.html (variant №12).
595
+ `l-line` (default) = compact one-liner, `l-meta` = inside the hint row,
596
+ `l-full` = full width; `off` hides the node entirely. */
597
+ .rail-wrap { display: flex; flex-direction: column; gap: 6px; margin-bottom: 10px; }
598
+ .rail-wrap[hidden] { display: none; }
599
+ .rail-wrap.l-line, .rail-wrap.l-meta {
600
+ flex-direction: row; align-items: center; gap: 6px 10px; margin-bottom: 8px;
601
+ flex-wrap: wrap;
602
+ }
603
+ .rail-wrap.l-line .rl-track { order: -1; flex: 1 1 120px; min-width: 80px; max-width: 180px; }
604
+ .rail-wrap.l-meta .rl-track { order: -1; flex: 1 1 90px; min-width: 64px; max-width: 110px; }
605
+ .rail-wrap.l-line .rail-l1, .rail-wrap.l-line .rail-l2 { flex: 1 1 auto; min-width: 0; }
606
+ .rail-wrap.l-line .rail-l1 .right { display: none; } /* Esc уже есть в .inp-meta */
607
+ .rail-wrap.l-line .rail-l2::before { content: '·'; color: var(--dim-a); margin-right: -2px; }
608
+ .rail-wrap.l-meta { margin-bottom: 0; }
609
+ .rail-wrap.l-meta .rail-l1 { font-size: 11.5px; }
610
+ .rail-wrap.l-meta .rail-l1 .st, .rail-wrap.l-meta .rail-l1 .s, .rail-wrap.l-meta .rail-l1 .right { display: none; }
611
+ .rail-wrap.l-meta .rail-l2 { display: none; } /* в строке подсказок только самое важное */
612
+ .rail-wrap.l-full .rl-track { flex: 1 1 auto; }
613
+ .rail-l1 {
614
+ display: flex; gap: 8px; align-items: baseline; flex-wrap: wrap;
615
+ font-size: 13px; color: var(--think);
616
+ }
617
+ .rail-l1 .s, .rail-l1 .right { color: var(--dim-a); }
618
+ .rail-l1 .right { margin-left: auto; font-size: 11.5px; }
619
+ .rail-l2 { display: flex; gap: 8px; align-items: baseline; font-size: 11.5px; color: var(--dim-a); flex-wrap: wrap; min-width: 0; }
620
+ .rail-l2 .last { color: var(--args); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
621
+
622
+ .rl-track {
623
+ position: relative; height: 12px; border-radius: 6px;
624
+ background: var(--border); overflow: hidden;
625
+ }
626
+ .rl-fill {
627
+ position: absolute; left: 0; top: 0; bottom: 0; width: calc(var(--prog, 0) * 1%);
628
+ background: linear-gradient(90deg, var(--think), var(--accent));
629
+ transition: width .2s linear;
630
+ }
631
+ .rl-fill::after {
632
+ content: ''; position: absolute; inset: 0;
633
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,.45), transparent);
634
+ transform: translateX(-100%); animation: rlSweep 1.5s linear infinite;
635
+ }
636
+ @keyframes rlSweep { to { transform: translateX(100%); } }
637
+ /* Засечки шагов плана — только в режиме plan */
638
+ .rl-track[data-mode="plan"]::after {
639
+ content: ''; position: absolute; inset: 0; pointer-events: none;
640
+ background: repeating-linear-gradient(90deg,
641
+ transparent 0, transparent calc(33.333% - 1.5px),
642
+ var(--bg) calc(33.333% - 1.5px), var(--bg) 33.333%);
643
+ }
644
+ /* indeterminate: бегущий сканер по всей длине */
645
+ .rl-track[data-mode="scan"] .rl-fill { display: none; }
646
+ .rl-scan {
647
+ display: none; position: absolute; top: 0; bottom: 0; width: 30%; left: -30%;
648
+ background: linear-gradient(90deg, transparent, var(--think) 40%, var(--accent) 72%, transparent);
649
+ }
650
+ .rl-track[data-mode="scan"] .rl-scan {
651
+ display: block; animation: rlScan 1.7s cubic-bezier(.4, .1, .6, .9) infinite;
652
+ }
653
+ @keyframes rlScan { to { left: 100%; } }
654
+ .rail-wrap.phase-tool .rl-track[data-mode="scan"] .rl-scan { animation-duration: 1s; }
655
+ .rail-wrap.phase-compose .rl-track[data-mode="scan"] .rl-scan { animation-duration: 1.3s; }
656
+ /* Вспышка на реальное событие (tool_start / tool_end / text / plan) */
657
+ .rl-track.flash {
658
+ box-shadow: 0 0 0 1px var(--accent), 0 0 14px rgba(196,168,236,.35);
659
+ animation: rlFlash .45s ease-out;
660
+ }
661
+ @keyframes rlFlash { 0% { filter: brightness(1.9); } 100% { filter: brightness(1); } }
662
+
574
663
  /* ---- sidebar — plan / usage / environment sections ---- */
575
664
  .sb {
576
- width: 280px; min-width: 280px; display: flex; flex-direction: column;
665
+ width: 340px; min-width: 340px; display: flex; flex-direction: column;
577
666
  border-left: 1px solid var(--border); background: var(--sb-bg); min-height: 0;
578
667
  }
579
668
  .sec {
@@ -879,12 +968,30 @@ body.light .toggle { background: var(--toggle-off); }
879
968
  background: var(--input-surface); border: 1px solid var(--border-2); border-radius: 4px;
880
969
  color: var(--fg); font: inherit; font-size: 12.5px; padding: 6px 8px; width: 100%; min-width: 0;
881
970
  }
971
+ /* base-URL field: the free-text input sits under the dropdown when "custom" */
972
+ .pform-base { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
882
973
  /* preset row sits above the field grid — keep it off the fields */
883
974
  .provider-body .pform > .pform-field { margin-bottom: 16px; }
884
975
  .pform-adv { margin-top: 18px; }
885
976
  .pform-adv summary { cursor: pointer; font-size: 11.5px; color: var(--dim-a); text-transform: uppercase; letter-spacing: .04em; }
886
977
  .pform-adv .pform-grid { margin-top: 12px; }
887
978
 
979
+ /* titled groups inside "advanced" (retry numbers / cache flags) */
980
+ .pform-checks { display: flex; flex-direction: column; gap: 10px; margin-top: 16px; }
981
+ .pform-checks-title {
982
+ font-size: 11.5px; color: var(--dim-a); text-transform: uppercase; letter-spacing: .04em;
983
+ }
984
+ /* the group gap already separates the title from its grid */
985
+ .pform-checks .pform-grid { margin-top: 0; }
986
+ .pform-checks-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 6px 16px; }
987
+ .pform-check {
988
+ display: inline-flex; align-items: center; gap: 7px; min-width: 0;
989
+ font-size: 12.5px; color: var(--muted); cursor: pointer;
990
+ }
991
+ .pform-check input[type="checkbox"] { width: auto; flex: 0 0 auto; margin: 0; accent-color: var(--accent); }
992
+ .pform-check span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
993
+ .pform-check:hover { color: var(--fg); }
994
+
888
995
  .sec-desc { color: var(--dim-a); font-size: 11.5px; line-height: 1.4; padding: 6px 0 0; max-width: 70ch; }
889
996
 
890
997
  /* structured editors (tags / checkboxes / table) own the full row width */
@@ -1078,6 +1185,25 @@ button.toggle:disabled { opacity: .5; cursor: default; }
1078
1185
  /* ---- responsive layout ---- */
1079
1186
  @media (max-width: 760px) {
1080
1187
  .bar-top { gap: 8px; padding: 8px 10px; }
1188
+ .bar-sub {
1189
+ display: flex; gap: 2px; align-items: center;
1190
+ padding: 5px 10px; background: var(--panel); border-bottom: 1px solid var(--border);
1191
+ color: var(--muted); font-size: 12.5px;
1192
+ }
1193
+ .bar-sub .icon-btn { height: 28px; min-width: 28px; }
1194
+ .sess-name {
1195
+ flex: 1 1 auto; min-width: 0; display: flex; cursor: pointer;
1196
+ background: none; border: none; font: inherit; color: var(--fg);
1197
+ padding: 5px 6px; border-radius: 4px; text-align: left;
1198
+ }
1199
+ .sess-name:hover { background: var(--hover-bg); }
1200
+ .sess-name:disabled { cursor: default; }
1201
+ .sess-name:disabled:hover { background: none; }
1202
+ .sess-name span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1203
+ /* + / list tools live here on phones; the dropdown opens below the bar. */
1204
+ .sess-tools { display: flex; gap: 2px; align-items: center; margin-left: auto; }
1205
+ .sess-tools .dd-menu { left: auto; right: 0; }
1206
+ #sessClose:hover { color: var(--red-strong); }
1081
1207
  .conn { display: none; }
1082
1208
  /* Sidebar toggle lives next to settings; settings keeps the right edge. */
1083
1209
  #toggleSidebar { display: inline-flex; }
@@ -1088,7 +1214,7 @@ button.toggle:disabled { opacity: .5; cursor: default; }
1088
1214
  .sb { display: none; }
1089
1215
  body.sb-open .sb {
1090
1216
  display: flex; position: fixed; top: 41px; right: 0; bottom: 0; z-index: 45;
1091
- width: min(320px, 85vw); min-width: 0; max-height: none;
1217
+ width: min(360px, 85vw); min-width: 0; max-height: none;
1092
1218
  border-left: 1px solid var(--border); border-top: none;
1093
1219
  box-shadow: var(--shadow-dd);
1094
1220
  }
@@ -1116,6 +1242,29 @@ button.toggle:disabled { opacity: .5; cursor: default; }
1116
1242
  .row { font-size: 12.5px; }
1117
1243
  .input-area { margin: 8px 10px 10px; }
1118
1244
  .msgs { padding: 12px 10px; }
1245
+ /* narrow phones: rail stacks vertically, track takes the full row */
1246
+ .rail-wrap.l-line, .rail-wrap.l-meta {
1247
+ flex-direction: column; align-items: stretch; gap: 6px;
1248
+ }
1249
+ .rail-wrap.l-line .rl-track, .rail-wrap.l-meta .rl-track {
1250
+ order: -1; flex: none; width: 100%; max-width: none;
1251
+ }
1252
+ .rail-wrap.l-line .rail-l1, .rail-wrap.l-line .rail-l2 { flex: none; }
1253
+ .rail-wrap.l-meta { width: 100%; flex-basis: 100%; }
1254
+ .selectors { gap: 6px; }
1255
+ .composer-main { gap: 4px; }
1256
+ /* phones have no Enter/Shift+Enter/Esc/Ctrl+V — hints only take up space.
1257
+ Spans only (not the whole row): the `meta` rail layout lives inside
1258
+ .inp-meta and must stay visible. */
1259
+ .inp-meta > span { display: none; }
1260
+ .inp-meta { gap: 0; margin-top: 0; padding: 0 2px; }
1261
+ .inp-meta:empty { display: none; }
1262
+ }
1263
+
1264
+ /* touch devices at any width: keyboard hints don't apply */
1265
+ @media (pointer: coarse) {
1266
+ .inp-meta > span { display: none; }
1267
+ .inp-meta { gap: 0; }
1119
1268
  }
1120
1269
 
1121
1270
  /* --- First-run setup gate ---------------------------------------------------