dsh-config-manager 0.1.69 → 0.1.71

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 (719) hide show
  1. package/README.md +59 -18
  2. package/README.zh-CN.md +29 -9
  3. package/lib/adapters/credentials.js +6 -3
  4. package/lib/adapters/file-collection.d.ts +21 -1
  5. package/lib/adapters/file-collection.js +32 -8
  6. package/lib/adapters/mcp.d.ts +12 -2
  7. package/lib/adapters/mcp.js +30 -13
  8. package/lib/adapters/plugin-files.d.ts +8 -0
  9. package/lib/adapters/plugin-files.js +36 -4
  10. package/lib/adapters/plugins.d.ts +28 -2
  11. package/lib/adapters/plugins.js +204 -55
  12. package/lib/adapters/prompts.d.ts +12 -2
  13. package/lib/adapters/prompts.js +34 -19
  14. package/lib/adapters/providers.js +5 -4
  15. package/lib/adapters/self.d.ts +20 -0
  16. package/lib/adapters/self.js +73 -0
  17. package/lib/adapters/sessions.d.ts +8 -0
  18. package/lib/adapters/sessions.js +47 -1
  19. package/lib/adapters/settings.d.ts +21 -3
  20. package/lib/adapters/settings.js +44 -7
  21. package/lib/adapters/skills.d.ts +36 -4
  22. package/lib/adapters/skills.js +222 -3
  23. package/lib/adapters/test-helpers.d.ts +31 -2
  24. package/lib/adapters/test-helpers.js +42 -5
  25. package/lib/adapters/workspaces.js +97 -5
  26. package/lib/cli/actions.d.ts +50 -3
  27. package/lib/cli/actions.js +103 -11
  28. package/lib/cli/help.d.ts +65 -0
  29. package/lib/cli/help.js +517 -0
  30. package/lib/cli/import-source.d.ts +32 -0
  31. package/lib/cli/import-source.js +178 -0
  32. package/lib/cli/index.d.ts +18 -2
  33. package/lib/cli/index.js +118 -90
  34. package/lib/cli/web/client-script.d.ts +8 -0
  35. package/lib/cli/web/client-script.js +11 -0
  36. package/lib/cli/web/http.d.ts +5 -0
  37. package/lib/cli/web/http.js +2 -1
  38. package/lib/cli/web/page.d.ts +16 -6
  39. package/lib/cli/web/page.js +102 -25
  40. package/lib/cli/web/routes.js +24 -5
  41. package/lib/cli/web/server.js +23 -2
  42. package/lib/client.d.ts +1019 -36
  43. package/lib/client.js +5522 -1564
  44. package/lib/core/analyzer.d.ts +15 -1
  45. package/lib/core/analyzer.js +114 -13
  46. package/lib/core/backup-plan.js +17 -1
  47. package/lib/core/backup.d.ts +8 -0
  48. package/lib/core/backup.js +28 -6
  49. package/lib/core/cache-cleaner.d.ts +10 -0
  50. package/lib/core/cache-cleaner.js +63 -22
  51. package/lib/core/checkpoint.d.ts +362 -0
  52. package/lib/core/checkpoint.js +1309 -0
  53. package/lib/core/journal.d.ts +37 -0
  54. package/lib/core/journal.js +69 -0
  55. package/lib/core/messages.d.ts +13 -0
  56. package/lib/core/messages.js +26 -0
  57. package/lib/core/model-tools.js +3 -0
  58. package/lib/core/patch-layers.d.ts +83 -0
  59. package/lib/core/patch-layers.js +110 -0
  60. package/lib/core/restore.d.ts +21 -0
  61. package/lib/core/restore.js +37 -3
  62. package/lib/core/rollback.js +6 -3
  63. package/lib/core/self-update.d.ts +52 -0
  64. package/lib/core/self-update.js +70 -0
  65. package/lib/core/session-health.d.ts +29 -5
  66. package/lib/core/session-health.js +28 -3
  67. package/lib/core/types.d.ts +126 -0
  68. package/lib/foreign/antigravity.d.ts +28 -0
  69. package/lib/foreign/antigravity.js +157 -0
  70. package/lib/foreign/bundle.d.ts +25 -0
  71. package/lib/foreign/bundle.js +79 -0
  72. package/lib/foreign/chatgpt.d.ts +6 -0
  73. package/lib/foreign/chatgpt.js +25 -0
  74. package/lib/foreign/claude-code.d.ts +3 -0
  75. package/lib/foreign/claude-code.js +85 -0
  76. package/lib/foreign/claude-sessions.d.ts +108 -0
  77. package/lib/foreign/claude-sessions.js +299 -0
  78. package/lib/foreign/cline.d.ts +6 -0
  79. package/lib/foreign/cline.js +27 -0
  80. package/lib/foreign/codex.d.ts +83 -0
  81. package/lib/foreign/codex.js +348 -0
  82. package/lib/foreign/continue.d.ts +9 -0
  83. package/lib/foreign/continue.js +65 -0
  84. package/lib/foreign/copilot.d.ts +39 -0
  85. package/lib/foreign/copilot.js +95 -0
  86. package/lib/foreign/crush.d.ts +11 -0
  87. package/lib/foreign/crush.js +57 -0
  88. package/lib/foreign/cursor.d.ts +87 -0
  89. package/lib/foreign/cursor.js +171 -0
  90. package/lib/foreign/dsh.d.ts +30 -0
  91. package/lib/foreign/dsh.js +101 -0
  92. package/lib/foreign/dsh4.d.ts +3 -0
  93. package/lib/foreign/dsh4.js +13 -0
  94. package/lib/foreign/gemini.d.ts +7 -0
  95. package/lib/foreign/gemini.js +44 -0
  96. package/lib/foreign/goose.d.ts +11 -0
  97. package/lib/foreign/goose.js +53 -0
  98. package/lib/foreign/grokbuild.d.ts +8 -0
  99. package/lib/foreign/grokbuild.js +25 -0
  100. package/lib/foreign/hermes.d.ts +2 -0
  101. package/lib/foreign/hermes.js +78 -0
  102. package/lib/foreign/kernel.d.ts +132 -0
  103. package/lib/foreign/kernel.js +569 -0
  104. package/lib/foreign/kilocode.d.ts +11 -0
  105. package/lib/foreign/kilocode.js +51 -0
  106. package/lib/foreign/kimi.d.ts +7 -0
  107. package/lib/foreign/kimi.js +47 -0
  108. package/lib/foreign/mimocode.d.ts +11 -0
  109. package/lib/foreign/mimocode.js +51 -0
  110. package/lib/foreign/openclaw.d.ts +7 -0
  111. package/lib/foreign/openclaw.js +46 -0
  112. package/lib/foreign/opencode.d.ts +11 -0
  113. package/lib/foreign/opencode.js +52 -0
  114. package/lib/foreign/pi.d.ts +7 -0
  115. package/lib/foreign/pi.js +48 -0
  116. package/lib/foreign/platform-paths.d.ts +66 -0
  117. package/lib/foreign/platform-paths.js +141 -0
  118. package/lib/foreign/qoder.d.ts +10 -0
  119. package/lib/foreign/qoder.js +49 -0
  120. package/lib/foreign/qwen.d.ts +7 -0
  121. package/lib/foreign/qwen.js +45 -0
  122. package/lib/foreign/read-antigravity.d.ts +57 -0
  123. package/lib/foreign/read-antigravity.js +504 -0
  124. package/lib/foreign/read-chatgpt.d.ts +20 -0
  125. package/lib/foreign/read-chatgpt.js +509 -0
  126. package/lib/foreign/read-claude-code.d.ts +24 -0
  127. package/lib/foreign/read-claude-code.js +234 -0
  128. package/lib/foreign/read-cline.d.ts +53 -0
  129. package/lib/foreign/read-cline.js +479 -0
  130. package/lib/foreign/read-codex.d.ts +75 -0
  131. package/lib/foreign/read-codex.js +842 -0
  132. package/lib/foreign/read-continue.d.ts +87 -0
  133. package/lib/foreign/read-continue.js +489 -0
  134. package/lib/foreign/read-copilot.d.ts +42 -0
  135. package/lib/foreign/read-copilot.js +267 -0
  136. package/lib/foreign/read-crush.d.ts +54 -0
  137. package/lib/foreign/read-crush.js +478 -0
  138. package/lib/foreign/read-cursor.d.ts +141 -0
  139. package/lib/foreign/read-cursor.js +705 -0
  140. package/lib/foreign/read-dsh.d.ts +43 -0
  141. package/lib/foreign/read-dsh.js +205 -0
  142. package/lib/foreign/read-dsh4.d.ts +14 -0
  143. package/lib/foreign/read-dsh4.js +27 -0
  144. package/lib/foreign/read-gemini.d.ts +55 -0
  145. package/lib/foreign/read-gemini.js +273 -0
  146. package/lib/foreign/read-goose.d.ts +25 -0
  147. package/lib/foreign/read-goose.js +322 -0
  148. package/lib/foreign/read-grokbuild.d.ts +34 -0
  149. package/lib/foreign/read-grokbuild.js +455 -0
  150. package/lib/foreign/read-hermes.d.ts +74 -0
  151. package/lib/foreign/read-hermes.js +690 -0
  152. package/lib/foreign/read-kilocode.d.ts +17 -0
  153. package/lib/foreign/read-kilocode.js +46 -0
  154. package/lib/foreign/read-kimi.d.ts +63 -0
  155. package/lib/foreign/read-kimi.js +719 -0
  156. package/lib/foreign/read-mimocode.d.ts +12 -0
  157. package/lib/foreign/read-mimocode.js +56 -0
  158. package/lib/foreign/read-openclaw.d.ts +51 -0
  159. package/lib/foreign/read-openclaw.js +445 -0
  160. package/lib/foreign/read-opencode.d.ts +150 -0
  161. package/lib/foreign/read-opencode.js +896 -0
  162. package/lib/foreign/read-pi.d.ts +56 -0
  163. package/lib/foreign/read-pi.js +411 -0
  164. package/lib/foreign/read-qoder.d.ts +54 -0
  165. package/lib/foreign/read-qoder.js +317 -0
  166. package/lib/foreign/read-qwen.d.ts +40 -0
  167. package/lib/foreign/read-qwen.js +326 -0
  168. package/lib/foreign/read-reasonix.d.ts +66 -0
  169. package/lib/foreign/read-reasonix.js +537 -0
  170. package/lib/foreign/read-teleagent.d.ts +15 -0
  171. package/lib/foreign/read-teleagent.js +68 -0
  172. package/lib/foreign/read-trae.d.ts +67 -0
  173. package/lib/foreign/read-trae.js +492 -0
  174. package/lib/foreign/read-vibe.d.ts +28 -0
  175. package/lib/foreign/read-vibe.js +364 -0
  176. package/lib/foreign/read-workbuddy.d.ts +49 -0
  177. package/lib/foreign/read-workbuddy.js +346 -0
  178. package/lib/foreign/read-zcode.d.ts +12 -0
  179. package/lib/foreign/read-zcode.js +38 -0
  180. package/lib/foreign/read-zed.d.ts +30 -0
  181. package/lib/foreign/read-zed.js +473 -0
  182. package/lib/foreign/reasonix.d.ts +6 -0
  183. package/lib/foreign/reasonix.js +20 -0
  184. package/lib/foreign/registry.d.ts +196 -0
  185. package/lib/foreign/registry.js +573 -0
  186. package/lib/foreign/session-ir.d.ts +186 -0
  187. package/lib/foreign/session-ir.js +427 -0
  188. package/lib/foreign/session-read.d.ts +102 -0
  189. package/lib/foreign/session-read.js +254 -0
  190. package/lib/foreign/session-source.d.ts +216 -0
  191. package/lib/foreign/session-source.js +453 -0
  192. package/lib/foreign/source-modules.d.ts +45 -0
  193. package/lib/foreign/source-modules.js +52 -0
  194. package/lib/foreign/sqlite.d.ts +61 -0
  195. package/lib/foreign/sqlite.js +404 -0
  196. package/lib/foreign/teleagent.d.ts +11 -0
  197. package/lib/foreign/teleagent.js +53 -0
  198. package/lib/foreign/trae.d.ts +6 -0
  199. package/lib/foreign/trae.js +20 -0
  200. package/lib/foreign/truth-table.d.ts +62 -0
  201. package/lib/foreign/truth-table.js +333 -0
  202. package/lib/foreign/types.d.ts +272 -0
  203. package/lib/foreign/types.js +2 -0
  204. package/lib/foreign/vibe.d.ts +6 -0
  205. package/lib/foreign/vibe.js +23 -0
  206. package/lib/foreign/workbuddy.d.ts +7 -0
  207. package/lib/foreign/workbuddy.js +45 -0
  208. package/lib/foreign/zcode.d.ts +11 -0
  209. package/lib/foreign/zcode.js +51 -0
  210. package/lib/foreign/zed.d.ts +11 -0
  211. package/lib/foreign/zed.js +53 -0
  212. package/lib/index.d.ts +154 -13
  213. package/lib/index.js +661 -84
  214. package/lib/market/github-repos.d.ts +28 -0
  215. package/lib/market/github-repos.js +43 -1
  216. package/lib/market/types.d.ts +1 -3
  217. package/lib/profiles/dsh-profile-manager.d.ts +54 -2
  218. package/lib/profiles/dsh-profile-manager.js +182 -11
  219. package/lib/profiles/dsh-profile-shared.d.ts +47 -0
  220. package/lib/profiles/dsh-profile-shared.js +15 -1
  221. package/lib/profiles/index.d.ts +1 -1
  222. package/lib/profiles/index.js +1 -1
  223. package/lib/routes/consult.js +51 -5
  224. package/lib/routes/foreign-context.d.ts +43 -0
  225. package/lib/routes/foreign-context.js +65 -0
  226. package/lib/routes/foreign.d.ts +11 -0
  227. package/lib/routes/foreign.js +208 -0
  228. package/lib/routes/import.d.ts +8 -0
  229. package/lib/routes/import.js +22 -1
  230. package/lib/routes/index.d.ts +2 -2
  231. package/lib/routes/index.js +4 -0
  232. package/lib/routes/kit.d.ts +4 -3
  233. package/lib/routes/market.js +0 -1
  234. package/lib/routes/prefs.d.ts +2 -1
  235. package/lib/routes/prefs.js +14 -2
  236. package/lib/routes/recovery.js +363 -3
  237. package/lib/routes/session-export.d.ts +117 -0
  238. package/lib/routes/session-export.js +270 -0
  239. package/lib/routes/snapshots.js +12 -2
  240. package/lib/routes/sync.js +82 -10
  241. package/lib/security/redaction.d.ts +14 -0
  242. package/lib/security/redaction.js +24 -9
  243. package/lib/security/secret-scanner.d.ts +27 -0
  244. package/lib/security/secret-scanner.js +54 -1
  245. package/lib/sync/autosync-scheduler.d.ts +13 -1
  246. package/lib/sync/autosync-scheduler.js +49 -26
  247. package/lib/sync/backup-files.js +6 -0
  248. package/lib/sync/gist/gist-transport.d.ts +91 -0
  249. package/lib/sync/gist/gist-transport.js +406 -0
  250. package/lib/sync/gist/messages.d.ts +22 -0
  251. package/lib/sync/gist/messages.js +46 -0
  252. package/lib/sync/s3/messages.d.ts +53 -0
  253. package/lib/sync/s3/messages.js +83 -0
  254. package/lib/sync/s3/s3-providers.d.ts +78 -0
  255. package/lib/sync/s3/s3-providers.js +156 -0
  256. package/lib/sync/s3/s3-transport.d.ts +126 -0
  257. package/lib/sync/s3/s3-transport.js +551 -0
  258. package/lib/sync/s3/sigv4.d.ts +107 -0
  259. package/lib/sync/s3/sigv4.js +196 -0
  260. package/lib/sync/sync-config.d.ts +250 -4
  261. package/lib/sync/sync-config.js +658 -57
  262. package/lib/sync/sync-engine.d.ts +1 -0
  263. package/lib/sync/sync-engine.js +4 -2
  264. package/lib/sync/sync-history.d.ts +1 -1
  265. package/lib/sync/webdav/webdav-transport.d.ts +31 -3
  266. package/lib/sync/webdav/webdav-transport.js +102 -18
  267. package/lib/ui/commands.d.ts +4 -3
  268. package/lib/ui/commands.js +41 -9
  269. package/lib/ui/disk-usage-view.d.ts +44 -0
  270. package/lib/ui/disk-usage-view.js +55 -1
  271. package/lib/ui/dsh-profiles-view.d.ts +53 -0
  272. package/lib/ui/dsh-profiles-view.js +56 -0
  273. package/lib/ui/foreign-view.d.ts +162 -0
  274. package/lib/ui/foreign-view.js +225 -0
  275. package/lib/ui/i18n.d.ts +77 -0
  276. package/lib/ui/i18n.js +164 -0
  277. package/lib/ui/session-inventory-view.d.ts +106 -0
  278. package/lib/ui/session-inventory-view.js +58 -0
  279. package/lib/ui/session-layout-view.d.ts +265 -0
  280. package/lib/ui/session-layout-view.js +271 -0
  281. package/lib/ui/sync-repository-picker.d.ts +98 -0
  282. package/lib/ui/sync-repository-picker.js +145 -0
  283. package/lib/ui/sync-settings-view.d.ts +143 -4
  284. package/lib/ui/sync-settings-view.js +231 -7
  285. package/lib/ui/types.d.ts +47 -0
  286. package/lib/utils/asar-read.d.ts +113 -0
  287. package/lib/utils/asar-read.js +523 -0
  288. package/lib/utils/env-lock.js +7 -2
  289. package/lib/utils/patch-yaml.d.ts +25 -0
  290. package/lib/utils/patch-yaml.js +62 -0
  291. package/lib/utils/paths.d.ts +10 -1
  292. package/lib/utils/paths.js +24 -3
  293. package/lib/utils/recursive-walk.js +12 -13
  294. package/lib/utils/session-format.d.ts +35 -2
  295. package/lib/utils/session-format.js +131 -5
  296. package/lib/utils/session-health-scan.d.ts +7 -1
  297. package/lib/utils/session-health-scan.js +369 -12
  298. package/lib/utils/session-layout-repair-service.d.ts +98 -0
  299. package/lib/utils/session-layout-repair-service.js +457 -0
  300. package/lib/utils/session-log-repair.d.ts +27 -0
  301. package/lib/utils/session-log-repair.js +233 -62
  302. package/lib/utils/session-repair-service.d.ts +32 -3
  303. package/lib/utils/session-repair-service.js +148 -9
  304. package/lib/utils/session-row-facts.d.ts +73 -0
  305. package/lib/utils/session-row-facts.js +182 -0
  306. package/lib/utils/session-verify.d.ts +118 -0
  307. package/lib/utils/session-verify.js +705 -0
  308. package/lib/utils/shared-constants.d.ts +59 -0
  309. package/lib/utils/shared-constants.js +71 -0
  310. package/package.json +1 -1
  311. package/src/adapters/credentials.test.ts +27 -0
  312. package/src/adapters/credentials.ts +6 -3
  313. package/src/adapters/file-collection.ts +33 -8
  314. package/src/adapters/files.test.ts +222 -0
  315. package/src/adapters/mcp.test.ts +43 -0
  316. package/src/adapters/mcp.ts +37 -14
  317. package/src/adapters/plugin-files.ts +34 -4
  318. package/src/adapters/plugins.test.ts +241 -0
  319. package/src/adapters/plugins.ts +201 -53
  320. package/src/adapters/prompts.test.ts +49 -0
  321. package/src/adapters/prompts.ts +41 -20
  322. package/src/adapters/providers.test.ts +16 -0
  323. package/src/adapters/providers.ts +4 -3
  324. package/src/adapters/self.test.ts +77 -0
  325. package/src/adapters/self.ts +75 -0
  326. package/src/adapters/sessions.test.ts +77 -0
  327. package/src/adapters/sessions.ts +47 -1
  328. package/src/adapters/settings.test.ts +78 -0
  329. package/src/adapters/settings.ts +42 -6
  330. package/src/adapters/skills.ts +221 -3
  331. package/src/adapters/test-helpers.ts +43 -5
  332. package/src/adapters/workspaces-dup-id.test.ts +144 -0
  333. package/src/adapters/workspaces.test.ts +10 -0
  334. package/src/adapters/workspaces.ts +97 -5
  335. package/src/cli/actions.test.ts +117 -2
  336. package/src/cli/actions.ts +132 -12
  337. package/src/cli/help.ts +570 -0
  338. package/src/cli/import-source.test.ts +193 -0
  339. package/src/cli/import-source.ts +229 -0
  340. package/src/cli/index.ts +129 -94
  341. package/src/cli/web/client-script.ts +12 -0
  342. package/src/cli/web/console-fixes.test.ts +36 -0
  343. package/src/cli/web/http.ts +7 -1
  344. package/src/cli/web/page.ts +108 -25
  345. package/src/cli/web/routes.ts +23 -4
  346. package/src/cli/web/script-anchor.test.ts +33 -0
  347. package/src/cli/web/server.ts +28 -2
  348. package/src/cli/web/web.test.ts +447 -4
  349. package/src/client/ConfigManagerSection.tsx +118 -63
  350. package/src/client/about/AboutPanel.tsx +42 -3
  351. package/src/client/about/PluginUpdateDialog.tsx +185 -0
  352. package/src/client/about/ReleaseBody.tsx +144 -0
  353. package/src/client/about/ReleaseNotesDialog.tsx +3 -130
  354. package/src/client/about/about-view.ts +7 -5
  355. package/src/client/about/plugin-update-view.test.ts +25 -0
  356. package/src/client/about/plugin-update-view.ts +26 -0
  357. package/src/client/about/release-notes-view.test.ts +33 -0
  358. package/src/client/about/release-notes-view.ts +34 -0
  359. package/src/client/api.ts +145 -1
  360. package/src/client/common/Icon.tsx +3 -0
  361. package/src/client/common/RunsCenter.tsx +8 -2
  362. package/src/client/common/Select.tsx +9 -2
  363. package/src/client/common/info-hint-guard.test.ts +63 -18
  364. package/src/client/common/plan-text-redaction.test.ts +193 -8
  365. package/src/client/common/routes.ts +15 -0
  366. package/src/client/config-manager.module.css +506 -354
  367. package/src/client/css-scale-guard.test.ts +122 -0
  368. package/src/client/css-token-guard.test.ts +82 -0
  369. package/src/client/environment/EnvironmentPanel.tsx +45 -16
  370. package/src/client/{snapshots → environment/maintenance}/DiskUsageCard.tsx +21 -17
  371. package/src/client/environment/profiles-incomplete-ui.test.ts +103 -0
  372. package/src/client/export/ExportView.tsx +9 -2
  373. package/src/client/{snapshots → home}/BackupScheduleCard.tsx +13 -4
  374. package/src/client/home/HomePanel.tsx +69 -157
  375. package/src/client/icon-layer-guard.test.ts +1 -1
  376. package/src/client/import/ForeignImportView.tsx +318 -0
  377. package/src/client/import/ImportWizardView.tsx +3 -1
  378. package/src/client/import/foreign-import-view-guard.test.ts +195 -0
  379. package/src/client/import/import-file-select.test.ts +6 -6
  380. package/src/client/import/import-wizard-steps.tsx +17 -1
  381. package/src/client/import/use-import-wizard-controller.ts +3 -3
  382. package/src/client/index.ts +1 -1
  383. package/src/client/library/LibraryActions.tsx +31 -34
  384. package/src/client/library/LibraryPanel.tsx +4 -1
  385. package/src/client/{snapshots → library}/RestorePlanView.tsx +1 -1
  386. package/src/client/{snapshots → library}/files-layout.test.ts +2 -2
  387. package/src/client/{snapshots → library}/report-dismiss.test.ts +26 -3
  388. package/src/client/library/task-panel-visibility.test.ts +25 -17
  389. package/src/client/locales.ts +278 -36
  390. package/src/client/lucide-icons.d.ts +1 -0
  391. package/src/client/market/MarketPanel.tsx +11 -2
  392. package/src/client/recovery/IncompleteCopiesSection.tsx +132 -0
  393. package/src/client/recovery/RecoveryPanel.tsx +486 -59
  394. package/src/client/recovery/recovery-api.ts +30 -0
  395. package/src/client/recovery/recovery-incomplete-copies.test.ts +151 -0
  396. package/src/client/recovery/recovery-locales.test.ts +88 -0
  397. package/src/client/recovery/recovery-locales.ts +321 -6
  398. package/src/client/recovery/recovery-panel-layout.test.ts +52 -0
  399. package/src/client/recovery/recovery-view.ts +92 -2
  400. package/src/client/run-store.test.ts +201 -89
  401. package/src/client/run-store.ts +114 -143
  402. package/src/client/session-export/session-export-view.test.ts +103 -0
  403. package/src/client/session-export/session-export-view.ts +118 -0
  404. package/src/client/sync/ChannelConfigDialog.tsx +219 -14
  405. package/src/client/sync/SyncChannelEntryCard.tsx +52 -4
  406. package/src/client/sync/SyncLogList.tsx +1 -1
  407. package/src/client/sync/SyncPanel.tsx +166 -102
  408. package/src/client/sync/SyncRepositoryPicker.tsx +216 -0
  409. package/src/client/sync/SyncSettingsView.test.ts +6 -1
  410. package/src/client/sync/history-model.test.ts +94 -57
  411. package/src/client/sync/history-model.ts +44 -25
  412. package/src/client/sync/sync-api.test.ts +56 -0
  413. package/src/client/sync/sync-api.ts +92 -0
  414. package/src/client/sync/sync-locales.ts +162 -2
  415. package/src/client/sync/sync-view.test.ts +3 -8
  416. package/src/client/sync/sync-view.ts +111 -21
  417. package/src/core/analyzer-cache.test.ts +47 -0
  418. package/src/core/analyzer.ts +115 -14
  419. package/src/core/backup-plan.test.ts +35 -0
  420. package/src/core/backup-plan.ts +19 -1
  421. package/src/core/backup.test.ts +37 -1
  422. package/src/core/backup.ts +27 -6
  423. package/src/core/cache-cleaner.test.ts +120 -1
  424. package/src/core/cache-cleaner.ts +59 -22
  425. package/src/core/checkpoint.test.ts +665 -0
  426. package/src/core/checkpoint.ts +1614 -0
  427. package/src/core/credential-plan-consistency.test.ts +93 -0
  428. package/src/core/incident-wiring.test.ts +6 -2
  429. package/src/core/journal.test.ts +70 -0
  430. package/src/core/journal.ts +68 -0
  431. package/src/core/messages.ts +26 -0
  432. package/src/core/model-tools.ts +3 -0
  433. package/src/core/patch-layers.test.ts +94 -0
  434. package/src/core/patch-layers.ts +150 -0
  435. package/src/core/restore.ts +59 -3
  436. package/src/core/rollback.ts +6 -3
  437. package/src/core/section-content-consistency.test.ts +185 -0
  438. package/src/core/self-update.test.ts +110 -0
  439. package/src/core/self-update.ts +118 -0
  440. package/src/core/session-health.test.ts +91 -1
  441. package/src/core/session-health.ts +56 -9
  442. package/src/core/types.ts +127 -1
  443. package/src/foreign/antigravity.test.ts +271 -0
  444. package/src/foreign/antigravity.ts +188 -0
  445. package/src/foreign/bundle.ts +108 -0
  446. package/src/foreign/chatgpt.test.ts +279 -0
  447. package/src/foreign/chatgpt.ts +30 -0
  448. package/src/foreign/claude-code.test.ts +234 -0
  449. package/src/foreign/claude-code.ts +106 -0
  450. package/src/foreign/claude-sessions-bytes.test.ts +227 -0
  451. package/src/foreign/claude-sessions.test.ts +180 -0
  452. package/src/foreign/claude-sessions.ts +461 -0
  453. package/src/foreign/cline.test.ts +274 -0
  454. package/src/foreign/cline.ts +32 -0
  455. package/src/foreign/codex.test.ts +585 -0
  456. package/src/foreign/codex.ts +409 -0
  457. package/src/foreign/continue.test.ts +365 -0
  458. package/src/foreign/continue.ts +73 -0
  459. package/src/foreign/copilot.test.ts +273 -0
  460. package/src/foreign/copilot.ts +133 -0
  461. package/src/foreign/crush.test.ts +234 -0
  462. package/src/foreign/crush.ts +66 -0
  463. package/src/foreign/cursor.test.ts +509 -0
  464. package/src/foreign/cursor.ts +259 -0
  465. package/src/foreign/dsh.test.ts +198 -0
  466. package/src/foreign/dsh.ts +117 -0
  467. package/src/foreign/dsh4.test.ts +127 -0
  468. package/src/foreign/dsh4.ts +15 -0
  469. package/src/foreign/file-budget.test.ts +256 -0
  470. package/src/foreign/fixtures/antigravity/README.md +18 -0
  471. package/src/foreign/fixtures/antigravity/basic/gemini/antigravity/mcp_config.json +13 -0
  472. package/src/foreign/fixtures/antigravity/basic/gemini/config/mcp_config.json +24 -0
  473. package/src/foreign/fixtures/antigravity/empty/gemini/antigravity/mcp_config.json +0 -0
  474. package/src/foreign/fixtures/antigravity/empty/gemini/antigravity/mcp_oauth_tokens.json +0 -0
  475. package/src/foreign/fixtures/antigravity/empty/gemini/config/mcp_config.json +0 -0
  476. package/src/foreign/fixtures/codex/README.md +31 -0
  477. package/src/foreign/fixtures/codex/basic/.agents/skills/hello/SKILL.md +6 -0
  478. package/src/foreign/fixtures/codex/basic/.agents/skills/wrapper/nested/SKILL.md +6 -0
  479. package/src/foreign/fixtures/codex/basic/.codex/AGENTS.md +4 -0
  480. package/src/foreign/fixtures/codex/basic/.codex/config.toml +28 -0
  481. package/src/foreign/fixtures/codex/malformed/.codex/config.toml +3 -0
  482. package/src/foreign/fixtures/codex/override/.codex/AGENTS.md +1 -0
  483. package/src/foreign/fixtures/codex/override/.codex/AGENTS.override.md +3 -0
  484. package/src/foreign/fixtures/codex/sessions/.codex/archived_sessions/rollout-2026-10-05T09-00-00-22222222-2222-4222-8222-222222222222.jsonl +2 -0
  485. package/src/foreign/fixtures/codex/sessions/.codex/sessions/2026/10/06/rollout-2026-10-06T10-00-00-11111111-1111-4111-8111-111111111111.jsonl +15 -0
  486. package/src/foreign/fixtures/codex/sessions/.codex/sessions/2026/10/06/rollout-2026-10-06T11-00-00-33333333-3333-4333-8333-333333333333.jsonl +2 -0
  487. package/src/foreign/fixtures/codex/sessions/.codex/sessions/2026/10/06/rollout-2026-10-06T11-30-00-55555555-5555-4555-8555-555555555555.jsonl +2 -0
  488. package/src/foreign/fixtures/codex/sessions/.codex/sessions/2026/10/06/rollout-2026-10-06T12-00-00-44444444-4444-4444-8444-444444444444.jsonl +2 -0
  489. package/src/foreign/fixtures/codex/sessions/.codex/sessions/notes.jsonl +1 -0
  490. package/src/foreign/fixtures/copilot/README.md +22 -0
  491. package/src/foreign/fixtures/copilot/basic/copilot-instructions.md +3 -0
  492. package/src/foreign/fixtures/copilot/basic/instructions/empty.instructions.md +1 -0
  493. package/src/foreign/fixtures/copilot/basic/instructions/repo.instructions.md +5 -0
  494. package/src/foreign/fixtures/copilot/basic/mcp-config.json +24 -0
  495. package/src/foreign/fixtures/copilot/basic/skills/hello/SKILL.md +6 -0
  496. package/src/foreign/fixtures/copilot/overridden/mcp-config.json +10 -0
  497. package/src/foreign/fixtures/cursor/README.md +17 -0
  498. package/src/foreign/fixtures/cursor/alt/.cursor/mcp.json +5 -0
  499. package/src/foreign/fixtures/cursor/basic/.cursor/mcp.json +18 -0
  500. package/src/foreign/fixtures/cursor/basic/.cursor/rules/agent.mdc +5 -0
  501. package/src/foreign/fixtures/cursor/basic/.cursor/rules/always.mdc +6 -0
  502. package/src/foreign/fixtures/cursor/basic/.cursor/rules/auto.mdc +7 -0
  503. package/src/foreign/fixtures/cursor/basic/.cursor/rules/manual.mdc +3 -0
  504. package/src/foreign/fixtures/cursor/basic/.cursor/skills/.hidden/SKILL.md +6 -0
  505. package/src/foreign/fixtures/cursor/basic/.cursor/skills/hello/SKILL.md +6 -0
  506. package/src/foreign/fixtures/cursor/basic/.cursor/skills/wrapper/nested/SKILL.md +6 -0
  507. package/src/foreign/fixtures/cursor/basic/.cursor/skills/wrapper/nested/notes.md +1 -0
  508. package/src/foreign/fixtures/cursor/basic/.cursorrules +1 -0
  509. package/src/foreign/fixtures/cursor/basic/project/.cursor/mcp.json +9 -0
  510. package/src/foreign/fixtures/cursor/basic/project/.cursor/rules/project-always.mdc +5 -0
  511. package/src/foreign/fixtures/cursor/basic/project/.cursor/skills/hello/SKILL.md +6 -0
  512. package/src/foreign/fixtures/cursor/basic/project/.cursorrules +1 -0
  513. package/src/foreign/fixtures/cursor/empty/.cursor/mcp.json +0 -0
  514. package/src/foreign/fixtures/cursor/malformed/.cursor/mcp.json +3 -0
  515. package/src/foreign/fixtures/cursor/malformed/.cursor/rules/broken.mdc +6 -0
  516. package/src/foreign/fixtures/cursor/shape/.cursor/mcp.json +3 -0
  517. package/src/foreign/fixtures/hermes/README.md +14 -0
  518. package/src/foreign/fixtures/hermes/basic/SOUL.md +3 -0
  519. package/src/foreign/fixtures/hermes/basic/config.yaml +48 -0
  520. package/src/foreign/fixtures/hermes/basic/dotenv.fixture +1 -0
  521. package/src/foreign/fixtures/hermes/basic/memories/MEMORY.md +1 -0
  522. package/src/foreign/fixtures/hermes/basic/memories/USER.md +1 -0
  523. package/src/foreign/fixtures/hermes/basic/skills/se-team-design/SKILL.md +6 -0
  524. package/src/foreign/fixtures/hermes/basic/skills/se-team-design/examples/usage.md +1 -0
  525. package/src/foreign/fixtures/hermes/basic/skills/software-development/dogfood/SKILL.md +6 -0
  526. package/src/foreign/fixtures/hermes/basic/skills/software-development/dogfood/notes.md +1 -0
  527. package/src/foreign/fixtures/hermes/basic/state.db +1 -0
  528. package/src/foreign/fixtures/hermes/empty/config.yaml +0 -0
  529. package/src/foreign/gemini.test.ts +291 -0
  530. package/src/foreign/gemini.ts +52 -0
  531. package/src/foreign/goose.test.ts +196 -0
  532. package/src/foreign/goose.ts +62 -0
  533. package/src/foreign/grokbuild.test.ts +246 -0
  534. package/src/foreign/grokbuild.ts +30 -0
  535. package/src/foreign/hermes.test.ts +545 -0
  536. package/src/foreign/hermes.ts +86 -0
  537. package/src/foreign/kernel-credentials.test.ts +88 -0
  538. package/src/foreign/kernel-workspaces.test.ts +88 -0
  539. package/src/foreign/kernel.ts +584 -0
  540. package/src/foreign/kilocode.test.ts +186 -0
  541. package/src/foreign/kilocode.ts +60 -0
  542. package/src/foreign/kimi.test.ts +259 -0
  543. package/src/foreign/kimi.ts +55 -0
  544. package/src/foreign/mcp-value-shape.test.ts +286 -0
  545. package/src/foreign/mimocode.test.ts +178 -0
  546. package/src/foreign/mimocode.ts +60 -0
  547. package/src/foreign/openclaw.test.ts +248 -0
  548. package/src/foreign/openclaw.ts +54 -0
  549. package/src/foreign/opencode.test.ts +376 -0
  550. package/src/foreign/opencode.ts +61 -0
  551. package/src/foreign/pi.test.ts +275 -0
  552. package/src/foreign/pi.ts +56 -0
  553. package/src/foreign/platform-paths.ts +156 -0
  554. package/src/foreign/qoder.test.ts +266 -0
  555. package/src/foreign/qoder.ts +57 -0
  556. package/src/foreign/qwen.test.ts +203 -0
  557. package/src/foreign/qwen.ts +53 -0
  558. package/src/foreign/read-antigravity.ts +569 -0
  559. package/src/foreign/read-chatgpt.ts +506 -0
  560. package/src/foreign/read-claude-code.ts +264 -0
  561. package/src/foreign/read-cline.ts +517 -0
  562. package/src/foreign/read-codex.ts +823 -0
  563. package/src/foreign/read-continue.ts +557 -0
  564. package/src/foreign/read-copilot.ts +304 -0
  565. package/src/foreign/read-crush.ts +503 -0
  566. package/src/foreign/read-cursor.ts +778 -0
  567. package/src/foreign/read-dsh.ts +215 -0
  568. package/src/foreign/read-dsh4.ts +35 -0
  569. package/src/foreign/read-gemini.ts +306 -0
  570. package/src/foreign/read-goose.ts +333 -0
  571. package/src/foreign/read-grokbuild.ts +475 -0
  572. package/src/foreign/read-hermes.ts +724 -0
  573. package/src/foreign/read-kilocode.ts +55 -0
  574. package/src/foreign/read-kimi.ts +768 -0
  575. package/src/foreign/read-mimocode.ts +66 -0
  576. package/src/foreign/read-openclaw.ts +505 -0
  577. package/src/foreign/read-opencode.ts +994 -0
  578. package/src/foreign/read-pi.ts +459 -0
  579. package/src/foreign/read-qoder.ts +351 -0
  580. package/src/foreign/read-qwen.ts +342 -0
  581. package/src/foreign/read-reasonix.ts +590 -0
  582. package/src/foreign/read-teleagent.ts +82 -0
  583. package/src/foreign/read-trae.ts +488 -0
  584. package/src/foreign/read-vibe.ts +353 -0
  585. package/src/foreign/read-workbuddy.ts +374 -0
  586. package/src/foreign/read-zcode.ts +48 -0
  587. package/src/foreign/read-zed.ts +479 -0
  588. package/src/foreign/reasonix.test.ts +336 -0
  589. package/src/foreign/reasonix.ts +25 -0
  590. package/src/foreign/registry.test.ts +377 -0
  591. package/src/foreign/registry.ts +750 -0
  592. package/src/foreign/session-ir.test.ts +189 -0
  593. package/src/foreign/session-ir.ts +614 -0
  594. package/src/foreign/session-read.ts +295 -0
  595. package/src/foreign/session-source.ts +625 -0
  596. package/src/foreign/skill-file-caps.test.ts +171 -0
  597. package/src/foreign/source-modules.ts +86 -0
  598. package/src/foreign/source-registry.test.ts +190 -0
  599. package/src/foreign/sqlite.test.ts +313 -0
  600. package/src/foreign/sqlite.ts +446 -0
  601. package/src/foreign/teleagent.test.ts +147 -0
  602. package/src/foreign/teleagent.ts +62 -0
  603. package/src/foreign/trae.test.ts +316 -0
  604. package/src/foreign/trae.ts +25 -0
  605. package/src/foreign/truncation-report.test.ts +238 -0
  606. package/src/foreign/truth-table.ts +453 -0
  607. package/src/foreign/types.ts +312 -0
  608. package/src/foreign/vibe.test.ts +209 -0
  609. package/src/foreign/vibe.ts +28 -0
  610. package/src/foreign/workbuddy.test.ts +207 -0
  611. package/src/foreign/workbuddy.ts +53 -0
  612. package/src/foreign/zcode.test.ts +224 -0
  613. package/src/foreign/zcode.ts +60 -0
  614. package/src/foreign/zed.test.ts +240 -0
  615. package/src/foreign/zed.ts +62 -0
  616. package/src/index.facade.test.ts +254 -16
  617. package/src/index.ts +704 -82
  618. package/src/market/github-repos.test.ts +98 -1
  619. package/src/market/github-repos.ts +63 -1
  620. package/src/market/types.ts +3 -3
  621. package/src/profiles/dsh-profile-incomplete-copy.test.ts +177 -0
  622. package/src/profiles/dsh-profile-manager.test.ts +37 -0
  623. package/src/profiles/dsh-profile-manager.ts +188 -13
  624. package/src/profiles/dsh-profile-shared.ts +55 -1
  625. package/src/profiles/index.ts +2 -1
  626. package/src/routes/consult.ts +53 -4
  627. package/src/routes/foreign-context.ts +89 -0
  628. package/src/routes/foreign.test.ts +443 -0
  629. package/src/routes/foreign.ts +226 -0
  630. package/src/routes/import.ts +23 -1
  631. package/src/routes/index.ts +6 -2
  632. package/src/routes/kit.ts +4 -3
  633. package/src/routes/market.ts +0 -1
  634. package/src/routes/prefs.ts +15 -1
  635. package/src/routes/recovery.test.ts +167 -0
  636. package/src/routes/recovery.ts +331 -1
  637. package/src/routes/session-export.ts +308 -0
  638. package/src/routes/snapshots.ts +12 -2
  639. package/src/routes/sync.ts +91 -7
  640. package/src/security/redaction.test.ts +149 -0
  641. package/src/security/redaction.ts +25 -9
  642. package/src/security/secret-scanner.test.ts +186 -0
  643. package/src/security/secret-scanner.ts +57 -1
  644. package/src/sync/autosync-risk-tier.test.ts +61 -0
  645. package/src/sync/autosync-scheduler.test.ts +48 -1
  646. package/src/sync/autosync-scheduler.ts +50 -26
  647. package/src/sync/backup-files.ts +5 -0
  648. package/src/sync/gist/gist-msgkeys-catalog.test.ts +33 -0
  649. package/src/sync/gist/gist-msgkeys.test.ts +71 -0
  650. package/src/sync/gist/gist-transport.test.ts +308 -0
  651. package/src/sync/gist/gist-transport.ts +550 -0
  652. package/src/sync/gist/messages.ts +49 -0
  653. package/src/sync/retention-prune-all-off.test.ts +50 -0
  654. package/src/sync/s3/cloud-config.test.ts +283 -0
  655. package/src/sync/s3/messages.ts +102 -0
  656. package/src/sync/s3/s3-delete-index-404.test.ts +170 -0
  657. package/src/sync/s3/s3-delete-index-unreadable.test.ts +141 -0
  658. package/src/sync/s3/s3-msgkeys.test.ts +101 -0
  659. package/src/sync/s3/s3-providers.ts +213 -0
  660. package/src/sync/s3/s3-transport.test.ts +394 -0
  661. package/src/sync/s3/s3-transport.ts +651 -0
  662. package/src/sync/s3/s3-upload-index-404.test.ts +171 -0
  663. package/src/sync/s3/sigv4.test.ts +219 -0
  664. package/src/sync/s3/sigv4.ts +283 -0
  665. package/src/sync/sync-config.test.ts +237 -5
  666. package/src/sync/sync-config.ts +841 -52
  667. package/src/sync/sync-engine-download-tombstone.test.ts +73 -0
  668. package/src/sync/sync-engine.ts +5 -3
  669. package/src/sync/sync-history.ts +1 -1
  670. package/src/sync/webdav/webdav-delete-index-404.test.ts +178 -0
  671. package/src/sync/webdav/webdav-delete-index-unreadable.test.ts +143 -0
  672. package/src/sync/webdav/webdav-msgkeys.test.ts +53 -0
  673. package/src/sync/webdav/webdav-transport.test.ts +9 -5
  674. package/src/sync/webdav/webdav-transport.ts +99 -17
  675. package/src/sync/webdav/webdav-upload-index-404.test.ts +177 -0
  676. package/src/ui/commands.test.ts +4 -1
  677. package/src/ui/commands.ts +46 -12
  678. package/src/ui/disk-usage-view.test.ts +63 -1
  679. package/src/ui/disk-usage-view.ts +93 -1
  680. package/src/ui/dsh-profiles-incomplete-view.test.ts +102 -0
  681. package/src/ui/dsh-profiles-view.ts +94 -0
  682. package/src/ui/foreign-view.test.ts +241 -0
  683. package/src/ui/foreign-view.ts +362 -0
  684. package/src/ui/i18n.ts +164 -0
  685. package/src/ui/mid-ellipsis.test.ts +5 -10
  686. package/src/ui/session-inventory-view.test.ts +142 -2
  687. package/src/ui/session-inventory-view.ts +127 -0
  688. package/src/ui/session-layout-view.test.ts +361 -0
  689. package/src/ui/session-layout-view.ts +444 -0
  690. package/src/ui/sync-repository-picker.test.ts +130 -0
  691. package/src/ui/sync-repository-picker.ts +180 -0
  692. package/src/ui/sync-settings-view.test.ts +166 -0
  693. package/src/ui/sync-settings-view.ts +319 -9
  694. package/src/ui/types.ts +42 -0
  695. package/src/utils/asar-read.test.ts +330 -0
  696. package/src/utils/asar-read.ts +606 -0
  697. package/src/utils/env-lock.test.ts +55 -0
  698. package/src/utils/env-lock.ts +6 -1
  699. package/src/utils/patch-yaml.test.ts +112 -0
  700. package/src/utils/patch-yaml.ts +72 -0
  701. package/src/utils/paths.test.ts +63 -0
  702. package/src/utils/paths.ts +25 -3
  703. package/src/utils/recursive-walk.test.ts +20 -0
  704. package/src/utils/recursive-walk.ts +12 -13
  705. package/src/utils/session-format.test.ts +113 -2
  706. package/src/utils/session-format.ts +127 -5
  707. package/src/utils/session-health-scan.test.ts +364 -1
  708. package/src/utils/session-health-scan.ts +434 -15
  709. package/src/utils/session-layout-repair-service.test.ts +362 -0
  710. package/src/utils/session-layout-repair-service.ts +568 -0
  711. package/src/utils/session-log-repair.test.ts +260 -1
  712. package/src/utils/session-log-repair.ts +294 -55
  713. package/src/utils/session-repair-service.test.ts +148 -1
  714. package/src/utils/session-repair-service.ts +165 -10
  715. package/src/utils/session-row-facts.test.ts +159 -0
  716. package/src/utils/session-row-facts.ts +187 -0
  717. package/src/utils/session-verify.test.ts +762 -0
  718. package/src/utils/session-verify.ts +784 -0
  719. package/src/utils/shared-constants.ts +82 -0
