cortico 0.1.1 → 0.1.2

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.
Files changed (85) hide show
  1. package/README.md +3 -3
  2. package/package.json +1 -1
  3. package/src/boot.ts +18 -0
  4. package/src/bot.ts +40 -5
  5. package/src/core/README.md +4 -2
  6. package/src/core/blobs.ts +23 -2
  7. package/src/core/config-schema.ts +1 -1
  8. package/src/core/config.ts +2 -16
  9. package/src/core/core.ts +15 -5
  10. package/src/core/loop.ts +55 -27
  11. package/src/core/session.ts +3 -2
  12. package/src/core/timers.ts +8 -6
  13. package/src/core/types.ts +18 -2
  14. package/src/core/util.ts +15 -0
  15. package/src/deploy.ts +5 -4
  16. package/src/extensions/README.md +6 -4
  17. package/src/extensions/dry-mount.ts +23 -2
  18. package/src/extensions/manifest.ts +21 -11
  19. package/src/extensions.ts +147 -23
  20. package/src/launcher.ts +23 -9
  21. package/src/protocol/open-responses/context-log.ts +37 -9
  22. package/src/providers/README.md +32 -7
  23. package/src/providers/base.ts +2 -0
  24. package/src/providers/console/config.ts +21 -0
  25. package/src/providers/console/hub.ts +270 -0
  26. package/src/providers/console/settings.ts +11 -19
  27. package/src/providers/console/types.ts +5 -0
  28. package/src/providers/hub-api.ts +3 -0
  29. package/src/providers/llamacpp/config.ts +38 -0
  30. package/src/providers/llamacpp/console/runtime-panel.ts +36 -73
  31. package/src/providers/llamacpp/console/server.ts +23 -2
  32. package/src/providers/llamacpp/index.ts +5 -1
  33. package/src/providers/llamacpp/native.ts +10 -5
  34. package/src/providers/llamacpp/options.ts +2 -0
  35. package/src/providers/name.ts +8 -0
  36. package/src/providers/openai-responses-compat/config.ts +33 -0
  37. package/src/providers/openai-responses-compat/console/client.ts +5 -0
  38. package/src/providers/openai-responses-compat/console/reasoning-panel.ts +84 -0
  39. package/src/providers/openai-responses-compat/console/server.ts +127 -0
  40. package/src/providers/openai-responses-compat/index.ts +40 -12
  41. package/src/providers/openai-responses-compat/native.ts +9 -4
  42. package/src/providers/openai-responses-compat/strings.ts +62 -1
  43. package/src/providers/registry.ts +5 -0
  44. package/src/providers/transport/responses-input.ts +59 -10
  45. package/src/web/README.md +12 -3
  46. package/src/web/auth.ts +80 -0
  47. package/src/web/client/console-pages/builtins/llm-settings/panel.ts +42 -35
  48. package/src/web/client/console-pages/builtins/llm-settings/pricing-panel.ts +22 -8
  49. package/src/web/client/console-pages/builtins/llm-settings/strings.ts +2 -4
  50. package/src/web/client/console-pages/host.ts +22 -5
  51. package/src/web/client/core/api.ts +5 -1
  52. package/src/web/client/core/router.ts +15 -0
  53. package/src/web/client/features/extensions/index.ts +276 -41
  54. package/src/web/client/features/extensions/strings.ts +84 -10
  55. package/src/web/client/features/feature.ts +1 -1
  56. package/src/web/client/features/live/diagnostics.ts +32 -0
  57. package/src/web/client/features/live/index.ts +27 -11
  58. package/src/web/client/features/live/protocol.ts +1 -0
  59. package/src/web/client/features/live/strings.ts +9 -3
  60. package/src/web/client/features/providers/detail.ts +262 -0
  61. package/src/web/client/features/providers/drafts.ts +23 -0
  62. package/src/web/client/features/providers/index.ts +173 -87
  63. package/src/web/client/features/providers/strings.ts +44 -17
  64. package/src/web/client/features/providers/types.ts +15 -0
  65. package/src/web/client/features/settings/general.ts +12 -0
  66. package/src/web/client/features/settings/strings.ts +6 -0
  67. package/src/web/client/main.ts +4 -0
  68. package/src/web/client/shell/index.ts +1 -1
  69. package/src/web/client/ui/icons.ts +9 -1
  70. package/src/web/client/ui/prompt-input.tsx +17 -5
  71. package/src/web/client/ui/strings.ts +0 -2
  72. package/src/web/diagnostics.ts +133 -0
  73. package/src/web/public/login.html +67 -0
  74. package/src/web/public/styles.css +122 -18
  75. package/src/web/server.ts +227 -21
  76. package/src/web/shared/client-panel.ts +3 -0
  77. package/src/web/shared/console-protocol.ts +3 -1
  78. package/src/worlds/bilibili/README.md +1 -1
  79. package/src/worlds/bilibili/overlay/server.ts +4 -2
  80. package/src/worlds/minecraft/ADAPT.md +66 -0
  81. package/src/worlds/minecraft/README.md +8 -0
  82. package/src/worlds/minecraft/mineflayer-fixes.ts +55 -1
  83. package/src/worlds/qq/normalize.ts +14 -0
  84. package/src/worlds/qq/world.ts +53 -7
  85. package/src/worlds/terminal/world.ts +3 -4
