magic-agent 2.4.3 → 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 (207) hide show
  1. package/CLIENT-CONTRACT.md +467 -41
  2. package/README.md +15 -14
  3. package/client-ui/pc/app.css +74 -0
  4. package/client-ui/pc/js/04-task-list.js +5 -1
  5. package/client-ui/pc/js/07-chat-stream-render.js +3 -3
  6. package/client-ui/pc/js/90-glue.js +40 -2
  7. package/client-ui/pc/js/92-composer.js +19 -4
  8. package/client-ui/pc/js/93-rail.js +16 -5
  9. package/client-ui/shared/conv/02-media-kinds.js +2 -2
  10. package/client-ui/shared/conv/03-chat-message.js +247 -23
  11. package/client-ui/shared/conv/06-ask-answer.js +75 -1
  12. package/client-ui/shared/conv/09-stream-apply.js +72 -7
  13. package/client-ui/shared/conv/19-attachments.js +157 -6
  14. package/client-ui/shared/conv/27-conv-ledger.js +5 -2
  15. package/client-ui/shared/conv/29-msg-variants.js +217 -0
  16. package/client-ui/shared/conv/conv.css +329 -174
  17. package/client-ui/shared/conv/dom-map.md +1 -0
  18. package/client-ui/shared/conversation.css +13 -2
  19. package/client-ui/shared/conversation.js +373 -50
  20. package/client-ui/shared/transport-http.js +14 -0
  21. package/client-ui-mobile/apps.css +16 -0
  22. package/client-ui-mobile/apps.js +406 -0
  23. package/client-ui-mobile/index.html +5554 -639
  24. package/client-ui-mobile/reqs.css +110 -1
  25. package/client-ui-mobile/reqs.js +533 -74
  26. package/client-ui-mobile/reqshot.js +505 -0
  27. package/client-ui-mobile/scripts.css +67 -0
  28. package/client-ui-mobile/scripts.js +599 -0
  29. package/client-ui-mobile/vendor/cose-base.js +3214 -0
  30. package/client-ui-mobile/vendor/cytoscape-fcose.js +1549 -0
  31. package/client-ui-mobile/vendor/cytoscape.min.js +32 -0
  32. package/client-ui-mobile/vendor/layout-base.js +5230 -0
  33. package/cmd/magic-client/browsectl.go +199 -0
  34. package/cmd/magic-client/clientctl.go +69 -10
  35. package/cmd/magic-client/main.go +210 -32
  36. package/internal/agent/ask.go +45 -0
  37. package/internal/agent/ask_test.go +39 -0
  38. package/internal/agent/attachments_test.go +6 -2
  39. package/internal/agent/capability.go +7 -1
  40. package/internal/agent/claude.go +20 -15
  41. package/internal/agent/codebuddy.go +125 -34
  42. package/internal/agent/codebuddy_account_test.go +54 -0
  43. package/internal/agent/codebuddy_stream_test.go +103 -0
  44. package/internal/agent/credits.go +713 -0
  45. package/internal/agent/credits_minimax_test.go +97 -0
  46. package/internal/agent/credits_test.go +211 -0
  47. package/internal/agent/custom_models.go +155 -0
  48. package/internal/agent/custom_models_test.go +125 -0
  49. package/internal/agent/dsh.go +123 -49
  50. package/internal/agent/dsh_caps_cache_test.go +184 -0
  51. package/internal/agent/dsh_resume.go +157 -7
  52. package/internal/agent/dsh_test.go +108 -6
  53. package/internal/agent/engine.go +37 -1
  54. package/internal/agent/engine_base.go +21 -17
  55. package/internal/agent/engine_base_test.go +2 -2
  56. package/internal/agent/engine_test.go +47 -86
  57. package/internal/agent/env.go +173 -1
  58. package/internal/agent/env_test.go +114 -0
  59. package/internal/agent/fallback.go +313 -0
  60. package/internal/agent/fallback_test.go +340 -0
  61. package/internal/agent/launch.go +43 -1
  62. package/internal/agent/limitnotice.go +207 -1
  63. package/internal/agent/limitnotice_test.go +140 -0
  64. package/internal/agent/llmhttp.go +46 -4
  65. package/internal/agent/llmhttp_test.go +157 -0
  66. package/internal/agent/models.go +53 -1
  67. package/internal/agent/models_test.go +20 -5
  68. package/internal/agent/pidalive_windows_test.go +40 -0
  69. package/internal/agent/runcmd.go +26 -0
  70. package/internal/agent/runcmd_windows.go +36 -5
  71. package/internal/agent/stream.go +166 -6
  72. package/internal/agent/stream_test.go +25 -38
  73. package/internal/agent/stream_timeline_test.go +2 -37
  74. package/internal/agent/streamjson.go +119 -7
  75. package/internal/agent/tools_suffix_test.go +6 -3
  76. package/internal/agent/trae.go +50 -243
  77. package/internal/agent/trae_exec.go +433 -0
  78. package/internal/agent/trae_exec_test.go +181 -0
  79. package/internal/agent/wraplaunch_test.go +113 -0
  80. package/internal/cli/ask.go +168 -37
  81. package/internal/cli/ask_test.go +1 -1
  82. package/internal/cli/checkin.go +77 -0
  83. package/internal/cli/clientcmd.go +3 -2
  84. package/internal/cli/control.go +46 -5
  85. package/internal/cli/control_test.go +65 -0
  86. package/internal/cli/engines_test.go +103 -0
  87. package/internal/cli/events.go +15 -0
  88. package/internal/cli/events_test.go +50 -0
  89. package/internal/cli/judge.go +104 -0
  90. package/internal/cli/quotas.go +125 -0
  91. package/internal/cli/requirements.go +51 -0
  92. package/internal/cli/root.go +157 -11
  93. package/internal/cli/session.go +75 -3
  94. package/internal/cli/session_test.go +82 -3
  95. package/internal/cli/sessionlog.go +6 -0
  96. package/internal/cli/sessionlog_test.go +22 -2
  97. package/internal/cli/suggest.go +7 -5
  98. package/internal/cli/team.go +37 -9
  99. package/internal/cli/team_test.go +39 -0
  100. package/internal/client/ab.go +372 -0
  101. package/internal/client/ab_test.go +287 -0
  102. package/internal/client/apk.go +8 -0
  103. package/internal/client/apk_test.go +59 -0
  104. package/internal/client/apps.go +1078 -0
  105. package/internal/client/apps_test.go +516 -0
  106. package/internal/client/browse.go +84 -36
  107. package/internal/client/browse_test.go +107 -9
  108. package/internal/client/browseinput.go +481 -0
  109. package/internal/client/browseinput_test.go +216 -0
  110. package/internal/client/corecmd.go +23 -0
  111. package/internal/client/corecmd_other.go +8 -0
  112. package/internal/client/corecmd_windows.go +24 -0
  113. package/internal/client/coreexe.go +196 -0
  114. package/internal/client/coreexe_test.go +161 -0
  115. package/internal/client/coreupgrade.go +866 -0
  116. package/internal/client/coreupgrade_test.go +561 -0
  117. package/internal/client/daemon.go +297 -33
  118. package/internal/client/daemon_test.go +33 -0
  119. package/internal/client/engines_checkin_test.go +57 -0
  120. package/internal/client/fallback_flags_test.go +64 -0
  121. package/internal/client/feishu.go +1259 -0
  122. package/internal/client/feishu_test.go +649 -0
  123. package/internal/client/health_identity_test.go +84 -0
  124. package/internal/client/hostenv.go +68 -0
  125. package/internal/client/hostenv_test.go +37 -0
  126. package/internal/client/jobs.go +518 -24
  127. package/internal/client/jobs_auto.go +571 -0
  128. package/internal/client/jobs_auto_test.go +431 -0
  129. package/internal/client/jobs_test.go +299 -2
  130. package/internal/client/knowledge.go +854 -0
  131. package/internal/client/knowledge_test.go +510 -0
  132. package/internal/client/lan.go +3 -3
  133. package/internal/client/plugins.go +5 -1
  134. package/internal/client/prefs.go +67 -0
  135. package/internal/client/procstart_linux.go +59 -0
  136. package/internal/client/publicurl.go +82 -0
  137. package/internal/client/quotas_merge_test.go +107 -0
  138. package/internal/client/requirements.go +207 -2
  139. package/internal/client/requirements_shots_test.go +200 -0
  140. package/internal/client/requirements_test.go +103 -0
  141. package/internal/client/restart.go +288 -0
  142. package/internal/client/restart_handoff_test.go +230 -0
  143. package/internal/client/restart_test.go +290 -0
  144. package/internal/client/scripts.go +1047 -0
  145. package/internal/client/scripts_decode_implausible.go +38 -0
  146. package/internal/client/scripts_decode_other.go +31 -0
  147. package/internal/client/scripts_decode_test.go +130 -0
  148. package/internal/client/scripts_decode_windows.go +182 -0
  149. package/internal/client/scripts_test.go +739 -0
  150. package/internal/client/service.go +717 -97
  151. package/internal/client/service_test.go +217 -1
  152. package/internal/client/sessions_cache.go +148 -0
  153. package/internal/client/sessions_cache_test.go +163 -0
  154. package/internal/client/sessions_fold.go +165 -0
  155. package/internal/client/sessions_fold_test.go +204 -0
  156. package/internal/client/singleinstance.go +470 -0
  157. package/internal/client/singleinstance_test.go +607 -0
  158. package/internal/client/suggest.go +105 -2
  159. package/internal/client/suggest_test.go +86 -0
  160. package/internal/client/team_flags.go +25 -11
  161. package/internal/client/team_flags_test.go +39 -0
  162. package/internal/client/testmain_test.go +88 -0
  163. package/internal/client/workspace_default_test.go +158 -0
  164. package/internal/client/workspacelockenv_test.go +54 -0
  165. package/internal/config/config.go +48 -0
  166. package/internal/judge/judge.go +315 -0
  167. package/internal/requirements/bootstrap.go +16 -0
  168. package/internal/requirements/consolidate.go +100 -9
  169. package/internal/requirements/doc.go +154 -3
  170. package/internal/requirements/graph.go +138 -0
  171. package/internal/requirements/memory.go +7 -0
  172. package/internal/requirements/modules.go +312 -0
  173. package/internal/requirements/modules_test.go +373 -0
  174. package/internal/requirements/relations.go +155 -0
  175. package/internal/requirements/relations_test.go +231 -0
  176. package/internal/requirements/requirements.go +10 -0
  177. package/internal/requirements/shots.go +418 -0
  178. package/internal/requirements/shots_test.go +387 -0
  179. package/internal/session/multiclient_test.go +368 -0
  180. package/internal/session/session.go +175 -11
  181. package/internal/session/session_test.go +7 -0
  182. package/internal/session/status.go +21 -0
  183. package/internal/session/status_test.go +28 -0
  184. package/internal/session/title.go +16 -0
  185. package/internal/session/title_test.go +26 -0
  186. package/internal/session/workspace_lock.go +265 -28
  187. package/internal/suggest/suggest.go +23 -1
  188. package/internal/team/event.go +3 -1
  189. package/internal/team/execute.go +21 -6
  190. package/internal/team/fallback_route_test.go +80 -0
  191. package/internal/team/planner.go +15 -3
  192. package/internal/team/route.go +89 -17
  193. package/internal/team/team.go +18 -4
  194. package/npm/apk/magic-agent-mobile-release.apk +0 -0
  195. package/npm/apk/version.json +6 -3
  196. package/npm/dist/darwin-arm64/magic-agent +0 -0
  197. package/npm/dist/darwin-arm64/magic-client +0 -0
  198. package/npm/dist/darwin-x64/magic-agent +0 -0
  199. package/npm/dist/darwin-x64/magic-client +0 -0
  200. package/npm/dist/linux-arm64/magic-agent +0 -0
  201. package/npm/dist/linux-arm64/magic-client +0 -0
  202. package/npm/dist/linux-x64/magic-agent +0 -0
  203. package/npm/dist/linux-x64/magic-client +0 -0
  204. package/npm/dist/win32-x64/magic-agent.exe +0 -0
  205. package/npm/dist/win32-x64/magic-client.exe +0 -0
  206. package/npm/install.js +11 -0
  207. package/package.json +14 -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,18 +469,18 @@
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
  「排队中 · 上一轮结束后自动发送」—— **不隐藏、不挪走**,否则就是这次报障的