@@ -54,6 +54,46 @@
54
54
  只有本机概况卡,纵向余量足够。420px 下可视行数约 9 行,且清理按钮仍在卡内。
55
55
  见 §9c 的 .diskUsageCard(为什么用固定高度而不是自适应)。 */
56
56
  --cm-disk-card-h: 420px;
57
+ /* ================= v3 语义 token 层(--cm-*)=================
58
+ 全部由 --dsw-* 派生;组件规则只消费 --cm-*,不再直接写 --dsw-* 状态色。
59
+ 由 css-token-guard.test.ts 与 css-scale-guard.test.ts 钉住。 */
60
+ --cm-text-1: var(--dsw-alias-label-primary);
61
+ --cm-text-2: var(--dsw-alias-label-secondary);
62
+ --cm-text-3: var(--dsw-alias-label-tertiary);
63
+ --cm-text-on-accent: var(--dsw-alias-label-primary-foreground);
64
+ --cm-surface-1: var(--dsw-alias-bg-layer-1);
65
+ --cm-surface-2: var(--dsw-alias-bg-layer-2);
66
+ --cm-surface-hover: var(--dsw-alias-interactive-bg-hover);
67
+ --cm-line-1: var(--dsw-alias-border-l1);
68
+ --cm-line-2: var(--dsw-alias-border-l2);
69
+ --cm-input-bg: var(--dsw-specific-input-major);
70
+ --cm-accent: var(--dsw-alias-state-business-primary);
71
+ --cm-accent-fill: var(--dsw-alias-button-info-fill);
72
+ --cm-accent-hover: var(--dsw-alias-button-info-hover);
73
+ --cm-ok: var(--dsw-alias-state-success-primary);
74
+ --cm-info: var(--dsw-alias-state-info-primary);
75
+ --cm-warn: var(--dsw-alias-state-warn-primary);
76
+ --cm-error: var(--dsw-alias-state-error-primary);
77
+ /* 字号 scale(4 档) */
78
+ --cm-fs-meta: 11px;
79
+ --cm-fs-table: 12px;
80
+ --cm-fs-base: 12.5px;
81
+ --cm-fs-title: 13px;
82
+ /* 间距 scale(9 档) */
83
+ --cm-sp-1: 2px; --cm-sp-2: 4px; --cm-sp-3: 6px; --cm-sp-4: 8px; --cm-sp-5: 10px;
84
+ --cm-sp-6: 12px; --cm-sp-7: 14px; --cm-sp-8: 16px; --cm-sp-9: 24px;
85
+ /* 圆角 scale(4 档) */
86
+ --cm-r-1: 4px; --cm-r-2: 6px; --cm-r-3: 8px; --cm-r-pill: 999px;
87
+ /* 控件高(3 档) */
88
+ --cm-h-sm: 24px; --cm-h-md: 28px; --cm-h-lg: 32px;
89
+ /* 阴影与焦点环 */
90
+ --cm-shadow-1: 0 10px 26px color-mix(in srgb, var(--dsw-alias-bg-base) 45%, transparent);
91
+ --cm-shadow-2: 0 12px 32px color-mix(in srgb, var(--dsw-alias-bg-base) 40%, transparent);
92
+ --cm-ring: 0 0 0 2px color-mix(in srgb, var(--cm-accent) 18%, transparent);
93
+ --cm-ring-strong: 0 0 0 2px color-mix(in srgb, var(--cm-accent) 55%, transparent);
94
+ /* 层级(6 档语义) */
95
+ --cm-z-raise: 1; --cm-z-sticky: 2; --cm-z-task: 90; --cm-z-mask: 100;
96
+ --cm-z-modal: 101; --cm-z-pop: 110; --cm-z-toast: 120;
57
97
  }
