dsh-config-manager 0.1.71 → 0.1.73

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 (596) hide show
  1. package/README.md +149 -98
  2. package/README.zh-CN.md +245 -88
  3. package/lib/adapters/agent-instructions.js +1 -1
  4. package/lib/adapters/file-collection.js +1 -1
  5. package/lib/adapters/index.d.ts +2 -1
  6. package/lib/adapters/index.js +6 -1
  7. package/lib/adapters/link-report.d.ts +1 -0
  8. package/lib/adapters/link-report.js +27 -3
  9. package/lib/adapters/messages.d.ts +21 -0
  10. package/lib/adapters/messages.js +57 -0
  11. package/lib/adapters/plugin-data.d.ts +114 -0
  12. package/lib/adapters/plugin-data.js +309 -0
  13. package/lib/adapters/plugin-files.js +3 -2
  14. package/lib/adapters/plugins.js +4 -3
  15. package/lib/adapters/prompts.d.ts +1 -0
  16. package/lib/adapters/prompts.js +7 -1
  17. package/lib/adapters/self.d.ts +8 -2
  18. package/lib/adapters/self.js +3 -2
  19. package/lib/adapters/sessions.d.ts +1 -0
  20. package/lib/adapters/sessions.js +4 -2
  21. package/lib/adapters/test-helpers.d.ts +9 -0
  22. package/lib/adapters/test-helpers.js +14 -0
  23. package/lib/adapters/ui.d.ts +2 -2
  24. package/lib/adapters/ui.js +25 -25
  25. package/lib/adapters/workspaces.d.ts +1 -0
  26. package/lib/adapters/workspaces.js +7 -3
  27. package/lib/cli/actions.d.ts +9 -1
  28. package/lib/cli/actions.js +5 -2
  29. package/lib/cli/help.js +23 -10
  30. package/lib/cli/index.d.ts +23 -0
  31. package/lib/cli/index.js +90 -32
  32. package/lib/cli/sessions-inspect.js +3 -1
  33. package/lib/cli/sessions-repair.js +25 -6
  34. package/lib/cli/web/page.d.ts +12 -0
  35. package/lib/cli/web/page.js +21 -12
  36. package/lib/cli/web/routes.js +2 -2
  37. package/lib/cli/web/server.js +4 -4
  38. package/lib/client.d.ts +1442 -494
  39. package/lib/client.js +15326 -8520
  40. package/lib/core/analyzer.d.ts +11 -2
  41. package/lib/core/analyzer.js +31 -8
  42. package/lib/core/backup-plan.d.ts +10 -0
  43. package/lib/core/backup-plan.js +51 -20
  44. package/lib/core/backup-verify.js +24 -23
  45. package/lib/core/backup.d.ts +25 -1
  46. package/lib/core/backup.js +99 -28
  47. package/lib/core/boot-rescue.js +4 -3
  48. package/lib/core/boot-safety.js +2 -1
  49. package/lib/core/command-rollback.d.ts +182 -0
  50. package/lib/core/command-rollback.js +293 -0
  51. package/lib/core/consult-source.js +7 -6
  52. package/lib/core/disk-usage.d.ts +74 -10
  53. package/lib/core/disk-usage.js +67 -4
  54. package/lib/core/engine-locale.d.ts +87 -0
  55. package/lib/core/engine-locale.js +125 -0
  56. package/lib/core/exporter.js +3 -3
  57. package/lib/core/fork-reconcile.d.ts +128 -0
  58. package/lib/core/fork-reconcile.js +150 -0
  59. package/lib/core/journal.js +6 -5
  60. package/lib/core/local-plugin-host.js +3 -2
  61. package/lib/core/local-plugin-pack.js +11 -6
  62. package/lib/core/messages-core.d.ts +294 -0
  63. package/lib/core/messages-core.js +619 -0
  64. package/lib/core/messages.d.ts +61 -2
  65. package/lib/core/messages.js +118 -13
  66. package/lib/core/migration-consult.js +21 -20
  67. package/lib/core/migration-history.js +19 -5
  68. package/lib/core/model-tools.d.ts +0 -22
  69. package/lib/core/model-tools.js +50 -27
  70. package/lib/core/phase3-host.js +30 -5
  71. package/lib/core/plugin-cli.js +18 -19
  72. package/lib/core/plugin-data-registry.d.ts +124 -0
  73. package/lib/core/plugin-data-registry.js +198 -0
  74. package/lib/core/reconcile.d.ts +2 -14
  75. package/lib/core/reconcile.js +87 -17
  76. package/lib/core/recovery-orchestrator.js +19 -18
  77. package/lib/core/reinstall.d.ts +4 -0
  78. package/lib/core/reinstall.js +26 -21
  79. package/lib/core/restore.js +20 -17
  80. package/lib/core/rollback-gate.d.ts +33 -0
  81. package/lib/core/rollback-gate.js +57 -0
  82. package/lib/core/rollback-ignore-rules.d.ts +31 -0
  83. package/lib/core/rollback-ignore-rules.js +140 -0
  84. package/lib/core/rollback-ledger.d.ts +248 -0
  85. package/lib/core/rollback-ledger.js +1282 -0
  86. package/lib/core/rollback-point.d.ts +1391 -0
  87. package/lib/core/rollback-point.js +3503 -0
  88. package/lib/core/rollback.js +6 -4
  89. package/lib/core/run-registry.js +6 -5
  90. package/lib/core/session-health.d.ts +15 -0
  91. package/lib/core/session-meta.d.ts +42 -2
  92. package/lib/core/session-meta.js +140 -1
  93. package/lib/core/session-title.d.ts +28 -0
  94. package/lib/core/session-title.js +185 -0
  95. package/lib/core/startup-barrier.d.ts +24 -0
  96. package/lib/core/startup-barrier.js +22 -0
  97. package/lib/core/transaction-coordinator.js +4 -3
  98. package/lib/core/types.d.ts +37 -1
  99. package/lib/core/validator.js +5 -4
  100. package/lib/core/verify-recovery.js +31 -30
  101. package/lib/foreign/bundle.js +3 -2
  102. package/lib/foreign/continue.js +2 -1
  103. package/lib/foreign/crush.js +2 -1
  104. package/lib/foreign/gemini.js +2 -1
  105. package/lib/foreign/goose.js +2 -1
  106. package/lib/foreign/kilocode.js +2 -1
  107. package/lib/foreign/kimi.js +2 -1
  108. package/lib/foreign/messages.d.ts +15 -0
  109. package/lib/foreign/messages.js +40 -0
  110. package/lib/foreign/mimocode.js +2 -1
  111. package/lib/foreign/openclaw.js +2 -1
  112. package/lib/foreign/opencode.js +2 -1
  113. package/lib/foreign/pi.js +2 -1
  114. package/lib/foreign/qoder.js +2 -1
  115. package/lib/foreign/qwen.js +2 -1
  116. package/lib/foreign/registry.d.ts +1 -1
  117. package/lib/foreign/registry.js +8 -7
  118. package/lib/foreign/teleagent.js +2 -1
  119. package/lib/foreign/workbuddy.js +2 -1
  120. package/lib/foreign/zcode.js +2 -1
  121. package/lib/foreign/zed.js +2 -1
  122. package/lib/index.d.ts +227 -7
  123. package/lib/index.js +799 -54
  124. package/lib/market/git-file-writer.js +20 -19
  125. package/lib/market/github-repos.js +35 -19
  126. package/lib/market/index-parser.js +31 -30
  127. package/lib/market/messages-market.d.ts +138 -0
  128. package/lib/market/messages-market.js +305 -0
  129. package/lib/market/my-repo.d.ts +2 -2
  130. package/lib/market/my-repo.js +32 -29
  131. package/lib/market/prepare.js +18 -15
  132. package/lib/market/security.js +20 -19
  133. package/lib/market/types.js +2 -1
  134. package/lib/market/url.js +2 -1
  135. package/lib/migrations/index.js +6 -5
  136. package/lib/migrations/messages-migrations.d.ts +32 -0
  137. package/lib/migrations/messages-migrations.js +58 -0
  138. package/lib/profiles/dsh-profile-launcher.js +2 -1
  139. package/lib/profiles/dsh-profile-runtime.js +2 -1
  140. package/lib/profiles/messages.d.ts +7 -0
  141. package/lib/profiles/messages.js +27 -0
  142. package/lib/routes/backup.js +18 -2
  143. package/lib/routes/import.js +3 -3
  144. package/lib/routes/index.d.ts +1 -1
  145. package/lib/routes/kit.d.ts +3 -2
  146. package/lib/routes/kit.js +6 -1
  147. package/lib/routes/market.js +1 -1
  148. package/lib/routes/messages.d.ts +43 -0
  149. package/lib/routes/messages.js +102 -0
  150. package/lib/routes/prefs.js +26 -3
  151. package/lib/routes/profiles.js +12 -6
  152. package/lib/routes/recovery.d.ts +21 -0
  153. package/lib/routes/recovery.js +478 -94
  154. package/lib/routes/snapshots.js +51 -4
  155. package/lib/routes/sync.js +79 -17
  156. package/lib/schema/config.d.ts +11 -1
  157. package/lib/schema/config.js +52 -20
  158. package/lib/schema/index.d.ts +8 -6
  159. package/lib/schema/index.js +8 -6
  160. package/lib/schema/manifest.js +19 -18
  161. package/lib/schema/messages.d.ts +47 -0
  162. package/lib/schema/messages.js +110 -0
  163. package/lib/schema/section-registry.d.ts +42 -15
  164. package/lib/schema/section-registry.js +67 -32
  165. package/lib/schema/types.d.ts +1 -1
  166. package/lib/schema/versions.js +6 -5
  167. package/lib/security/encryption.js +16 -15
  168. package/lib/security/integrity.js +8 -7
  169. package/lib/security/messages.d.ts +30 -0
  170. package/lib/security/messages.js +77 -0
  171. package/lib/security/redaction.js +12 -0
  172. package/lib/security/secret-scanner.js +16 -13
  173. package/lib/security/vault.js +2 -1
  174. package/lib/security/zip-security.js +4 -3
  175. package/lib/sync/ancestor.js +2 -1
  176. package/lib/sync/autosync-config.d.ts +11 -0
  177. package/lib/sync/autosync-config.js +12 -0
  178. package/lib/sync/autosync-scheduler.d.ts +11 -1
  179. package/lib/sync/autosync-scheduler.js +115 -76
  180. package/lib/sync/backup-files.js +3 -2
  181. package/lib/sync/backup-scheduler.js +6 -5
  182. package/lib/sync/blob-store.js +2 -1
  183. package/lib/sync/git/git-transport.d.ts +55 -0
  184. package/lib/sync/git/git-transport.js +152 -2
  185. package/lib/sync/github-auth.js +10 -9
  186. package/lib/sync/layout.js +13 -12
  187. package/lib/sync/messages.d.ts +63 -0
  188. package/lib/sync/messages.js +149 -0
  189. package/lib/sync/review-queue.js +6 -5
  190. package/lib/sync/s3/messages.d.ts +7 -0
  191. package/lib/sync/s3/messages.js +16 -0
  192. package/lib/sync/s3/s3-providers.d.ts +4 -1
  193. package/lib/sync/s3/s3-providers.js +5 -5
  194. package/lib/sync/s3/s3-transport.js +1 -1
  195. package/lib/sync/s3/sigv4.js +2 -1
  196. package/lib/sync/snapshot-crypto.js +6 -5
  197. package/lib/sync/snapshot-json.js +3 -2
  198. package/lib/sync/sync-engine.d.ts +58 -22
  199. package/lib/sync/sync-engine.js +119 -48
  200. package/lib/sync/sync-history.js +7 -6
  201. package/lib/sync/sync-selection.d.ts +15 -4
  202. package/lib/sync/sync-selection.js +17 -5
  203. package/lib/sync/ui-prefs.d.ts +22 -0
  204. package/lib/sync/ui-prefs.js +28 -0
  205. package/lib/sync/webdav/webdav-transport.d.ts +1 -0
  206. package/lib/sync/webdav/webdav-transport.js +4 -1
  207. package/lib/ui/artifact-view.js +4 -3
  208. package/lib/ui/commands.d.ts +1 -1
  209. package/lib/ui/commands.js +10 -0
  210. package/lib/ui/diff-view.d.ts +10 -0
  211. package/lib/ui/diff-view.js +17 -0
  212. package/lib/ui/disk-usage-view.d.ts +33 -4
  213. package/lib/ui/disk-usage-view.js +29 -1
  214. package/lib/ui/errors.d.ts +1 -1
  215. package/lib/ui/errors.js +4 -3
  216. package/lib/ui/export-flow.js +26 -20
  217. package/lib/ui/foreign-view.d.ts +5 -1
  218. package/lib/ui/foreign-view.js +26 -2
  219. package/lib/ui/i18n.d.ts +68 -1
  220. package/lib/ui/i18n.js +120 -2
  221. package/lib/ui/import-wizard.d.ts +7 -0
  222. package/lib/ui/import-wizard.js +13 -10
  223. package/lib/ui/progress.d.ts +2 -2
  224. package/lib/ui/progress.js +1 -2
  225. package/lib/ui/report.d.ts +5 -5
  226. package/lib/ui/report.js +6 -6
  227. package/lib/ui/rollback-view.d.ts +815 -0
  228. package/lib/ui/rollback-view.js +738 -0
  229. package/lib/ui/selection-model.d.ts +41 -0
  230. package/lib/ui/selection-model.js +30 -0
  231. package/lib/ui/session-inventory-view.d.ts +97 -3
  232. package/lib/ui/session-inventory-view.js +76 -2
  233. package/lib/ui/session-issue-labels.d.ts +43 -0
  234. package/lib/ui/session-issue-labels.js +48 -0
  235. package/lib/ui/sync-settings-view.d.ts +33 -0
  236. package/lib/ui/sync-settings-view.js +40 -0
  237. package/lib/ui/test-helpers.js +2 -1
  238. package/lib/ui/types.d.ts +8 -3
  239. package/lib/ui/types.js +1 -1
  240. package/lib/utils/atomic-write.js +6 -5
  241. package/lib/utils/bundle-scan.d.ts +11 -1
  242. package/lib/utils/bundle-scan.js +12 -1
  243. package/lib/utils/env-lock.d.ts +10 -0
  244. package/lib/utils/env-lock.js +73 -46
  245. package/lib/utils/json.js +6 -5
  246. package/lib/utils/messages-utils.d.ts +96 -0
  247. package/lib/utils/messages-utils.js +216 -0
  248. package/lib/utils/proxy.js +18 -5
  249. package/lib/utils/recursive-walk.d.ts +22 -0
  250. package/lib/utils/recursive-walk.js +75 -1
  251. package/lib/utils/session-log-repair.js +10 -9
  252. package/lib/utils/zip.js +27 -26
  253. package/package.json +12 -2
  254. package/src/adapters/agent-instructions.ts +1 -1
  255. package/src/adapters/file-collection.test.ts +1 -0
  256. package/src/adapters/file-collection.ts +1 -1
  257. package/src/adapters/files.test.ts +27 -0
  258. package/src/adapters/index.ts +6 -1
  259. package/src/adapters/link-report.test.ts +22 -2
  260. package/src/adapters/link-report.ts +29 -4
  261. package/src/adapters/messages.ts +61 -0
  262. package/src/adapters/plugin-data.test.ts +225 -0
  263. package/src/adapters/plugin-data.ts +351 -0
  264. package/src/adapters/plugin-files.ts +3 -2
  265. package/src/adapters/plugins.ts +4 -3
  266. package/src/adapters/prompts.ts +7 -1
  267. package/src/adapters/self.test.ts +26 -0
  268. package/src/adapters/self.ts +10 -3
  269. package/src/adapters/sessions.ts +4 -2
  270. package/src/adapters/settings.test.ts +38 -1
  271. package/src/adapters/test-helpers.ts +15 -0
  272. package/src/adapters/ui.test.ts +2 -2
  273. package/src/adapters/ui.ts +27 -26
  274. package/src/adapters/workspaces.ts +7 -3
  275. package/src/cli/actions.test.ts +28 -0
  276. package/src/cli/actions.ts +11 -2
  277. package/src/cli/help.ts +23 -10
  278. package/src/cli/index-guards.test.ts +193 -0
  279. package/src/cli/index.ts +106 -31
  280. package/src/cli/sessions-inspect.test.ts +15 -1
  281. package/src/cli/sessions-inspect.ts +3 -1
  282. package/src/cli/sessions-repair.test.ts +84 -0
  283. package/src/cli/sessions-repair.ts +33 -7
  284. package/src/cli/web/console-route-parity.test.ts +115 -0
  285. package/src/cli/web/page.ts +23 -12
  286. package/src/cli/web/routes.ts +2 -1
  287. package/src/cli/web/server.ts +4 -4
  288. package/src/cli/web/web.test.ts +2 -2
  289. package/src/client/ConfigManagerSection.tsx +30 -2
  290. package/src/client/about/AboutPanel.tsx +2 -2
  291. package/src/client/about/PluginUpdateDialog.tsx +1 -1
  292. package/src/client/about/ReleaseNotesDialog.tsx +2 -2
  293. package/src/client/about/about-view.test.ts +13 -3
  294. package/src/client/about/about-view.ts +10 -6
  295. package/src/client/about/release-notes-view.test.ts +14 -4
  296. package/src/client/about/release-notes-view.ts +4 -2
  297. package/src/client/api.ts +18 -6
  298. package/src/client/chat/ChatEntryView.tsx +411 -0
  299. package/src/client/chat/RollbackDiffTab.tsx +108 -0
  300. package/src/client/chat/RollbackFileIcon.tsx +96 -0
  301. package/src/client/chat/RollbackReviewDialog.tsx +607 -0
  302. package/src/client/chat/chat-entry-view.test.ts +1174 -0
  303. package/src/client/chat/chat-entry-view.ts +758 -0
  304. package/src/client/chat/chat-locales.ts +152 -0
  305. package/src/client/chat/chat-node-registration.ts +64 -0
  306. package/src/client/chat/chat-point-window.ts +183 -0
  307. package/src/client/chat/chat-slots.ts +107 -0
  308. package/src/client/chat/rollback-diff-tab.test.ts +105 -0
  309. package/src/client/chat/rollback-diff-tab.ts +174 -0
  310. package/src/client/chat/rollback-entry-view.test.ts +1469 -0
  311. package/src/client/chat/rollback-entry-view.ts +946 -0
  312. package/src/client/chat/sidebar-slots.ts +59 -0
  313. package/src/client/common/ConfirmDialog.tsx +7 -3
  314. package/src/client/common/ContentPicker.tsx +48 -10
  315. package/src/client/common/DiffTable.tsx +133 -0
  316. package/src/client/common/ErrorBanner.tsx +4 -4
  317. package/src/client/common/Icon.tsx +2 -0
  318. package/src/client/common/Modal.tsx +8 -1
  319. package/src/client/common/ProgressBar.tsx +8 -2
  320. package/src/client/common/ReportView.tsx +4 -4
  321. package/src/client/common/RunsCenter.tsx +1 -0
  322. package/src/client/common/client-route-parity.test.ts +84 -0
  323. package/src/client/common/info-hint-guard.test.ts +46 -13
  324. package/src/client/common/picker-lazy-units.test.ts +42 -0
  325. package/src/client/common/plan-text-redaction.test.ts +17 -6
  326. package/src/client/common/progress-view-edge.test.ts +8 -7
  327. package/src/client/common/progress-view.test.ts +9 -9
  328. package/src/client/common/progress-view.ts +2 -2
  329. package/src/client/common/routes.ts +38 -0
  330. package/src/client/common/section-labels.test.ts +1 -0
  331. package/src/client/common/section-labels.ts +2 -0
  332. package/src/client/common/ui.tsx +73 -10
  333. package/src/client/config-manager.module.css +1109 -31
  334. package/src/client/css-scale-guard.test.ts +30 -0
  335. package/src/client/environment/EnvironmentPanel.tsx +11 -4
  336. package/src/client/environment/maintenance/DiskUsageCard.tsx +23 -2
  337. package/src/client/export/ExportView.tsx +13 -8
  338. package/src/client/history/HistoryPanel.tsx +4 -3
  339. package/src/client/history/history-api.ts +2 -2
  340. package/src/client/history/history-locales.ts +5 -1
  341. package/src/client/home/HomePanel.tsx +29 -8
  342. package/src/client/import/ForeignImportView.tsx +4 -5
  343. package/src/client/import/ImportWizardView.tsx +5 -3
  344. package/src/client/import/import-wizard-split.test.ts +3 -1
  345. package/src/client/import/import-wizard-steps.tsx +9 -9
  346. package/src/client/index.ts +232 -3
  347. package/src/client/library/LibraryActions.tsx +32 -7
  348. package/src/client/library/LibraryPanel.tsx +23 -3
  349. package/src/client/library/RestorePlanView.tsx +9 -66
  350. package/src/client/locales.ts +62 -9
  351. package/src/client/lucide-icons.d.ts +1 -0
  352. package/src/client/market/MarketPanel.tsx +13 -2
  353. package/src/client/market/MyConfigsView.tsx +5 -4
  354. package/src/client/market/MyConfigsWizard.tsx +10 -8
  355. package/src/client/market/market-api.test.ts +9 -8
  356. package/src/client/market/market-api.ts +2 -2
  357. package/src/client/market/market-locales.ts +3 -0
  358. package/src/client/market/market-view.test.ts +6 -6
  359. package/src/client/market/market-view.ts +3 -3
  360. package/src/client/market/my-configs-api.ts +2 -2
  361. package/src/client/market/my-configs-view.test.ts +23 -22
  362. package/src/client/market/my-configs-view.ts +8 -8
  363. package/src/client/recovery/IncompleteCopiesSection.tsx +2 -1
  364. package/src/client/recovery/RecoveryPanel.tsx +442 -283
  365. package/src/client/recovery/RollbackCard.tsx +859 -0
  366. package/src/client/recovery/RollbackDiffPane.tsx +69 -0
  367. package/src/client/recovery/RollbackFileChanges.tsx +163 -0
  368. package/src/client/recovery/incident-api.ts +2 -2
  369. package/src/client/recovery/recovery-api.ts +144 -6
  370. package/src/client/recovery/recovery-locales.test.ts +299 -0
  371. package/src/client/recovery/recovery-locales.ts +520 -149
  372. package/src/client/recovery/recovery-panel-layout.test.ts +132 -2
  373. package/src/client/recovery/rollback-enabled.ts +41 -0
  374. package/src/client/recovery/rollback-file-changes.test.ts +114 -0
  375. package/src/client/recovery/session-dialog-mount.test.ts +54 -0
  376. package/src/client/run-store.ts +84 -21
  377. package/src/client/sync/AutosyncCard.tsx +25 -1
  378. package/src/client/sync/ChannelClearConfirmDialog.tsx +6 -3
  379. package/src/client/sync/ChannelConfigDialog.tsx +10 -10
  380. package/src/client/sync/DecryptPasswordCard.tsx +2 -2
  381. package/src/client/sync/SecurityOptionsCard.tsx +27 -17
  382. package/src/client/sync/SyncChannelEntryCard.tsx +14 -2
  383. package/src/client/sync/SyncConfirmView.tsx +46 -8
  384. package/src/client/sync/SyncLogList.tsx +1 -1
  385. package/src/client/sync/SyncPanel.tsx +31 -23
  386. package/src/client/sync/SyncRepositoryPicker.tsx +3 -5
  387. package/src/client/sync/SyncSectionPickerDialog.tsx +11 -2
  388. package/src/client/sync/SyncSettingsView.test.ts +20 -1
  389. package/src/client/sync/UnreadableSnapshotsBanner.tsx +1 -1
  390. package/src/client/sync/WorkDirCard.tsx +112 -0
  391. package/src/client/sync/history-model.test.ts +42 -9
  392. package/src/client/sync/history-model.ts +30 -15
  393. package/src/client/sync/sync-api.test.ts +57 -33
  394. package/src/client/sync/sync-api.ts +80 -6
  395. package/src/client/sync/sync-locales.ts +104 -3
  396. package/src/client/sync/sync-view-v2.test.ts +65 -13
  397. package/src/client/sync/sync-view.test.ts +107 -52
  398. package/src/client/sync/sync-view.ts +124 -41
  399. package/src/core/analyzer.ts +31 -9
  400. package/src/core/backup-plan.test.ts +48 -5
  401. package/src/core/backup-plan.ts +51 -20
  402. package/src/core/backup-verify.ts +24 -23
  403. package/src/core/backup.test.ts +76 -0
  404. package/src/core/backup.ts +105 -29
  405. package/src/core/boot-rescue.ts +4 -3
  406. package/src/core/boot-safety.ts +2 -1
  407. package/src/core/command-rollback.test.ts +536 -0
  408. package/src/core/command-rollback.ts +406 -0
  409. package/src/core/consult-source.ts +7 -6
  410. package/src/core/disk-usage.test.ts +257 -1
  411. package/src/core/disk-usage.ts +134 -14
  412. package/src/core/engine-locale.test.ts +593 -0
  413. package/src/core/engine-locale.ts +175 -0
  414. package/src/core/exporter.ts +3 -3
  415. package/src/core/fork-reconcile.test.ts +279 -0
  416. package/src/core/fork-reconcile.ts +234 -0
  417. package/src/core/journal.ts +6 -5
  418. package/src/core/local-plugin-host.ts +3 -2
  419. package/src/core/local-plugin-pack.ts +11 -6
  420. package/src/core/messages-core.ts +661 -0
  421. package/src/core/messages.ts +125 -17
  422. package/src/core/migration-consult.ts +21 -20
  423. package/src/core/migration-history.ts +19 -5
  424. package/src/core/model-tools.ts +28 -27
  425. package/src/core/phase3-host.ts +21 -5
  426. package/src/core/phase3-p2b-fingerprint.test.ts +22 -0
  427. package/src/core/plugin-cli.ts +18 -19
  428. package/src/core/plugin-data-registry.test.ts +113 -0
  429. package/src/core/plugin-data-registry.ts +261 -0
  430. package/src/core/reconcile.test.ts +117 -0
  431. package/src/core/reconcile.ts +85 -17
  432. package/src/core/recovery-orchestrator.ts +19 -18
  433. package/src/core/reinstall.ts +26 -21
  434. package/src/core/restore.ts +20 -17
  435. package/src/core/rollback-file-diff.test.ts +159 -0
  436. package/src/core/rollback-gate.test.ts +66 -0
  437. package/src/core/rollback-gate.ts +61 -0
  438. package/src/core/rollback-ignore-rules.ts +126 -0
  439. package/src/core/rollback-ledger.test.ts +655 -0
  440. package/src/core/rollback-ledger.ts +1314 -0
  441. package/src/core/rollback-point.test.ts +2853 -0
  442. package/src/core/rollback-point.ts +4340 -0
  443. package/src/core/rollback.ts +5 -3
  444. package/src/core/run-registry.ts +6 -5
  445. package/src/core/session-health.ts +15 -0
  446. package/src/core/session-meta.test.ts +117 -1
  447. package/src/core/session-meta.ts +149 -2
  448. package/src/core/session-title.test.ts +127 -0
  449. package/src/core/session-title.ts +189 -0
  450. package/src/core/startup-barrier.test.ts +69 -0
  451. package/src/core/startup-barrier.ts +27 -0
  452. package/src/core/transaction-coordinator.ts +4 -3
  453. package/src/core/types.ts +37 -1
  454. package/src/core/validator.ts +5 -4
  455. package/src/core/verify-recovery.ts +31 -30
  456. package/src/foreign/bundle.ts +3 -2
  457. package/src/foreign/continue.ts +2 -1
  458. package/src/foreign/crush.ts +2 -1
  459. package/src/foreign/file-budget.test.ts +2 -0
  460. package/src/foreign/gemini.ts +2 -1
  461. package/src/foreign/goose.ts +2 -1
  462. package/src/foreign/kilocode.ts +2 -1
  463. package/src/foreign/kimi.ts +2 -1
  464. package/src/foreign/messages.ts +44 -0
  465. package/src/foreign/mimocode.ts +2 -1
  466. package/src/foreign/openclaw.ts +2 -1
  467. package/src/foreign/opencode.ts +2 -1
  468. package/src/foreign/pi.ts +2 -1
  469. package/src/foreign/qoder.ts +2 -1
  470. package/src/foreign/qwen.ts +2 -1
  471. package/src/foreign/registry.test.ts +1 -1
  472. package/src/foreign/registry.ts +8 -7
  473. package/src/foreign/teleagent.ts +2 -1
  474. package/src/foreign/workbuddy.ts +2 -1
  475. package/src/foreign/zcode.ts +2 -1
  476. package/src/foreign/zed.ts +2 -1
  477. package/src/index.facade.test.ts +340 -1
  478. package/src/index.ts +876 -57
  479. package/src/market/git-file-writer.ts +20 -19
  480. package/src/market/github-repos.test.ts +23 -0
  481. package/src/market/github-repos.ts +37 -19
  482. package/src/market/index-parser.ts +31 -30
  483. package/src/market/messages-market.ts +325 -0
  484. package/src/market/my-repo.ts +32 -29
  485. package/src/market/prepare.ts +18 -15
  486. package/src/market/security.ts +20 -19
  487. package/src/market/types.ts +2 -1
  488. package/src/market/url.ts +2 -1
  489. package/src/migrations/index.ts +6 -5
  490. package/src/migrations/messages-migrations.ts +59 -0
  491. package/src/profiles/dsh-profile-launcher.ts +2 -1
  492. package/src/profiles/dsh-profile-runtime.ts +2 -1
  493. package/src/profiles/messages.ts +31 -0
  494. package/src/routes/backup.ts +18 -2
  495. package/src/routes/import.ts +3 -3
  496. package/src/routes/index.ts +1 -1
  497. package/src/routes/kit.ts +9 -3
  498. package/src/routes/market.ts +1 -1
  499. package/src/routes/messages.ts +106 -0
  500. package/src/routes/prefs.ts +31 -2
  501. package/src/routes/profiles.ts +12 -6
  502. package/src/routes/recovery.test.ts +405 -1
  503. package/src/routes/recovery.ts +477 -94
  504. package/src/routes/snapshots.ts +51 -4
  505. package/src/routes/sync.ts +82 -17
  506. package/src/schema/config.ts +53 -20
  507. package/src/schema/index.ts +7 -5
  508. package/src/schema/manifest-schema.test.ts +4 -4
  509. package/src/schema/manifest.ts +19 -18
  510. package/src/schema/messages.ts +120 -0
  511. package/src/schema/registry.test.ts +28 -7
  512. package/src/schema/section-registry.ts +96 -42
  513. package/src/schema/types.ts +2 -1
  514. package/src/schema/versions.ts +6 -5
  515. package/src/security/encryption.ts +16 -15
  516. package/src/security/integrity.ts +8 -7
  517. package/src/security/messages.ts +87 -0
  518. package/src/security/redaction.test.ts +17 -1
  519. package/src/security/redaction.ts +13 -0
  520. package/src/security/secret-scanner.ts +19 -12
  521. package/src/security/security.test.ts +47 -0
  522. package/src/security/vault.ts +2 -1
  523. package/src/security/zip-security.ts +4 -3
  524. package/src/sync/ancestor.ts +2 -1
  525. package/src/sync/autosync-config.ts +21 -0
  526. package/src/sync/autosync-scheduler.test.ts +63 -7
  527. package/src/sync/autosync-scheduler.ts +118 -78
  528. package/src/sync/backup-files.ts +3 -2
  529. package/src/sync/backup-scheduler.ts +6 -5
  530. package/src/sync/blob-store.ts +2 -1
  531. package/src/sync/git/git-transport.test.ts +170 -8
  532. package/src/sync/git/git-transport.ts +176 -2
  533. package/src/sync/github-auth.ts +10 -9
  534. package/src/sync/layout.ts +13 -12
  535. package/src/sync/messages.ts +153 -0
  536. package/src/sync/review-queue.ts +6 -5
  537. package/src/sync/s3/messages.ts +16 -0
  538. package/src/sync/s3/s3-providers.ts +9 -6
  539. package/src/sync/s3/s3-transport.ts +1 -1
  540. package/src/sync/s3/sigv4.ts +3 -1
  541. package/src/sync/snapshot-crypto.ts +6 -5
  542. package/src/sync/snapshot-json.ts +3 -2
  543. package/src/sync/sync-credentials.test.ts +119 -0
  544. package/src/sync/sync-engine-download-tombstone.test.ts +1 -1
  545. package/src/sync/sync-engine.test.ts +226 -8
  546. package/src/sync/sync-engine.ts +154 -52
  547. package/src/sync/sync-history.ts +7 -6
  548. package/src/sync/sync-selection.test.ts +12 -2
  549. package/src/sync/sync-selection.ts +18 -5
  550. package/src/sync/transport.test.ts +1 -0
  551. package/src/sync/ui-prefs.test.ts +44 -1
  552. package/src/sync/ui-prefs.ts +39 -0
  553. package/src/sync/webdav/webdav-transport.ts +4 -1
  554. package/src/ui/artifact-view.ts +4 -3
  555. package/src/ui/commands.test.ts +1 -0
  556. package/src/ui/commands.ts +11 -1
  557. package/src/ui/diff-view.test.ts +9 -1
  558. package/src/ui/diff-view.ts +22 -0
  559. package/src/ui/disk-usage-view.test.ts +113 -6
  560. package/src/ui/disk-usage-view.ts +63 -7
  561. package/src/ui/errors.ts +4 -3
  562. package/src/ui/export-flow.ts +26 -20
  563. package/src/ui/foreign-view.test.ts +43 -0
  564. package/src/ui/foreign-view.ts +30 -3
  565. package/src/ui/i18n.ts +131 -2
  566. package/src/ui/import-wizard.ts +18 -10
  567. package/src/ui/progress.ts +2 -2
  568. package/src/ui/report.ts +7 -6
  569. package/src/ui/rollback-view.test.ts +836 -0
  570. package/src/ui/rollback-view.ts +1405 -0
  571. package/src/ui/selection-model.test.ts +33 -1
  572. package/src/ui/selection-model.ts +53 -0
  573. package/src/ui/session-inventory-view.test.ts +109 -0
  574. package/src/ui/session-inventory-view.ts +138 -3
  575. package/src/ui/session-issue-labels.test.ts +51 -0
  576. package/src/ui/session-issue-labels.ts +70 -0
  577. package/src/ui/sync-settings-view.test.ts +36 -0
  578. package/src/ui/sync-settings-view.ts +49 -0
  579. package/src/ui/test-helpers.ts +2 -1
  580. package/src/ui/types.ts +10 -4
  581. package/src/utils/atomic-write.ts +6 -5
  582. package/src/utils/bundle-scan.test.ts +2 -2
  583. package/src/utils/bundle-scan.ts +12 -1
  584. package/src/utils/env-lock.ts +83 -49
  585. package/src/utils/json.ts +7 -5
  586. package/src/utils/messages-utils.ts +232 -0
  587. package/src/utils/proxy.test.ts +25 -0
  588. package/src/utils/proxy.ts +19 -5
  589. package/src/utils/recursive-walk.test.ts +43 -0
  590. package/src/utils/recursive-walk.ts +75 -1
  591. package/src/utils/session-log-repair.ts +10 -9
  592. package/src/utils/zip.ts +27 -26
  593. package/lib/core/checkpoint.d.ts +0 -362
  594. package/lib/core/checkpoint.js +0 -1309
  595. package/src/core/checkpoint.test.ts +0 -665
  596. package/src/core/checkpoint.ts +0 -1614