@@ -54,8 +54,8 @@
54
54
  --shadow-soft: color-mix(in srgb, var(--ink) 7%, transparent);
55
55
  --shadow-strong: color-mix(in srgb, var(--ink) 20%, transparent);
56
56
  --overlay: color-mix(in srgb, var(--ink) 44%, transparent);
57
- --sans: -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", "Noto Sans SC", sans-serif;
58
- --mono: ui-monospace, "Cascadia Mono", "Sarasa Mono SC", Consolas, "PingFang SC", "Microsoft YaHei", monospace;
57
+ --sans: -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", "Noto Sans CJK SC", sans-serif;
58
+ --mono: ui-monospace, "Cascadia Mono", "Sarasa Mono SC", Consolas, monospace;
59
59
  --background: var(--paper);
60
60
  --surface: var(--sheet);
61
61
  --surface-hover: var(--sheet-2);
@@ -159,7 +159,7 @@
159
159
  .pagedesc { font-size: 13px; color: var(--ink-soft); max-width: 68ch; }
160
160
 
161
161
  .scroll { flex: 1; min-height: 0; overflow-y: auto; padding: 18px 30px 40px; }
162
- .measure { max-width: 1080px; }
162
+ .measure { max-width: var(--content-width); }
163
163
 
164
164
 
165
165
  .subtabs { display: flex; gap: 4px; flex-wrap: wrap; padding: 12px 30px 0; flex: none; }
@@ -221,12 +221,14 @@
221
221
  }
222
222
  .btn:hover { color: var(--ink); border-color: var(--line-strong); background: var(--sheet); }
223
223
  .btn:disabled { opacity: .45; cursor: default; }