58
98
 
59
99
  /* 交互过渡统一参数(hover/focus 颜色过渡;仅颜色属性,克制) */
@@ -65,7 +105,7 @@
65
105
 
66
106
  /* 键盘焦点环:仅键盘导航(:focus-visible)触发 */
67
107
  .section :is(button, a, input, select, textarea, [role='tab']):focus-visible {
68
- outline: 2px solid var(--dsw-alias-state-business-primary);
108
+ outline: 2px solid var(--cm-accent);
69
109
  outline-offset: 2px;
70
110
  }
71
111
 
@@ -123,7 +163,7 @@
123
163
  position: relative;
124
164
  display: inline-flex;
125
165
  align-items: center;
126
- gap: 5px;
166
+ gap: 4px;
127
167
  flex: none;
128
168
  height: 24px;
129
169
  padding: 0 10px;
@@ -146,15 +186,15 @@
146
186
 
147
187
  .navTab:focus-visible,
148
188
  .navMore:focus-visible {
149
- outline: 2px solid var(--dsw-alias-state-business-primary);
189
+ outline: 2px solid var(--cm-accent);
150
190
  outline-offset: 1px;
151
191
  border-radius: 6px;
152
192
  }
153
193
 
154
194
  .navTab[data-active],
155
195
  .navMore[data-active] {
156
- background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 16%, transparent);
157
- box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--dsw-alias-state-business-primary) 45%, transparent);
196
+ background: color-mix(in srgb, var(--cm-accent) 16%, transparent);
197
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--cm-accent) 45%, transparent);
158
198
  color: var(--dsw-alias-label-primary);