@@ -70,7 +70,7 @@ test('my-configs-view: validateMyConfigForm 名称必填(空 / 纯空白 →
70
70
  })
71
71
 
72
72
  test('my-configs-view: validateMyConfigForm 名称合法(trim 后非空)→ 无错误', () => {
73
- const errs = validateMyConfigForm({ ...EMPTY_MY_CONFIG_FORM, name: ' 我的配置 ' })
73
+ const errs = validateMyConfigForm({ ...EMPTY_MY_CONFIG_FORM, name: ' 我的配置 ' }, zhUiT)
74
74
  assert.equal(errs.name, null)
75
75
  })
76
76
 
@@ -159,7 +159,7 @@ test('my-configs-view: itemStatusFromHost pr-pending 无 prUrl → 空串兜底
159
159
  const st = itemStatusFromHost({ status: 'pr-pending' })
160
160
  assert.deepEqual(st, { kind: 'pending-pr', prUrl: '', prNumber: undefined })
161
161
  // 经徽章模板仍出文本(PR 待审核),链接缺省不炸
162
- const badge = itemStatusBadge(st)
162
+ const badge = itemStatusBadge(st, zhUiT)
163
163
  assert.equal(badge.kind, 'warn')
164
164
  assert.equal(badge.text, 'PR 待审核')
165
165
  })
