micro-models-agent 2.5.0 → 2.8.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,3 +1,4 @@
1
+ /* ---- theme tokens (dark default; light override further below) ---- */
1
2
  :root {
2
3
  --bg: #12161d;
3
4
  --fg: #e6edf3;
@@ -144,6 +145,7 @@ body {
144
145
  font-size: 13px; display: flex; flex-direction: column; overflow: hidden;
145
146
  }
146
147
 
148
+ /* ---- topbar: new chat, sessions dropdown, tabstrip, settings ---- */
147
149
  .bar-top {
148
150
  display: flex; gap: 14px; align-items: center;
149
151
  padding: 8px 14px; background: var(--panel); border-bottom: 1px solid var(--border);
@@ -156,6 +158,7 @@ body {
156
158
  .icon-btn:hover { background: var(--hover-bg); color: var(--fg); }
157
159
  .icon-btn.primary { color: var(--accent); }
158
160
  #openSettings { margin-left: auto; margin-right: 6px; }
161
+ #toggleSidebar { display: none; }
159
162
  .conn { color: var(--dim-a); font-size: 11.5px; white-space: nowrap; }
160
163
  .tabstrip {
161
164
  display: flex; gap: 4px; align-items: center; overflow-x: auto;
@@ -176,7 +179,6 @@ body {
176
179
  .stab:hover { color: var(--fg); }
177
180
  .stab.on { background: var(--stab-on-bg); color: var(--fg); border-color: var(--border); }
178
181
  .stab .name { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
179
- .stab .sid { flex: 0 0 auto; color: var(--dim-b); font-size: 11px; }
180
182
  .stab .stab-x {
181
183
  flex: 0 0 auto; width: 18px; height: 18px; padding: 0; justify-content: center;
182
184
  color: var(--dim-b); border-radius: 3px; cursor: pointer;
@@ -216,6 +218,7 @@ body {
216
218
  .dd-menu .act { display: flex; align-items: center; gap: 8px; width: 100%; text-align: left; padding: 7px 8px; border-radius: 4px; cursor: pointer; color: var(--accent); font-size: 12.5px; }
217
219
  .dd-menu .act:hover { background: var(--accent-bg); }
218
220
 
221
+ /* ---- layout + chat feed (messages, cards, markdown, tool output) ---- */
219
222
  .layout { flex: 1; display: flex; min-height: 0; }
220
223
 
221
224
  /* chat */
@@ -285,6 +288,69 @@ body.light .code { border: 1px solid var(--border); }
285
288
  .toolout .more { color: var(--dim-b); cursor: pointer; font-size: 12px; }
286
289
  .toolout .more:hover { color: var(--dim-a); }
287
290
 
291
+ /* markdown answers (streamed by md.js) — lines and glyphs, no boxes */
292
+ .md { color: var(--ans); overflow-wrap: anywhere; }
293
+ .md > * { flex-shrink: 0; }
294
+ .md p { margin: 4px 0; white-space: pre-wrap; }
295
+ .md h1, .md h2, .md h3, .md h4, .md h5, .md h6 {
296
+ color: var(--fg); font-weight: 600; line-height: 1.3; margin: 10px 0 4px;
297
+ }
298
+ .md h1 { font-size: 1.35em; }
299
+ .md h2 { font-size: 1.2em; }
300
+ .md h3 { font-size: 1.1em; }
301
+ .md h4, .md h5, .md h6 { font-size: 1em; }
302
+ .md h1:first-child, .md h2:first-child, .md h3:first-child { margin-top: 2px; }
303
+ .md ul, .md ol { margin: 4px 0; padding-left: 22px; }
304
+ .md li { margin: 1px 0; }
305
+ .md li > p { margin: 0; }
306
+ .md blockquote { margin: 4px 0; padding-left: 10px; border-left: 2px solid var(--pipe); color: var(--dim-a); }
307
+ .md hr { border: 0; border-top: 1px solid var(--rule); margin: 8px 0; }
308
+ .md a { color: var(--accent); text-decoration: none; }
309
+ .md a:hover { text-decoration: underline; }
310
+ .md img { max-width: 100%; border-radius: 4px; }
311
+ .md code {
312
+ background: var(--surface); color: var(--fg); padding: 1px 5px;
313
+ border-radius: 3px; font-size: .92em;
314
+ }
315
+ .md pre code { background: none; padding: 0; border-radius: 0; font-size: inherit; }
316
+ .md input[type="checkbox"] { margin-right: 4px; vertical-align: middle; }
317
+ .md table { border-collapse: collapse; margin: 6px 0; font-size: .95em; }
318
+ .md th { color: var(--fg); font-weight: 600; text-align: left; padding: 2px 14px 3px 0; }
319
+ .md td { color: var(--ans); padding: 2px 14px 3px 0; border-top: 1px solid var(--border-3); }
320
+
321
+ /* fenced code block: dim header (language · copy) + code body */
322
+ .codeblock { margin: 6px 0; background: var(--surface); border-radius: 4px; overflow: hidden; }
323
+ body.light .codeblock { border: 1px solid var(--border); }
324
+ .cb-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 3px 8px 3px 12px; font-size: 11.5px; color: var(--dim-b); }
325
+ .cb-lang { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
326
+ .cb-copy { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; padding: 0; border: 0; border-radius: 4px; background: transparent; color: var(--dim-b); cursor: pointer; }
327
+ .cb-copy .svg-icon { width: 14px; height: 14px; }
328
+ .cb-copy:hover:not(:disabled) { background: var(--hover-bg); color: var(--fg); }
329
+ .cb-copy:disabled { opacity: .3; cursor: default; }
330
+ .cb-copy.done { color: var(--green); }
331
+ .codeblock pre { margin: 0; padding: 6px 12px 10px; overflow-x: auto; max-height: 420px; overflow-y: auto; }
332
+ .codeblock code { display: block; white-space: pre; color: var(--fg); font-size: 12.5px; line-height: 1.55; }
333
+
334
+ /* highlight.js token palette — reuses the theme's semantic tokens */
335
+ .hljs-comment, .hljs-quote { color: var(--dim-b); font-style: italic; }
336
+ .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-doctag { color: var(--red); }
337
+ .hljs-string, .hljs-attr, .hljs-attribute, .hljs-regexp, .hljs-link { color: var(--accent); }
338
+ .hljs-number, .hljs-symbol, .hljs-bullet { color: var(--accent); }
339
+ .hljs-title, .hljs-section, .hljs-selector-id, .hljs-selector-class { color: var(--purple); }
340
+ .hljs-built_in, .hljs-type, .hljs-class .hljs-title { color: var(--yellow); }
341
+ .hljs-variable, .hljs-template-variable, .hljs-params, .hljs-property { color: var(--fg); }
342
+ .hljs-meta { color: var(--dim-a); }
343
+ .hljs-tag, .hljs-name, .hljs-selector-pseudo { color: var(--green); }
344
+ .hljs-deletion { color: var(--red); }
345
+ .hljs-addition { color: var(--green); }
346
+ .hljs-emphasis { font-style: italic; }
347
+ .hljs-strong { font-weight: 700; }
348
+
349
+ /* per-message copy actions */
350
+ .msg-actions { display: flex; gap: 12px; margin: 3px 0 6px; }
351
+ .act-btn { font: inherit; font-size: 11.5px; color: var(--dim-b); background: none; border: 0; padding: 0; cursor: pointer; }
352
+ .act-btn:hover { color: var(--fg); }
353
+
288
354
  /* tool payload cards in chat */
289
355
  .imgcard {
290
356
  margin-left: 26px; max-width: 360px; border-radius: 4px; overflow: hidden;
@@ -371,7 +437,7 @@ body.light .imgcard .ph { background: var(--ph-light); }
371
437
  }
372
438
  .empty .g { color: var(--green); }
373
439
 
374
- /* input */
440
+ /* ---- composer: selectors, attachments, input, autocomplete ---- */
375
441
  .input-area { margin: 14px 22px 16px; position: relative; }
376
442
  .selectors { display: flex; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; }
377
443
  .sel { position: relative; }
@@ -500,7 +566,7 @@ body.light .sel > button { border: 1px solid var(--border); }
500
566
  .input-area.dragover .composer { border-color: var(--accent); box-shadow: 0 0 0 2px var(--input-shadow); }
501
567
  @keyframes blink { 50% { opacity: 0; } }
502
568
 
503
- /* sidebar — sections with independent scroll */
569
+ /* ---- sidebar — plan / usage / environment sections ---- */
504
570
  .sb {
505
571
  width: 280px; min-width: 280px; display: flex; flex-direction: column;
506
572
  border-left: 1px solid var(--border); background: var(--sb-bg); min-height: 0;
@@ -545,6 +611,16 @@ body.light .kv b { color: var(--fg); }
545
611
  .kv .dim { color: var(--dim-a); }
546
612
  .kv .wn { color: var(--yellow); }
547
613
  body.light .kv .wn { color: var(--yellow); }
614
+ .kv-val { display: inline-flex; align-items: center; gap: 4px; min-width: 0; }
615
+ .kv-val b { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
616
+ .copy-btn {
617
+ display: inline-flex; align-items: center; justify-content: center;
618
+ width: 18px; height: 18px; padding: 0; flex: 0 0 auto;
619
+ border: 0; border-radius: 3px; background: transparent;
620
+ color: var(--dim-b); cursor: pointer;
621
+ }
622
+ .copy-btn .svg-icon { width: 12px; height: 12px; }
623
+ .copy-btn:hover { color: var(--fg); background: var(--hover-bg); }
548
624
  /* Environment section: stacked items (name on top, dim value below). */
549
625
  #env .env-item { padding: 3px 0; }
550
626
  #env .env-k { color: var(--muted); font-size: 12px; }
@@ -552,7 +628,7 @@ body.light .kv .wn { color: var(--yellow); }
552
628
  .bar { height: 4px; background: var(--track); border-radius: 2px; margin-top: 6px; overflow: hidden; }
553
629
  .bar i { display: block; height: 100%; width: 0; background: var(--green-fill); transition: width .2s; }
554
630
 
555
- /* settings modal */
631
+ /* ---- settings modal + nested dialogs (provider, confirm) ---- */
556
632
  .overlay {
557
633
  display: none; position: fixed; inset: 0; z-index: 50;
558
634
  background: var(--overlay); align-items: center; justify-content: center;
@@ -590,6 +666,16 @@ body.light .kv .wn { color: var(--yellow); }
590
666
  .confirm-actions .linkbtn:hover { text-decoration: none; background: var(--hover-bg-2); }
591
667
  .confirm-actions .linkbtn.danger { border-color: var(--red-strong); color: var(--red-strong); }
592
668
  .confirm-actions .linkbtn.danger:hover { background: var(--x-hover-bg); }
669
+
670
+ /* nested provider add/edit dialog (opens above the settings modal) */
671
+ .overlay.overlay-nested { z-index: 60; }
672
+ .modal.modal-provider {
673
+ width: min(520px, 92vw); height: auto; max-height: 88vh; border-radius: 8px;
674
+ }
675
+ .provider-body { display: block; padding: 20px 22px 22px; overflow-y: auto; }
676
+ .provider-body .pform {
677
+ margin: 0; padding: 0; border: 0; background: none;
678
+ }
593
679
  .menu-col {
594
680
  width: 200px; min-width: 200px; padding: 12px 8px;
595
681
  border-right: 1px solid var(--border); overflow-y: auto;
@@ -725,23 +811,73 @@ body.light .toggle { background: var(--toggle-off); }
725
811
  .mem-add input { flex: 1 1 180px; min-width: 0; }
726
812
  .mem-add .linkbtn { flex: 0 0 auto; }
727
813
 
814
+ /* settings sections (models / providers) */
815
+ .settings-section { margin-bottom: 22px; }
816
+ .sec-head {
817
+ display: flex; align-items: baseline; gap: 10px;
818
+ padding: 0 0 6px; border-bottom: 1px solid var(--border-3);
819
+ }
820
+ .sec-title { font-size: 11.5px; text-transform: uppercase; letter-spacing: .05em; color: var(--dim-a); }
821
+ .sec-add {
822
+ margin-left: auto; display: inline-flex; align-items: center; gap: 5px;
823
+ font: inherit; font-size: 12px; color: var(--accent);
824
+ background: none; border: 0; padding: 2px 0; cursor: pointer;
825
+ }
826
+ .sec-add:hover { text-decoration: underline; }
827
+ .sec-add .svg-icon { width: 13px; height: 13px; }
828
+ .sec-body { padding-top: 8px; }
829
+
830
+ /* model catalog */
831
+ .model-list { max-height: 320px; overflow-y: auto; }
832
+ .model-item {
833
+ display: flex; align-items: center; gap: 10px;
834
+ padding: 6px 0; border-bottom: 1px solid var(--border-3);
835
+ font-size: 12.5px; color: var(--muted);
836
+ }
837
+ .model-item:last-child { border-bottom: none; }
838
+ .model-item .m-name { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
839
+ .model-item.active .m-name { color: var(--purple); }
840
+ .model-item .m-meta { color: var(--dim-a); white-space: nowrap; flex: 0 0 auto; }
841
+
842
+ /* provider entries */
843
+ .provider-list { display: flex; flex-direction: column; }
844
+ .provider-item { padding: 8px 0; border-bottom: 1px solid var(--border-3); }
845
+ .provider-item:last-child { border-bottom: none; }
846
+ .provider-item .p-head { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
847
+ .provider-item .p-name { color: var(--fg); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
848
+ .provider-item .badge {
849
+ flex: 0 0 auto; font-size: 10.5px; text-transform: uppercase; letter-spacing: .04em;
850
+ color: var(--green); border: 1px solid var(--border-2); border-radius: 999px; padding: 1px 7px;
851
+ }
852
+ .provider-item .p-meta { color: var(--dim-a); font-size: 11.5px; margin-top: 2px; overflow-wrap: anywhere; }
853
+ .provider-item .p-actions { display: flex; gap: 12px; margin-top: 6px; }
854
+ .chip { font: inherit; font-size: 11.5px; color: var(--accent); background: none; border: 0; padding: 0; cursor: pointer; }
855
+ .chip:hover { text-decoration: underline; }
856
+ .chip.danger { color: var(--red-strong); }
857
+
728
858
  /* provider add/edit form */
729
- .add-provider { display: inline-block; padding: 8px 0; }
730
859
  .pform {
731
- margin-top: 10px; padding: 12px; border: 1px solid var(--border-2); border-radius: 6px;
860
+ margin-top: 12px; padding: 12px; border: 1px solid var(--border-2); border-radius: 6px;
732
861
  background: var(--surface);
733
862
  }
863
+ .pform-title { font-size: 12.5px; color: var(--fg); margin-bottom: 10px; }
734
864
  .pform-grid {
735
865
  display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
736
- gap: 8px 12px;
866
+ gap: 14px;
737
867
  }
738
- .pform-field { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
868
+ .pform-field { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
739
869
  .pform-field label { font-size: 11px; color: var(--dim-a); text-transform: uppercase; letter-spacing: .04em; }
740
- .pform-field input {
870
+ .pform-field input,
871
+ .pform-field select {
741
872
  background: var(--input-surface); border: 1px solid var(--border-2); border-radius: 4px;
742
- color: var(--fg); font: inherit; font-size: 12.5px; padding: 5px 8px; width: 100%; min-width: 0;
743
- }
744
- .pform-actions { display: flex; gap: 14px; align-items: center; padding-top: 10px; }
873
+ color: var(--fg); font: inherit; font-size: 12.5px; padding: 6px 8px; width: 100%; min-width: 0;
874
+ }
875
+ /* preset row sits above the field grid — keep it off the fields */
876
+ .provider-body .pform > .pform-field { margin-bottom: 16px; }
877
+ .pform-adv { margin-top: 18px; }
878
+ .pform-adv summary { cursor: pointer; font-size: 11.5px; color: var(--dim-a); text-transform: uppercase; letter-spacing: .04em; }
879
+ .pform-adv .pform-grid { margin-top: 12px; }
880
+ .pform-actions { display: flex; gap: 14px; align-items: center; padding-top: 22px; }
745
881
  .pform-actions .linkbtn.dim { color: var(--dim-a); }
746
882
  .settings-note { color: var(--dim-b); font-size: 11.5px; line-height: 1.7; padding: 8px 0 4px; }
747
883
 
@@ -849,13 +985,19 @@ button.toggle:disabled { opacity: .5; cursor: default; }
849
985
  @media (max-width: 760px) {
850
986
  .bar-top { gap: 8px; padding: 8px 10px; }
851
987
  .conn { display: none; }
988
+ /* Sidebar toggle lives next to settings; settings keeps the right edge. */
989
+ #toggleSidebar { display: inline-flex; }
990
+ #openSettings { margin-left: 0; }
852
991
  .layout { flex-direction: column; }
853
992
  .chat { min-height: 0; }
854
- .sb {
855
- width: 100%; min-width: 0; max-height: 42vh;
856
- border-left: none; border-top: 1px solid var(--border);
993
+ /* Phones: sidebar hidden, opens as an overlay drawer via body.sb-open. */
994
+ .sb { display: none; }
995
+ body.sb-open .sb {
996
+ display: flex; position: fixed; top: 41px; right: 0; bottom: 0; z-index: 45;
997
+ width: min(320px, 85vw); min-width: 0; max-height: none;
998
+ border-left: 1px solid var(--border); border-top: none;
999
+ box-shadow: var(--shadow-dd);
857
1000
  }
858
- .sec.usage-sec { max-height: 50%; }
859
1001
  .msgs { padding: 14px; }
860
1002
  .input-area { margin: 10px 14px 12px; }
861
1003
  .inp-meta { flex-wrap: wrap; gap: 8px; }
@@ -879,3 +1021,93 @@ button.toggle:disabled { opacity: .5; cursor: default; }
879
1021
  .input-area { margin: 8px 10px 10px; }
880
1022
  .msgs { padding: 12px 10px; }
881
1023
  }
1024
+
1025
+ /* --- First-run setup gate ---------------------------------------------------
1026
+ Full-screen wizard shown when the config is virgin. No boxed panels: rows,
1027
+ glyphs and dim separators per docs/design/ui/STYLE.md. `body.setup-active`
1028
+ hides the chat chrome so the wizard owns the viewport. */
1029
+ body.setup-active .bar-top,
1030
+ body.setup-active .layout { display: none; }
1031
+
1032
+ .setup-gate[hidden] { display: none; }
1033
+ .setup-gate {
1034
+ position: fixed; inset: 0; z-index: 60;
1035
+ background: var(--bg); color: var(--fg);
1036
+ overflow-y: auto;
1037
+ display: flex; justify-content: center;
1038
+ padding: 48px 20px;
1039
+ }
1040
+ .setup-wrap { width: 100%; max-width: 560px; }
1041
+ .setup-h { font-size: 20px; font-weight: 600; margin: 0 0 4px; }
1042
+ .setup-h .glyph { color: var(--accent); margin-right: 8px; }
1043
+ .setup-sub { color: var(--dim-a); font-size: 13px; margin: 0 0 22px; }
1044
+
1045
+ .setup-steps {
1046
+ display: flex; flex-wrap: wrap; gap: 4px;
1047
+ font-size: 12px; color: var(--dim-b); margin-bottom: 22px;
1048
+ }
1049
+ .setup-steps .s.on { color: var(--accent); }
1050
+ .setup-steps .s.done { color: var(--green); }
1051
+ .setup-steps .sep { color: var(--rule); }
1052
+
1053
+ .setup-step-title { font-size: 15px; font-weight: 600; margin: 0 0 4px; }
1054
+ .setup-hint { color: var(--dim-a); font-size: 12.5px; margin: 0 0 14px; line-height: 1.5; }
1055
+
1056
+ .setup-field { margin-bottom: 14px; }
1057
+ .setup-label { display: block; font-size: 12px; color: var(--dim-a); margin-bottom: 5px; }
1058
+ .setup-input {
1059
+ width: 100%; box-sizing: border-box;
1060
+ background: var(--inp-bg); color: var(--fg);
1061
+ border: 1px solid var(--border-2); border-radius: 7px;
1062
+ padding: 8px 10px; font-size: 13.5px; font-family: inherit;
1063
+ }
1064
+ .setup-input:focus-visible { outline: none; border-color: var(--inp-focus); box-shadow: 0 0 0 2px var(--input-shadow); }
1065
+
1066
+ .setup-opt {
1067
+ display: flex; width: 100%; box-sizing: border-box;
1068
+ align-items: baseline; gap: 8px; text-align: left;
1069
+ background: transparent; color: var(--fg);
1070
+ border: 1px solid var(--border); border-radius: 7px;
1071
+ padding: 9px 11px; margin-bottom: 7px;
1072
+ font-size: 13px; font-family: inherit; cursor: pointer;
1073
+ }
1074
+ .setup-opt:hover { background: var(--hover-bg); }
1075
+ .setup-opt .g { color: var(--dim-b); }
1076
+ .setup-opt .t { font-weight: 500; }
1077
+ .setup-opt .d { color: var(--dim-a); font-size: 12px; }
1078
+ .setup-opt.on { border-color: var(--accent); background: var(--accent-bg); }
1079
+ .setup-opt.on .g { color: var(--accent); }
1080
+
1081
+ .setup-row-inline { display: flex; gap: 8px; align-items: center; }
1082
+ .setup-row-inline .setup-input { flex: 1; }
1083
+
1084
+ .setup-actions { display: flex; gap: 10px; align-items: center; margin-top: 22px; }
1085
+ .setup-actions .spacer { flex: 1; }
1086
+ .setup-btn {
1087
+ background: var(--surface); color: var(--fg);
1088
+ border: 1px solid var(--border-2); border-radius: 7px;
1089
+ padding: 8px 15px; font-size: 13px; font-family: inherit; cursor: pointer;
1090
+ }
1091
+ .setup-btn:hover { background: var(--hover-bg); }
1092
+ .setup-btn.primary { background: var(--green-fill); border-color: var(--green-fill); color: #fff; }
1093
+ .setup-btn.primary:hover { filter: brightness(1.08); }
1094
+ .setup-btn:disabled { opacity: .5; cursor: default; }
1095
+ .setup-btn.link { background: none; border: none; color: var(--accent); padding: 8px 4px; }
1096
+
1097
+ .setup-msg { font-size: 12.5px; margin-top: 10px; min-height: 17px; }
1098
+ .setup-msg.ok { color: var(--green); }
1099
+ .setup-msg.warn { color: var(--yellow); }
1100
+ .setup-msg.err { color: var(--err); }
1101
+
1102
+ .setup-summary { margin-top: 6px; }
1103
+ .setup-summary .r { display: flex; gap: 12px; padding: 5px 0; border-bottom: 1px solid var(--border-3); font-size: 13px; }
1104
+ .setup-summary .k { color: var(--dim-a); width: 150px; flex: 0 0 auto; }
1105
+ .setup-summary .v { color: var(--fg); word-break: break-all; }
1106
+
1107
+ .setup-toggle { display: flex; align-items: center; gap: 9px; padding: 7px 0; font-size: 13px; cursor: pointer; }
1108
+ .setup-toggle input { accent-color: var(--green-fill); width: 15px; height: 15px; }
1109
+
1110
+ @media (max-width: 640px) {
1111
+ .setup-gate { padding: 24px 14px; }
1112
+ .setup-summary .k { width: 110px; }
1113
+ }