159
199
  font-weight: 600;
160
200
  }
@@ -164,7 +204,7 @@
164
204
  width: 6px;
165
205
  height: 6px;
166
206
  border-radius: 50%;
167
- background: var(--dsw-alias-state-error-primary);
207
+ background: var(--cm-error);
168
208
  flex: none;
169
209
  }
170
210
 
@@ -201,8 +241,8 @@
201
241
 
202
242
  /* 导航条动作按钮激活态(面板打开时对应按钮高亮) */
203
243
  .navActions .ghostButton[data-active] {
204
- border-color: color-mix(in srgb, var(--dsw-alias-state-business-primary) 55%, transparent);
205
- color: var(--dsw-alias-state-business-primary);
244
+ border-color: color-mix(in srgb, var(--cm-accent) 55%, transparent);
245
+ color: var(--cm-accent);
206
246
  }
207
247
 
208
248
  /* —— 图标按钮(工具栏/导航通用) —— */
@@ -217,8 +257,8 @@
217
257
  border-radius: 6px;
218
258
  background: none;
219
259
  font: inherit;
220
- font-size: 14px;
221
- line-height: 1;
260
+ font-size: 13px;
261
+ line-height: 1.25;
222
262
  color: var(--dsw-alias-label-secondary);
223
263
  cursor: pointer;
224
264
  align-self: center;
@@ -230,7 +270,7 @@
230
270
  }
231
271
 
232
272
  .iconBtn:focus-visible {
233
- outline: 2px solid var(--dsw-alias-state-business-primary);
273
+ outline: 2px solid var(--cm-accent);
234
274
  outline-offset: 1px;
235
275
  }
236
276
 
@@ -248,29 +288,19 @@
248
288
  }
249
289
 
250
290
  .iconBtn[data-active] {
251
- background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 14%, transparent);
252
- color: var(--dsw-alias-state-business-primary);
291
+ background: color-mix(in srgb, var(--cm-accent) 14%, transparent);
292
+ color: var(--cm-accent);
253
293
  }
254
294
 
255
295
  /* 危险语义图标按钮(行内删除等破坏性动作的视觉隔离) */
256
296
  .iconBtn[data-danger] {
257
- color: var(--dsw-alias-state-error-primary);
297
+ color: var(--cm-error);
258
298
  }
259
299
 
260
300
  .iconBtn[data-danger]:hover {
261
- background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);
262
- border-color: var(--dsw-alias-state-error-primary);
263
- color: var(--dsw-alias-state-error-primary);
264
- }
265
-
266
- /* 行内动作分隔(安全操作与破坏性操作之间的 1px 竖线) */
267
- .rowDivider {
268
- width: 1px;
269
- height: 14px;
270
- background: var(--dsw-alias-border-l2);
271
- margin: 0 2px;
272
- flex: none;
273
- align-self: center;
301
+ background: color-mix(in srgb, var(--cm-error) 12%, transparent);
302
+ border-color: var(--cm-error);
303
+ color: var(--cm-error);
274
304
  }
275
305
 
276
306
  /* —— 页面主体(滚动区):flex 链让页面内容可伸展填满视口高度 —— */
@@ -385,7 +415,7 @@
385
415
  .taskPanel {
386
416
  position: absolute;
387
417
  inset: 0;
388
- z-index: 90;
418
+ z-index: var(--cm-z-task);
389
419
  display: flex;
390
420
  flex-direction: column;
391
421
  min-height: 0;
@@ -450,6 +480,58 @@
450
480
  overflow: hidden;
451
481
  }
452
482
 
483
+ /* 全局横幅槽位(SAFE MODE 等):v3 起由类提供内边距 —— 壳层里不再写内联 style。 */
484
+ .bannerSlot {
485
+ padding: 8px 12px 0;
486
+ }
487
+
488
+ /* v3:通道卡折叠体(SyncPanel)—— Collapse 的内层不是 flex 容器,多张卡片直接堆叠会贴在一起,
489
+ 这里补回与 .viewBody 一致的 10px 节奏(入口卡与折叠体之间也留 10px)。 */
490
+ .syncChannelBody {
491
+ margin-top: 10px;
492
+ }
493
+
494
+ .syncChannelBody .collapseInner {
495
+ display: flex;
496
+ flex-direction: column;
497
+ gap: 10px;
498
+ }
499
+
500
+ /* 状态栏里的「进行中任务名」:弱化一档,与状态文本并排但不抢焦点。 */
501
+ .statusTask {
502
+ color: var(--dsw-alias-label-secondary);
503
+ font-weight: 600;
504
+ }
505
+
506
+ /* 状态栏的细进度条:**恒为不定态** —— 本层只有「在跑 / 没跑」,真实百分比住在宿主
507
+ /progress 的轮询结果里。编一个百分比或画成静止满格都是在撒谎(未知不显示 0 同理)。
508
+ prefers-reduced-motion 下**刻意保留**:它承载「正在进行」这个状态本身。 */
509
+ .statusProgress {
510
+ display: inline-block;
511
+ position: relative;
512
+ width: 60px;
513
+ height: 4px;
514
+ flex: none;
515
+ border-radius: 999px;
516
+ overflow: hidden;
517
+ background: color-mix(in srgb, var(--cm-accent) 20%, transparent);
518
+ }
519
+
520
+ .statusProgress::after {
521
+ content: '';
522
+ position: absolute;
523
+ inset: 0 auto 0 0;
524
+ width: 40%;
525
+ border-radius: 999px;
526
+ background: var(--cm-accent);
527
+ animation: statusIndeterminate 1.2s var(--cm-motion-ease-in-out) infinite;
528
+ }
529
+
530
+ @keyframes statusIndeterminate {
531
+ 0% { transform: translateX(-100%); }
532
+ 100% { transform: translateX(250%); }
533
+ }
534
+
453
535
  .statusDot {
454
536
  display: inline-block;
455
537
  width: 7px;
@@ -462,19 +544,19 @@
462
544
  }
463
545
 
464
546
  .statusDot[data-kind='ok'] {
465
- background: var(--dsw-alias-state-success-primary);
547
+ background: var(--cm-ok);
466
548
  }
467
549
 
468
550
  .statusDot[data-kind='info'] {
469
- background: var(--dsw-alias-state-business-primary);
551
+ background: var(--cm-accent);
470
552
  }
471
553
 
472
554
  .statusDot[data-kind='warn'] {
473
- background: var(--dsw-alias-state-warn-primary);
555
+ background: var(--cm-warn);
474
556
  }
475
557
 
476
558
  .statusDot[data-kind='error'] {
477
- background: var(--dsw-alias-state-error-primary);
559
+ background: var(--cm-error);
478
560
  }
479
561
 
480
562
  .statusDot[data-pulse] {
@@ -489,6 +571,8 @@
489
571
  .statusText {
490
572
  overflow: hidden;
491
573
  text-overflow: ellipsis;
574
+ /* flex 行内的文本需要显式 min-width:0 才会真正省略,否则自动最小尺寸 = 内容宽度 */
575
+ min-width: 0;
492
576
  }
493
577
 
494
578
  .statusSpacer {
@@ -517,19 +601,19 @@
517
601
  font: inherit;
518
602
  font-size: 12.5px;
519
603
  font-weight: 600;
520
- line-height: 1;
604
+ line-height: 1.25;
521
605
  white-space: nowrap;
522
606
  cursor: pointer;
523
607
  user-select: none;
524
608
  }
525
609
 
526
610
  .primaryButton {
527
- background: var(--dsw-alias-button-info-fill);
611
+ background: var(--cm-accent-fill);
528
612
  color: var(--dsw-alias-label-primary-foreground);
529
613
  }
530
614
 
531
615
  .primaryButton:hover:not(:disabled) {
532
- background: var(--dsw-alias-button-info-hover);
616
+ background: var(--cm-accent-hover);
533
617
  }
534
618
 
535
619
  .ghostButton {
@@ -544,19 +628,19 @@
544
628
 
545
629
  .dangerButton {
546
630
  background: transparent;
547
- border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);
548
- color: var(--dsw-alias-state-error-primary);
631
+ border-color: color-mix(in srgb, var(--cm-error) 45%, transparent);
632
+ color: var(--cm-error);
549
633
  }
550
634
 
551
635
  .dangerButton:hover:not(:disabled) {
552
- background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);
553
- border-color: var(--dsw-alias-state-error-primary);
636
+ background: color-mix(in srgb, var(--cm-error) 12%, transparent);
637
+ border-color: var(--cm-error);
554
638
  }
555
639
 
556
640
  .primaryButton:focus-visible,
557
641
  .ghostButton:focus-visible,
558
642
  .dangerButton:focus-visible {
559
- outline: 2px solid var(--dsw-alias-state-business-primary);
643
+ outline: 2px solid var(--cm-accent);
560
644
  outline-offset: 1px;
561
645
  }
562
646
 
@@ -573,8 +657,8 @@
573
657
  .dangerButton[data-size='sm'] {
574
658
  height: 24px;
575
659
  padding: 0 8px;
576
- font-size: 11.5px;
577
- border-radius: 5px;
660
+ font-size: 11px;
661
+ border-radius: 6px;
578
662
  }
579
663
 
580
664
  /* —— 输入 / 选择 —— */
@@ -605,13 +689,13 @@
605
689
  }
606
690
 
607
691
  .input:hover {
608
- border-color: color-mix(in srgb, var(--dsw-alias-state-business-primary) 40%, var(--dsw-alias-border-l2));
692
+ border-color: color-mix(in srgb, var(--cm-accent) 40%, var(--dsw-alias-border-l2));
609
693
  }
610
694
 
611
695
  .input:focus {
612
696
  outline: none;
613
- border-color: var(--dsw-alias-state-business-primary);
614
- box-shadow: 0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent);
697
+ border-color: var(--cm-accent);
698
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--cm-accent) 18%, transparent);
615
699
  }
616
700
 
617
701
  .input:disabled {
@@ -661,15 +745,15 @@
661
745
  }
662
746
 
663
747
  .selectTrigger:hover {
664
- border-color: color-mix(in srgb, var(--dsw-alias-state-business-primary) 40%, var(--dsw-alias-border-l2));
748
+ border-color: color-mix(in srgb, var(--cm-accent) 40%, var(--dsw-alias-border-l2));
665
749
  }
666
750
 
667
751
  /* 展开态与键盘焦点同一视觉(都是「这个控件当前活着」) */
668
752
  .selectTrigger:focus-visible,
669
753
  .selectRoot[data-open] .selectTrigger {
670
754
  outline: none;
671
- border-color: var(--dsw-alias-state-business-primary);
672
- box-shadow: 0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent);
755
+ border-color: var(--cm-accent);
756
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--cm-accent) 18%, transparent);
673
757
  }
674
758
 
675
759
  .selectTrigger:disabled {
@@ -706,7 +790,7 @@
706
790
  top / left / min-width / max-height 一律由组件量测后写入内联样式(动态坐标无法用静态类表达)。 */
707
791
  .selectMenu {
708
792
  position: absolute;
709
- z-index: 110;
793
+ z-index: var(--cm-z-pop);
710
794
  /* 不要写 min-width:100% —— portal 后它相对 **.section** 解析(实测弹层宽 521px),
711
795
  而组件的内联 minWidth 已是「触发器宽度」,那才是想要的。
712
796
  z-index 取 110:高于弹窗卡片(101)与遮罩(100),低于通知层(120)。 */
@@ -780,10 +864,10 @@
780
864
  `aria-checked` 是 MoreMenu 的 menuitemradio 用的选中态(listbox 才用 aria-selected)。 */
781
865
  .selectOption[aria-selected='true'],
782
866
  .selectOption[aria-checked='true'] {
783
- color: var(--dsw-alias-state-business-primary);
867
+ color: var(--cm-accent);
784
868
  font-weight: 600;
785
- background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 10%, transparent);
786
- box-shadow: inset 2px 0 0 var(--dsw-alias-state-business-primary);
869
+ background: color-mix(in srgb, var(--cm-accent) 10%, transparent);
870
+ box-shadow: inset 2px 0 0 var(--cm-accent);
787
871
  }
788
872
 
789
873
  .selectOption[data-disabled] {
@@ -835,10 +919,10 @@
835
919
  }
836
920
 
837
921
  .libraryFilter[data-active] {
838
- color: var(--dsw-alias-state-business-primary);
922
+ color: var(--cm-accent);
839
923
  font-weight: 600;
840
- background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 16%, transparent);
841
- box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--dsw-alias-state-business-primary) 45%, transparent);
924
+ background: color-mix(in srgb, var(--cm-accent) 16%, transparent);
925
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--cm-accent) 45%, transparent);
842
926
  }
843
927
 
844
928
  /* 计数:只在对应来源加载成功后渲染(加载中/失败时整个不出现,绝不显示 0) */
@@ -868,8 +952,8 @@
868
952
 
869
953
  .librarySearch:focus-visible {
870
954
  outline: none;
871
- border-color: var(--dsw-alias-state-business-primary);
872
- box-shadow: 0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent);
955
+ border-color: var(--cm-accent);
956
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--cm-accent) 18%, transparent);
873
957
  }
874
958
 
875
959
  /* 底栏:计数 + 三个「新增产物」入口。**不显示合计体积**(四源里只有备份文件有体积) */
@@ -926,7 +1010,7 @@
926
1010
  }
927
1011
 
928
1012
  .artifactRow[data-expanded] {
929
- background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 5%, transparent);
1013
+ background: color-mix(in srgb, var(--cm-accent) 5%, transparent);
930
1014
  }
931
1015
 
932
1016
  /* 行高 52px = 标题 19 + 元数据 17 + 上下 padding 8(§6.2 的页面预算按它算) */
@@ -961,7 +1045,7 @@
961
1045
  }
962
1046
 
963
1047
  .artifactExpand:focus-visible {
964
- outline: 2px solid var(--dsw-alias-state-business-primary);
1048
+ outline: 2px solid var(--cm-accent);
965
1049
  outline-offset: 1px;
966
1050
  }
967
1051
 
@@ -1066,8 +1150,8 @@
1066
1150
 
1067
1151
  .paletteInput:focus-visible {
1068
1152
  outline: none;
1069
- border-color: var(--dsw-alias-state-business-primary);
1070
- box-shadow: 0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent);
1153
+ border-color: var(--cm-accent);
1154
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--cm-accent) 18%, transparent);
1071
1155
  }
1072
1156
 
1073
1157
  /* 限高内滚:与 planScroll / reportScroll / pickerList 同一条长列表纪律 */
@@ -1150,7 +1234,7 @@
1150
1234
  .radioLabel {
1151
1235
  display: flex;
1152
1236
  align-items: flex-start;
1153
- gap: 7px;
1237
+ gap: 6px;
1154
1238
  cursor: pointer;
1155
1239
  font-size: 12.5px;
1156
1240
  color: var(--dsw-alias-label-primary);
@@ -1161,14 +1245,14 @@
1161
1245
  width: 14px;
1162
1246
  height: 14px;
1163
1247
  margin: 2px 0 0;
1164
- accent-color: var(--dsw-alias-state-business-primary);
1248
+ accent-color: var(--cm-accent);
1165
1249
  cursor: pointer;
1166
1250
  flex: none;
1167
1251
  }
1168
1252
 
1169
1253
  .checkboxRow input:focus-visible,
1170
1254
  .radioLabel input:focus-visible {
1171
- outline: 2px solid var(--dsw-alias-state-business-primary);
1255
+ outline: 2px solid var(--cm-accent);
1172
1256
  outline-offset: 2px;
1173
1257
  }
1174
1258
 
@@ -1178,40 +1262,16 @@
1178
1262
  align-items: center;
1179
1263
  gap: 4px;
1180
1264
  height: 18px;
1181
- padding: 0 7px;
1182
- border-radius: 9px;
1183
- font-size: 10.5px;
1265
+ padding: 0 6px;
1266
+ border-radius: 8px;
1267
+ font-size: 11px;
1184
1268
  font-weight: 600;
1185
- line-height: 1;
1269
+ line-height: 1.25;
1186
1270
  white-space: nowrap;
1187
1271
  border: 1px solid var(--dsw-alias-border-l2);
