magic-agent 2.6.0 → 2.6.3

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 (102) hide show
  1. package/CLIENT-CONTRACT.md +188 -16
  2. package/client-ui/pc/app.css +42 -0
  3. package/client-ui/pc/js/90-glue.js +3 -0
  4. package/client-ui/shared/conv/03-chat-message.js +25 -19
  5. package/client-ui/shared/conv/09-stream-apply.js +9 -0
  6. package/client-ui/shared/conv/29-msg-variants.js +136 -0
  7. package/client-ui/shared/conv/conv.css +253 -158
  8. package/client-ui/shared/conversation.js +39 -2
  9. package/client-ui-mobile/apps.css +16 -0
  10. package/client-ui-mobile/apps.js +406 -0
  11. package/client-ui-mobile/index.html +2695 -379
  12. package/client-ui-mobile/reqs.css +11 -4
  13. package/client-ui-mobile/reqs.js +49 -5
  14. package/client-ui-mobile/scripts.css +46 -0
  15. package/client-ui-mobile/scripts.js +66 -6
  16. package/cmd/magic-client/browsectl.go +1 -1
  17. package/cmd/magic-client/clientctl.go +37 -2
  18. package/cmd/magic-client/main.go +159 -12
  19. package/internal/agent/dsh_caps_cache_test.go +184 -0
  20. package/internal/agent/dsh_resume.go +144 -5
  21. package/internal/agent/env.go +173 -1
  22. package/internal/agent/env_test.go +114 -0
  23. package/internal/agent/limitnotice.go +207 -1
  24. package/internal/agent/limitnotice_test.go +140 -0
  25. package/internal/agent/stream.go +30 -0
  26. package/internal/agent/streamjson.go +11 -1
  27. package/internal/cli/ask.go +8 -0
  28. package/internal/cli/engines_test.go +103 -0
  29. package/internal/cli/events.go +11 -0
  30. package/internal/cli/events_test.go +50 -0
  31. package/internal/cli/judge.go +104 -0
  32. package/internal/cli/root.go +35 -6
  33. package/internal/cli/session.go +69 -3
  34. package/internal/cli/session_test.go +82 -3
  35. package/internal/cli/sessionlog.go +6 -0
  36. package/internal/cli/sessionlog_test.go +22 -2
  37. package/internal/client/apk.go +8 -0
  38. package/internal/client/apk_test.go +59 -0
  39. package/internal/client/apps.go +1078 -0
  40. package/internal/client/apps_test.go +516 -0
  41. package/internal/client/coreexe.go +196 -0
  42. package/internal/client/coreexe_test.go +161 -0
  43. package/internal/client/coreupgrade.go +866 -0
  44. package/internal/client/coreupgrade_test.go +561 -0
  45. package/internal/client/daemon.go +209 -18
  46. package/internal/client/feishu.go +1259 -0
  47. package/internal/client/feishu_test.go +649 -0
  48. package/internal/client/health_identity_test.go +84 -0
  49. package/internal/client/hostenv.go +68 -0
  50. package/internal/client/hostenv_test.go +37 -0
  51. package/internal/client/jobs.go +233 -12
  52. package/internal/client/jobs_auto.go +571 -0
  53. package/internal/client/jobs_auto_test.go +431 -0
  54. package/internal/client/plugins.go +5 -1
  55. package/internal/client/prefs.go +67 -0
  56. package/internal/client/procstart_linux.go +59 -0
  57. package/internal/client/publicurl.go +82 -0
  58. package/internal/client/requirements.go +9 -1
  59. package/internal/client/requirements_test.go +103 -0
  60. package/internal/client/restart.go +167 -13
  61. package/internal/client/restart_handoff_test.go +230 -0
  62. package/internal/client/restart_test.go +140 -1
  63. package/internal/client/scripts_decode_implausible.go +38 -0
  64. package/internal/client/scripts_decode_other.go +4 -0
  65. package/internal/client/scripts_decode_test.go +16 -11
  66. package/internal/client/scripts_decode_windows.go +0 -24
  67. package/internal/client/scripts_test.go +14 -1
  68. package/internal/client/service.go +403 -87
  69. package/internal/client/service_test.go +166 -1
  70. package/internal/client/sessions_cache.go +148 -0
  71. package/internal/client/sessions_cache_test.go +163 -0
  72. package/internal/client/sessions_fold.go +165 -0
  73. package/internal/client/sessions_fold_test.go +204 -0
  74. package/internal/client/singleinstance.go +470 -0
  75. package/internal/client/singleinstance_test.go +607 -0
  76. package/internal/client/testmain_test.go +88 -0
  77. package/internal/client/workspace_default_test.go +158 -0
  78. package/internal/client/workspacelockenv_test.go +54 -0
  79. package/internal/config/config.go +48 -0
  80. package/internal/judge/judge.go +315 -0
  81. package/internal/session/multiclient_test.go +368 -0
  82. package/internal/session/session.go +83 -11
  83. package/internal/session/session_test.go +7 -0
  84. package/internal/session/status.go +21 -0
  85. package/internal/session/status_test.go +28 -0
  86. package/internal/session/title.go +16 -0
  87. package/internal/session/title_test.go +26 -0
  88. package/internal/session/workspace_lock.go +265 -28
  89. package/npm/apk/magic-agent-mobile-release.apk +0 -0
  90. package/npm/apk/version.json +8 -1
  91. package/npm/dist/darwin-arm64/magic-agent +0 -0
  92. package/npm/dist/darwin-arm64/magic-client +0 -0
  93. package/npm/dist/darwin-x64/magic-agent +0 -0
  94. package/npm/dist/darwin-x64/magic-client +0 -0
  95. package/npm/dist/linux-arm64/magic-agent +0 -0
  96. package/npm/dist/linux-arm64/magic-client +0 -0
  97. package/npm/dist/linux-x64/magic-agent +0 -0
  98. package/npm/dist/linux-x64/magic-client +0 -0
  99. package/npm/dist/win32-x64/magic-agent.exe +0 -0
  100. package/npm/dist/win32-x64/magic-client.exe +0 -0
  101. package/npm/install.js +11 -0
  102. package/package.json +8 -3
@@ -77,7 +77,9 @@
77
77
 
78
78
  .md-body li::marker{color:var(--cinnabar-hi);font-family:var(--mono);font-size:.9em}
79
79
 