467
477
  「追问没在对话区显示」。虚线边框同时说明它不是「已送达」那种实心状态。 */
468
- .qa-msg.qa-mine.is-queued .qa-bd{border-style:dashed;border-color:var(--queued,#8B5CF6);
478
+ .qa-msg.qa-mine.is-queued .qa-bd{border-style:dashed;border-color:var(--queued);
469
479
  background:linear-gradient(180deg,#FAF7FF,#F3EEFF)}
470
480
  .qa-msg.qa-mine.is-queued .qa-bd::after{content:"排队中 · 上一轮结束后自动发送";
471
- display:block;margin-top:6px;font-size:11.5px;line-height:15px;color:var(--queued,#8B5CF6)}
472
- [data-theme="dark"] .qa-msg.qa-mine.is-queued .qa-bd{background:#241E33;border-color:#7C5CE0}
473
- [data-theme="dark"] .qa-msg.qa-mine.is-queued .qa-bd::after{color:#A98CF5}
481
+ display:block;margin-top:6px;font-size:11.5px;line-height:15px;color:var(--queued)}
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)}
483
+ [data-theme="dark"] .qa-msg.qa-mine.is-queued .qa-bd::after{color:var(--queued)}
474
484
  /* 排队期间被取消(`is-cancelled`):气泡留着当回执,但明确说它不会被执行。
475
485
  用灰色虚线而不是红色 —— 用户自己撤的,不是失败,别用报错的颜色吓人。 */
476
486
  .qa-msg.qa-mine.is-cancelled .qa-bd{border-style:dashed;border-color:var(--line);
@@ -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
 
@@ -549,6 +559,33 @@
549
559
 
550
560
  .qa-art-video video{display:block;max-width:280px;max-height:190px;background:#000}
551
561
 
562
+ /* HTML 产物卡:iframe 就地预览(2026-10-24)—— 固定尺寸与视频同一档,可滚动看整页。
563
+ 缩略 iframe 关掉指针事件(点击不冒泡出 iframe,关了才能「点卡片看大图」),光标用放大镜。 */
564
+ .qa-art-html{cursor:zoom-in}
565
+
566
+ .qa-art-html iframe{display:block;width:280px;height:190px;border:0;background:#fff;pointer-events:none}
567
+
568
+ .qa-arts-html{display:grid;grid-template-columns:repeat(auto-fill,280px);gap:8px}
569
+
570
+ .qa-arts-html .qa-art-html{width:280px}
571
+
572
+ .qa-arts-html .qa-art-cap{max-width:none}
573
+
574
+ /* HTML 产物全屏预览层(点击卡片弹出,内核自画,见 19-attachments 的 __qaArtHtmlPeek):
575
+ 深蒙层 + 顶条(文件名 / 关闭)+ 撑满余下的 iframe。 */
576
+ .qa-art-html-peek{position:fixed;inset:0;z-index:9999;display:flex;flex-direction:column;
577
+ gap:8px;padding:20px;background:rgba(28,25,23,.62)}
578
+
579
+ .qa-art-html-peek-bar{display:flex;align-items:center;gap:10px}
580
+
581
+ .qa-art-html-peek-t{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
582
+ font-family:var(--mono);font-size:12px;color:#F5F4F3}
583
+
584
+ .qa-art-html-peek-x{flex:0 0 auto;padding:3px 12px;border-radius:8px;border:1px solid rgba(245,244,243,.35);
585
+ background:transparent;color:#F5F4F3;font-size:12px;cursor:pointer}
586
+
587
+ .qa-art-html-peek iframe{flex:1 1 auto;width:100%;border:0;border-radius:10px;background:#fff}
588
+
552
589
  .qa-art audio{display:block;width:260px;margin:8px}
553
590
 
554
591
  .qa-art-cap{display:flex;align-items:center;gap:7px;padding:6px 9px;max-width:280px;
@@ -586,11 +623,11 @@
586
623
 
587
624
  .qa-art:hover .qa-art-go{opacity:1}
588
625
 
589
- [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)}
590
627
 
591
628
  [data-theme="dark"] .qa-art:hover{border-color:var(--cinnabar-hi)}
592
629
 
593
- [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)}
594
631
 
595
632
  .qa-msg.qa-mine .qa-arts,.qa-msg.qa-sim .qa-arts{justify-content:flex-end}
596
633
 
@@ -741,9 +778,9 @@
741
778
 
742
779
  .qa-turn-bd > .qa-think:first-child,.qa-turn-bd > .qa-tools:first-child{margin-top:0}
743
780
 
744
- [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)}
745
782
 
746
- [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)}
747
784
 
748
785
  .qa-tool{margin:3px 0 1px;border:1px solid var(--line);border-radius:10px;
749
786
  background:#FCFBF9;overflow:hidden;transition:background .25s,border-color .25s}
@@ -864,7 +901,7 @@
864
901
  stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
865
902
 
866
903
  .qa-ask-tag{font-family:var(--mono);font-size:9px;letter-spacing:.06em;padding:1.5px 7px;
867
- border-radius:99px;border:1px solid rgba(79,70,229,.28);color:var(--indigo);background:var(--halo-indigo)}
904
+ border-radius:99px;border:1px solid color-mix(in srgb, var(--indigo) 28%, transparent);color:var(--indigo);background:var(--halo-indigo)}
868
905
 
869
906
  .qa-ask-ttl{font-family:var(--mono);font-size:9px;letter-spacing:.1em;color:var(--paper-mute);margin-left:auto}
870
907
 
@@ -883,7 +920,7 @@
883
920
  padding:7px 9px;border:1px solid var(--line);border-radius:8px;background:#fff;font:inherit;
884
921
  cursor:pointer;transition:border-color .18s,background .18s}
885
922
 
886
- .qa-ask-opt:hover{border-color:rgba(79,70,229,.45);background:var(--halo-indigo)}
923
+ .qa-ask-opt:hover{border-color:color-mix(in srgb, var(--indigo) 45%, transparent);background:var(--halo-indigo)}
887
924
 
888
925
  .qa-ask-opt .mk{width:15px;height:15px;flex:none;margin-top:1px;border-radius:5px;
889
926
  border:1.5px solid var(--line);display:grid;place-items:center;color:var(--paper-mute)}
@@ -910,18 +947,18 @@
910
947
  .qa-ask-other input{flex:1;min-width:0;padding:6px 9px;border:1px solid var(--line);
911
948
  border-radius:8px;background:#fff;font-family:var(--serif);font-size:12px;color:var(--paper)}
912
949
 
913
- .qa-ask-other input:focus{outline:none;border-color:rgba(79,70,229,.5)}
950
+ .qa-ask-other input:focus{outline:none;border-color:color-mix(in srgb, var(--indigo) 50%, transparent)}
914
951
 
915
952
  .qa-ask-other button{flex:none;padding:6px 12px;border:1px solid var(--line);border-radius:8px;
916
953
  background:#fff;font-family:var(--serif);font-size:12px;color:var(--paper-dim);cursor:pointer}
917
954
 
918
- .qa-ask-other button:hover{border-color:rgba(79,70,229,.45);color:var(--indigo)}
955
+ .qa-ask-other button:hover{border-color:color-mix(in srgb, var(--indigo) 45%, transparent);color:var(--indigo)}
919
956
 
920
957
  .qa-ask-ft{display:flex;align-items:center;gap:8px;margin-top:8px}
921
958
 
922
959
  .qa-ask-ft[hidden],.qa-ask-ans[hidden]{display:none}
923
960
 
924
- .qa-ask-sub{flex:none;padding:5px 14px;border:1px solid rgba(79,70,229,.4);border-radius:99px;
961
+ .qa-ask-sub{flex:none;padding:5px 14px;border:1px solid color-mix(in srgb, var(--indigo) 40%, transparent);border-radius:99px;
925
962
  background:var(--halo-indigo);font-family:var(--serif);font-size:12px;color:var(--indigo);cursor:pointer}
926
963
 
927
964
  .qa-ask-sub:disabled{opacity:.4;cursor:default;border-color:var(--line);background:transparent;
@@ -988,6 +1025,72 @@
988
1025
 
989
1026
  .qa-done.err{color:var(--cinnabar-hi)}
990
1027
 
1028
+ /* 错误显示卡(终态失败):朱砂描边 + 淡红底的卡片面(见 29-msg-variants 的 qaErrorCardNode)。
1029
+ ⚠️ 根节点带 `.qa-done` 类(收尾行契约要数它),这里把它从「等宽灰字行」翻成「块级卡片」:
1030
+ display:block 盖掉 `.qa-done` 的 flex 行布局;颜色交给子元素,根只留卡片面。 */
1031
+ .qa-errcard{display:block;margin:8px 0 4px;padding:10px 12px;
1032
+ border:1px solid rgba(214,64,42,.38);border-radius:var(--r-md);background:rgba(214,64,42,.06)}
1033
+
1034
+ .qa-errcard + .qa-errcard{margin-top:0}
1035
+
1036
+ .qa-ec-hd{display:flex;align-items:center;gap:8px}
1037
+
1038
+ .qa-ec-ico{width:16px;height:16px;flex:none;display:grid;place-items:center;color:var(--cinnabar-hi)}
1039
+
1040
+ .qa-ec-ico svg{width:15px;height:15px;display:block;stroke:currentColor;fill:none;
1041
+ stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
1042
+
1043
+ .qa-ec-tt{flex:1;min-width:0;font-family:var(--font);font-size:13px;font-weight:600;color:var(--cinnabar-hi)}
1044
+
1045
+ .qa-ec-bd{margin-top:8px}
1046
+
1047
+ .qa-ec-reason{margin:0;font-size:12.5px;line-height:1.6;color:var(--paper-dim);
1048
+ white-space:pre-wrap;word-break:break-word}
1049
+
1050
+ .qa-ec-meta{margin-top:6px;font-family:var(--mono);font-size:10px;letter-spacing:.04em;color:var(--paper-mute)}
1051
+
1052
+ /* 卡片里的可展开详情(复用 .qa-mk 词汇);把它的左缩进让出来,贴着卡片内边距更顺 */
1053
+ .qa-errcard .qa-mk{margin:8px 0 0}
1054
+
1055
+ .qa-errcard .qa-mk-bd{padding-left:2px}
1056
+
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)}
1089
+
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)}
1093
+
991
1094
  .qa-reqacts{display:flex;flex-wrap:wrap;gap:8px;padding:10px 2px 2px;justify-content:flex-start}
992
1095
 
993
1096
  .qa-reqacts button{font-family:var(--mono);font-size:11px;letter-spacing:.04em;padding:5px 12px;
@@ -1004,183 +1107,217 @@
1004
1107
 
1005
1108
  .qa-reqacts button.go:hover{background:rgba(214,64,42,.12)}
1006
1109
 
1007
- [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)}
1008
1111
 
1009
- [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)}
1010
1113
 
1011
- [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)}
1012
1115
 
1013
- [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)}
1014
1117
 
1015
- [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)}
1016
1119
 
1017
- [data-theme="dark"] .qa-stream{background:#1C1C1E}
1120
+ [data-theme="dark"] .qa-stream{background:var(--subtle)}
1018
1121
 
1019
- [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)}
1020
1123
 
1021
- [data-theme="dark"] .qa-msg{color:#E5E5E5}
1124
+ [data-theme="dark"] .qa-msg{color:var(--ink-soft)}
1022
1125
 
1023
- [data-theme="dark"] .qa-t{color:#F5F4F3}
1126
+ [data-theme="dark"] .qa-t{color:var(--ink)}
1024
1127
 
1025
- [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)}
1026
1129
 
1027
- [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)}
1028
1131
 
1029
- [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)}
1030
1133
 
1031
- [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)}
1032
1135
 
1033
- [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)}
1034
1137
 
1035
- [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)}
1036
1139
 