1188
1272
  color: var(--dsw-alias-label-secondary);
1189
1273
  }
1190
1274
 
1191
- .badgeOk {
1192
- border-color: transparent;
1193
- background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent);
1194
- color: var(--dsw-alias-state-success-primary);
1195
- }
1196
-
1197
- .badgeInfo {
1198
- border-color: color-mix(in srgb, var(--dsw-alias-state-business-primary) 30%, transparent);
1199
- background: transparent;
1200
- color: var(--dsw-alias-label-secondary);
1201
- }
1202
-
1203
- .badgeWarn {
1204
- border-color: transparent;
1205
- background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);
1206
- color: var(--dsw-alias-state-warn-primary);
1207
- }
1208
-
1209
- .badgeError {
1210
- border-color: transparent;
1211
- background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 14%, transparent);
1212
- color: var(--dsw-alias-state-error-primary);
1213
- }
1214
-
1215
1275
  /* —— 横幅(四态;紧凑) —— */
1216
1276
  .banner {
1217
1277
  animation: itemEnter var(--cm-motion-base) var(--cm-motion-ease-out);
@@ -1231,30 +1291,30 @@
1231
1291
  }
1232
1292
 
1233
1293
  .banner[data-kind='ok'] {
1234
- border-color: color-mix(in srgb, var(--dsw-alias-state-success-primary) 35%, transparent);
1235
- background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 9%, transparent);
1294
+ border-color: color-mix(in srgb, var(--cm-ok) 35%, transparent);
1295
+ background: color-mix(in srgb, var(--cm-ok) 9%, transparent);
1236
1296
  }
1237
1297
 
1238
1298
  .banner[data-kind='info'] {
1239
- border-color: color-mix(in srgb, var(--dsw-alias-state-business-primary) 30%, transparent);
1240
- background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 8%, transparent);
1299
+ border-color: color-mix(in srgb, var(--cm-accent) 30%, transparent);
1300
+ background: color-mix(in srgb, var(--cm-accent) 8%, transparent);
1241
1301
  }
1242
1302
 
1243
1303
  .banner[data-kind='warn'] {
1244
- border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);
1245
- background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 9%, transparent);
1304
+ border-color: color-mix(in srgb, var(--cm-warn) 40%, transparent);
1305
+ background: color-mix(in srgb, var(--cm-warn) 9%, transparent);
1246
1306
  }
1247
1307
 
1248
1308
  .banner[data-kind='error'] {
1249
- border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);
1250
- background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 9%, transparent);
1309
+ border-color: color-mix(in srgb, var(--cm-error) 45%, transparent);
1310
+ background: color-mix(in srgb, var(--cm-error) 9%, transparent);
1251
1311
  }
1252
1312
 
1253
1313
  /* —— Spinner —— */
1254
1314
  .spinnerWrap {
1255
1315
  display: inline-flex;
1256
1316
  align-items: center;
1257
- gap: 7px;
1317
+ gap: 6px;
1258
1318
  vertical-align: middle;
1259
1319
  }
1260
1320
 
@@ -1345,7 +1405,7 @@
1345
1405
  }
1346
1406
 
1347
1407
  /* 形态:标题 / 正文行 / 区块 / 行条目 */
1348
- .skeletonTitle { height: 13px; width: 42%; border-radius: 5px; }
1408
+ .skeletonTitle { height: 13px; width: 42%; border-radius: 6px; }
1349
1409
  .skeletonLine { height: 11px; }
1350
1410
  .skeletonBlock { height: 46px; border-radius: 8px; }
1351
1411
  .skeletonRow { height: 30px; border-radius: 6px; }
@@ -1407,7 +1467,7 @@
1407
1467
 
1408
1468
  /* 骨架下方的可见文案(与 Spinner 的 label 同义):加载反馈必须能被读到,不只靠色块 */
1409
1469
  .skeletonCaption {
1410
- font-size: 11.5px;
1470
+ font-size: 11px;
1411
1471
  color: var(--dsw-alias-label-tertiary);
1412
1472
  }
1413
1473
 
@@ -1474,20 +1534,20 @@
1474
1534
  }
1475
1535
 
1476
1536
  .fieldLabel {
1477
- font-size: 11.5px;
1537
+ font-size: 11px;
1478
1538
  font-weight: 600;
1479
1539
  color: var(--dsw-alias-label-secondary);
1480
1540
  }
1481
1541
 
1482
1542
  .hint {
1483
- font-size: 11.5px;
1543
+ font-size: 11px;
1484
1544
  line-height: 1.5;
1485
1545
  color: var(--dsw-alias-label-tertiary);
1486
1546
  }
1487
1547
 
1488
1548
  .formError {
1489
- font-size: 11.5px;
1490
- color: var(--dsw-alias-state-error-primary);
1549
+ font-size: 11px;
1550
+ color: var(--cm-error);
1491
1551
  }
1492
1552
 
1493
1553
  /* —— ⓘ 说明原语(common/InfoHint.tsx,2026-10)——
@@ -1517,7 +1577,7 @@
1517
1577
  border-radius: 4px;
1518
1578
  background: none;
1519
1579
  font: inherit;
1520
- line-height: 1;
1580
+ line-height: 1.25;
1521
1581
  color: var(--dsw-alias-label-tertiary);
1522
1582
  cursor: pointer;
1523
1583
  flex: none;
@@ -1535,7 +1595,7 @@
1535
1595
  那条路径下气泡不会打开(见 InfoHint.tsx 的 onFocus)—— 于是焦点环与 data-open 同进同出:
1536
1596
  键盘用户 Tab 到 ⓘ 时气泡必然同时打开,焦点环照常可见,可访问性不受影响。 */
1537
1597
  .infoHintBtn[data-open]:focus-visible {
1538
- outline: 2px solid var(--dsw-alias-state-business-primary);
1598
+ outline: 2px solid var(--cm-accent);
1539
1599
  outline-offset: 1px;
1540
1600
  }
1541
1601
 
@@ -1546,14 +1606,14 @@
1546
1606
 
1547
1607
  /* 点击固定后的锁定态(与 .iconBtn[data-active] 同一视觉语言) */
1548
1608
  .infoHintBtn[data-pinned] {
1549
- background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 14%, transparent);
1550
- color: var(--dsw-alias-state-business-primary);
1609
+ background: color-mix(in srgb, var(--cm-accent) 14%, transparent);
1610
+ color: var(--cm-accent);
1551
1611
  }
1552
1612
 
1553
1613
  .infoHintBubble {
1554
1614
  position: fixed;
1555
1615
  /* 高于 Dialog 内容层(.dialogMask 100 / .dialogContentCenter 101),低于通知层(120) */
1556
- z-index: 110;
1616
+ z-index: var(--cm-z-pop);
1557
1617
  box-sizing: border-box;
1558
1618
  max-width: min(260px, calc(100vw - 24px));
1559
1619
  /* 高度的结构性上限:保证气泡在宿主 564×720 画布内**永远**放得下(480 + 上下 8px 边距 < 720;
@@ -1567,7 +1627,7 @@
1567
1627
  background: var(--dsw-alias-bg-layer-2);
1568
1628
  box-shadow: 0 10px 26px color-mix(in srgb, var(--dsw-alias-bg-base) 45%, transparent);
1569
1629
  color: var(--dsw-alias-label-secondary);
1570
- font-size: 11.5px;
1630
+ font-size: 11px;
1571
1631
  line-height: 1.5;
1572
1632
  /* 多行换行:长文本折行、显式换行符保留,绝不省略号截断 */
1573
1633
  white-space: pre-wrap;
@@ -1616,13 +1676,13 @@
1616
1676
  margin: 0;
1617
1677
  font-size: 13px;
1618
1678
  font-weight: 700;
1619
- line-height: 1.4;
1679
+ line-height: 1.5;
1620
1680
  color: var(--dsw-alias-label-primary);
1621
1681
  }
1622
1682
 
1623
1683
  .sectionSubtitle {
1624
1684
  margin: 1px 0 0;
1625
- font-size: 11.5px;
1685
+ font-size: 11px;
1626
1686
  color: var(--dsw-alias-label-tertiary);
1627
1687
  }
1628
1688
 
@@ -1634,7 +1694,7 @@
1634
1694
  align-items: center;
1635
1695
  justify-content: center;
1636
1696
  gap: 4px;
1637
- padding: 28px 16px;
1697
+ padding: 24px 16px;
1638
1698
  border: 1px dashed var(--dsw-alias-border-l2);
1639
1699
  border-radius: 8px;
1640
1700
  text-align: center;
@@ -1645,39 +1705,6 @@
1645
1705
  box-sizing: border-box;
1646
1706
  }
1647
1707
 
1648
- /* 居中空态页(大块空视图:垂直居中 + 图形 + CTA,替代贴顶小虚线框) */
1649
- .emptyHero {
1650
- flex: 1 1 auto;
1651
- display: flex;
1652
- flex-direction: column;
1653
- align-items: center;
1654
- justify-content: center;
1655
- gap: 6px;
1656
- min-height: 320px;
1657
- text-align: center;
1658
- }
1659
-
1660
- .emptyHeroSymbol {
1661
- font-size: 30px;
1662
- line-height: 1;
1663
- color: var(--dsw-alias-label-tertiary);
1664
- opacity: 0.75;
1665
- }
1666
-
1667
- .emptyHeroTitle {
1668
- font-size: 13px;
1669
- font-weight: 700;
1670
- color: var(--dsw-alias-label-primary);
1671
- }
1672
-
1673
- .emptyHeroBody {
1674
- max-width: 340px;
1675
- font-size: 12px;
1676
- line-height: 1.6;
1677
- color: var(--dsw-alias-label-tertiary);
1678
- margin: 0 0 6px;
1679
- }
1680
-
1681
1708
  /* 首用空态的三步引导(复用 .stepper,仅补与上下文的间距) */
1682
1709
  .emptySteps {
1683
1710
  margin: 2px 0 10px;
@@ -1743,7 +1770,7 @@
1743
1770
  .dataTable th {
1744
1771
  position: sticky;
1745
1772
  top: 0;
1746
- z-index: 1;
1773
+ z-index: var(--cm-z-raise);
1747
1774
  padding: 6px 10px;
1748
1775
  text-align: left;
1749
1776
  font-size: 11px;
@@ -1774,13 +1801,13 @@
1774
1801
  }
1775
1802
 
1776
1803
  .dataTable tbody tr[data-selected] {
1777
- background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 9%, transparent);
1804
+ background: color-mix(in srgb, var(--cm-accent) 9%, transparent);
1778
1805
  }
1779
1806
 
1780
1807
  .dataTable .num {
1781
1808
  text-align: right;
1782
1809
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1783
- font-size: 11.5px;
1810
+ font-size: 12px;
1784
1811
  white-space: nowrap;
1785
1812
  }
1786
1813
 
@@ -1805,7 +1832,7 @@
1805
1832
  .rowActions {
1806
1833
  display: inline-flex;
1807
1834
  align-items: center;
1808
- gap: 3px;
1835
+ gap: 2px;
1809
1836
  }
1810
1837
 
1811
1838
  /* 表格主列:名称 + 内联元数据(固定最小高度,避免「有徽章/备注」与「无」的行高跳动) */
@@ -1835,15 +1862,6 @@
1835
1862
  min-width: 0;
1836
1863
  }
1837
1864
 
1838
- /* 备注文本:作为 cellMeta 的可收缩子项,单行省略(避免硬截断无 … 的「未完成感」 */
1839
- .cellMetaNote {
1840
- display: inline-flex;
1841
- align-items: center;
1842
- gap: 3px;
1843
- min-width: 0;
1844
- flex: 0 1 auto;
1845
- }
1846
-
1847
1865
  /* 备注文字本体:块级省略(text-overflow 需作用于可收缩的块/inline-block 文本元素) */
1848
1866
  .cellMetaNoteText {
1849
1867
  min-width: 0;
@@ -1860,7 +1878,7 @@
1860
1878
  }
1861
1879
 
1862
1880
  .warnText {
1863
- color: var(--dsw-alias-state-warn-primary);
1881
+ color: var(--cm-warn);
1864
1882
  }
1865
1883
 
1866
1884
  /* —— 键值行 —— */
@@ -1868,7 +1886,7 @@
1868
1886
  display: flex;
1869
1887
  align-items: baseline;
1870
1888
  gap: 10px;
1871
- padding: 5px 0;
1889
+ padding: 4px 0;
1872
1890
  border-bottom: 1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 55%, transparent);
1873
1891
  font-size: 12px;
1874
1892
  min-width: 0;
@@ -1889,7 +1907,7 @@
1889
1907
  flex: none;
1890
1908
  width: 88px;
1891
1909
  color: var(--dsw-alias-label-tertiary);
1892
- font-size: 11.5px;
1910
+ font-size: 11px;
1893
1911
  }
1894
1912
 
1895
1913
  .kvValue {
@@ -1899,7 +1917,7 @@
1899
1917
  }
1900
1918
 
1901
1919
  .kvValue.mono {
1902
- font-size: 11.5px;
1920
+ font-size: 12px;
1903
1921
  color: var(--dsw-alias-label-secondary);
1904
1922
  }
1905
1923
 
@@ -1911,7 +1929,7 @@
1911
1929
  gap: 2px;
1912
1930
  padding: 2px;
1913
1931
  border: 1px solid var(--dsw-alias-border-l2);
1914
- border-radius: 7px;
1932
+ border-radius: 8px;
1915
1933
  background: var(--dsw-alias-bg-base);
1916
1934
  margin: 0 0 10px;
1917
1935
  }
@@ -1920,14 +1938,14 @@
1920
1938
  .modeTab {
1921
1939
  display: inline-flex;
1922
1940
  align-items: center;
1923
- gap: 5px;
1941
+ gap: 4px;
1924
1942
  height: 22px;
1925
- padding: 0 9px;
1943
+ padding: 0 8px;
1926
1944
  border: none;
1927
- border-radius: 5px;
1945
+ border-radius: 6px;
1928
1946
  background: none;
1929
1947
  font: inherit;
1930
- font-size: 11.5px;
1948
+ font-size: 11px;
1931
1949
  font-weight: 500;
1932
1950
  color: var(--dsw-alias-label-secondary);
1933
1951
  cursor: pointer;
@@ -1941,7 +1959,7 @@
1941
1959
 
1942
1960
  .segItem:focus-visible,
1943
1961
  .modeTab:focus-visible {
1944
- outline: 2px solid var(--dsw-alias-state-business-primary);
1962
+ outline: 2px solid var(--cm-accent);
1945
1963
  outline-offset: 1px;
1946
1964
  }
1947
1965
 
@@ -1954,7 +1972,7 @@
1954
1972
  }
1955
1973
 
1956
1974
  .modeHint {
1957
- font-size: 11.5px;
1975
+ font-size: 11px;
1958
1976
  color: var(--dsw-alias-label-tertiary);
1959
1977
  margin: -4px 0 10px;
1960
1978
  }
@@ -1985,7 +2003,7 @@
1985
2003
  .stepperStep {
1986
2004
  display: inline-flex;
1987
2005
  align-items: center;
1988
- gap: 5px;
2006
+ gap: 4px;
1989
2007
  flex: none;
1990
2008
  }
1991
2009
 
@@ -1997,7 +2015,7 @@
1997
2015
  height: 17px;
1998
2016
  border-radius: 50%;
1999
2017
  border: 1.5px solid var(--dsw-alias-border-l2);
2000
- font-size: 9.5px;
2018
+ font-size: 11px;
2001
2019
  font-weight: 700;
2002
2020
  color: var(--dsw-alias-label-tertiary);
2003
2021
  background: var(--dsw-alias-bg-layer-2);
@@ -2005,15 +2023,15 @@
2005
2023
  }
2006
2024
 
2007
2025
  .stepperDot[data-state='current'] {
2008
- border-color: var(--dsw-alias-state-business-primary);
2009
- background: var(--dsw-alias-state-business-primary);
2026
+ border-color: var(--cm-accent);
2027
+ background: var(--cm-accent);
2010
2028
  color: var(--dsw-alias-label-primary-foreground);
2011
2029
  }
2012
2030
 
2013
2031
  .stepperDot[data-state='done'] {
2014
2032
  border-color: transparent;
2015
- background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 16%, transparent);
2016
- color: var(--dsw-alias-state-success-primary);
2033
+ background: color-mix(in srgb, var(--cm-ok) 16%, transparent);
2034
+ color: var(--cm-ok);
2017
2035
  }
2018
2036
 
2019
2037
  .stepperLabel {
@@ -2034,13 +2052,13 @@
2034
2052
  .stepperConnector {
2035
2053
  width: 14px;
2036
2054
  height: 1.5px;
2037
- margin: 0 5px;
2055
+ margin: 0 4px;
2038
2056
  background: var(--dsw-alias-border-l2);
2039
2057
  flex: none;
2040
2058
  }
2041
2059
 
2042
2060
  .stepperStep[data-state='done'] .stepperConnector {
2043
- background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 45%, transparent);
2061
+ background: color-mix(in srgb, var(--cm-ok) 45%, transparent);
2044
2062
  }
2045
2063
 
2046
2064
  /* —— 进度条 —— */