224
- .btn.primary { background: var(--accent); color: var(--on-accent); border-color: var(--accent); }
225
- .btn.primary:hover { filter: brightness(1.06); color: var(--on-accent); }
224
+ .btn.primary { background: var(--accent); color: #fff; border-color: var(--accent); }
225
+ .btn.primary:hover { filter: brightness(1.06); color: #fff; }
226
226
  .btn.warn:hover { color: var(--warn); border-color: var(--warn); }
227
227
  .btn.danger { color: var(--danger); border-color: color-mix(in srgb, var(--danger) 42%, transparent); }
228
228
  .btn.danger:hover { background: color-mix(in srgb, var(--danger) 9%, transparent); border-color: var(--danger); }
229
229
  .btn.sm { padding: 4px 11px; font-size: var(--text-detail); }
230
+ .btn-ico { display: inline-flex; align-items: center; gap: 6px; }
231
+ .btn-ico .icon { width: 14px; height: 14px; }
230
232
 
231
233
  .msgline { font: var(--text-detail)/1.45 var(--sans); min-height: 16px; color: var(--ok); }
232
234
  .msgline:empty { display: none; }
@@ -639,7 +641,7 @@
639
641
  min-height: 36px;
640
642
  transition: background-color .15s ease, color .15s ease, border-color .15s ease, opacity .15s ease;
641
643
  }
642
- .btn.primary, .seg.active { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }
644
+ .btn.primary, .seg.active { background: var(--accent); border-color: var(--accent); color: #fff; }
643
645
  input.field, select.field, textarea.field { min-height: 40px; }
644
646
  input:focus-visible, textarea:focus-visible, select:focus-visible, button:focus-visible, [tabindex]:focus-visible {
645
647
  outline: 2px solid color-mix(in srgb, var(--accent) 45%, transparent); outline-offset: 2px;
@@ -989,17 +991,19 @@
989
991
  overflow-x: hidden;
990
992
  overflow-y: auto;
991
993
  padding: 30px var(--page-gutter) 56px;
992
- scrollbar-gutter: stable;
994
+ scrollbar-gutter: stable both-edges;
993
995
  }
994
996
  .providerchrome {
997
+ overflow: hidden;
998
+ scrollbar-gutter: stable both-edges;
995
999
  flex: none;
996
1000
  min-width: 0;
997
1001
  padding: 30px var(--page-gutter) 0;
998
1002
  }
999
1003
  .panelslot { padding-top: 8px; }
1000
- .featureslot > :not(.viewport-overlay),
1004
+ .featureslot > :where(:not(.viewport-overlay)),
1001
1005
  .providerchrome > *,
1002
- .panelslot > :not(.viewport-overlay) {
1006
+ .panelslot > :where(:not(.viewport-overlay)) {
1003
1007
  flex: none;
1004
1008
  width: 100%;
1005
1009
  max-width: var(--content-width);
@@ -1012,9 +1016,8 @@
1012
1016
  padding: 0;
1013
1017
  }
1014
1018
  .coreview .measure {
1015
- width: min(100%, var(--conversation-width));
1016
- margin-right: auto;
1017
- margin-left: 0;
1019
+ width: min(100%, var(--content-width));
1020
+ margin-inline: auto;
1018
1021
  }
1019
1022
  .featureslot-live > *,
1020
1023
  .featureslot-core > * {
@@ -1035,7 +1038,7 @@
1035
1038
  .providerintro .msgline { margin-top: 10px; }
1036
1039
  .pagetitle { margin-top: 7px; font: 600 22px/1.3 var(--sans); letter-spacing: -.025em; }
1037
1040
  .pagedesc { margin-top: 5px; color: var(--muted-foreground); font-size: 13px; line-height: 1.55; }
1038
- .scroll { padding: 22px var(--page-gutter) 48px; scrollbar-gutter: stable; }
1041
+ .scroll { padding: 22px var(--page-gutter) 48px; scrollbar-gutter: stable both-edges; }
1039
1042
  .measure { width: min(100%, var(--content-width)); margin-inline: auto; }
1040
1043
  .subtabs {
1041
1044
  width: 100%;
@@ -1068,6 +1071,11 @@
1068
1071
  details.sheet.fold { margin-bottom: 10px; }
1069
1072
  details.sheet.fold > summary { padding: 0; }
1070
1073
  details.sheet.fold > .foldbody { padding: 14px 0 0; }
1074
+ /* 整张点开详细页的卡(npm 搜索结果)。取值与 .connection-card 一致。 */
1075
+ .iocard-open { cursor: pointer; transition: background .15s, border-color .15s; }
1076
+ .iocard-open:hover { border-color: var(--border-strong); background: color-mix(in srgb, var(--surface) 92%, transparent); }
1077
+ .iocard-open:focus-visible { outline: 2px solid var(--ink-dim); outline-offset: 1px; }
1078
+ .iocard-open.is-installed { border-color: var(--accent); box-shadow: 0 0 8px color-mix(in srgb, var(--accent) 12%, transparent); }
1071
1079
  .featureslot > :not(.sheet) + .sheet,
1072
1080
  .featureslot > .sheet + .sheet,
1073
1081
  .panelslot > :not(.sheet) + .sheet,
@@ -1150,7 +1158,7 @@
1150
1158
  }
1151
1159
  .prompt-toolbar .msgline { min-width: 0; overflow-wrap: anywhere; }
1152
1160
  .featureslot-prompts > .prompt-library,
1153
- .panelslot > .prompt-library { margin-top: 28px; }
1161
+ .panelslot > .prompt-library { margin-top: 0; }
1154
1162
  .prompt-card textarea.field {
1155
1163
  width: 100%;
1156
1164
  min-height: 300px;
@@ -1432,7 +1440,7 @@
1432
1440
  box-shadow: none;
1433
1441
  }
1434
1442
  .btn:hover { background: var(--hover); color: var(--foreground); border-color: transparent; box-shadow: none; }
1435
- .btn.primary { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }
1443
+ .btn.primary { background: var(--accent); border-color: var(--accent); color: #fff; }
1436
1444
  .btn.primary:hover { background: color-mix(in srgb, var(--accent) 90%, var(--ink)); filter: none; }
1437
1445
  :root[data-theme-scheme="mint"] .btn.primary {
1438
1446
  background: color-mix(in srgb, var(--accent) 78%, var(--sheet-2));
@@ -1452,6 +1460,15 @@
1452
1460
  font-family: var(--sans);
1453
1461
  font-size: 13px;
1454
1462
  }
1463
+ select.field:not([multiple]):not([size]) {
1464
+ appearance: none;
1465
+ padding-right: 36px;
1466
+ background-image: linear-gradient(45deg, transparent 50%, var(--muted-foreground) 50%),
1467
+ linear-gradient(135deg, var(--muted-foreground) 50%, transparent 50%);
1468
+ background-position: right 18px center, right 14px center;
1469
+ background-size: 4px 4px;
1470
+ background-repeat: no-repeat;
1471
+ }
1455
1472
  input.field:focus, select.field:focus, textarea.field:focus { border-color: var(--border-strong); }
1456
1473
  .fieldrow .fieldlabel { margin-bottom: 6px; color: var(--muted-foreground); font-size: 11px; letter-spacing: 0; text-transform: none; }
1457
1474
  .segwrap { gap: 2px; padding: 2px; background: var(--surface-hover); border: 0; border-radius: var(--radius-md); }
@@ -1590,7 +1607,7 @@
1590
1607
  .providerhub .panelslot { display: block; flex: none; padding: 0; overflow: visible; container: none; }
1591
1608
  .providerhub .panelslot { margin-top: 22px; }
1592
1609
  .providerhub .providerchrome > *,
1593
- .providerhub .panelslot > :not(.viewport-overlay) { max-width: none; }
1610
+ .providerhub .panelslot > :where(:not(.viewport-overlay)) { max-width: none; }
1594
1611
  .providerhub .providerintro .pagetitle { margin: 0; font-size: 18px; }
1595
1612
  .providerhub .providerintro .pagedesc { margin-top: 4px; }
1596
1613
  .providerhub .providerintro .rowbar { margin-top: 10px; }
@@ -1621,7 +1638,7 @@
1621
1638
 
1622
1639
  @media (max-width: 900px) {
1623
1640
  #rail { width: 232px; }
1624
- .pagehead, .scroll, .subtabs, .liveband, .tlscroll { padding-left: 20px; padding-right: 20px; }
1641
+ :root { --page-gutter: 20px; }
1625
1642
  .settings-layout { grid-template-columns: minmax(0, 1fr); gap: 20px; }
1626
1643
  .settings-index { position: static; flex-direction: row; overflow-x: auto; }
1627
1644
  .settings-jump { width: auto; white-space: nowrap; }
@@ -1724,5 +1741,92 @@
1724
1741
  .ob-btn:hover:not(:disabled) { background: var(--hover); }
1725
1742
  .ob-btn .icon { width: 14px; height: 14px; }
1726
1743
  .ob-btn:disabled { opacity: .55; cursor: not-allowed; }
1727
- .ob-btn.ob-go { background: var(--accent); color: var(--on-accent); }
1744
+ .ob-btn.ob-go { background: var(--accent); color: #fff; }
1728
1745
  .ob-btn.ob-go:hover:not(:disabled) { filter: brightness(1.06); }
1746
+ .connection-hub{display:grid;grid-template-columns:minmax(210px,280px) minmax(0,1fr);gap:24px;align-items:start}
1747
+ .connection-index{position:sticky;top:16px;min-width:0;max-height:calc(100vh - 140px);overflow:auto;padding:4px}
1748
+ .connection-cards{display:grid;gap:12px;padding:3px}
1749
+ .connection-card{min-width:0;border:1px solid var(--line);border-radius:12px;padding:14px;background:var(--paper);cursor:pointer;transition:background .15s,border-color .15s}
1750
+ .connection-card.is-active{border-color:var(--accent);box-shadow:0 0 8px color-mix(in srgb,var(--accent) 12%,transparent)}
1751
+ .connection-card.is-selected{background:color-mix(in srgb,var(--ink) 5%,var(--paper));outline:2px solid var(--ink-dim);outline-offset:1px}
1752
+ .connection-name,.connection-kind,.connection-model,.connection-url,.connection-status,.connection-secondary{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
1753
+ .connection-name{font:700 17px/1.25 var(--sans)}.connection-kind{margin-top:4px;font:600 11.5px/1.3 var(--sans);color:var(--muted-foreground)}.connection-model{margin-top:9px;font-size:13px}.connection-url{font-size:11px;color:var(--ink-dim);margin-top:3px}
1754
+ .connection-status{font-size:12px;margin-top:14px}.connection-secondary{font-size:11px;color:var(--ink-dim)}
1755
+ .connection-card .rowbar{margin-top:12px;justify-content:space-between;gap:4px}
1756
+ .connection-detail{min-width:0}.connection-detail .sheet{margin-bottom:16px}
1757
+ .connection-detail .connection-field{margin-bottom:15px}.connection-detail input:not([type=checkbox]),.connection-detail select,.connection-detail textarea{max-width:100%;width:100%}
1758
+ .connection-detail .field-error{color:var(--danger,#b43c38);font-size:12px;min-height:0}.connection-shared{color:var(--ink-dim);font-size:12px;line-height:1.7;margin:20px 0 12px}
1759
+ .connection-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.connection-actions .grow{flex:1}
1760
+ @media(max-width:760px){.connection-hub{grid-template-columns:1fr}.connection-index{position:static;max-height:320px}.connection-cards{grid-template-columns:repeat(auto-fit,minmax(210px,1fr))}}
1761
+ .connection-guard{border:1px solid var(--line);border-radius:16px;padding:24px;background:var(--paper);color:var(--ink);max-width:560px;box-shadow:0 12px 60px #0003}
1762
+ .connection-guard::backdrop{background:#0005}.connection-guard h3{margin-bottom:20px}
1763
+
1764
+ .live-summary { flex-wrap:wrap; }
1765
+ .live-connection { display:inline-flex; align-items:center; gap:7px; min-width:0; max-width:48%; background:none; border:0; color:var(--ink-soft); cursor:pointer; padding:0; font:11.5px/1 var(--sans); }
1766
+ .live-connection-label { flex-shrink:0; }
1767
+ .live-connection-value { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; padding:4px 8px; border-radius:7px; background:var(--hover); border:1px solid var(--border); color:var(--ink-blue); font-weight:600; }
1768
+ .live-connection:hover .live-connection-value { border-color:var(--accent); }
1769
+ .live-connection:focus-visible { outline:2px solid var(--accent); outline-offset:3px; border-radius:7px; }
1770
+ @media(max-width:760px) { .live-connection { max-width:100%; margin-left:auto; } }
1771
+
1772
+ .connection-detail .msgline:not(.bad) { color:var(--ink-soft); }
1773
+ .connection-detail .tdesc { margin:6px 0 12px; }
1774
+
1775
+ /* Page headings stay above the shared content origin while each page scrolls. */
1776
+ .featureslot:has(> .featureintro) { padding-top:0; }
1777
+ .featureintro { padding-bottom:16px; border-bottom:1px solid var(--border); }
1778
+ .featureslot > .featureintro { position:sticky; top:0; z-index:20; padding-top:30px; margin-bottom:24px; background:var(--background); }
1779
+ .featureslot > .featureintro + * { margin-top:0; }
1780
+ .featureslot > .featureintro + .sheet { margin-top:0; }
1781
+ .providerchrome { padding-bottom:0; }
1782
+ .providerchrome + .panelslot { padding-top:24px; }
1783
+ .coreview > .pagehead { padding-bottom:16px; }
1784
+ .connection-index { padding-top:0; top:100px; }
1785
+ .connection-detail > div > div:first-child > .sheet:first-child { padding-top:0; }
1786
+ .connection-hub .btn { border:1px solid var(--border-strong); }
1787
+ .connection-hub .btn:hover { border-color:var(--ink-soft); }
1788
+ .connection-hub .btn.danger { border-color:currentColor; }
1789
+ .connection-hub .btn.primary, .connection-hub .btn.primary:hover { color:#fff; border-color:var(--accent); }
1790
+ .connection-module-readonly:disabled { opacity:1; background-color:var(--surface); color:var(--foreground); cursor:default; }
1791
+ .field-note, .tdesc, .trow .tdesc, .sheet .sh-desc, .pagedesc, p.muted, small.muted,
1792
+ .connection-detail .msgline:not(.bad), .connection-shared {
1793
+ font:var(--text-detail)/1.55 var(--sans); color:var(--muted-foreground);
1794
+ }
1795
+ .field-note { margin:10px 0; }
1796
+ .field-note:empty { display:none; }
1797
+ .pricing-rules, .pricing-snapshot { margin-top:16px; }
1798
+ .pricing-rules > textarea, .pricing-snapshot > pre { margin-top:10px; }
1799
+
1800
+ .coreview > .pagehead { position:relative; border-bottom:0; }
1801
+ .coreview > .pagehead::after { content:''; position:absolute; bottom:0; left:var(--page-gutter); right:var(--page-gutter); height:1px; background:var(--border); }
1802
+ .coreview > .subtabs { margin-top:24px; }
1803
+
1804
+ .providerchrome > .featureintro + * { margin-top: 24px; }
1805
+ .providerchrome > .pagedesc { margin-bottom: 10px; }
1806
+ .providerchrome > .rowbar { margin-bottom: 10px; }
1807
+ .coreview > .scroll { scrollbar-gutter: auto; }
1808
+ .panelslot > :first-child > .sheet:first-child { padding-top: 0; }
1809
+
1810
+ /* 卡片上的删除与探活。 */
1811
+ .connection-create { margin-bottom:16px; }
1812
+ .connection-create-hint { margin:7px 2px 0; font:var(--text-detail)/1.5 var(--sans); color:var(--muted-foreground); }
1813
+ .connection-create > .btn { width:100%; }
1814
+ .connection-card { position:relative; }
1815
+ .connection-erase { position:absolute; top:10px; right:10px; display:flex; align-items:center; gap:0; height:26px; padding:0 6px; border:1px solid transparent; border-radius:8px; background:none; color:var(--ink-dim); cursor:pointer; transition:color .14s ease, background .14s ease, border-color .14s ease, gap .18s ease; }
1816
+ .connection-erase .icon { width:14px; height:14px; flex:none; }
1817
+ .connection-erase:hover { color:var(--danger,#b43c38); background:var(--hover); }
1818
+ .connection-erase-text { display:grid; grid-template-columns:0fr; overflow:hidden; font:600 12px/1 var(--sans); white-space:nowrap; transition:grid-template-columns .18s ease; }
1819
+ .connection-erase-text > span { overflow:hidden; }
1820
+ .connection-erase.is-armed { gap:6px; color:var(--danger,#b43c38); border-color:currentColor; background:var(--paper); }
1821
+ .connection-erase.is-armed .connection-erase-text { grid-template-columns:1fr; }
1822
+ .connection-name { padding-right:34px; }
1823
+ .connection-probe-btn .connection-spin { display:none; width:12px; height:12px; margin-left:6px; border:2px solid currentColor; border-right-color:transparent; border-radius:50%; animation:connection-spin .7s linear infinite; }
1824
+ .connection-probe-btn.is-busy .connection-spin { display:inline-block; }
1825
+ @keyframes connection-spin { to { transform:rotate(360deg); } }
1826
+ .connection-probe { display:grid; grid-template-rows:0fr; margin-top:0; transition:grid-template-rows .2s ease, margin-top .2s ease, opacity .2s ease; opacity:0; }
1827
+ .connection-probe.is-open { grid-template-rows:1fr; margin-top:12px; opacity:1; }
1828
+ .connection-probe-body { overflow:hidden; }
1829
+ .connection-probe .sheet { margin:0; padding:10px 12px; border:1px solid var(--border); border-radius:10px; background:var(--surface); }
1830
+ .connection-probe .kvtable td { padding:3px 0; font-size:11.5px; word-break:break-word; }
1831
+ .connection-probe .kvtable td:first-child { padding-right:8px; color:var(--muted-foreground); white-space:nowrap; }
1832
+ .connection-probe > .connection-probe-body > .btn { margin-top:8px; }