1037
- [data-theme="dark"] .qa-t.md-body blockquote p{color:#A8A29E}
1140
+ [data-theme="dark"] .qa-t.md-body blockquote p{color:var(--muted)}
1038
1141
 
1039
- [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)}
1040
1143
  /* 放在上面那条**之后**:同为 4 个类级选择器,靠后才会赢(托管气泡的暗色底不被盖回灰)。 */
1041
- [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)}
1042
1145
 
1043
- [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))}
1044
1147
 
1045
- [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)}
1046
1149
 
1047
- [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)}
1048
1151
 
1049
- [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)}
1050
1153
 
1051
- [data-theme="dark"] .qa-tool-name{color:#F5F4F3}
1154
+ [data-theme="dark"] .qa-tool-name{color:var(--ink)}
1052
1155
 
1053
- [data-theme="dark"] .qa-tool-args{color:#A8A29E}
1156
+ [data-theme="dark"] .qa-tool-args{color:var(--muted)}
1054
1157
 
1055
- [data-theme="dark"] .qa-tool-bd{border-color:#3B3835}
1158
+ [data-theme="dark"] .qa-tool-bd{border-color:var(--md-border)}
1056
1159
 
1057
- [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)}
1058
1161
 
1059
- [data-theme="dark"] .qa-tool-sec pre{background:#0F0F10}
1162
+ [data-theme="dark"] .qa-tool-sec pre{background:var(--code)}
1060
1163
 
1061
- [data-theme="dark"] .qa-sub{border-color:#3B3835}
1164
+ [data-theme="dark"] .qa-sub{border-color:var(--md-border)}
1062
1165
 
1063
- [data-theme="dark"] .qa-sub-t{color:#E5E5E5}
1166
+ [data-theme="dark"] .qa-sub-t{color:var(--ink-soft)}
1064
1167
 
1065
- [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)}
1066
1169
 
1067
- [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)}
1068
1171
 
1069
- [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)}
1070
1173
 
1071
- [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)}
1072
1175
 
1073
1176
  [data-theme="dark"] .qa-ico svg{stroke:currentColor}
1074
1177
 
1075
1178
  [data-theme="dark"] .qa-av-img{border-radius:8px}
1076
1179
 
1077
- [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)}
1078
1185
 