@@ -167,7 +167,7 @@ test('my-configs-view: itemStatusFromHost pr-pending 无 prUrl → 空串兜底
167
167
  test('my-configs-view: itemStatusFromHost + toMyItemView 组合投影(Host 条目 → 视图行)', () => {
168
168
  const view = toMyItemView(
169
169
  { id: 'cfg-a', name: '我的配置', version: '1.0.0', categories: ['plugins'], author: 'alice' },
170
- itemStatusFromHost({ status: 'pr-pending', prUrl: 'https://github.com/x/pr/3' }),
170
+ itemStatusFromHost({ status: 'pr-pending', prUrl: 'https://github.com/x/pr/3' }), zhUiT
171
171
  )
172
172
  assert.equal(view.name, '我的配置')
173
173
  assert.deepEqual(view.status, { kind: 'pending-pr', prUrl: 'https://github.com/x/pr/3', prNumber: undefined })
@@ -180,7 +180,7 @@ test('my-configs-view: itemStatusFromHost + toMyItemView 组合投影(Host 条
180
180
  test('my-configs-view: toMyItemView 全字段透传(name/version/updatedAt/categories/author)', () => {
181
181
  const v = toMyItemView(
182
182
  item({ id: 'cfg-a', name: '我的配置', version: '1.2.0', updatedAt: '2026-08-20T10:00:00.000Z', categories: ['plugins'], author: 'alice' }),
183
- { kind: 'listed' },
183
+ { kind: 'listed' }, zhUiT
184
184
  )
185
185
  assert.equal(v.id, 'cfg-a')
186
186
  assert.equal(v.name, '我的配置')
@@ -191,7 +191,7 @@ test('my-configs-view: toMyItemView 全字段透传(name/version/updatedAt/cat
191
191
  })
192
192
 
193
193
  test('my-configs-view: toMyItemView 字段缺失兜底(name 回退 id;其余空串/空数组)', () => {
194
- const v = toMyItemView(item({ id: 'cfg-a' }), { kind: 'not-listed' })
194
+ const v = toMyItemView(item({ id: 'cfg-a' }), { kind: 'not-listed' }, zhUiT)
195
195
  assert.equal(v.name, 'cfg-a', 'name 缺省回退 id')
196
196
  assert.equal(v.version, '')
197
197
  assert.equal(v.updatedAt, '')
@@ -200,17 +200,17 @@ test('my-configs-view: toMyItemView 字段缺失兜底(name 回退 id;其余
200
200
  })
201
201
 
202
202
  test('my-configs-view: toMyItemView name 纯空白也回退 id', () => {
203
- const v = toMyItemView(item({ id: 'cfg-a', name: ' ' }), { kind: 'not-listed' })
203
+ const v = toMyItemView(item({ id: 'cfg-a', name: ' ' }), { kind: 'not-listed' }, zhUiT)
204
204
  assert.equal(v.name, 'cfg-a')
205
205
  })
206
206
 
207
207
  test('my-configs-view: toMyItemView 带 stars → 透传(仓库级 star 展示位)', () => {
208
- const v = toMyItemView(item({ id: 'cfg-a', stars: 42 }), { kind: 'listed' })
208
+ const v = toMyItemView(item({ id: 'cfg-a', stars: 42 }), { kind: 'listed' }, zhUiT)
209
209
  assert.equal(v.stars, 42)
210
210
  })
211
211
 
212
212
  test('my-configs-view: toMyItemView 无 stars → undefined(UI 不显示 ⭐)', () => {
213
- const v = toMyItemView(item({ id: 'cfg-a' }), { kind: 'not-listed' })
213
+ const v = toMyItemView(item({ id: 'cfg-a' }), { kind: 'not-listed' }, zhUiT)
214
214
  assert.equal(v.stars, undefined)
215
215
  })
216
216
 
@@ -222,7 +222,7 @@ test('my-configs-view: buildMyItemsView stars 随条目传播', () => {
222
222
  ],
223
223
  officialListedIds: new Set(['a', 'b']),
224
224
  openPrs: [],
225
- })
225
+ }, zhUiT)
226
226
  assert.equal(views[0]!.stars, 5)
227
227
  assert.equal(views[1]!.stars, undefined)
228
228
  })
@@ -230,15 +230,15 @@ test('my-configs-view: buildMyItemsView stars 随条目传播', () => {
230
230
  /* ---------------------------------------------------------------- 徽章模板 */
231
231
 
232
232
  test('my-configs-view: itemStatusBadge 三态 → 语义 kind(ok=已收录 / warn=PR 待审核 / info=未收录)', () => {
233
- const listed = itemStatusBadge({ kind: 'listed' })
233
+ const listed = itemStatusBadge({ kind: 'listed' }, zhUiT)
234
234
  assert.equal(listed.kind, 'ok')
235
235
  assert.equal(listed.text, '已收录')
236
- const pending = itemStatusBadge({ kind: 'pending-pr', prNumber: 3, prUrl: 'https://github.com/x/pr/3' })
236
+ const pending = itemStatusBadge({ kind: 'pending-pr', prNumber: 3, prUrl: 'https://github.com/x/pr/3' }, zhUiT)
237
237
  assert.equal(pending.kind, 'warn')
238
238
  assert.equal(pending.text, 'PR 待审核')
239
239
  assert.equal(pending.prUrl, 'https://github.com/x/pr/3')
240
240
  assert.equal(pending.prNumber, 3)
241
- const none = itemStatusBadge({ kind: 'not-listed' })
241
+ const none = itemStatusBadge({ kind: 'not-listed' }, zhUiT)
242
242
  assert.equal(none.kind, 'info')
243
243
  assert.equal(none.text, '未收录')
244
244
  })
@@ -253,7 +253,7 @@ test('my-configs-view: itemStatusBadge en 镜像(kind 不变,文案英文)
253
253
  /* ---------------------------------------------------------------- 列表装配与摘要 */
254
254
 
255
255
  test('my-configs-view: buildMyItemsView 空列表 → 空数组(边界)', () => {
256
- assert.deepEqual(buildMyItemsView({ items: [], officialListedIds: new Set(), openPrs: [] }), [])
256
+ assert.deepEqual(buildMyItemsView({ items: [], officialListedIds: new Set(), openPrs: [] }, zhUiT), [])
257
257
  })
258
258
 
259
259
  test('my-configs-view: buildMyItemsView 混合状态按 officialListedIds + openPr head 分支推导', () => {
@@ -265,7 +265,7 @@ test('my-configs-view: buildMyItemsView 混合状态按 officialListedIds + open
265
265
  ],
266
266
  officialListedIds: new Set(['a']),
267
267
  openPrs: [openPr({ number: 1, head: 'dsh-market-sync/b' })],
268
- })
268
+ }, zhUiT)
269
269
  assert.equal(views.length, 3)
270
270
  assert.deepEqual(views[0]?.status, { kind: 'listed' })
271
271
  assert.deepEqual(views[1]?.status, { kind: 'pending-pr', prNumber: 1, prUrl: 'https://github.com/xiajiajun516/dsh-config-market/pull/1' })
@@ -280,7 +280,7 @@ test('my-configs-view: buildMyItemsView open PR head 分支不匹配 → 仍视
280
280
  items: [item({ id: 'x', name: 'X' })],
281
281
  officialListedIds: new Set(),
282
282
  openPrs: [openPr({ number: 9, head: 'dsh-market-sync/other' })],
283
- })
283
+ }, zhUiT)
284
284
  assert.deepEqual(views[0]?.status, { kind: 'not-listed' })