@@ -2051,7 +2069,7 @@
2051
2069
  .progressTrack {
2052
2070
  position: relative;
2053
2071
  height: 5px;
2054
- border-radius: 3px;
2072
+ border-radius: 4px;
2055
2073
  background: color-mix(in srgb, var(--dsw-alias-border-l1) 80%, transparent);
2056
2074
  overflow: hidden;
2057
2075
  }
@@ -2059,18 +2077,18 @@
2059
2077
  .progressBar {
2060
2078
  position: absolute;
2061
2079
  inset: 0 auto 0 0;
2062
- border-radius: 3px;
2063
- background: var(--dsw-alias-state-business-primary);
2080
+ border-radius: 4px;
2081
+ background: var(--cm-accent);
2064
2082
  transition: width var(--cm-motion-slow) var(--cm-motion-ease-out);
2065
2083
  }
2066
2084
 
2067
2085
  .progressBarDone {
2068
- background: var(--dsw-alias-state-success-primary);
2086
+ background: var(--cm-ok);
2069
2087
  }
2070
2088
 
2071
2089
  /* 已结束但结论为失败:绝不沿用 success 绿(运行中心里失败的任务必须一眼看出不是「成功」) */
2072
2090
  .progressBarFailed {
2073
- background: var(--dsw-alias-state-error-primary);
2091
+ background: var(--cm-error);
2074
2092
  }
2075
2093
 
2076
2094
  .progressIndeterminate {
@@ -2078,8 +2096,8 @@
2078
2096
  top: 0;
2079
2097
  bottom: 0;
2080
2098
  width: 34%;
2081
- border-radius: 3px;
2082
- background: var(--dsw-alias-state-business-primary);
2099
+ border-radius: 4px;
2100
+ background: var(--cm-accent);
2083
2101
  animation: indet 1.15s var(--cm-motion-ease-in-out) infinite;
2084
2102
  }
2085
2103
 
@@ -2092,8 +2110,8 @@
2092
2110
  display: flex;
2093
2111
  align-items: center;
2094
2112
  gap: 8px;
2095
- margin-top: 5px;
2096
- font-size: 11.5px;
2113
+ margin-top: 4px;
2114
+ font-size: 11px;
2097
2115
  color: var(--dsw-alias-label-secondary);
2098
2116
  }
2099
2117
 
@@ -2120,9 +2138,9 @@
2120
2138
  }
2121
2139
 
2122
2140
  .progressBadgeCount {
2123
- padding: 0 5px;
2141
+ padding: 0 4px;
2124
2142
  border-radius: 8px;
2125
- background: color-mix(in srgb, var(--dsw-alias-state-info-primary) 14%, transparent);
2143
+ background: color-mix(in srgb, var(--cm-info) 14%, transparent);
2126
2144
  color: var(--dsw-alias-label-secondary);
2127
2145
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
2128
2146
  }
@@ -2132,7 +2150,7 @@
2132
2150
  }
2133
2151
 
2134
2152
  .progressDetail {
2135
- margin-top: 3px;
2153
+ margin-top: 2px;
2136
2154
  font-size: 11px;
2137
2155
  color: var(--dsw-alias-label-tertiary);
2138
2156
  }
@@ -2170,7 +2188,7 @@
2170
2188
  .dialogMask {
2171
2189
  position: fixed;
2172
2190
  inset: 0;
2173
- z-index: 100;
2191
+ z-index: var(--cm-z-mask);
2174
2192
  display: flex;
2175
2193
  align-items: center;
2176
2194
  justify-content: center;
@@ -2191,7 +2209,7 @@
2191
2209
  top: 50%;
2192
2210
  left: 50%;
2193
2211
  transform: translate(-50%, -50%);
2194
- z-index: 101;
2212
+ z-index: var(--cm-z-modal);
2195
2213
  /* 弹窗卡片入场:**只淡入,不缩放**。
2196
2214
  为什么去掉 scale:本类靠 translate(-50%,-50%) 自居中,而 scale 会同时改变内容盒的
2197
2215
  可见尺寸 → 卡片高度在动画期间变化 → 视觉上「先在偏下的位置出现,再闪到中心」
@@ -2239,7 +2257,7 @@
2239
2257
  display: flex;
2240
2258
  flex-direction: column;
2241
2259
  border: 1px solid var(--dsw-alias-border-l1);
2242
- border-radius: 10px;
2260
+ border-radius: 8px;
2243
2261
  background: var(--dsw-alias-bg-layer-2);
2244
2262
  box-shadow: 0 12px 32px color-mix(in srgb, var(--dsw-alias-bg-base) 40%, transparent);
2245
2263
  }
@@ -2299,6 +2317,33 @@
2299
2317
  border-top: 1px solid var(--dsw-alias-border-l1);
2300
2318
  }
2301
2319
 
2320
+ /* —— 插件自更新弹窗(「新版本 → 立即更新」,2026-10)——
2321
+ 版本行 + 更新说明(正文排版由共享原语 ReleaseBody 提供)+ 状态横幅;
2322
+ 成功态在此提示「请重启 DSH 生效」。 */
2323
+ .updateVersionRow {
2324
+ display: flex;
2325
+ align-items: center;
2326
+ flex-wrap: wrap;
2327
+ gap: 8px;
2328
+ margin-bottom: 10px;
2329
+ }
2330
+
2331
+ .updateVersionArrow {
2332
+ color: var(--dsw-alias-label-tertiary);
2333
+ }
2334
+
2335
+ .updateVersionTarget {
2336
+ font-size: 13px;
2337
+ font-weight: 600;
2338
+ color: var(--dsw-alias-label-primary);
2339
+ }
2340
+
2341
+ .updateNotesLoading {
2342
+ display: flex;
2343
+ justify-content: center;
2344
+ padding: 24px 0;
2345
+ }
2346
+
2302
2347
  /* —— 全局通知(右下角堆叠) ——
2303
2348
  定位:absolute 贴合 .section(非 fixed/Portal),确保落在宿主弹窗层叠上下文内;
2304
2349
  容器不吃指针事件,避免遮挡右下角的页面点击(状态栏/列表),仅卡片自身可交互。 */
@@ -2309,7 +2354,7 @@
2309
2354
  /* 高于页面内容、状态栏(无)、弹窗遮罩(100)与卡片(101):弹窗打开期间触发的通知
2310
2355
  不能落在遮罩之下(否则被 55% 不透明遮罩盖住而严重褪色)。
2311
2356
  仍留在插件层叠上下文内,因此不会越过宿主 overlay(z-index: 1000)。 */
2312
- z-index: 120;
2357
+ z-index: var(--cm-z-toast);
2313
2358
  display: flex;
2314
2359
  flex-direction: column;
2315
2360
  align-items: flex-end;
@@ -2331,7 +2376,7 @@
2331
2376
  background: var(--dsw-alias-bg-layer-2);
2332
2377
  box-shadow: 0 8px 24px color-mix(in srgb, var(--dsw-alias-bg-base) 45%, transparent);
2333
2378
  font-size: 12px;
2334
- line-height: 1.45;
2379
+ line-height: 1.5;
2335
2380
  color: var(--dsw-alias-label-primary);
2336
2381
  animation: toastIn var(--cm-motion-base) var(--cm-motion-ease-out);
2337
2382
  }
@@ -2343,31 +2388,31 @@
2343
2388
 
2344
2389
  /* 四态语义:左侧色条 + 图标着色(复用 Badge/Banner 的 --dsw-* 状态色) */
2345
2390
  .toast[data-kind='ok'] {
2346
- border-color: color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent);
2391
+ border-color: color-mix(in srgb, var(--cm-ok) 40%, transparent);
2347
2392
  }
2348
2393
 
2349
2394
  .toast[data-kind='ok'] .toastGlyph {
2350
- color: var(--dsw-alias-state-success-primary);
2395
+ color: var(--cm-ok);
2351
2396
  }
2352
2397
 
2353
2398
  .toast[data-kind='info'] .toastGlyph {
2354
- color: var(--dsw-alias-state-business-primary);
2399
+ color: var(--cm-accent);
2355
2400
  }
2356
2401
 
2357
2402
  .toast[data-kind='warn'] {
2358
- border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);
2403
+ border-color: color-mix(in srgb, var(--cm-warn) 40%, transparent);
2359
2404
  }
2360
2405
 
2361
2406
  .toast[data-kind='warn'] .toastGlyph {
2362
- color: var(--dsw-alias-state-warn-primary);
2407
+ color: var(--cm-warn);
2363
2408
  }
2364
2409
 
2365
2410
  .toast[data-kind='error'] {
2366
- border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);
2411
+ border-color: color-mix(in srgb, var(--cm-error) 45%, transparent);
2367
2412
  }
2368
2413
 
2369
2414
  .toast[data-kind='error'] .toastGlyph {
2370
- color: var(--dsw-alias-state-error-primary);
2415
+ color: var(--cm-error);
2371
2416
  }
2372
2417
 
2373
2418
  .toastGlyph {
@@ -2410,6 +2455,13 @@
2410
2455
  color: inherit;
2411
2456
  text-align: left;
2412
2457
  cursor: pointer;
2458
+ /* v3 修正(真机反馈「进度条与文字紧贴着」):按钮里并排三段 —— 状态文本 / 任务名 /
2459
+ 细进度条。它们此前是普通内联内容,没有任何间距。inline-flex + gap 给出一致的行内
2460
+ 节奏(flex 会把连续文本包成匿名 flex 项,所以「1 个任务进行中」与任务名之间也有间距)。 */
2461
+ display: inline-flex;
2462
+ align-items: center;
2463
+ gap: 8px;
2464
+ min-width: 0;
2413
2465
  }
2414
2466
 
2415
2467
  .statusAction:hover {
@@ -2418,7 +2470,7 @@
2418
2470
  }
2419
2471
 
2420
2472
  .statusAction:focus-visible {
2421
- outline: 2px solid var(--dsw-alias-state-business-primary);
2473
+ outline: 2px solid var(--cm-accent);
2422
2474
  outline-offset: 1px;
2423
2475
  border-radius: 4px;
2424
2476
  }
@@ -2460,9 +2512,9 @@
2460
2512
  .runsWarnNote {
2461
2513
  margin: 8px 0 0;
2462
2514
  padding: 6px 8px;
2463
- border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 45%, transparent);
2515
+ border: 1px solid color-mix(in srgb, var(--cm-warn) 45%, transparent);
2464
2516
  border-radius: 6px;
2465
- background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 10%, transparent);
2517
+ background: color-mix(in srgb, var(--cm-warn) 10%, transparent);
2466
2518
  font-size: 11px;
2467
2519
  color: var(--dsw-alias-label-secondary);
2468
2520
  }
@@ -2474,7 +2526,7 @@
2474
2526
 
2475
2527
  .runsCardTime {
2476
2528
  margin-left: auto;
2477
- font-size: 10.5px;
2529
+ font-size: 11px;
2478
2530
  color: var(--dsw-alias-label-tertiary);
2479
2531
  white-space: nowrap;
2480
2532
  }
@@ -2494,7 +2546,7 @@
2494
2546
  border-radius: 6px;
2495
2547
  background: var(--dsw-alias-bg-base);
2496
2548
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
2497
- font-size: 10.5px;
2549
+ font-size: 11px;
2498
2550
  line-height: 1.5;
2499
2551
  color: var(--dsw-alias-label-secondary);
2500
2552
  }
@@ -2515,10 +2567,10 @@
2515
2567
  .runsOption {
2516
2568
  display: flex;
2517
2569
  flex-direction: column;
2518
- gap: 3px;
2570
+ gap: 2px;
2519
2571
  width: 100%;
2520
2572
  margin: 0 0 8px;
2521
- padding: 9px 11px;
2573
+ padding: 8px 10px;
2522
2574
  border: 1px solid var(--dsw-alias-border-l2);
2523
2575
  border-radius: 8px;
2524
2576
  background: var(--dsw-alias-bg-layer-2);
@@ -2529,17 +2581,17 @@
2529
2581
  }
2530
2582
 
2531
2583
  .runsOption:hover {
2532
- border-color: var(--dsw-alias-state-business-primary);
2584
+ border-color: var(--cm-accent);
2533
2585
  }
2534
2586
 
2535
2587
  .runsOption:focus-visible {
2536
- outline: 2px solid var(--dsw-alias-state-business-primary);
2588
+ outline: 2px solid var(--cm-accent);
2537
2589
  outline-offset: 1px;
2538
2590
  }
2539
2591
 
2540
2592
  .runsOption[data-active] {
2541
- border-color: var(--dsw-alias-state-business-primary);
2542
- background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 8%, transparent);
2593
+ border-color: var(--cm-accent);
2594
+ background: color-mix(in srgb, var(--cm-accent) 8%, transparent);
2543
2595
  }
2544
2596
 
2545
2597
  .runsOptionTitle {
@@ -2556,12 +2608,12 @@
2556
2608
  }
2557
2609
 
2558
2610
  .runsOptionTag {
2559
- padding: 0 5px;
2611
+ padding: 0 4px;
2560
2612
  border-radius: 999px;
2561
- font-size: 10px;
2613
+ font-size: 11px;
2562
2614
  font-weight: 600;
2563
- background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 14%, transparent);
2564
- color: var(--dsw-alias-state-business-primary);
2615
+ background: color-mix(in srgb, var(--cm-accent) 14%, transparent);
2616
+ color: var(--cm-accent);
2565
2617
  }
2566
2618
 
2567
2619
 
@@ -2591,18 +2643,6 @@
2591
2643
  保留为原语,供后续需要独占一行的分段控件使用。)
2592
2644
  注意:本类必须**自带分段控件外壳**(border/radius/padding/bg-base),
2593
2645
  否则 `.modeTab[data-active]` 的选中底色(layer-2)会与 Card 底色相同而「隐形」。 */
2594
- .tabRow {
2595
- display: flex;
2596
- align-items: center;
2597
- gap: 2px;
2598
- flex-wrap: wrap;
2599
- width: fit-content;
2600
- padding: 2px;
2601
- border: 1px solid var(--dsw-alias-border-l2);
2602
- border-radius: 7px;
2603
- background: var(--dsw-alias-bg-base);
2604
- margin: 10px 0 10px;
2605
- }
2606
2646
 
2607
2647
  /* 同步页「选择历史快照」空态提示行(原为行内 hint,独立成行以保持下拉与按钮同基线) */
2608
2648
  .snapshotPickerHint {
@@ -2687,13 +2727,13 @@
2687
2727
  }
2688
2728
 
2689
2729
  .statStrip[data-tone='error'] {
2690
- border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);
2691
- background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 7%, transparent);
2730
+ border-color: color-mix(in srgb, var(--cm-error) 45%, transparent);
2731
+ background: color-mix(in srgb, var(--cm-error) 7%, transparent);
2692
2732
  }
2693
2733
 
2694
2734
  .statStrip[data-tone='warn'] {
2695
- border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);
2696
- background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 6%, transparent);
2735
+ border-color: color-mix(in srgb, var(--cm-warn) 40%, transparent);
2736
+ background: color-mix(in srgb, var(--cm-warn) 6%, transparent);
2697
2737
  }
2698
2738
 
2699
2739
  .statHealth {
@@ -2725,7 +2765,7 @@
2725
2765
  }
2726
2766
 
2727
2767
  .statHealthAction:focus-visible {
2728
- outline: 2px solid var(--dsw-alias-state-business-primary);
2768
+ outline: 2px solid var(--cm-accent);
2729
2769
  outline-offset: -2px;
2730
2770
  border-radius: 6px;
2731
2771
  }
@@ -2739,7 +2779,7 @@
2739
2779
  border-left: 1px solid var(--dsw-alias-border-l1);
2740
2780
  background: none;
2741
2781
  font: inherit;
2742
- font-size: 11.5px;
2782
+ font-size: 11px;
2743
2783
  color: var(--dsw-alias-label-secondary);
2744
2784
  white-space: nowrap;
2745
2785
  cursor: pointer;
@@ -2761,7 +2801,7 @@
2761
2801
  }
2762
2802
 
2763
2803
  .statSeg:focus-visible {
2764
- outline: 2px solid var(--dsw-alias-state-business-primary);
2804
+ outline: 2px solid var(--cm-accent);
2765
2805
  outline-offset: -2px;
2766
2806
  }
2767
2807
 
@@ -2784,22 +2824,6 @@
2784
2824
  margin-bottom: 10px;
2785
2825
  }
2786
2826
 
2787
- .infoRow {
2788
- display: flex;
2789
- align-items: baseline;
2790
- gap: 8px;
2791
- min-width: 0;
2792
- font-size: 12px;
2793
- padding: 2px 0;
2794
- }
2795
-
2796
- .infoKey {
2797
- flex: none;
2798
- width: 76px;
2799
- color: var(--dsw-alias-label-tertiary);
2800
- font-size: 11.5px;
2801
- }
2802
-
2803
2827
  .infoValue {
2804
2828
  flex: 1 1 auto;
2805
2829
  min-width: 0;
@@ -2829,7 +2853,7 @@
2829
2853
  background: none;
2830
2854
  font: inherit;
2831
2855
  font-size: 11px;
2832
- line-height: 1;
2856
+ line-height: 1.25;
2833
2857
  color: var(--dsw-alias-label-tertiary);
2834
2858
  cursor: pointer;
2835
2859
  flex: none;
@@ -2841,7 +2865,7 @@
2841
2865
  }