80
- .md-body a{color:#0F766E;text-decoration:none;border-bottom:1px dotted rgba(15,118,110,.4);
80
+ /* 链接色 = var(--syntax-teal)(默认仍是这份绿松石):深色覆盖要把「Running」那类案头链接换成琥珀,
81
+ 与代码里的字符串共用一个「青」的落点,浅色两个值都等于原值、一个像素不变。 */
82
+ .md-body a{color:#0F766E;color:var(--syntax-teal,#0F766E);text-decoration:none;border-bottom:1px dotted rgba(15,118,110,.4);
81
83
  word-break:break-all;transition:.15s}
82
84
 
83
85
  .md-body a:hover{color:var(--paper);border-bottom-color:var(--paper)}
@@ -157,8 +159,9 @@
157
159
  .md-body .hljs-keyword,.md-body .hljs-selector-tag,.md-body .hljs-literal,
158
160
  .md-body .hljs-section,.md-body .hljs-link{color:#B91C1C}
159
161
 
162
+ /* 字符串色走 --syntax-teal(默认 = 下面这份绿松石,宿主可覆盖;深色覆盖不再自带薄荷绿)。 */
160
163
  .md-body .hljs-string,.md-body .hljs-attr,.md-body .hljs-template-tag,
161
- .md-body .hljs-addition{color:#0F766E}
164
+ .md-body .hljs-addition{color:#0F766E;color:var(--syntax-teal,#0F766E)}
162
165
 
163
166
  .md-body .hljs-number,.md-body .hljs-built_in,.md-body .hljs-type,
164
167
  .md-body .hljs-params,.md-body .hljs-meta{color:#92670A}
@@ -243,96 +246,96 @@
243
246
 
244
247
  .qa-t.md-body img:hover{filter:brightness(1.05)}
245
248
 
246
- [data-theme="dark"] .qa-t.md-body code{background:#2B2B2E;color:#E5E5E5}
249
+ [data-theme="dark"] .qa-t.md-body code{background:var(--md-code-bg);color:var(--ink-soft)}
247
250
 
248
- [data-theme="dark"] .qa-t.md-body pre{background:#1C1C1E;border-color:#3B3835}
251
+ [data-theme="dark"] .qa-t.md-body pre{background:var(--subtle);border-color:var(--md-border)}
249
252
 
250
- [data-theme="dark"] .qa-t.md-body pre code{color:#E5E5E5}
253
+ [data-theme="dark"] .qa-t.md-body pre code{color:var(--ink-soft)}
251
254
 
252
- [data-theme="dark"] .qa-t.md-body th{background:rgba(245,244,243,.05)}
255
+ [data-theme="dark"] .qa-t.md-body th{background:rgba(242,251,245,.05)}
253
256
 
254
- [data-theme="dark"] .qa-t.md-body td,[data-theme="dark"] .qa-t.md-body th{border-color:#3B3835}
257
+ [data-theme="dark"] .qa-t.md-body td,[data-theme="dark"] .qa-t.md-body th{border-color:var(--md-border)}
255
258
 
256
- [data-theme="dark"] .qa-t.md-body blockquote{background:rgba(245,244,243,.04);border-color:#3B3835}
259
+ [data-theme="dark"] .qa-t.md-body blockquote{background:rgba(242,251,245,.04);border-color:var(--md-border)}
257
260
 
258
- [data-theme="dark"] .qa-t.md-body blockquote p{color:#A8A29E}
261
+ [data-theme="dark"] .qa-t.md-body blockquote p{color:var(--muted)}
259
262
 
260
- [data-theme="dark"] .md-body code{background:#2B2B2E;border-color:#3B3835;color:#E5E5E5}
263
+ [data-theme="dark"] .md-body code{background:var(--md-code-bg);border-color:var(--md-border);color:var(--ink-soft)}
261
264
 
262
- [data-theme="dark"] .md-body pre{background:#1C1C1E;border-color:#3B3835}
265
+ [data-theme="dark"] .md-body pre{background:var(--subtle);border-color:var(--md-border)}
263
266
 
264
- [data-theme="dark"] .md-body .md-mermaid{background:#1C1C1E;border-color:#3B3835}
267
+ [data-theme="dark"] .md-body .md-mermaid{background:var(--subtle);border-color:var(--md-border)}
265
268
 
266
- [data-theme="dark"] .md-body pre code{color:#E5E5E5}
269
+ [data-theme="dark"] .md-body pre code{color:var(--ink-soft)}
267
270
 
268
- [data-theme="dark"] .md-body pre code.hljs{color:#D6D3D1}
271
+ [data-theme="dark"] .md-body pre code.hljs{color:var(--ink-soft)}
269
272
 
270
- [data-theme="dark"] .md-body a{color:#F06953}
273
+ [data-theme="dark"] .md-body a{color:var(--amber)}
271
274
 
272
- [data-theme="dark"] .md-body a:hover{color:#F5F4F3;border-bottom-color:#F5F4F3}
275
+ [data-theme="dark"] .md-body a:hover{color:var(--ink);border-bottom-color:var(--ink)}
273
276
 
274
- [data-theme="dark"] .md-body th{background:rgba(245,244,243,.05)}
277
+ [data-theme="dark"] .md-body th{background:rgba(242,251,245,.05)}
275
278
 
276
279
  [data-theme="dark"] .md-body td,
277
- [data-theme="dark"] .md-body th{border-color:#3B3835}
280
+ [data-theme="dark"] .md-body th{border-color:var(--md-border)}
278
281
 
279
- [data-theme="dark"] .md-body tbody tr:nth-child(even){background:rgba(245,244,243,.03)}
282
+ [data-theme="dark"] .md-body tbody tr:nth-child(even){background:rgba(242,251,245,.03)}
280
283
 
281
- [data-theme="dark"] .md-body blockquote{background:rgba(240,105,83,.07)}
284
+ [data-theme="dark"] .md-body blockquote{background:rgba(var(--warning-rgb),.10)}
282
285
 
283
- [data-theme="dark"] .md-body hr{border-color:#3B3835}
286
+ [data-theme="dark"] .md-body hr{border-color:var(--md-border)}
284
287
 
285
- [data-theme="dark"] .md-body img{border-color:#3B3835}
288
+ [data-theme="dark"] .md-body img{border-color:var(--md-border)}
286
289
 
287
290
  [data-theme="dark"] .md-body .hljs-comment,
288
- [data-theme="dark"] .md-body .hljs-quote{color:#A8A29E}
291
+ [data-theme="dark"] .md-body .hljs-quote{color:var(--muted)}
289
292
 
290
293
  [data-theme="dark"] .md-body .hljs-keyword,
291
294
  [data-theme="dark"] .md-body .hljs-selector-tag,
292
295
  [data-theme="dark"] .md-body .hljs-literal,
293
296
  [data-theme="dark"] .md-body .hljs-section,
294
- [data-theme="dark"] .md-body .hljs-link{color:#F87171}
297
+ [data-theme="dark"] .md-body .hljs-link{color:var(--fail)}
295
298
 
296
299
  [data-theme="dark"] .md-body .hljs-string,
297
300
  [data-theme="dark"] .md-body .hljs-attr,
298
301
  [data-theme="dark"] .md-body .hljs-template-tag,
299
- [data-theme="dark"] .md-body .hljs-addition{color:#5EEAD4}
302
+ [data-theme="dark"] .md-body .hljs-addition{color:var(--syntax-teal)}
300
303
 
301
304
  [data-theme="dark"] .md-body .hljs-number,
302
305
  [data-theme="dark"] .md-body .hljs-built_in,
303
306
  [data-theme="dark"] .md-body .hljs-type,
304
307
  [data-theme="dark"] .md-body .hljs-params,
305
- [data-theme="dark"] .md-body .hljs-meta{color:#FBBF24}
308
+ [data-theme="dark"] .md-body .hljs-meta{color:var(--amber)}
306
309
 
307
310
  [data-theme="dark"] .md-body .hljs-title,
308
311
  [data-theme="dark"] .md-body .hljs-title.function_,
309
312
  [data-theme="dark"] .md-body .hljs-title.class_,
310
313
  [data-theme="dark"] .md-body .hljs-name,
311
314
  [data-theme="dark"] .md-body .hljs-selector-id,
312
- [data-theme="dark"] .md-body .hljs-selector-class{color:#E5B96A}
315
+ [data-theme="dark"] .md-body .hljs-selector-class{color:var(--amber)}
313
316
 
314
317
  [data-theme="dark"] .md-body .hljs-variable,
315
318
  [data-theme="dark"] .md-body .hljs-template-variable,
316
319
  [data-theme="dark"] .md-body .hljs-attribute,
317
320
  [data-theme="dark"] .md-body .hljs-tag,
318
- [data-theme="dark"] .md-body .hljs-regexp{color:#E5B96A}
321
+ [data-theme="dark"] .md-body .hljs-regexp{color:var(--amber)}
319
322
 
320
323
  [data-theme="dark"] .md-body .hljs-symbol,
321
324
  [data-theme="dark"] .md-body .hljs-bullet,
322
325
  [data-theme="dark"] .md-body .hljs-doctag,
323
- [data-theme="dark"] .md-body .hljs-deletion{color:#F06953}
326
+ [data-theme="dark"] .md-body .hljs-deletion{color:var(--amber)}
324
327
 
325
- [data-theme="dark"] .md-body li.task-li .bx{border-color:#525252}
328
+ [data-theme="dark"] .md-body li.task-li .bx{border-color:var(--faint)}
326
329
 
327
- [data-theme="dark"] .md-body li.task-li.done .bx{background:rgba(52,211,153,.16);border-color:rgba(52,211,153,.5);color:#34D399}
330
+ [data-theme="dark"] .md-body li.task-li.done .bx{background:rgba(var(--success-rgb),.18);border-color:rgba(var(--success-rgb),.52);color:var(--success)}
328
331
 
329
- [data-theme="dark"] .qa-t.md-body a{color:#F06953}
332
+ [data-theme="dark"] .qa-t.md-body a{color:var(--amber)}
330
333
 
331
- [data-theme="dark"] .qa-t.md-body a:hover{color:#F5F4F3}
334
+ [data-theme="dark"] .qa-t.md-body a:hover{color:var(--ink)}
332
335
 
333
- [data-theme="dark"] .qa-t.md-body hr{border-color:#3B3835}
336
+ [data-theme="dark"] .qa-t.md-body hr{border-color:var(--md-border)}
334
337
 
335
- [data-theme="dark"] .qa-t.md-body img{border-color:#3B3835}
338
+ [data-theme="dark"] .qa-t.md-body img{border-color:var(--md-border)}
336
339
 
337
340
  .qa-t.md-body h2{font-size:16.5px}
338
341
 
@@ -392,7 +395,14 @@
392
395
 
393
396
  .qa-dotgap.on{background:var(--cinnabar-hi)}
394
397
 
395
- [data-theme="dark"] .qa-dotgap{background:#57534E}
398
+ [data-theme="dark"] .qa-dotgap{background:var(--faint)}
399
+
400
+ /* 分页点的「当前页」:浅色 d 那行用的是珊瑚 --cinnabar-hi(ZCode 的朱砂),
401
+ 深色覆盖没写它 → 会从浅色那份继承过来,在墨绿底上留下唯一一处珊瑚橙。
402
+ 深色统一到「进行中」的琥珀(.qa-dot.on / .qa-dotgap.on 两处)。 */
403
+ [data-theme="dark"] .qa-dot.on{background:var(--amber)}
404
+
405
+ [data-theme="dark"] .qa-dotgap.on{background:var(--amber)}
396
406
 
397
407
  .qa-msg.qa-jump .qa-bd{animation:qaJumpFlash 1.2s ease-out 1}
398
408
 
@@ -400,9 +410,9 @@
400
410
 
401
411
  @media (prefers-reduced-motion: reduce){.qa-msg.qa-jump .qa-bd{animation:none}}
402
412
 
403
- [data-theme="dark"] .qa-dot:not(.on){background:#57534E}
413
+ [data-theme="dark"] .qa-dot:not(.on){background:var(--faint)}
404
414
 
405
- [data-theme="dark"] .qa-dot:hover:not(.on){background:#A8A29E}
415
+ [data-theme="dark"] .qa-dot:hover:not(.on){background:var(--muted)}
406
416
 
407
417
  @media (prefers-reduced-motion: reduce){.qa-dot{transition:none}}
408
418
 
@@ -459,8 +469,8 @@
459
469
  user-select:none;white-space:nowrap}
460
470
  .qa-hosted-tag::before{content:"";width:4px;height:4px;border-radius:50%;
461
471
  background:currentColor;flex:0 0 auto}
462
- [data-theme="dark"] .qa-msg.qa-hosted .qa-bd{background:#241B18;border-color:#8A5144}
463
- [data-theme="dark"] .qa-hosted-tag{background:rgba(240,105,83,.16);color:#F2A08E}
472
+ [data-theme="dark"] .qa-msg.qa-hosted .qa-bd{background:rgba(var(--warning-rgb),.14);border-color:color-mix(in srgb, var(--amber) 45%, transparent)}
473
+ [data-theme="dark"] .qa-hosted-tag{background:rgba(var(--warning-rgb),.20);color:var(--amber)}
464
474
  /* 排队中的用户气泡(`is-queued`):已经发出去、但还在等前一轮跑完。
465
475
  气泡照常可读(用户要能确认自己写的是什么),只把底色压淡 + 虚线边 + 底下补一行
466
476
  「排队中 · 上一轮结束后自动发送」—— **不隐藏、不挪走**,否则就是这次报障的
@@ -469,7 +479,7 @@
469
479
  background:linear-gradient(180deg,#FAF7FF,#F3EEFF)}
470
480
  .qa-msg.qa-mine.is-queued .qa-bd::after{content:"排队中 · 上一轮结束后自动发送";
471
481
  display:block;margin-top:6px;font-size:11.5px;line-height:15px;color:var(--queued)}
472
- [data-theme="dark"] .qa-msg.qa-mine.is-queued .qa-bd{background:#241E33;border-color:#7C5CE0}
482
+ [data-theme="dark"] .qa-msg.qa-mine.is-queued .qa-bd{background:color-mix(in srgb, var(--amber) 9%, var(--raised));border-color:var(--queued)}
473
483
  [data-theme="dark"] .qa-msg.qa-mine.is-queued .qa-bd::after{color:var(--queued)}
474
484
  /* 排队期间被取消(`is-cancelled`):气泡留着当回执,但明确说它不会被执行。
475
485
  用灰色虚线而不是红色 —— 用户自己撤的,不是失败,别用报错的颜色吓人。 */
@@ -498,7 +508,7 @@
498
508
 
499
509
  .qa-fold-btn:hover{border-color:#A8A29E;color:var(--paper)}
500
510
 
501
- [data-theme="dark"] .qa-fold-btn{background:#1C1C1E;border-color:#3B3835;color:#D6D3D1}
511
+ [data-theme="dark"] .qa-fold-btn{background:var(--subtle);border-color:var(--md-border);color:var(--ink-soft)}
502
512
 
503
513
  .qa-revshots img{max-width:150px;max-height:104px}
504
514
 
@@ -613,11 +623,11 @@
613
623
 
614
624
  .qa-art:hover .qa-art-go{opacity:1}
615
625
 
616
- [data-theme="dark"] .qa-art{background:rgba(245,244,243,.03);border-color:#3B3835}
626
+ [data-theme="dark"] .qa-art{background:rgba(242,251,245,.03);border-color:var(--md-border)}
617
627
 
618
628
  [data-theme="dark"] .qa-art:hover{border-color:var(--cinnabar-hi)}
619
629
 
620
- [data-theme="dark"] .qa-art-ext{background:rgba(240,105,83,.12);border-color:rgba(240,105,83,.28)}
630
+ [data-theme="dark"] .qa-art-ext{background:rgba(var(--warning-rgb),.16);border-color:rgba(var(--warning-rgb),.30)}
621
631
 
622
632
  .qa-msg.qa-mine .qa-arts,.qa-msg.qa-sim .qa-arts{justify-content:flex-end}
623
633
 
@@ -768,9 +778,9 @@
768
778
 
769
779
  .qa-turn-bd > .qa-think:first-child,.qa-turn-bd > .qa-tools:first-child{margin-top:0}
770
780
 
771
- [data-theme="dark"] .qa-turn{border-color:#3B3835;background:rgba(245,244,243,.02)}
781
+ [data-theme="dark"] .qa-turn{border-color:var(--md-border);background:rgba(242,251,245,.02)}
772
782
 
773
- [data-theme="dark"] .qa-turn-sum:hover{background:rgba(245,244,243,.05)}
783
+ [data-theme="dark"] .qa-turn-sum:hover{background:rgba(242,251,245,.05)}
774
784
 
775
785
  .qa-tool{margin:3px 0 1px;border:1px solid var(--line);border-radius:10px;
776
786
  background:#FCFBF9;overflow:hidden;transition:background .25s,border-color .25s}
@@ -1044,9 +1054,42 @@
1044
1054
 
1045
1055
  .qa-errcard .qa-mk-bd{padding-left:2px}
1046
1056
 
1047
- [data-theme="dark"] .qa-errcard{background:rgba(248,113,113,.10);border-color:rgba(248,113,113,.42)}
1057
+ /* 额度 / 限流提示卡(2026-10-25,见 29-msg-variants 的 qaQuotaCardNode)----------
1058
+ 与朱砂「调用失败」卡**刻意分开配色**:额度用尽不是故障(不用修配置),
1059
+ 是「等一会儿 / 换个模型」就能继续的状态 —— 涂成错误红会把人引到错误的自救动作上。
1060
+ 形态走「左侧琥珀竖条 + 完整三行」(时刻 / 原因 / 建议),与需求看板的 .reqerr 同一范式。
1061
+ ⚠️ 色板只用 `--amber`:PC 皮肤(client-ui/pc/app.css)**只有 --amber**,没有
1062
+ --warning / --raised;面与边用 color-mix 淡出,明暗两套主题各自解得对。 */
1063
+ .qa-errcard.qa-quota{
1064
+ border-color:color-mix(in srgb,var(--amber) 42%,transparent);
1065
+ border-left:3px solid color-mix(in srgb,var(--amber) 70%,transparent);
1066
+ padding-left:10px;
1067
+ background:color-mix(in srgb,var(--amber) 8%,transparent)}
1068
+
1069
+ .qa-quota .qa-ec-ico{color:var(--amber)}
1070
+
1071
+ .qa-quota .qa-ec-tt{color:color-mix(in srgb,var(--amber) 72%,var(--paper))}
1072
+
1073
+ /* 抬头右侧那枚小徽章(额度不足 / 已被限流):等宽小字 + 琥珀描边,与 .qa-st 同一档字号 */
1074
+ .qa-qc-badge{flex:none;display:inline-flex;align-items:center;height:15px;padding:0 5px;
1075
+ border:1px solid color-mix(in srgb,var(--amber) 42%,transparent);border-radius:var(--r-xs);
1076
+ background:color-mix(in srgb,var(--amber) 12%,transparent);
1077
+ font-family:var(--mono);font-size:9px;letter-spacing:.06em;white-space:nowrap;color:var(--amber)}
1078
+
1079
+ /* 「什么时候恢复」:时刻加粗(用户此刻只想知道这一个数),相对时间跟在后面 */
1080
+ .qa-qc-reset{margin:6px 0 0;font-size:12.5px;line-height:1.6;color:var(--paper-dim)}
1081
+
1082
+ .qa-qc-reset b{font-family:var(--mono);font-size:13px;font-weight:600;color:var(--amber)}
1083
+
1084
+ /* 「该怎么办」:**和原因同色**(不降档)—— 实测亮色主题下用 --paper-mute(#94A3B8)
1085
+ 落在淡琥珀底上只有 ~2.3:1,那句话恰恰是这张卡里唯一「能照着做」的内容,糊了就白写了。 */
1086
+ .qa-qc-hint{margin:4px 0 0;font-size:12px;line-height:1.55;color:var(--paper-dim)}
1087
+
1088
+ [data-theme="dark"] .qa-errcard.qa-quota{background:color-mix(in srgb,var(--amber) 14%,transparent)}
1048
1089
 
1049
- [data-theme="dark"] .qa-ec-reason{color:#E7E5E4}
1090
+ [data-theme="dark"] .qa-errcard{background:rgba(var(--fail-rgb),.14);border-color:rgba(var(--fail-rgb),.42)}
1091
+
1092
+ [data-theme="dark"] .qa-ec-reason{color:var(--ink-soft)}
1050
1093
 
1051
1094
  .qa-reqacts{display:flex;flex-wrap:wrap;gap:8px;padding:10px 2px 2px;justify-content:flex-start}
1052
1095
 
@@ -1064,183 +1107,217 @@
1064
1107
 
1065
1108
  .qa-reqacts button.go:hover{background:rgba(214,64,42,.12)}
1066
1109
 
1067
- [data-theme="dark"] .qa-reqacts button{background:#1C1C1E;border-color:#3B3835;color:#D6D3D1}
1110
+ [data-theme="dark"] .qa-reqacts button{background:var(--subtle);border-color:var(--md-border);color:var(--ink-soft)}
1068
1111
 
1069
- [data-theme="dark"] .qa-reqacts button.ok{color:#34D399;border-color:rgba(52,211,153,.42);background:rgba(52,211,153,.10)}
1112
+ [data-theme="dark"] .qa-reqacts button.ok{color:var(--success);border-color:rgba(var(--success-rgb),.45);background:rgba(var(--success-rgb),.12)}
1070
1113
 
1071
- [data-theme="dark"] .qa-reqacts button.ok:hover{background:rgba(52,211,153,.18)}
1114
+ [data-theme="dark"] .qa-reqacts button.ok:hover{background:rgba(var(--success-rgb),.20)}
1072
1115
 
1073
- [data-theme="dark"] .qa-reqacts button.go{color:#F06953;border-color:rgba(240,105,83,.45);background:rgba(240,105,83,.10)}
1116
+ [data-theme="dark"] .qa-reqacts button.go{color:var(--amber);border-color:rgba(var(--warning-rgb),.45);background:rgba(var(--warning-rgb),.14)}
1074
1117
 
1075
- [data-theme="dark"] .qa-reqacts button.go:hover{background:rgba(240,105,83,.18)}
1118
+ [data-theme="dark"] .qa-reqacts button.go:hover{background:rgba(var(--warning-rgb),.22)}
1076
1119
 
1077
- [data-theme="dark"] .qa-stream{background:#1C1C1E}
1120
+ [data-theme="dark"] .qa-stream{background:var(--subtle)}
1078
1121
 
1079
- [data-theme="dark"] .qa-scroll::-webkit-scrollbar-thumb{background:#3B3835;border-color:#1C1C1E}
1122
+ [data-theme="dark"] .qa-scroll::-webkit-scrollbar-thumb{background:var(--md-border);border-color:var(--subtle)}
1080
1123
 
1081
- [data-theme="dark"] .qa-msg{color:#E5E5E5}
1124
+ [data-theme="dark"] .qa-msg{color:var(--ink-soft)}
1082
1125
 
1083
- [data-theme="dark"] .qa-t{color:#F5F4F3}
1126
+ [data-theme="dark"] .qa-t{color:var(--ink)}
1084
1127
 
1085
- [data-theme="dark"] .qa-t.md-body code{background:#2B2B2E;color:#E5E5E5}
1128
+ [data-theme="dark"] .qa-t.md-body code{background:var(--md-code-bg);color:var(--ink-soft)}
1086
1129
 
1087
- [data-theme="dark"] .qa-t.md-body pre{background:#1C1C1E;border-color:#3B3835}
1130
+ [data-theme="dark"] .qa-t.md-body pre{background:var(--subtle);border-color:var(--md-border)}
1088
1131
 
1089
- [data-theme="dark"] .qa-t.md-body pre code{color:#E5E5E5}
1132
+ [data-theme="dark"] .qa-t.md-body pre code{color:var(--ink-soft)}
1090
1133
 
1091
- [data-theme="dark"] .qa-t.md-body th{background:rgba(245,244,243,.05)}
1134
+ [data-theme="dark"] .qa-t.md-body th{background:rgba(242,251,245,.05)}
1092
1135
 
1093
- [data-theme="dark"] .qa-t.md-body td,[data-theme="dark"] .qa-t.md-body th{border-color:#3B3835}
1136
+ [data-theme="dark"] .qa-t.md-body td,[data-theme="dark"] .qa-t.md-body th{border-color:var(--md-border)}
1094
1137
 
1095
- [data-theme="dark"] .qa-t.md-body blockquote{background:rgba(245,244,243,.04);border-color:#3B3835}
1138
+ [data-theme="dark"] .qa-t.md-body blockquote{background:rgba(242,251,245,.04);border-color:var(--md-border)}
1096
1139
 
1097
- [data-theme="dark"] .qa-t.md-body blockquote p{color:#A8A29E}
1140
+ [data-theme="dark"] .qa-t.md-body blockquote p{color:var(--muted)}
1098
1141
 
1099
- [data-theme="dark"] .qa-msg.qa-mine .qa-bd{background:#1C1C1E;border-color:#3B3835}
1142
+ [data-theme="dark"] .qa-msg.qa-mine .qa-bd{background:var(--subtle);border-color:var(--md-border)}
1100
1143
  /* 放在上面那条**之后**:同为 4 个类级选择器,靠后才会赢(托管气泡的暗色底不被盖回灰)。 */
1101
- [data-theme="dark"] .qa-msg.qa-hosted .qa-bd{background:#241B18;border-color:#8A5144}
1144
+ [data-theme="dark"] .qa-msg.qa-hosted .qa-bd{background:rgba(var(--warning-rgb),.14);border-color:color-mix(in srgb, var(--amber) 45%, transparent)}
1102
1145
 
1103
- [data-theme="dark"] .qa-av-txt{background:linear-gradient(180deg,#2B2B2E,#1C1C1E)}
1146
+ [data-theme="dark"] .qa-av-txt{background:linear-gradient(180deg,color-mix(in srgb,var(--muted) 18%,var(--raised)),var(--raised))}
1104
1147
 
1105
- [data-theme="dark"] .qa-av-txt.qa-av-rev{background:linear-gradient(180deg,#3A2F1B,#241F16);color:#FBBF24}
1148
+ [data-theme="dark"] .qa-av-txt.qa-av-rev{background:linear-gradient(180deg,color-mix(in srgb, var(--amber) 24%, var(--raised)),color-mix(in srgb, var(--amber) 10%, var(--raised)));color:var(--amber)}
1106
1149
 
1107
- [data-theme="dark"] .qa-tool{border-color:#3B3835;background:rgba(245,244,243,.02)}
1150
+ [data-theme="dark"] .qa-tool{border-color:var(--md-border);background:rgba(242,251,245,.02)}
1108
1151
 
1109
- [data-theme="dark"] .qa-tool-head:hover{background:rgba(245,244,243,.05)}
1152
+ [data-theme="dark"] .qa-tool-head:hover{background:rgba(242,251,245,.05)}
1110
1153
 
1111
- [data-theme="dark"] .qa-tool-name{color:#F5F4F3}
1154
+ [data-theme="dark"] .qa-tool-name{color:var(--ink)}
1112
1155
 
1113
- [data-theme="dark"] .qa-tool-args{color:#A8A29E}
1156
+ [data-theme="dark"] .qa-tool-args{color:var(--muted)}
1114
1157
 
1115
- [data-theme="dark"] .qa-tool-bd{border-color:#3B3835}
1158
+ [data-theme="dark"] .qa-tool-bd{border-color:var(--md-border)}
1116
1159
 
1117
- [data-theme="dark"] .qa-tool.open .qa-tool-bd{border-color:#3B3835}
1160
+ [data-theme="dark"] .qa-tool.open .qa-tool-bd{border-color:var(--md-border)}
1118
1161
 
1119
- [data-theme="dark"] .qa-tool-sec pre{background:#0F0F10}
1162
+ [data-theme="dark"] .qa-tool-sec pre{background:var(--code)}
1120
1163
 
1121
- [data-theme="dark"] .qa-sub{border-color:#3B3835}
1164
+ [data-theme="dark"] .qa-sub{border-color:var(--md-border)}
1122
1165
 
1123
- [data-theme="dark"] .qa-sub-t{color:#E5E5E5}
1166
+ [data-theme="dark"] .qa-sub-t{color:var(--ink-soft)}
1124
1167
 
1125
- [data-theme="dark"] .qa-agent-chip{background:rgba(245,244,243,.05);border-color:#3B3835}
1168
+ [data-theme="dark"] .qa-agent-chip{background:rgba(242,251,245,.05);border-color:var(--md-border)}
1126
1169
 
1127
- [data-theme="dark"] .qa-agent-chip.run{background:rgba(240,105,83,.1);border-color:rgba(240,105,83,.3)}
1170
+ [data-theme="dark"] .qa-agent-chip.run{background:rgba(var(--warning-rgb),.14);border-color:rgba(var(--warning-rgb),.32)}
1128
1171
 
1129
- [data-theme="dark"] .qa-think-bd{background:rgba(245,244,243,.03);border-color:#3B3835}
1172
+ [data-theme="dark"] .qa-think-bd{background:rgba(242,251,245,.03);border-color:var(--md-border)}
1130
1173
 
1131
- [data-theme="dark"] .qa-ask{border-color:#3B3835;background:rgba(245,244,243,.02)}
1174
+ [data-theme="dark"] .qa-ask{border-color:var(--md-border);background:rgba(242,251,245,.02)}
1132
1175
 
1133
1176
  [data-theme="dark"] .qa-ico svg{stroke:currentColor}
1134
1177
 
1135
1178
  [data-theme="dark"] .qa-av-img{border-radius:8px}
1136
1179
 
1137
- [data-theme="dark"] .qa-msg:not(.qa-mine) .qa-bd{color:#E5E5E5}
1180
+ [data-theme="dark"] .qa-msg:not(.qa-mine) .qa-bd{color:var(--ink-soft)}
1181
+
1182
+ [data-theme="dark"] .qa-t.md-body a{color:var(--amber)}
1183
+
1184
+ [data-theme="dark"] .qa-t.md-body a:hover{color:var(--ink)}
1185
+
1186
+ [data-theme="dark"] .qa-t.md-body hr{border-color:var(--md-border)}
1138
1187
 
1139
- [data-theme="dark"] .qa-t.md-body a{color:#F06953}
1188
+ [data-theme="dark"] .qa-t.md-body img{border-color:var(--md-border)}
1140
1189
 
1141
- [data-theme="dark"] .qa-t.md-body a:hover{color:#F5F4F3}
1190
+ [data-theme="dark"] .qa-think-toggle{color:var(--muted)}
1142
1191
 
1143
- [data-theme="dark"] .qa-t.md-body hr{border-color:#3B3835}
1192
+ [data-theme="dark"] .qa-think-dur{color:var(--faint)}
1144
1193
 
1145
- [data-theme="dark"] .qa-t.md-body img{border-color:#3B3835}
1194
+ [data-theme="dark"] .qa-tools-toggle{color:var(--muted)}
1146
1195
 
1147
- [data-theme="dark"] .qa-think-toggle{color:#78716C}
1196
+ [data-theme="dark"] .qa-tools-count{color:var(--faint)}
1148
1197
 
1149
- [data-theme="dark"] .qa-think-dur{color:#525252}
1198
+ [data-theme="dark"] .qa-tools-dur{color:var(--faint)}
1150
1199
 
1151
- [data-theme="dark"] .qa-tools-toggle{color:#78716C}
1200
+ [data-theme="dark"] .qa-tool-ico{background:var(--activity)}
1152
1201
 
1153
- [data-theme="dark"] .qa-tools-count{color:#525252}
1202
+ [data-theme="dark"] .qa-tool-dur{color:var(--faint)}
1154
1203
 
1155
- [data-theme="dark"] .qa-tools-dur{color:#525252}
1204
+ [data-theme="dark"] .qa-tool .chev{stroke:var(--faint)}
1156
1205
 
1157
- [data-theme="dark"] .qa-tool-ico{background:rgba(245,244,243,.05)}
1206
+ [data-theme="dark"] .qa-tool[data-state="running"] .qa-tool-st::before{background:var(--amber)}
1158
1207
 
1159
- [data-theme="dark"] .qa-tool-dur{color:#525252}
1208
+ /* ── 2026-10-25 · 深色配色收口(用户:「深色皮肤继续完成全部配色优化」)──
1209
+ 这 199 条深色覆盖原先是照 ZCode 的 Stone 灰写死的字面量(#1C1C1E 面 / #3B3835 线 / #E5E5E5 字),
1210
+ 外加珊瑚橙 #F06953 当链接、青绿 #34D399 当成功、暖灰 #A8A29E 当次要字。
1211
+ 挂到移动端这套墨绿主题上就露出两处毛病:
1212
+ ① 一屏两种色:宿主令牌早已是墨绿,这几行还是石褐灰 —— 灰底卡片和玉色卡片并排,像没刷完;
1213
+ ② 和主色打架:珊瑚橙在墨绿上是最刺眼的一处,却偏偏用在链接、运行中徽标、批准按钮上,
1214
+ 与「玉青 = 可点」的规则相反。
1215
+ 所以这一段把深色覆盖统一改成主题令牌(上面 199 行已批量替换):
1216
+ #1C1C1E→--subtle、#0F0F10→--code、#2B2B2E→--md-code-bg、#3B3835→--md-border、
1217
+ #F5F4F3→--ink、#E5E5E5/#D6D3D1→--ink-soft、#A8A29E/#78716C/#71717A→--muted、
1218
+ #525252→--faint、#34D399→--success、#F87171→--fail、#FCA5A5→--error-text,
1219
+ 叠加用的 rgba(245,244,243,…) 换成 rgba(242,251,245,…)(= --ink 的 rgb)。
1220
+ 下面几条是替换后还要按这套皮肤自己的语义再定一次的:
1221
+ · 链接 / 运行中 / 删除行:珊瑚橙 → 琥珀 --amber。移动端的「可点」是玉青,暖色留给
1222
+ 「注意 / 进行中」(与列表里的「等待中」同一个视觉语言);
1223
+ · 代码高亮的青(字符串):深色覆盖原来写薄荷 #5EEAD4(像荧光),改成与浅色同一支绿松石 --syntax-teal;
1224
+ · 「审核」头像格:金渐变换成琥珀两阶,和 --amber 的字同族。
1225
+ 浅色一代(不带 [data-theme] 的那些行)一个字没动。 */
1160
1226
 
1161
- [data-theme="dark"] .qa-tool .chev{stroke:#525252}
1227
+ /* 朱砂实心按钮(「沿用这个选项」)上的字:原写 #1C1917(石褐墨),
1228
+ 统一换成页面底 --canvas —— 主题里「压在实色上的字」一律是它。 */
1229
+ [data-theme="dark"] .qa-ask-other button{color:var(--canvas)}
1162
1230
 
1163
- [data-theme="dark"] .qa-tool[data-state="running"] .qa-tool-st::before{background:#F59E0B}
1231
+ [data-theme="dark"] .qa-ask-other button:hover{color:var(--canvas)}
1164
1232
 
1165
- [data-theme="dark"] .qa-ask-hd{color:#E5E5E5}
1233
+ /* diff 新增行:原来用 ZCode 的绿松石 #0A6A51(H166),和 --success 的 H142 是两种绿 ——
1234
+ 文字提成 --success,与行底(--success-rgb 14%)同族;浅色那份(.qa-diff-row.add)不动。 */
1235
+ [data-theme="dark"] .qa-diff-row.add{color:var(--success)}
1236
+
1237
+ [data-theme="dark"] .qa-diff-row.add .s{color:var(--success)}
1238
+
1239
+ /* 代码块内层底色:#0F0F10(石褐)→ --code(页面层级的代码底)。 */
1240
+ [data-theme="dark"] .qa-tool-sec pre{background:var(--code)}
1241
+
1242
+ [data-theme="dark"] .qa-ask-hd{color:var(--ink-soft)}
1166
1243
 
1167
1244
  [data-theme="dark"] .qa-ask-tag{color:var(--indigo);border-color:color-mix(in srgb, var(--indigo) 40%, transparent);background:color-mix(in srgb, var(--indigo) 10%, transparent)}
1168
1245
 
1169
- [data-theme="dark"] .qa-ask-ttl{color:#525252}
1246
+ [data-theme="dark"] .qa-ask-ttl{color:var(--faint)}
1170
1247
 
1171
- [data-theme="dark"] .qa-ask-qb{border-top-color:#3B3835}
1248
+ [data-theme="dark"] .qa-ask-qb{border-top-color:var(--md-border)}
1172
1249
 
1173
- [data-theme="dark"] .qa-ask-q{color:#F5F4F3}
1250
+ [data-theme="dark"] .qa-ask-q{color:var(--ink)}
1174
1251
 
1175
- [data-theme="dark"] .qa-ask-opt{border-color:#3B3835;background:transparent}
1252
+ [data-theme="dark"] .qa-ask-opt{border-color:var(--md-border);background:transparent}
1176
1253
 
1177
1254
  [data-theme="dark"] .qa-ask-opt:hover{border-color:color-mix(in srgb, var(--indigo) 45%, transparent);background:color-mix(in srgb, var(--indigo) 8%, transparent)}
1178
1255
 
1179
- [data-theme="dark"] .qa-ask-opt .lb{color:#E5E5E5}
1256
+ [data-theme="dark"] .qa-ask-opt .lb{color:var(--ink-soft)}
1180
1257
 
1181
- [data-theme="dark"] .qa-ask-opt .ds{color:#78716C}
1258
+ [data-theme="dark"] .qa-ask-opt .ds{color:var(--muted)}
1182
1259
 
1183
- [data-theme="dark"] .qa-ask-opt .mk{border-color:#525252;background:transparent}
1260
+ [data-theme="dark"] .qa-ask-opt .mk{border-color:var(--faint);background:transparent}
1184
1261
 
1185
1262
  [data-theme="dark"] .qa-ask-opt.sel{border-color:var(--indigo);background:color-mix(in srgb, var(--indigo) 10%, transparent)}
1186
1263
 
1187
- [data-theme="dark"] .qa-ask-opt.sel .lb{color:#F5F4F3}
1264
+ [data-theme="dark"] .qa-ask-opt.sel .lb{color:var(--ink)}
1188
1265
 
1189
- [data-theme="dark"] .qa-ask-other input{background:#1C1C1E;border-color:#3B3835;color:#F5F4F3}
1266
+ [data-theme="dark"] .qa-ask-other input{background:var(--subtle);border-color:var(--md-border);color:var(--ink)}
1190
1267
 
1191
- [data-theme="dark"] .qa-ask-other button{background:#1C1C1E;border-color:#3B3835;color:#A8A29E}
1268
+ [data-theme="dark"] .qa-ask-other button{background:var(--subtle);border-color:var(--md-border);color:var(--muted)}
1192
1269
 
1193
1270
  [data-theme="dark"] .qa-ask-sub{background:color-mix(in srgb, var(--indigo) 10%, transparent);border-color:color-mix(in srgb, var(--indigo) 40%, transparent);color:var(--indigo)}
1194
1271
 
1195
1272
  [data-theme="dark"] .qa-ask-sub:hover:not(:disabled){background:color-mix(in srgb, var(--indigo) 18%, transparent)}
1196
1273
 
1197
- [data-theme="dark"] .qa-ask-hint{color:#525252}
1274
+ [data-theme="dark"] .qa-ask-hint{color:var(--faint)}
1198
1275
 
1199
- [data-theme="dark"] .qa-ask-ans{border-top-color:#3B3835}
1276
+ [data-theme="dark"] .qa-ask-ans{border-top-color:var(--md-border)}
1200
1277
 
1201
- [data-theme="dark"] .qa-ask-ans .k{color:#525252}
1278
+ [data-theme="dark"] .qa-ask-ans .k{color:var(--faint)}
1202
1279
 
1203
- [data-theme="dark"] .qa-ask-ans .v{color:#34D399}
1280
+ [data-theme="dark"] .qa-ask-ans .v{color:var(--success)}
1204
1281
 
1205
- [data-theme="dark"] .qa-askdock>.qa-ask{background:#1C1C1E;box-shadow:0 6px 20px rgba(0,0,0,.4)}
1282
+ [data-theme="dark"] .qa-askdock>.qa-ask{background:var(--raised);box-shadow:0 6px 20px rgba(0,0,0,.4)}
1206
1283
 
1207
- [data-theme="dark"] .qa-askdock::-webkit-scrollbar-thumb{background:#3B3835}
1284
+ [data-theme="dark"] .qa-askdock::-webkit-scrollbar-thumb{background:var(--md-border)}
1208
1285
 
1209
- [data-theme="dark"] .qa-ask-x{color:#78716C}
1286
+ [data-theme="dark"] .qa-ask-x{color:var(--muted)}
1210
1287
 
1211
- [data-theme="dark"] .qa-ask-x:hover{background:rgba(245,244,243,.08);color:#F5F4F3}
1288
+ [data-theme="dark"] .qa-ask-x:hover{background:rgba(242,251,245,.08);color:var(--ink)}
1212
1289
 
1213
- [data-theme="dark"] .qa-run{background:#1C1C1E}
1290
+ [data-theme="dark"] .qa-run{background:var(--subtle)}
1214
1291
 
1215
- [data-theme="dark"] .qa-run::after{background:#1C1C1E}
1292
+ [data-theme="dark"] .qa-run::after{background:var(--subtle)}
1216
1293
 
1217
- [data-theme="dark"] .qa-spinner{border-color:#3B3835;border-top-color:var(--indigo)}
1294
+ [data-theme="dark"] .qa-spinner{border-color:var(--md-border);border-top-color:var(--indigo)}
1218
1295
 
1219
- [data-theme="dark"] .qa-run-pill{background:rgba(245,244,243,.05);border-color:#3B3835}
1296
+ [data-theme="dark"] .qa-run-pill{background:rgba(242,251,245,.05);border-color:var(--md-border)}
1220
1297
 
1221
- [data-theme="dark"] .qa-run-t{color:#78716C}
1298
+ [data-theme="dark"] .qa-run-t{color:var(--muted)}
1222
1299
 
1223
- [data-theme="dark"] .qa-done{color:#78716C}
1300
+ [data-theme="dark"] .qa-done{color:var(--muted)}
1224
1301
 
1225
- [data-theme="dark"] .qa-done .d{background:#34D399}
1302
+ [data-theme="dark"] .qa-done .d{background:var(--success)}
1226
1303
 
1227
- [data-theme="dark"] .qa-done.err{color:#F87171}
1304
+ [data-theme="dark"] .qa-done.err{color:var(--fail)}
1228
1305
 
1229
- [data-theme="dark"] .qa-done.err .d{background:#F87171}
1306
+ [data-theme="dark"] .qa-done.err .d{background:var(--fail)}
1230
1307
 
1231
- [data-theme="dark"] .qa-agent-chip{color:#A8A29E;border-color:#3B3835;background:rgba(245,244,243,.05)}
1308
+ [data-theme="dark"] .qa-agent-chip{color:var(--muted);border-color:var(--md-border);background:rgba(242,251,245,.05)}
1232
1309
 
1233
- [data-theme="dark"] .qa-agent-chip.run{color:#F06953;background:rgba(240,105,83,.12);border-color:rgba(240,105,83,.35)}
1310
+ [data-theme="dark"] .qa-agent-chip.run{color:var(--amber);background:rgba(var(--warning-rgb),.16);border-color:rgba(var(--warning-rgb),.36)}
1234
1311
 
1235
- [data-theme="dark"] .qa-agent-chip.ok{color:#34D399;background:rgba(52,211,153,.1);border-color:rgba(52,211,153,.35)}
1312
+ [data-theme="dark"] .qa-agent-chip.ok{color:var(--success);background:rgba(var(--success-rgb),.12);border-color:rgba(var(--success-rgb),.38)}
1236
1313
 
1237
- [data-theme="dark"] .qa-agent-sess{color:#71717A;border-color:#3B3835}
1314
+ [data-theme="dark"] .qa-agent-sess{color:var(--muted);border-color:var(--md-border)}
1238
1315
 
1239
- [data-theme="dark"] .qa-sub-h{color:#525252}
1316
+ [data-theme="dark"] .qa-sub-h{color:var(--faint)}
1240
1317
 
1241
- [data-theme="dark"] .qa-sub-n{color:#525252}
1318
+ [data-theme="dark"] .qa-sub-n{color:var(--faint)}
1242
1319
 
1243
- [data-theme="dark"] .qa-note{color:#525252}
1320
+ [data-theme="dark"] .qa-note{color:var(--faint)}
1244
1321
 
1245
1322
  .qa-av.qa-av-sim{display:grid;place-items:center;background:linear-gradient(180deg,var(--cinnabar-hi),var(--cinnabar));color:#FFF7F5}
1246
1323
 
@@ -1269,9 +1346,9 @@
1269
1346
 
1270
1347
  .qa-ask-other button:hover{background:var(--cinnabar-hi);border-color:var(--cinnabar-hi);color:#fff}
1271
1348
 
1272
- [data-theme="dark"] .qa-ask-other button{background:var(--cinnabar);border-color:var(--cinnabar);color:#1C1917}
1349
+ [data-theme="dark"] .qa-ask-other button{background:var(--amber);border-color:var(--amber);color:var(--canvas)}
1273
1350
 
1274
- [data-theme="dark"] .qa-ask-other button:hover{background:var(--cinnabar-hi);border-color:var(--cinnabar-hi);color:#1C1917}
1351
+ [data-theme="dark"] .qa-ask-other button:hover{background:var(--cinnabar-hi);border-color:var(--cinnabar-hi);color:var(--canvas)}
1275
1352
 
1276
1353
  .qa-tool-name{font-size:10.5px;font-weight:500;color:var(--paper-dim)}
1277
1354
 
@@ -1379,13 +1456,13 @@
1379
1456
  @keyframes qaHistSweep{0%{transform:translateX(-100%)}60%,100%{transform:translateX(100%)}}
1380
1457
  @keyframes qaHistShimmer{0%{transform:translateX(-100%)}55%,100%{transform:translateX(100%)}}
1381
1458
 
1382
- [data-theme="dark"] .qa-hist-note{background:rgba(255,255,255,.04)}
1459
+ [data-theme="dark"] .qa-hist-note{background:rgba(242,251,245,.04)}
1383
1460
 
1384
- [data-theme="dark"] .qa-hist-note.wait{color:#525252}
1461
+ [data-theme="dark"] .qa-hist-note.wait{color:var(--faint)}
1385
1462
 
1386
- [data-theme="dark"] .qa-hist-note.lost{border-left-color:#F87171}
1463
+ [data-theme="dark"] .qa-hist-note.lost{border-left-color:var(--fail)}
1387
1464
 
1388
- [data-theme="dark"] .qa-hist-lines span{background:rgba(255,255,255,.09)}
1465
+ [data-theme="dark"] .qa-hist-lines span{background:rgba(242,251,245,.09)}
1389
1466
 
1390
1467
  [data-theme="dark"] .qa-hist-lines span::after{
1391
1468
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.16),transparent)}
@@ -1446,17 +1523,17 @@
1446
1523
  background:#F5F4F3;font-family:var(--mono);font-size:10.5px;line-height:1.6;
1447
1524
  color:#57534E;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere}
1448
1525
 
1449
- [data-theme="dark"] .qa-hist-step{border-color:#3B3835;background:rgba(245,244,243,.02)}
1526
+ [data-theme="dark"] .qa-hist-step{border-color:var(--md-border);background:rgba(242,251,245,.02)}
1450
1527
 
1451
- [data-theme="dark"] .qa-hist-step summary:hover{background:rgba(245,244,243,.05)}
1528
+ [data-theme="dark"] .qa-hist-step summary:hover{background:rgba(242,251,245,.05)}
1452
1529
 
1453
- [data-theme="dark"] .qa-hist-step summary::after{color:#A8A29E}
1530
+ [data-theme="dark"] .qa-hist-step summary::after{color:var(--muted)}
1454
1531
 
1455
- [data-theme="dark"] .qa-hist-step--think{border-left-color:#3B3835}
1532
+ [data-theme="dark"] .qa-hist-step--think{border-left-color:var(--md-border)}
1456
1533
 
1457
- [data-theme="dark"] .qa-hist-step-body{color:#D6D3D1}
1534
+ [data-theme="dark"] .qa-hist-step-body{color:var(--ink-soft)}
1458
1535
 
1459
- [data-theme="dark"] .qa-hist-step-pre{background:#0F0F10;color:#D6D3D1}
1536
+ [data-theme="dark"] .qa-hist-step-pre{background:var(--code);color:var(--ink-soft)}
1460
1537
 
1461
1538
  .qa-msg:not(.qa-mine):not(.qa-sim){flex-direction:column;gap:6px;align-items:stretch}
1462
1539
 
@@ -1638,33 +1715,33 @@
1638
1715
  [data-theme="dark"] .qa-cf-bd pre,[data-theme="dark"] .qa-tool-sec pre{
1639
1716
  color:#D6D3D1;background:transparent}
1640
1717
 
1641
- [data-theme="dark"] .qa-tool-bd > * + *,[data-theme="dark"] .qa-fc-hd{border-color:#3B3835}
1718
+ [data-theme="dark"] .qa-tool-bd > * + *,[data-theme="dark"] .qa-fc-hd{border-color:var(--md-border)}
1642
1719
 
1643
- [data-theme="dark"] .qa-cf-copy:hover{background:rgba(245,244,243,.09);color:#F5F4F3}
1720
+ [data-theme="dark"] .qa-cf-copy:hover{background:rgba(242,251,245,.09);color:var(--ink)}
1644
1721
 
1645
- [data-theme="dark"] .qa-mk-row[data-tog="1"]:hover{background:rgba(245,244,243,.05)}
1722
+ [data-theme="dark"] .qa-mk-row[data-tog="1"]:hover{background:rgba(242,251,245,.05)}
1646
1723
 
1647
- [data-theme="dark"] .qa-st{background:rgba(245,244,243,.05);border-color:#3B3835}
1724
+ [data-theme="dark"] .qa-st{background:rgba(242,251,245,.05);border-color:var(--md-border)}
1648
1725
 
1649
- [data-theme="dark"] .qa-diff-row .b{background:#3B3835}
1726
+ [data-theme="dark"] .qa-diff-row .b{background:var(--md-border)}
1650
1727
 
1651
- [data-theme="dark"] .qa-diff-row.add{background:rgba(52,211,153,.12);color:#6EE7B7}
1728
+ [data-theme="dark"] .qa-diff-row.add{background:rgba(var(--success-rgb),.14);color:var(--success)}
1652
1729
 
1653
- [data-theme="dark"] .qa-diff-row.add .s{color:#6EE7B7}
1730
+ [data-theme="dark"] .qa-diff-row.add .s{color:var(--success)}
1654
1731
 
1655
- [data-theme="dark"] .qa-diff-row.del{background:rgba(240,105,83,.12);color:#FCA5A5}
1732
+ [data-theme="dark"] .qa-diff-row.del{background:rgba(var(--warning-rgb),.16);color:var(--error-text)}
1656
1733
 
1657
- [data-theme="dark"] .qa-diff-row.del .s{color:#FCA5A5}
1734
+ [data-theme="dark"] .qa-diff-row.del .s{color:var(--error-text)}
1658
1735
 
1659
1736
  [data-theme="dark"] .qa-diff-row.hunk{background:color-mix(in srgb, var(--indigo) 12%, transparent);color:var(--indigo)}
1660
1737
 
1661
- [data-theme="dark"] .qa-diff-row.file{background:rgba(245,244,243,.045);color:#A8A29E}
1738
+ [data-theme="dark"] .qa-diff-row.file{background:rgba(242,251,245,.045);color:var(--muted)}
1662
1739
 
1663
1740
  .qa-msg.qa-mine .qa-fold-btn{background:transparent}
1664
1741
 
1665
1742
  .qa-msg.qa-mine .qa-fold-btn:hover{background:rgba(28,25,23,.05)}
1666
1743
 
1667
- [data-theme="dark"] .qa-msg.qa-mine .qa-fold-btn:hover{background:rgba(245,244,243,.07)}
1744
+ [data-theme="dark"] .qa-msg.qa-mine .qa-fold-btn:hover{background:rgba(242,251,245,.07)}
1668
1745
 
1669
1746
  .qa-acts{display:flex;align-items:center;justify-content:flex-start;gap:2px;min-width:0}
1670
1747
 
@@ -1697,7 +1774,7 @@
1697
1774
 
1698
1775
  .qa-act-copy.copied .i-ok{display:block;stroke:var(--jade)}
1699
1776
 
1700
- [data-theme="dark"] .qa-act:hover{background:rgba(245,244,243,.09);color:#F5F4F3}
1777
+ [data-theme="dark"] .qa-act:hover{background:rgba(242,251,245,.09);color:var(--ink)}
1701
1778
 
1702
1779
  /* ---- 任务列表(qaTodoNode / qaTodoFill,见 29-msg-variants)----
1703
1780
  一族两形:工具卡明细里的「待办清单」与一条应答里唯一那块「任务列表」面板。
@@ -1752,10 +1829,10 @@
1752
1829
  stroke-linecap:round;stroke-linejoin:round;transition:transform .15s}
1753
1830
  .qa-todo-panel.open .qa-todo-toggle svg{transform:rotate(180deg)}
1754
1831
  .qa-todo-panel:not(.open) .qa-todo-list{display:none}
1755
- [data-theme="dark"] .qa-todo-hd{background:rgba(245,244,243,.045);border-color:#3B3835}
1756
- [data-theme="dark"] .qa-todo-ico{border-color:#57534E}
1757
- [data-theme="dark"] .qa-todo-row.is-in_progress{color:#F5F4F3}
1758
- [data-theme="dark"] .qa-todo-row.is-completed{color:#A8A29E}
1832
+ [data-theme="dark"] .qa-todo-hd{background:rgba(242,251,245,.045);border-color:var(--md-border)}
1833
+ [data-theme="dark"] .qa-todo-ico{border-color:var(--faint)}
1834
+ [data-theme="dark"] .qa-todo-row.is-in_progress{color:var(--ink)}
1835
+ [data-theme="dark"] .qa-todo-row.is-completed{color:var(--muted)}
1759
1836
 
1760
1837
  /* ============================================================================
1761
1838
  * 令牌桥:magic-test 的调色板名字 → 各端宿主已有的令牌(**只用不定义**)
@@ -1768,6 +1845,24 @@
1768
1845
  * 值是「兜底」:宿主给了同名令牌(--ink / --muted / …)就以宿主为准。
1769
1846
  * ========================================================================== */
1770
1847
  :where(:root) {
1848
+ /* 状态色的 **rgb 三通道**(2026-10-25 深色配色收口):
1849
+ 深色覆盖里有一批「同色不同透明度」的叠加底(12 条 .05 / .04 / .03 …),
1850
+ 写成 color-mix 会把 alpha 和颜色搅在一起、也没法一行改一处;
1851
+ 透传三通道就能写出 rgba(var(--warning-rgb),.14):**颜色永远跟着主题令牌走**。
1852
+ ⚠️ 不能写成 var(--amber-rgb, 217, 119, 6):兜底值里有逗号,语法上会被当成三个值。
1853
+ 默认值就是本壳的琥珀 / 鎏金 / 玉绿 / 失败红;宿主想让叠加底跟着自己的令牌走,
1854
+ 就在自己的 :root 里把 --warning-rgb 等四行改写成对应令牌的 rgb 通道。 */
1855
+ --warning-rgb: 217, 119, 6;
1856
+ --queued-rgb: 232, 199, 122;
1857
+ --success-rgb: 34, 197, 94;
1858
+ --fail-rgb: 248, 113, 113;
1859
+ /* 代码高亮里的「字符串」色:浅色代用的是绿松石 #0F766E(H175)。深色覆盖原来写的是
1860
+ 薄荷 #5EEAD4(H166,压在深底上像荧光)—— 直接沿用同一支绿松石,两种主题的代码配色才一致。
1861
+ .md-body a 的「正文链接」默认也走这一支(那几行写成 color:#0F766E;color:var(--syntax-teal,#0F766E),
1862
+ 浅色两个值相同 → 一个像素不变);深色覆盖再把正文链接显式换成 --amber(「正文里的可点」规则)。
1863
+ 不在主题令牌里:它只服务本文件的 .hljs-string / 正文链接,不参与界面配色。 */
1864
+ --syntax-teal: #0F766E;
1865
+
1771
1866
  /* 文字三级(magic-test: paper / paper-dim / paper-mute) */
1772
1867
  --paper: var(--ink);
1773
1868
  --paper-dim: var(--muted);