285
285
  })
286
286
 
@@ -290,12 +290,13 @@ test('my-configs-view: summarizeMyItems 统计(空 → 全零;混合 → 分
290
290
  items: [item({ id: 'a' }), item({ id: 'b' }), item({ id: 'c' }), item({ id: 'd' })],
291
291
  officialListedIds: new Set(['a', 'b']),
292
292
  openPrs: [openPr({ number: 1, head: 'dsh-market-sync/c' })],
293
- })
293
+ }, zhUiT)
294
294
  assert.deepEqual(summarizeMyItems(views), { total: 4, listed: 2, pendingPr: 1, notListed: 1 })
295
295
  })
296
296
 
297
- test('my-configs-view: 引用 zhUiT 默认参数路径(makeUiT 之外的同语义断言)', () => {
298
- // zhUiT 是 makeUiT('zh') 的实例,行为一致;直接经导出函数默认参数走通
297
+ test('my-configs-view: 引用 zhUiT 显式翻译器路径(makeUiT 之外的同语义断言)', () => {
298
+ // zhUiT 是 makeUiT('zh') 的实例,行为一致;这些导出函数自 t3 起 t 为**必传**(不再有任何语言缺省),
299
+ // 因此这里显式传入 —— 断言与改造前逐字相同,覆盖的是「显式 zh 翻译器」这条路径
299
300
  assert.equal(itemStatusBadge({ kind: 'listed' }, zhUiT).text, '已收录')
300
301
  assert.equal(validateMyConfigForm({ ...EMPTY_MY_CONFIG_FORM, name: ' ' }, zhUiT).name, '名称不能为空')
301
302
  })
@@ -380,7 +381,7 @@ test('my-configs-view: toMyWizardSlice 去掉瞬态字段(validating/running/f
380
381
  })
381
382
 
382
383
  test('my-configs-view: restoreMyWizard(null) → EMPTY 语义(step select、瞬态归零、formErrors 无错)', () => {
383
- const w = restoreMyWizard(null)
384
+ const w = restoreMyWizard(null, zhUiT)
384
385
  assert.equal(w.mode, 'upload')
385
386
  assert.equal(w.step, 'select')
386
387
  assert.equal(w.zipPath, null)
@@ -410,7 +411,7 @@ test('my-configs-view: restoreMyWizard(slice) → 瞬态归零、formErrors 按
410
411
  result: uploadResult(),
411
412
  error: null,
412
413
  }
413
- const w = restoreMyWizard(slice)
414
+ const w = restoreMyWizard(slice, zhUiT)
414
415
  assert.equal(w.mode, 'update')
415
416
  assert.equal(w.step, 'form')
416
417
  assert.equal(w.zipPath, slice.zipPath)
@@ -424,9 +425,9 @@ test('my-configs-view: restoreMyWizard(slice) → 瞬态归零、formErrors 按
424
425
  assert.equal(w.error, null)
425
426
  assert.notEqual(w.form, slice.form, 'form 为新对象,不共享切片引用')
426
427
  // form.name 为空 → formErrors.name 重算为非 null
427
- const w2 = restoreMyWizard({ ...slice, form: { ...slice.form, name: ' ' } })
428
+ const w2 = restoreMyWizard({ ...slice, form: { ...slice.form, name: ' ' } }, zhUiT)
428
429
  assert.notEqual(w2.formErrors.name, null, '空白名称 → 重算出错误')
429
- assert.equal(w2.formErrors.name, validateMyConfigForm({ ...slice.form, name: ' ' }).name)
430
+ assert.equal(w2.formErrors.name, validateMyConfigForm({ ...slice.form, name: ' ' }, zhUiT).name)
430
431
  })
431
432
 
432
433
  test('my-configs-view: initialWizard(mode) → 指定模式、step select、空表单', () => {
@@ -16,7 +16,7 @@
16
16
  * 安全硬约束:本层只做展示推导,不接触 token / 凭据;PR URL 由调用方提供,
17
17
  * 渲染前仍过 redact() 兜底(与全站一致)。
18
18
  */
19
- import { zhUiT, type UiT } from '../../ui/i18n.ts'
19
+ import type { UiT } from '../../ui/i18n.ts'
20
20
  import type { UploadResult } from '../../market/my-repo.ts'
21
21
  import type { MarketDownloadResult } from '../../market/types.ts'
22
22
  import type { ImportResult, ItemResolution } from '../../core/types.ts'
@@ -100,7 +100,7 @@ export interface MyConfigFormErrors {
100
100
  }
101
101
 
102
102
  /** 表单校验:名称必填(trim 后非空)。描述/类别可选。 */
103
- export function validateMyConfigForm(form: MyConfigForm, t: UiT = zhUiT): MyConfigFormErrors {
103
+ export function validateMyConfigForm(form: MyConfigForm, t: UiT): MyConfigFormErrors {
104
104
  return { name: form.name.trim() === '' ? t('myConfigs.form.errorName') : null }
105
105
  }
106
106
 
@@ -200,7 +200,7 @@ export function toMyWizardSlice(w: MyWizardState): MyWizardSlice {
200
200
  * 持久化切片 → 全量状态(null → 全新向导)。瞬态字段归零(validating/running 恒 false),
201
201
  * formErrors 按 form 经 validateMyConfigForm 重算;form 拷贝新对象(不共享切片引用)。
202
202
  */
203
- export function restoreMyWizard(slice: MyWizardSlice | null): MyWizardState {
203
+ export function restoreMyWizard(slice: MyWizardSlice | null, t: UiT): MyWizardState {
204
204
  if (slice === null) return { ...EMPTY_MY_WIZARD, form: { ...EMPTY_MY_CONFIG_FORM } }
205
205
  return {
206
206
  mode: slice.mode,
@@ -211,7 +211,7 @@ export function restoreMyWizard(slice: MyWizardSlice | null): MyWizardState {
211
211
  validated: slice.validated,
212
212
  validationError: slice.validationError,
213
213
  form: { ...slice.form },
214
- formErrors: validateMyConfigForm(slice.form),
214
+ formErrors: validateMyConfigForm(slice.form, t),
215
215
  running: false,
216
216
  result: slice.result,
217
217
  error: slice.error,
@@ -301,7 +301,7 @@ export interface AutoFieldBadge {
301
301
  }
302
302
 
303
303
  /** 系统自动字段徽章列表(id/作者/版本/更新时间 → 「系统自动」徽章)。 */
304
- export function autoFieldBadges(t: UiT = zhUiT): AutoFieldBadge[] {
304
+ export function autoFieldBadges(t: UiT): AutoFieldBadge[] {
305
305
  const autoText = t('myConfigs.autoField')
306
306
  const labels: { field: MyConfigAutoField; label: string }[] = [
307
307
  { field: 'id', label: t('myConfigs.field.id') },
@@ -410,7 +410,7 @@ export function itemStatusFromHost(entry: {
410
410
  }
411
411
 
412
412
  /** 收录状态 → 徽章模板(ok=已收录 / warn=PR 待审核 / info=未收录)。 */
413
- export function itemStatusBadge(status: ItemStatus, t: UiT = zhUiT): ItemStatusBadge {
413
+ export function itemStatusBadge(status: ItemStatus, t: UiT): ItemStatusBadge {
414
414
  switch (status.kind) {
415
415
  case 'listed':
416
416
  return { kind: 'ok', text: t('myConfigs.status.listed') }
@@ -438,7 +438,7 @@ export interface MyItemView {
438
438
  }
439
439
 
440
440
  /** 条目投影:缺失字段给默认值(name 缺省回退 id;其余空串/空数组)。 */
441
- export function toMyItemView(item: MyItemSource, status: ItemStatus, t: UiT = zhUiT): MyItemView {
441
+ export function toMyItemView(item: MyItemSource, status: ItemStatus, t: UiT): MyItemView {
442
442
  return {
443
443
  id: item.id,
444
444
  name: item.name !== undefined && item.name.trim() !== '' ? item.name : item.id,
@@ -462,7 +462,7 @@ export interface MyItemsInput {
462
462
  }
463
463
 
464
464
  /** 列表级装配:每条目推导收录状态 + 投影 + 徽章(React 壳只渲染)。 */
465
- export function buildMyItemsView(input: MyItemsInput, t: UiT = zhUiT): MyItemView[] {
465
+ export function buildMyItemsView(input: MyItemsInput, t: UiT): MyItemView[] {
466
466
  return input.items.map((item) => {
467
467
  const officialListed = input.officialListedIds.has(item.id)
468
468
  const openPr = input.openPrs.find((p) => p.head === prBranchFor(item.id)) ?? null
@@ -13,6 +13,7 @@
13
13
  import { useState } from 'react'
14
14
 
15
15
  import { Badge, Button, Card } from '../common/ui.tsx'
16
+ import { InfoHint } from '../common/InfoHint.tsx'
16
17
  import { redact } from '../../security/redaction.ts'
17
18
  import css from '../config-manager.module.css'
18
19
  import type { TranslateNS } from '../client-types.ts'
@@ -75,9 +76,9 @@ export function IncompleteCopiesSection(props: IncompleteCopiesSectionProps) {
75
76
  <Card>
76
77
  <div className={css.statRow}>
77
78
  <strong>{t('recovery.incomplete.title')}</strong>
79
+ <InfoHint text={t('recovery.incomplete.hint')} label={t('common.infoHint')} />
78
80
  <Badge kind="warn">{String(rows.length)}</Badge>
79
81
  </div>
80
- <div className={css.hint}>{t('recovery.incomplete.hint')}</div>
81
82
  <div className={css.snapshotList}>
82
83
  {rows.map((row) => (
83
84
  <div key={row.name} className={css.snapshotRow}>