1079
- [data-theme="dark"] .qa-t.md-body a{color:#F06953}
1186
+ [data-theme="dark"] .qa-t.md-body hr{border-color:var(--md-border)}
1080
1187
 
1081
- [data-theme="dark"] .qa-t.md-body a:hover{color:#F5F4F3}
1188
+ [data-theme="dark"] .qa-t.md-body img{border-color:var(--md-border)}
1082
1189
 
1083
- [data-theme="dark"] .qa-t.md-body hr{border-color:#3B3835}
1190
+ [data-theme="dark"] .qa-think-toggle{color:var(--muted)}
1084
1191
 
1085
- [data-theme="dark"] .qa-t.md-body img{border-color:#3B3835}
1192
+ [data-theme="dark"] .qa-think-dur{color:var(--faint)}
1086
1193
 
1087
- [data-theme="dark"] .qa-think-toggle{color:#78716C}
1194
+ [data-theme="dark"] .qa-tools-toggle{color:var(--muted)}
1088
1195
 
1089
- [data-theme="dark"] .qa-think-dur{color:#525252}
1196
+ [data-theme="dark"] .qa-tools-count{color:var(--faint)}
1090
1197
 
1091
- [data-theme="dark"] .qa-tools-toggle{color:#78716C}
1198
+ [data-theme="dark"] .qa-tools-dur{color:var(--faint)}
1092
1199
 
1093
- [data-theme="dark"] .qa-tools-count{color:#525252}
1200
+ [data-theme="dark"] .qa-tool-ico{background:var(--activity)}
1094
1201
 
1095
- [data-theme="dark"] .qa-tools-dur{color:#525252}
1202
+ [data-theme="dark"] .qa-tool-dur{color:var(--faint)}
1096
1203
 
1097
- [data-theme="dark"] .qa-tool-ico{background:rgba(245,244,243,.05)}
1204
+ [data-theme="dark"] .qa-tool .chev{stroke:var(--faint)}
1098
1205
 
1099
- [data-theme="dark"] .qa-tool-dur{color:#525252}
1206
+ [data-theme="dark"] .qa-tool[data-state="running"] .qa-tool-st::before{background:var(--amber)}
1100
1207
 
1101
- [data-theme="dark"] .qa-tool .chev{stroke:#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] 的那些行)一个字没动。 */
1102
1226
 
1103
- [data-theme="dark"] .qa-tool[data-state="running"] .qa-tool-st::before{background:#F59E0B}
1227
+ /* 朱砂实心按钮(「沿用这个选项」)上的字:原写 #1C1917(石褐墨),
1228
+ 统一换成页面底 --canvas —— 主题里「压在实色上的字」一律是它。 */
1229
+ [data-theme="dark"] .qa-ask-other button{color:var(--canvas)}
1104
1230
 
1105
- [data-theme="dark"] .qa-ask-hd{color:#E5E5E5}
1231
+ [data-theme="dark"] .qa-ask-other button:hover{color:var(--canvas)}
1106
1232
 
1107
- [data-theme="dark"] .qa-ask-tag{color:#818CF8;border-color:rgba(129,140,248,.4);background:rgba(129,140,248,.1)}
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)}
1108
1236
 
1109
- [data-theme="dark"] .qa-ask-ttl{color:#525252}
1237
+ [data-theme="dark"] .qa-diff-row.add .s{color:var(--success)}
1110
1238
 
1111
- [data-theme="dark"] .qa-ask-qb{border-top-color:#3B3835}
1239
+ /* 代码块内层底色:#0F0F10(石褐)→ --code(页面层级的代码底)。 */
1240
+ [data-theme="dark"] .qa-tool-sec pre{background:var(--code)}
1112
1241
 
1113
- [data-theme="dark"] .qa-ask-q{color:#F5F4F3}
1242
+ [data-theme="dark"] .qa-ask-hd{color:var(--ink-soft)}
1114
1243
 
1115
- [data-theme="dark"] .qa-ask-opt{border-color:#3B3835;background:transparent}
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)}
1116
1245
 
1117
- [data-theme="dark"] .qa-ask-opt:hover{border-color:rgba(129,140,248,.45);background:rgba(129,140,248,.08)}
1246
+ [data-theme="dark"] .qa-ask-ttl{color:var(--faint)}
1118
1247
 
1119
- [data-theme="dark"] .qa-ask-opt .lb{color:#E5E5E5}
1248
+ [data-theme="dark"] .qa-ask-qb{border-top-color:var(--md-border)}
1120
1249
 
1121
- [data-theme="dark"] .qa-ask-opt .ds{color:#78716C}
1250
+ [data-theme="dark"] .qa-ask-q{color:var(--ink)}
1122
1251
 
1123
- [data-theme="dark"] .qa-ask-opt .mk{border-color:#525252;background:transparent}
1252
+ [data-theme="dark"] .qa-ask-opt{border-color:var(--md-border);background:transparent}
1124
1253
 
1125
- [data-theme="dark"] .qa-ask-opt.sel{border-color:#6366F1;background:rgba(99,102,241,.1)}
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)}
1126
1255
 
1127
- [data-theme="dark"] .qa-ask-opt.sel .lb{color:#F5F4F3}
1256
+ [data-theme="dark"] .qa-ask-opt .lb{color:var(--ink-soft)}
1128
1257
 
1129
- [data-theme="dark"] .qa-ask-other input{background:#1C1C1E;border-color:#3B3835;color:#F5F4F3}
1258
+ [data-theme="dark"] .qa-ask-opt .ds{color:var(--muted)}
1130
1259
 
1131
- [data-theme="dark"] .qa-ask-other button{background:#1C1C1E;border-color:#3B3835;color:#A8A29E}
1260
+ [data-theme="dark"] .qa-ask-opt .mk{border-color:var(--faint);background:transparent}
1132
1261
 
1133
- [data-theme="dark"] .qa-ask-sub{background:rgba(99,102,241,.1);border-color:rgba(99,102,241,.4);color:#818CF8}
1262
+ [data-theme="dark"] .qa-ask-opt.sel{border-color:var(--indigo);background:color-mix(in srgb, var(--indigo) 10%, transparent)}
1134
1263
 
1135
- [data-theme="dark"] .qa-ask-sub:hover:not(:disabled){background:rgba(99,102,241,.18)}
1264
+ [data-theme="dark"] .qa-ask-opt.sel .lb{color:var(--ink)}
1136
1265
 
1137
- [data-theme="dark"] .qa-ask-hint{color:#525252}
1266
+ [data-theme="dark"] .qa-ask-other input{background:var(--subtle);border-color:var(--md-border);color:var(--ink)}
1138
1267
 
1139
- [data-theme="dark"] .qa-ask-ans{border-top-color:#3B3835}
1268
+ [data-theme="dark"] .qa-ask-other button{background:var(--subtle);border-color:var(--md-border);color:var(--muted)}
1140
1269
 
1141
- [data-theme="dark"] .qa-ask-ans .k{color:#525252}
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)}
1142
1271
 
1143
- [data-theme="dark"] .qa-ask-ans .v{color:#34D399}
1272
+ [data-theme="dark"] .qa-ask-sub:hover:not(:disabled){background:color-mix(in srgb, var(--indigo) 18%, transparent)}
1144
1273
 
1145
- [data-theme="dark"] .qa-askdock>.qa-ask{background:#1C1C1E;box-shadow:0 6px 20px rgba(0,0,0,.4)}
1274
+ [data-theme="dark"] .qa-ask-hint{color:var(--faint)}
1146
1275
 
1147
- [data-theme="dark"] .qa-askdock::-webkit-scrollbar-thumb{background:#3B3835}
1276
+ [data-theme="dark"] .qa-ask-ans{border-top-color:var(--md-border)}
1148
1277
 
1149
- [data-theme="dark"] .qa-ask-x{color:#78716C}
1278
+ [data-theme="dark"] .qa-ask-ans .k{color:var(--faint)}
1150
1279
 
1151
- [data-theme="dark"] .qa-ask-x:hover{background:rgba(245,244,243,.08);color:#F5F4F3}
1280
+ [data-theme="dark"] .qa-ask-ans .v{color:var(--success)}
1152
1281
 
1153
- [data-theme="dark"] .qa-run{background:#1C1C1E}
1282
+ [data-theme="dark"] .qa-askdock>.qa-ask{background:var(--raised);box-shadow:0 6px 20px rgba(0,0,0,.4)}
1154
1283
 
1155
- [data-theme="dark"] .qa-run::after{background:#1C1C1E}
1284
+ [data-theme="dark"] .qa-askdock::-webkit-scrollbar-thumb{background:var(--md-border)}
1156
1285
 
1157
- [data-theme="dark"] .qa-spinner{border-color:#3B3835;border-top-color:#818CF8}
1286
+ [data-theme="dark"] .qa-ask-x{color:var(--muted)}
1158
1287
 
1159
- [data-theme="dark"] .qa-run-pill{background:rgba(245,244,243,.05);border-color:#3B3835}
1288
+ [data-theme="dark"] .qa-ask-x:hover{background:rgba(242,251,245,.08);color:var(--ink)}
1160
1289
 
1161
- [data-theme="dark"] .qa-run-t{color:#78716C}
1290
+ [data-theme="dark"] .qa-run{background:var(--subtle)}
1162
1291
 
1163
- [data-theme="dark"] .qa-done{color:#78716C}
1292
+ [data-theme="dark"] .qa-run::after{background:var(--subtle)}
1164
1293
 
1165
- [data-theme="dark"] .qa-done .d{background:#34D399}
1294
+ [data-theme="dark"] .qa-spinner{border-color:var(--md-border);border-top-color:var(--indigo)}
1166
1295
 
1167
- [data-theme="dark"] .qa-done.err{color:#F87171}
1296
+ [data-theme="dark"] .qa-run-pill{background:rgba(242,251,245,.05);border-color:var(--md-border)}
1168
1297
 
1169
- [data-theme="dark"] .qa-done.err .d{background:#F87171}
1298
+ [data-theme="dark"] .qa-run-t{color:var(--muted)}
1170
1299
 
1171
- [data-theme="dark"] .qa-agent-chip{color:#A8A29E;border-color:#3B3835;background:rgba(245,244,243,.05)}
1300
+ [data-theme="dark"] .qa-done{color:var(--muted)}
1172
1301
 
1173
- [data-theme="dark"] .qa-agent-chip.run{color:#F06953;background:rgba(240,105,83,.12);border-color:rgba(240,105,83,.35)}
1302
+ [data-theme="dark"] .qa-done .d{background:var(--success)}
1174
1303
 
1175
- [data-theme="dark"] .qa-agent-chip.ok{color:#34D399;background:rgba(52,211,153,.1);border-color:rgba(52,211,153,.35)}
1304
+ [data-theme="dark"] .qa-done.err{color:var(--fail)}
1176
1305
 
1177
- [data-theme="dark"] .qa-agent-sess{color:#71717A;border-color:#3B3835}
1306
+ [data-theme="dark"] .qa-done.err .d{background:var(--fail)}
1178
1307
 
1179
- [data-theme="dark"] .qa-sub-h{color:#525252}
1308
+ [data-theme="dark"] .qa-agent-chip{color:var(--muted);border-color:var(--md-border);background:rgba(242,251,245,.05)}
1180
1309
 
1181
- [data-theme="dark"] .qa-sub-n{color:#525252}
1310
+ [data-theme="dark"] .qa-agent-chip.run{color:var(--amber);background:rgba(var(--warning-rgb),.16);border-color:rgba(var(--warning-rgb),.36)}
1182
1311
 
1183
- [data-theme="dark"] .qa-note{color:#525252}
1312
+ [data-theme="dark"] .qa-agent-chip.ok{color:var(--success);background:rgba(var(--success-rgb),.12);border-color:rgba(var(--success-rgb),.38)}
1313
+
1314
+ [data-theme="dark"] .qa-agent-sess{color:var(--muted);border-color:var(--md-border)}
1315
+
1316
+ [data-theme="dark"] .qa-sub-h{color:var(--faint)}
1317
+
1318
+ [data-theme="dark"] .qa-sub-n{color:var(--faint)}
1319
+
1320
+ [data-theme="dark"] .qa-note{color:var(--faint)}
1184
1321
 
1185
1322
  .qa-av.qa-av-sim{display:grid;place-items:center;background:linear-gradient(180deg,var(--cinnabar-hi),var(--cinnabar));color:#FFF7F5}
1186
1323
 
@@ -1209,9 +1346,9 @@
1209
1346
 
1210
1347
  .qa-ask-other button:hover{background:var(--cinnabar-hi);border-color:var(--cinnabar-hi);color:#fff}
1211
1348
 
1212
- [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)}
1213
1350
 
1214
- [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)}
1215
1352
 
1216
1353
  .qa-tool-name{font-size:10.5px;font-weight:500;color:var(--paper-dim)}
1217
1354
 
@@ -1319,13 +1456,13 @@
1319
1456
  @keyframes qaHistSweep{0%{transform:translateX(-100%)}60%,100%{transform:translateX(100%)}}
1320
1457
  @keyframes qaHistShimmer{0%{transform:translateX(-100%)}55%,100%{transform:translateX(100%)}}
1321
1458
 
1322
- [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)}
1323
1460
 
1324
- [data-theme="dark"] .qa-hist-note.wait{color:#525252}
1461
+ [data-theme="dark"] .qa-hist-note.wait{color:var(--faint)}
1325
1462
 
1326
- [data-theme="dark"] .qa-hist-note.lost{border-left-color:#F87171}
1463
+ [data-theme="dark"] .qa-hist-note.lost{border-left-color:var(--fail)}
1327
1464
 
1328
- [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)}
1329
1466
 
1330
1467
  [data-theme="dark"] .qa-hist-lines span::after{
1331
1468
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.16),transparent)}
@@ -1386,17 +1523,17 @@
1386
1523
  background:#F5F4F3;font-family:var(--mono);font-size:10.5px;line-height:1.6;
1387
1524
  color:#57534E;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere}
1388
1525
 
1389
- [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)}
1390
1527
 
1391
- [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)}
1392
1529
 
1393
- [data-theme="dark"] .qa-hist-step summary::after{color:#A8A29E}
1530
+ [data-theme="dark"] .qa-hist-step summary::after{color:var(--muted)}
1394
1531
 
1395
- [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)}
1396
1533
 
1397
- [data-theme="dark"] .qa-hist-step-body{color:#D6D3D1}
1534
+ [data-theme="dark"] .qa-hist-step-body{color:var(--ink-soft)}
1398
1535
 
1399
- [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)}
1400
1537
 
1401
1538
  .qa-msg:not(.qa-mine):not(.qa-sim){flex-direction:column;gap:6px;align-items:stretch}
1402
1539
 
@@ -1515,7 +1652,7 @@
1515
1652
 
1516
1653
  .qa-diff-row.del .s{color:#9E3120}
1517
1654
 
1518
- .qa-diff-row.hunk{background:rgba(79,70,229,.07);color:#4338CA}
1655
+ .qa-diff-row.hunk{background:color-mix(in srgb, var(--indigo) 7%, transparent);color:var(--indigo)}
1519
1656
 
1520
1657
  .qa-diff-row.file{background:rgba(28,25,23,.035);color:var(--paper-mute)}
1521
1658
 
@@ -1578,33 +1715,33 @@
1578
1715
  [data-theme="dark"] .qa-cf-bd pre,[data-theme="dark"] .qa-tool-sec pre{
1579
1716
  color:#D6D3D1;background:transparent}
1580
1717
 
1581
- [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)}
1582
1719
 
1583
- [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)}
1584
1721
 
1585
- [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)}
1586
1723
 
1587
- [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)}
1588
1725
 
1589
- [data-theme="dark"] .qa-diff-row .b{background:#3B3835}
1726
+ [data-theme="dark"] .qa-diff-row .b{background:var(--md-border)}
1590
1727
 
1591
- [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)}
1592
1729
 
1593
- [data-theme="dark"] .qa-diff-row.add .s{color:#6EE7B7}
1730
+ [data-theme="dark"] .qa-diff-row.add .s{color:var(--success)}
1594
1731
 
1595
- [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)}
1596
1733
 
1597
- [data-theme="dark"] .qa-diff-row.del .s{color:#FCA5A5}
1734
+ [data-theme="dark"] .qa-diff-row.del .s{color:var(--error-text)}
1598
1735
 
1599
- [data-theme="dark"] .qa-diff-row.hunk{background:rgba(129,140,248,.12);color:#A5B4FC}
1736
+ [data-theme="dark"] .qa-diff-row.hunk{background:color-mix(in srgb, var(--indigo) 12%, transparent);color:var(--indigo)}
1600
1737
 
1601
- [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)}
1602
1739
 
1603
1740
  .qa-msg.qa-mine .qa-fold-btn{background:transparent}
1604
1741
 
1605
1742
  .qa-msg.qa-mine .qa-fold-btn:hover{background:rgba(28,25,23,.05)}
1606
1743
 
1607
- [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)}
1608
1745
 
1609
1746
  .qa-acts{display:flex;align-items:center;justify-content:flex-start;gap:2px;min-width:0}
1610
1747
 
@@ -1624,9 +1761,9 @@
1624
1761
  /* 排队气泡上的「取消排队」:这里要的是**文字**按钮(用户得看懂点它会发生什么),
1625
1762
  所以不复用上面 22×22 的图标尺寸,单开一档。 */
1626
1763
  .qa-msg.qa-mine .qa-acts .qa-act--cancel{width:auto;height:22px;padding:0 8px;border-radius:var(--r-full);
1627
- font-size:11.5px;line-height:22px;color:var(--queued,#8B5CF6);white-space:nowrap}
1628
- .qa-msg.qa-mine .qa-acts .qa-act--cancel:hover{background:rgba(139,92,246,.12);color:var(--queued,#8B5CF6)}
1629
- [data-theme="dark"] .qa-msg.qa-mine .qa-acts .qa-act--cancel{color:#A98CF5}
1764
+ font-size:11.5px;line-height:22px;color:var(--queued);white-space:nowrap}
1765
+ .qa-msg.qa-mine .qa-acts .qa-act--cancel:hover{background:color-mix(in srgb, var(--queued) 12%, transparent);color:var(--queued)}
1766
+ [data-theme="dark"] .qa-msg.qa-mine .qa-acts .qa-act--cancel{color:var(--queued)}
1630
1767
 
1631
1768
  .qa-act svg{width:13px;height:13px;display:block;stroke:currentColor;fill:none;
1632
1769
  stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
@@ -1637,7 +1774,7 @@
1637
1774
 
1638
1775
  .qa-act-copy.copied .i-ok{display:block;stroke:var(--jade)}
1639
1776
 
1640
- [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)}
1641
1778
 
1642
1779
  /* ---- 任务列表(qaTodoNode / qaTodoFill,见 29-msg-variants)----
1643
1780
  一族两形:工具卡明细里的「待办清单」与一条应答里唯一那块「任务列表」面板。
@@ -1692,10 +1829,10 @@
1692
1829
  stroke-linecap:round;stroke-linejoin:round;transition:transform .15s}
1693
1830
  .qa-todo-panel.open .qa-todo-toggle svg{transform:rotate(180deg)}
1694
1831
  .qa-todo-panel:not(.open) .qa-todo-list{display:none}
1695
- [data-theme="dark"] .qa-todo-hd{background:rgba(245,244,243,.045);border-color:#3B3835}
1696
- [data-theme="dark"] .qa-todo-ico{border-color:#57534E}
1697
- [data-theme="dark"] .qa-todo-row.is-in_progress{color:#F5F4F3}
1698
- [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)}
1699
1836
 
1700
1837
  /* ============================================================================
1701
1838
  * 令牌桥:magic-test 的调色板名字 → 各端宿主已有的令牌(**只用不定义**)
@@ -1708,6 +1845,24 @@
1708
1845
  * 值是「兜底」:宿主给了同名令牌(--ink / --muted / …)就以宿主为准。
1709
1846
  * ========================================================================== */
1710
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
+
1711
1866
  /* 文字三级(magic-test: paper / paper-dim / paper-mute) */
1712
1867
  --paper: var(--ink);
1713
1868
  --paper-dim: var(--muted);