2842
2866
 
2843
2867
  .copyBtn:focus-visible {
2844
- outline: 2px solid var(--dsw-alias-state-business-primary);
2868
+ outline: 2px solid var(--cm-accent);
2845
2869
  outline-offset: 1px;
2846
2870
  }
2847
2871
 
@@ -2855,7 +2879,7 @@
2855
2879
  opacity: 1;
2856
2880
  }
2857
2881
 
2858
- /* —— 活动卡(填充剩余高度;内部滚动) —— */
2882
+ /* —— 活动卡(**首页最后一个数据块**:吃掉剩余高度,列表自身内滚;Canvas 纪律) —— */
2859
2883
  .activityCard {
2860
2884
  display: flex;
2861
2885
  flex-direction: column;
@@ -2906,9 +2930,10 @@
2906
2930
  }
2907
2931
 
2908
2932
  .activityRows {
2909
- /* 可收缩:卡片被页面挤压缩短时列表随之收缩(自身 overflow 内滚),
2910
- 否则列表保持 272px 而卡片变矮 → 内容溢出卡片边框(曾实测 274px 内容 vs 205px 卡片)。 */
2911
- flex: 0 1 auto;
2933
+ /* v3:卡片刻意吃掉首页剩余高度(.fillCard),列表随之伸展并自身内滚 —— 否则首页底部
2934
+ 会留出大片空白(用户真机反馈「太空旷」)。min-height:0 是可收缩的前提:没有它,
2935
+ 列表的自动最小尺寸 = 内容高度,卡片会被 30 行撑破而不是滚动。 */
2936
+ flex: 1 1 auto;
2912
2937
  min-height: 0;
2913
2938
  overflow-y: auto;
2914
2939
  border: 1px solid var(--dsw-alias-border-l1);
@@ -2916,19 +2941,15 @@
2916
2941
  background: var(--dsw-alias-bg-base);
2917
2942
  }
2918
2943
 
2919
- /* 自适应上限变体:fit-content,超过 8 行内部滚动(不再强制撑出空黑块) */
2920
- .activityFit {
2921
- max-height: 272px;
2922
- }
2923
2944
 
2924
2945
  .activityRow {
2925
2946
  display: grid;
2926
2947
  grid-template-columns: 72px minmax(0, 1fr) auto;
2927
2948
  align-items: center;
2928
2949
  gap: 10px;
2929
- padding: 5px 10px;
2950
+ padding: 4px 10px;
2930
2951
  border-bottom: 1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 55%, transparent);
2931
- font-size: 11.5px;
2952
+ font-size: 12px;
2932
2953
  line-height: 1.5;
2933
2954
  min-width: 0;
2934
2955
  }
@@ -2942,7 +2963,7 @@
2942
2963
  line-height: 1.5;
2943
2964
  color: var(--dsw-alias-label-tertiary);
2944
2965
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
2945
- font-size: 10.5px;
2966
+ font-size: 11px;
2946
2967
  white-space: nowrap;
2947
2968
  }
2948
2969
 
@@ -2983,7 +3004,7 @@
2983
3004
  .activityResultOk {
2984
3005
  display: inline-flex;
2985
3006
  align-items: center;
2986
- gap: 5px;
3007
+ gap: 4px;
2987
3008
  line-height: 1.5;
2988
3009
  font-size: 11px;
2989
3010
  color: var(--dsw-alias-label-tertiary);
@@ -3005,7 +3026,7 @@
3005
3026
  }
3006
3027
 
3007
3028
  .factLabel {
3008
- font-size: 10.5px;
3029
+ font-size: 11px;
3009
3030
  color: var(--dsw-alias-label-tertiary);
3010
3031
  white-space: nowrap;
3011
3032
  }
@@ -3025,7 +3046,7 @@
3025
3046
  .sectionGrid {
3026
3047
  display: grid;
3027
3048
  grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
3028
- gap: 0 28px;
3049
+ gap: 0 24px;
3029
3050
  }
3030
3051
 
3031
3052
  .sectionRow {
@@ -3035,7 +3056,7 @@
3035
3056
  gap: 10px;
3036
3057
  padding: 4px 0;
3037
3058
  border-bottom: 1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 55%, transparent);
3038
- font-size: 11.5px;
3059
+ font-size: 12px;
3039
3060
  min-width: 0;
3040
3061
  }
3041
3062
 
@@ -3056,14 +3077,14 @@
3056
3077
  .sectionCount {
3057
3078
  justify-self: end;
3058
3079
  color: var(--dsw-alias-label-tertiary);
3059
- font-size: 10.5px;
3080
+ font-size: 11px;
3060
3081
  font-variant-numeric: tabular-nums;
3061
3082
  white-space: nowrap;
3062
3083
  }
3063
3084
 
3064
3085
  .sectionSize {
3065
3086
  justify-self: end;
3066
- font-size: 10.5px;
3087
+ font-size: 11px;
3067
3088
  color: var(--dsw-alias-label-secondary);
3068
3089
  font-variant-numeric: tabular-nums;
3069
3090
  white-space: nowrap;
@@ -3072,7 +3093,7 @@
3072
3093
  /* 活动空态(紧凑) */
3073
3094
  .activityEmpty {
3074
3095
  padding: 16px;
3075
- font-size: 11.5px;
3096
+ font-size: 11px;
3076
3097
  color: var(--dsw-alias-label-tertiary);
3077
3098
  text-align: center;
3078
3099
  }
@@ -3100,8 +3121,8 @@
3100
3121
  }
3101
3122
 
3102
3123
  .snapshotRow[data-selected] {
3103
- border-color: var(--dsw-alias-state-business-primary);
3104
- background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, transparent);
3124
+ border-color: var(--cm-accent);
3125
+ background: color-mix(in srgb, var(--cm-accent) 7%, transparent);
3105
3126
  }
3106
3127
 
3107
3128
  .snapshotRowHeader {
@@ -3135,7 +3156,7 @@
3135
3156
  font-weight: 500;
3136
3157
  font-size: 12.5px;
3137
3158
  word-break: break-all;
3138
- line-height: 1.4;
3159
+ line-height: 1.5;
3139
3160
  }
3140
3161
 
3141
3162
  .snapshotRowMeta {
@@ -3144,7 +3165,7 @@
3144
3165
  gap: 10px;
3145
3166
  min-width: 0;
3146
3167
  font-size: 12px;
3147
- color: var(--dsw-alias-text-secondary);
3168
+ color: var(--dsw-alias-label-secondary);
3148
3169
  }
3149
3170
 
3150
3171
  .snapshotRowBadges {
@@ -3292,7 +3313,7 @@
3292
3313
  .pickerOverlay {
3293
3314
  position: absolute;
3294
3315
  inset: 0;
3295
- z-index: 2;
3316
+ z-index: var(--cm-z-sticky);
3296
3317
  /* 出现/消失原本是瞬时的:读取大分区时遮罩突然盖上来会像「闪一下」。 */
3297
3318
  animation: maskIn var(--cm-motion-fast) var(--cm-motion-ease-out);
3298
3319
  display: flex;
@@ -3362,12 +3383,12 @@
3362
3383
  animation: itemEnter var(--cm-motion-base) var(--cm-motion-ease-out);
3363
3384
  display: flex;
3364
3385
  align-items: center;
3365
- padding: 3px 0 3px 18px;
3386
+ padding: 2px 0 2px 16px;
3366
3387
  min-width: 0;
3367
3388
  }
3368
3389
 
3369
3390
  .pickerUnitName {
3370
- font-size: 11.5px;
3391
+ font-size: 12px;
3371
3392
  color: var(--dsw-alias-label-primary);
3372
3393
  /* 长单元名(长路径 / 会话标题)不得撑宽列表(UI-16):文本已由 tailWeightedEllipsis 中段省略,
3373
3394
  这里再用 CSS 省略兜底实际容器宽度,行宽始终跟随容器而不是内容。完整值走 title。 */
@@ -3385,7 +3406,7 @@
3385
3406
  display: flex;
3386
3407
  align-items: center;
3387
3408
  gap: 4px;
3388
- padding: 5px 0;
3409
+ padding: 4px 0;
3389
3410
  min-width: 0;
3390
3411
  }
3391
3412
 
@@ -3408,7 +3429,7 @@
3408
3429
  }
3409
3430
 
3410
3431
  .pickerSubgroupName {
3411
- font-size: 11.5px;
3432
+ font-size: 11px;
3412
3433
  font-weight: 600;
3413
3434
  color: var(--dsw-alias-label-secondary);
3414
3435
  min-width: 0;
@@ -3427,20 +3448,20 @@
3427
3448
  .pickerMore {
3428
3449
  display: flex;
3429
3450
  justify-content: center;
3430
- padding: 4px 0 2px 18px;
3451
+ padding: 4px 0 2px 16px;
3431
3452
  }
3432
3453
 
3433
3454
  .pickerUnitDetail {
3434
3455
  max-width: 220px;
3435
3456
  overflow: hidden;
3436
- font-size: 10.5px;
3457
+ font-size: 11px;
3437
3458
  color: var(--dsw-alias-label-tertiary);
3438
3459
  text-overflow: ellipsis;
3439
3460
  white-space: nowrap;
3440
3461
  }
3441
3462
 
3442
3463
  .pickerCount {
3443
- font-size: 10.5px;
3464
+ font-size: 11px;
3444
3465
  color: var(--dsw-alias-label-tertiary);
3445
3466
  font-variant-numeric: tabular-nums;
3446
3467
  white-space: nowrap;
@@ -3457,7 +3478,7 @@
3457
3478
  .optionsRow {
3458
3479
  display: flex;
3459
3480
  align-items: center;
3460
- gap: 18px;
3481
+ gap: 16px;
3461
3482
 
3462
3483
  /* ------------------------------------------------------------------
3463
3484
  公告位(导出页 + 选内容弹窗共用)
@@ -3551,7 +3572,7 @@
3551
3572
  .warnList {
3552
3573
  margin: 4px 0 0;
3553
3574
  padding-left: 18px;
3554
- font-size: 11.5px;
3575
+ font-size: 11px;
3555
3576
  color: var(--dsw-alias-label-secondary);
3556
3577
  }
3557
3578
 
@@ -3577,7 +3598,7 @@
3577
3598
  }
3578
3599
 
3579
3600
  .conflictItem {
3580
- border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 35%, transparent);
3601
+ border: 1px solid color-mix(in srgb, var(--cm-warn) 35%, transparent);
3581
3602
  border-radius: 8px;
3582
3603
  background: var(--dsw-alias-bg-layer-2);
3583
3604
  padding: 10px 12px;
@@ -3618,10 +3639,10 @@
3618
3639
  .choiceCard {
3619
3640
  display: flex;
3620
3641
  align-items: center;
3621
- gap: 7px;
3642
+ gap: 6px;
3622
3643
  padding: 8px 10px;
3623
3644
  border: 1px solid var(--dsw-alias-border-l2);
3624
- border-radius: 7px;
3645
+ border-radius: 8px;
3625
3646
  background: var(--dsw-alias-bg-base);
3626
3647
  font-size: 12px;
3627
3648
  font-weight: 500;
@@ -3631,17 +3652,17 @@
3631
3652
  }
3632
3653
 
3633
3654
  .choiceCard:hover {
3634
- border-color: color-mix(in srgb, var(--dsw-alias-state-business-primary) 40%, var(--dsw-alias-border-l2));
3655
+ border-color: color-mix(in srgb, var(--cm-accent) 40%, var(--dsw-alias-border-l2));
3635
3656
  }
3636
3657
 
3637
3658
  .choiceCard:focus-within {
3638
- outline: 2px solid var(--dsw-alias-state-business-primary);
3659
+ outline: 2px solid var(--cm-accent);
3639
3660
  outline-offset: 1px;
3640
3661
  }
3641
3662
 
3642
3663
  .choiceCard[data-selected] {
3643
- border-color: var(--dsw-alias-state-business-primary);
3644
- background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 9%, transparent);
3664
+ border-color: var(--cm-accent);
3665
+ background: color-mix(in srgb, var(--cm-accent) 9%, transparent);
3645
3666
  color: var(--dsw-alias-label-primary);
3646
3667
  }
3647
3668
 
@@ -3649,7 +3670,7 @@
3649
3670
  width: 13px;
3650
3671
  height: 13px;
3651
3672
  margin: 0;
3652
- accent-color: var(--dsw-alias-state-business-primary);
3673
+ accent-color: var(--cm-accent);
3653
3674
  flex: none;
3654
3675
  }
3655
3676
 
@@ -3681,7 +3702,7 @@
3681
3702
  display: flex;
3682
3703
  align-items: baseline;
3683
3704
  gap: 8px;
3684
- padding: 5px 0;
3705
+ padding: 4px 0;
3685
3706
  }
3686
3707
 
3687
3708
  /* 两行之间的分割线(第一行不加,避免与容器上边框重复) */
@@ -3719,7 +3740,7 @@
3719
3740
  gap: 8px;
3720
3741
  padding: 8px 10px;
3721
3742
  border: 1px solid var(--dsw-alias-border-l1);
3722
- border-radius: 7px;
3743
+ border-radius: 8px;
3723
3744
  background: var(--dsw-alias-bg-layer-2);
3724
3745
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
3725
3746
  font-size: 11px;
@@ -3733,7 +3754,7 @@
3733
3754
  但不影响行内 flex 里的 select) */
3734
3755
  display: flex;
3735
3756
  flex-direction: column;
3736
- padding: 5px 8px;
3757
+ padding: 4px 8px;
3737
3758
  border: 1px solid var(--dsw-alias-border-l2);
3738
3759
  border-radius: 6px;
3739
3760
  background: var(--dsw-alias-bg-base);
@@ -3815,7 +3836,7 @@
3815
3836
  padding: 1px 10px;
3816
3837
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
3817
3838
  font-size: 11px;
3818
- line-height: 1.6;
3839
+ line-height: 1.5;
3819
3840
  color: var(--dsw-alias-label-secondary);
3820
3841
  white-space: pre-wrap;
3821
3842
  overflow-wrap: anywhere;
@@ -3832,7 +3853,7 @@
3832
3853
  background: none;
3833
3854
  font: inherit;
3834
3855
  font-size: 11px;
3835
- color: var(--dsw-alias-state-business-primary);
3856
+ color: var(--cm-accent);
3836
3857
  cursor: pointer;
3837
3858
  padding: 0 4px;
3838
3859
  }
@@ -3850,15 +3871,15 @@
3850
3871
 
3851
3872
  /* 项状态行:按级别着色(✗ 红 / ⚠ 黄 / ✓ 绿 / ⏭ 灰 / ▶ 主文本)—— 一眼看出哪些要处理 */
3852
3873
  .logLine[data-level='fail'] {
3853
- color: var(--dsw-alias-state-error-primary);
3874
+ color: var(--cm-error);
3854
3875
  }
3855
3876
 
3856
3877
  .logLine[data-level='warn'] {
3857
- color: var(--dsw-alias-state-warn-primary);
3878
+ color: var(--cm-warn);
3858
3879
  }
3859
3880
 
3860
3881
  .logLine[data-level='ok'] {
3861
- color: var(--dsw-alias-state-success-primary);
3882
+ color: var(--cm-ok);
3862
3883
  }
3863
3884
 
3864
3885
  .logLine[data-level='skip'] {
@@ -3874,7 +3895,7 @@
3874
3895
  padding: 0 10px 0 22px;
3875
3896
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
3876
3897
  font-size: 11px;
3877
- line-height: 1.6;
3898
+ line-height: 1.5;
3878
3899
  color: var(--dsw-alias-label-tertiary);
3879
3900
  white-space: pre-wrap;
3880
3901
  overflow-wrap: anywhere;
@@ -3897,7 +3918,7 @@
3897
3918
  background: none;
3898
3919
  font: inherit;
3899
3920
  font-size: 11px;
3900
- color: var(--dsw-alias-state-business-primary);
3921
+ color: var(--cm-accent);
3901
3922
  cursor: pointer;
3902
3923
  padding: 0 4px;
3903
3924
  }
@@ -3973,14 +3994,14 @@
3973
3994
 
3974
3995
  .reportProblemText {
3975
3996
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
3976
- font-size: 11.5px;
3997
+ font-size: 12px;
3977
3998
  color: var(--dsw-alias-label-primary);
3978
3999
  overflow-wrap: anywhere;
3979
4000
  }
3980
4001
 
3981
4002
  .reportProblemReason {
3982
- margin-top: 3px;
3983
- font-size: 11.5px;
4003
+ margin-top: 2px;
4004
+ font-size: 11px;
3984
4005
  line-height: 1.5;
3985
4006
  color: var(--dsw-alias-label-secondary);
3986
4007
  overflow-wrap: anywhere;
@@ -3996,16 +4017,16 @@
3996
4017
 
3997
4018
  .reportWarningRow {
3998
4019
  padding: 2px 10px;
3999
- font-size: 11.5px;
4020
+ font-size: 11px;
4000
4021
  line-height: 1.5;
4001
- color: var(--dsw-alias-state-warn-primary);
4022
+ color: var(--cm-warn);
4002
4023
  overflow-wrap: anywhere;
4003
4024
  }
4004
4025
 
4005
4026
  /* 完整文本报告(渐进披露):结构化视图是主路径,这里是「逐字核对」的原文入口 */
4006
4027
  .reportDetails {
4007
4028
  margin-top: 4px;
4008
- font-size: 11.5px;
4029
+ font-size: 11px;
4009
4030
  color: var(--dsw-alias-label-tertiary);
4010
4031
  }
4011
4032
 
@@ -4072,17 +4093,17 @@
4072
4093
  display: flex;
4073
4094
  align-items: flex-start;
4074
4095
  gap: 8px;
4075
- padding: 9px 12px;
4076
- border: 1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);
4096
+ padding: 8px 12px;
4097
+ border: 1px solid color-mix(in srgb, var(--cm-error) 45%, transparent);
4077
4098
  border-radius: 8px;
4078
- background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);
4099
+ background: color-mix(in srgb, var(--cm-error) 8%, transparent);
4079
4100
  margin: 0 0 10px;
4080
4101
  font-size: 12px;
4081
4102
  }
4082
4103
 
4083
4104
  .errorTitle {
4084
4105
  font-weight: 600;
4085
- color: var(--dsw-alias-state-error-primary);
4106
+ color: var(--cm-error);
4086
4107
  }
4087
4108
 
4088
4109
  .errorLine {
@@ -4096,7 +4117,7 @@
4096
4117
  .errorList {
4097
4118
  margin: 4px 0 0;
4098
4119
  padding-left: 18px;
4099
- font-size: 11.5px;
4120
+ font-size: 11px;
4100
4121
  }
4101
4122
 
4102
4123
  .errorItem {
@@ -4122,7 +4143,7 @@
4122
4143
  }
4123
4144
 
4124
4145
  .errorActionLabel {
4125
- color: var(--dsw-alias-state-business-primary);
4146
+ color: var(--cm-accent);
4126
4147
  }
4127
4148
 
4128
4149
  /* 恢复计划 / 差异查看 */
@@ -4137,30 +4158,30 @@
4137
4158
  padding: 0 6px;
4138
4159
  border-radius: 4px;
4139
4160
  background: var(--dsw-alias-interactive-bg-hover);
4140
- font-size: 10px;
4161
+ font-size: 11px;
4141
4162
  font-weight: 600;
4142
4163
  color: var(--dsw-alias-label-secondary);
4143
4164
  white-space: nowrap;
4144
4165
  }
4145
4166
 
4146
4167
  .kindTagOk {
4147
- background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 13%, transparent);
4148
- color: var(--dsw-alias-state-success-primary);
4168
+ background: color-mix(in srgb, var(--cm-ok) 13%, transparent);
4169
+ color: var(--cm-ok);
4149
4170
  }
4150
4171
 
4151
4172
  .kindTagInfo {
4152
- background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 13%, transparent);
4153
- color: var(--dsw-alias-state-business-primary);
4173
+ background: color-mix(in srgb, var(--cm-accent) 13%, transparent);
4174
+ color: var(--cm-accent);
4154
4175
  }
4155
4176
 
4156
4177
  .kindTagWarn {
4157
- background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 13%, transparent);
4158
- color: var(--dsw-alias-state-warn-primary);
4178
+ background: color-mix(in srgb, var(--cm-warn) 13%, transparent);
4179
+ color: var(--cm-warn);
4159
4180
  }
4160
4181
 
4161
4182
  .kindTagError {
4162
- background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 13%, transparent);
4163
- color: var(--dsw-alias-state-error-primary);
4183
+ background: color-mix(in srgb, var(--cm-error) 13%, transparent);
4184
+ color: var(--cm-error);
4164
4185
  }
4165
4186
 
4166
4187
  /* —— git 风格恢复预览:分组行 + 左右双栏逐行对照(2026-09) ——
@@ -4206,14 +4227,14 @@
4206
4227
 
4207
4228
  .restorePlanRow:focus-visible {
4208
4229
  outline: none;
4209
- box-shadow: 0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary) 55%, transparent);
4230
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--cm-accent) 55%, transparent);
4210
4231
  }
4211
4232
 
4212
4233
  .restorePlanPath {
4213
4234
  flex: 1;
4214
4235
  min-width: 0;
4215
4236
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
4216
- font-size: 11.5px;
4237
+ font-size: 12px;
4217
4238
  color: var(--dsw-alias-label-primary);
4218
4239
  overflow: hidden;
4219
4240
  text-overflow: ellipsis;
@@ -4236,7 +4257,7 @@
4236
4257
  }
4237
4258
 
4238
4259
  .restorePlanNote {
4239
- padding: 0 6px 4px 28px;
4260
+ padding: 0 6px 4px 24px;
4240
4261
  font-size: 11px;
4241
4262
  color: var(--dsw-alias-label-secondary);
4242
4263
  overflow-wrap: anywhere;
@@ -4275,7 +4296,7 @@
4275
4296
  .diffGroupToggle:focus-visible {
4276
4297
  outline: none;
4277
4298
  border-radius: 4px;
4278
- box-shadow: 0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary) 55%, transparent);
4299
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--cm-accent) 55%, transparent);
4279
4300
  }
4280
4301
 
4281
4302
  .diffStatTotal {
@@ -4285,18 +4306,11 @@
4285
4306
  }
4286
4307
 
4287
4308
  .diffStatAdd {
4288
- color: var(--dsw-alias-state-success-primary);
4309
+ color: var(--cm-ok);
4289
4310
  }
4290
4311
 
4291
4312
  .diffStatDel {
4292
- color: var(--dsw-alias-state-error-primary);
4293
- }
4294
-
4295
- /* 同一容器内两个区块之间的水平分割线(迁移前咨询 ↔ 计划预览) */
4296
- .sectionDivider {
4297
- height: 1px;
4298
- margin: 10px 0;
4299
- background: var(--dsw-alias-border-l1);
4313
+ color: var(--cm-error);
4300
4314
  }
4301
4315
 
4302
4316
  .diffPane {
@@ -4324,7 +4338,7 @@
4324
4338
  border-bottom: 1px solid var(--dsw-alias-border-l1);
4325
4339
  border-right: 1px solid var(--dsw-alias-border-l1);
4326
4340
  color: var(--dsw-alias-label-tertiary);
4327
- font-size: 10.5px;
4341
+ font-size: 11px;
4328
4342
  font-weight: 600;
4329
4343
  text-align: left;
4330
4344
  }
@@ -4338,7 +4352,7 @@
4338
4352
  padding: 1px 6px;
4339
4353
  background: var(--dsw-alias-bg-layer-2);
4340
4354
  color: var(--dsw-alias-label-tertiary);
4341
- font-size: 10.5px;
4355
+ font-size: 11px;
4342
4356
  }
4343
4357
 
4344
4358
  .diffNo {
@@ -4359,11 +4373,11 @@
4359
4373
  }
4360
4374
 
4361
4375
  .diffCellAdd {
4362
- background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent);
4376
+ background: color-mix(in srgb, var(--cm-ok) 12%, transparent);
4363
4377
  }
4364
4378
 
4365
4379
  .diffCellDel {
4366
- background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);
4380
+ background: color-mix(in srgb, var(--cm-error) 12%, transparent);
4367
4381
  }
4368
4382
 
4369
4383
  .nextStepsGroup {
@@ -4379,7 +4393,7 @@
4379
4393
 
4380
4394
  .rollbackBox {
4381
4395
  border: 1px solid var(--dsw-alias-border-l2);
4382
- border-radius: 7px;
4396
+ border-radius: 8px;
4383
4397
  background: var(--dsw-alias-bg-base);
4384
4398
  padding: 8px 10px;
4385
4399
  margin-bottom: 10px;
@@ -4475,7 +4489,7 @@
4475
4489
  .historyTime {
4476
4490
  flex: none;
4477
4491
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
4478
- font-size: 10.5px;
4492
+ font-size: 11px;
4479
4493
  color: var(--dsw-alias-label-tertiary);
4480
4494
  padding-top: 1px;
4481
4495
  }
@@ -4489,13 +4503,13 @@
4489
4503
  border: 1px solid var(--dsw-alias-border-l1);
4490
4504
  border-radius: 8px;
4491
4505
  background: var(--dsw-alias-bg-layer-2);
4492
- padding: 9px 12px;
4506
+ padding: 8px 12px;
4493
4507
  margin-bottom: 6px;
4494
4508
  }
4495
4509
 
4496
4510
  .profileRow[data-selected] {
4497
- border-color: var(--dsw-alias-state-business-primary);
4498
- background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, transparent);
4511
+ border-color: var(--cm-accent);
4512
+ background: color-mix(in srgb, var(--cm-accent) 7%, transparent);
4499
4513
  }
4500
4514
 
4501
4515
  .profileRowHeader {
@@ -4568,7 +4582,7 @@ button.profileRowMain {
4568
4582
  }
4569
4583
 
4570
4584
  button.profileRowMain:hover {
4571
- color: var(--dsw-alias-state-business-primary);
4585
+ color: var(--cm-accent);
4572
4586
  }
4573
4587
 
4574
4588
  /* 档案列表表头行(标题 + 统计 + 刷新):与档案行同宽,标题不占满整行 */
@@ -4614,7 +4628,7 @@ button.profileRowMain:hover {
4614
4628
  .aboutAuthor {
4615
4629
  font-size: 12.5px;
4616
4630
  font-weight: 600;
4617
- color: var(--dsw-alias-state-business-primary);
4631
+ color: var(--cm-accent);
4618
4632
  text-decoration: none;
4619
4633
  overflow-wrap: anywhere;
4620
4634
  }
@@ -4624,7 +4638,7 @@ button.profileRowMain:hover {
4624
4638
  }
4625
4639
 
4626
4640
  .aboutAuthor:focus-visible {
4627
- outline: 2px solid var(--dsw-alias-state-business-primary);
4641
+ outline: 2px solid var(--cm-accent);
4628
4642
  outline-offset: 1px;
4629
4643
  border-radius: 4px;
4630
4644
  }
@@ -4640,7 +4654,7 @@ button.profileRowMain:hover {
4640
4654
  }
4641
4655
 
4642
4656
  .severityError {
4643
- color: var(--dsw-alias-state-error-primary);
4657
+ color: var(--cm-error);
4644
4658
  font-weight: 600;
4645
4659
  }
4646
4660
 
@@ -4816,3 +4830,141 @@ button.profileRowMain:hover {
4816
4830
  background-image: none;
4817
4831
  }
4818
4832
  }
4833
+ /* ================================================================ §16 Page: Foreign agent import
4834
+
4835
+ 外部 agent 配置导入的**只读发现 → 预览 → 交给既有导入向导**界面(t16 静态资产,
4836
+ 组件由 t17 落地)。本块只提供样式,不含任何逻辑;类名与 t17 组件的 `css.xxx` 一一对应。
4837
+
4838
+ 为什么复用既有类而不是新造一套:
4839
+ · 页面骨架沿用 `.viewBody`/`.pagePad`(页面主体区块间距由 §9b 统一提供);
4840
+ · 滚动区沿用 `.marketReviewScroll` 的高度契约(min 200px / max 800px,长列表不在页面上撑开);
4841
+ · 来源卡沿用 `.card`/`.groupLabel`/`.statRow` 的既有原语。
4842
+ 本块只补三件既有类**表达不了**的东西(Reuse → Extend → Refactor → Create 的第四步):
4843
+
4844
+ ① `.sourceList`:来源是**可选行**(单选进入下一步),既有的勾选行(.pickerUnit)是"多选树节点",
4845
+ 语义与命中路径的排版都不同,硬塞会把两种心智混在一行里;
4846
+ ② `.sourcePaths`:命中路径要**等宽 + 可换行**(Windows 反斜杠路径很长),
4847
+ 既有 `.mono` 只管字体不管换行,长路径会把行撑宽、把右侧状态徽章挤出视野;
4848
+ ③ `.skipList`:未迁移项的**两段式**行(机器码 → 人话 + 来源/条数),
4849
+ 与 `.warnList`(纯文本条目)不同 —— 它必须让"码"与"解释"在视觉上可区分,否则用户读不出
4850
+ 哪段是稳定标识、哪段是解释。
4851
+
4852
+ 零硬编码颜色:全部走 --dsw-* token(tint 一律 color-mix)。 */
4853
+
4854
+ /* 来源列表:可选行的纵向容器(单选进入下一步) */
4855
+ .sourceList {
4856
+ display: flex;
4857
+ flex-direction: column;
4858
+ gap: 6px;
4859
+ margin-bottom: 10px;
4860
+ }
4861
+
4862
+ /* 一行来源:左侧选择控件(t17 传入)+ 名称/状态 + 命中路径。
4863
+ 用 flex-start 而不是 center:命中路径可能折成多行,居中对齐会让左列控件浮在半空。 */
4864
+ .sourceRow {
4865
+ display: flex;
4866
+ align-items: flex-start;
4867
+ gap: 8px;
4868
+ padding: 8px 10px;
4869
+ border: 1px solid var(--dsw-alias-border-l1);
4870
+ border-radius: 8px;
4871
+ background: var(--dsw-alias-bg-layer-2);
4872
+ min-width: 0;
4873
+ }
4874
+
4875
+ /* 选中态:与产物库/档案行的既有写法同款(业务色 1px + 7% 底色) */
4876
+ .sourceRow[data-selected] {
4877
+ border-color: var(--cm-accent);
4878
+ background: color-mix(in srgb, var(--cm-accent) 7%, transparent);
4879
+ }
4880
+
4881
+ /* 不可选(本机未检测到):整体降一级对比度,但**不隐藏** —— 用户需要知道"这个来源我查过了" */
4882
+ .sourceRow[data-disabled] {
4883
+ opacity: 0.7;
4884
+ }
4885
+
4886
+ .sourceRowMain {
4887
+ flex: 1 1 auto;
4888
+ min-width: 0;
4889
+ }
4890
+
4891
+ /* 来源名 + 状态徽章一行(名称可省略,徽章不收缩) */
4892
+ .sourceRowHead {
4893
+ display: flex;
4894
+ align-items: center;
4895
+ gap: 8px;
4896
+ min-width: 0;
4897
+ }
4898
+
4899
+ .sourceRowName {
4900
+ font-size: 12px;
4901
+ font-weight: 600;
4902
+ color: var(--dsw-alias-label-primary);
4903
+ min-width: 0;
4904
+ overflow: hidden;
4905
+ text-overflow: ellipsis;
4906
+ white-space: nowrap;
4907
+ }
4908
+
4909
+ .sourceRowHead > *:not(.sourceRowName) {
4910
+ flex: none;
4911
+ }
4912
+
4913
+ /* 命中路径:等宽 + 允许在任意位置换行(Windows 长路径不得撑宽行、不得把徽章挤出视野) */
4914
+ .sourcePaths {
4915
+ display: block;
4916
+ margin-top: 4px;
4917
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
4918
+ font-size: 11px;
4919
+ line-height: 1.5;
4920
+ color: var(--dsw-alias-label-tertiary);
4921
+ overflow-wrap: anywhere;
4922
+ }
4923
+
4924
+ /* 未迁移项列表:一行一项,左侧机器码、右侧解释 */
4925
+ .skipList {
4926
+ display: flex;
4927
+ flex-direction: column;
4928
+ gap: 4px;
4929
+ margin: 6px 0 0;
4930
+ padding: 0;
4931
+ font-size: 11px;
4932
+ color: var(--dsw-alias-label-secondary);
4933
+ }
4934
+
4935
+ /* 未迁移项行:码与解释同排(窄面板下允许换行成两段) */
4936
+ .skipRow {
4937
+ display: flex;
4938
+ align-items: baseline;
4939
+ flex-wrap: wrap;
4940
+ gap: 6px;
4941
+ min-width: 0;
4942
+ }
4943
+
4944
+ /* 稳定机器码(用户可据此搜索/上报):等宽 + 次级底色,**刻意不隐藏** ——
4945
+ 用户报告问题时需要这个标识;容器上另有 title 承载完整说明。 */
4946
+ .skipCode {
4947
+ flex: none;
4948
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
4949
+ font-size: 11px;
4950
+ padding: 1px 4px;
4951
+ border-radius: 4px;
4952
+ background: color-mix(in srgb, var(--dsw-alias-label-tertiary) 12%, transparent);
4953
+ color: var(--dsw-alias-label-secondary);
4954
+ white-space: nowrap;
4955
+ }
4956
+
4957
+ /* 机器码之后的解释文本:占据剩余宽度,长文本在任意位置折行 */
4958
+ .skipText {
4959
+ flex: 1 1 auto;
4960
+ min-width: 0;
4961
+ overflow-wrap: anywhere;
4962
+ }
4963
+
4964
+ /* 未迁移项的计数与来源(如「来源:claude-code · 3 项」):仍是文本,但比解释低一级 */
4965
+ .skipMeta {
4966
+ flex: none;
4967
+ font-size: 11px;
4968
+ color: var(--dsw-alias-label-tertiary);
4969
+ font-variant-numeric: tabular-nums;
4970
+ }