dsh-config-manager 0.1.71 → 0.1.72

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 (548) hide show
  1. package/README.md +111 -96
  2. package/README.zh-CN.md +207 -86
  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 +1 -1
  6. package/lib/adapters/index.js +1 -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 +18 -0
  10. package/lib/adapters/messages.js +50 -0
  11. package/lib/adapters/plugin-files.js +3 -2
  12. package/lib/adapters/plugins.js +4 -3
  13. package/lib/adapters/prompts.d.ts +1 -0
  14. package/lib/adapters/prompts.js +7 -1
  15. package/lib/adapters/self.d.ts +7 -1
  16. package/lib/adapters/self.js +1 -1
  17. package/lib/adapters/sessions.d.ts +1 -0
  18. package/lib/adapters/sessions.js +4 -2
  19. package/lib/adapters/ui.d.ts +2 -2
  20. package/lib/adapters/ui.js +25 -25
  21. package/lib/adapters/workspaces.d.ts +1 -0
  22. package/lib/adapters/workspaces.js +7 -3
  23. package/lib/cli/actions.d.ts +9 -1
  24. package/lib/cli/actions.js +5 -2
  25. package/lib/cli/help.js +23 -10
  26. package/lib/cli/index.d.ts +23 -0
  27. package/lib/cli/index.js +90 -32
  28. package/lib/cli/sessions-inspect.js +3 -1
  29. package/lib/cli/sessions-repair.js +25 -6
  30. package/lib/cli/web/page.d.ts +12 -0
  31. package/lib/cli/web/page.js +21 -12
  32. package/lib/cli/web/routes.js +2 -2
  33. package/lib/cli/web/server.js +4 -4
  34. package/lib/client.d.ts +1349 -490
  35. package/lib/client.js +43047 -36738
  36. package/lib/core/backup-plan.js +30 -17
  37. package/lib/core/backup-verify.js +24 -23
  38. package/lib/core/backup.d.ts +5 -0
  39. package/lib/core/backup.js +51 -25
  40. package/lib/core/boot-rescue.js +4 -3
  41. package/lib/core/boot-safety.js +2 -1
  42. package/lib/core/command-rollback.d.ts +178 -0
  43. package/lib/core/command-rollback.js +289 -0
  44. package/lib/core/consult-source.js +7 -6
  45. package/lib/core/disk-usage.d.ts +74 -10
  46. package/lib/core/disk-usage.js +67 -4
  47. package/lib/core/engine-locale.d.ts +87 -0
  48. package/lib/core/engine-locale.js +125 -0
  49. package/lib/core/exporter.js +3 -3
  50. package/lib/core/fork-reconcile.d.ts +128 -0
  51. package/lib/core/fork-reconcile.js +150 -0
  52. package/lib/core/journal.js +6 -5
  53. package/lib/core/local-plugin-host.js +3 -2
  54. package/lib/core/local-plugin-pack.js +11 -6
  55. package/lib/core/messages-core.d.ts +292 -0
  56. package/lib/core/messages-core.js +615 -0
  57. package/lib/core/messages.d.ts +60 -2
  58. package/lib/core/messages.js +116 -13
  59. package/lib/core/migration-consult.js +21 -20
  60. package/lib/core/migration-history.js +19 -5
  61. package/lib/core/model-tools.d.ts +0 -22
  62. package/lib/core/model-tools.js +50 -27
  63. package/lib/core/phase3-host.js +30 -5
  64. package/lib/core/plugin-cli.js +18 -19
  65. package/lib/core/reconcile.d.ts +2 -14
  66. package/lib/core/reconcile.js +87 -17
  67. package/lib/core/recovery-orchestrator.js +19 -18
  68. package/lib/core/reinstall.d.ts +4 -0
  69. package/lib/core/reinstall.js +26 -21
  70. package/lib/core/restore.js +20 -17
  71. package/lib/core/rollback-ignore-rules.d.ts +31 -0
  72. package/lib/core/rollback-ignore-rules.js +140 -0
  73. package/lib/core/rollback-point.d.ts +1208 -0
  74. package/lib/core/rollback-point.js +2993 -0
  75. package/lib/core/run-registry.js +6 -5
  76. package/lib/core/session-health.d.ts +15 -0
  77. package/lib/core/session-meta.d.ts +42 -2
  78. package/lib/core/session-meta.js +140 -1
  79. package/lib/core/session-title.d.ts +28 -0
  80. package/lib/core/session-title.js +185 -0
  81. package/lib/core/startup-barrier.d.ts +24 -0
  82. package/lib/core/startup-barrier.js +22 -0
  83. package/lib/core/transaction-coordinator.js +4 -3
  84. package/lib/core/types.d.ts +18 -1
  85. package/lib/core/validator.js +5 -4
  86. package/lib/core/verify-recovery.js +31 -30
  87. package/lib/foreign/bundle.js +3 -2
  88. package/lib/foreign/continue.js +2 -1
  89. package/lib/foreign/crush.js +2 -1
  90. package/lib/foreign/gemini.js +2 -1
  91. package/lib/foreign/goose.js +2 -1
  92. package/lib/foreign/kilocode.js +2 -1
  93. package/lib/foreign/kimi.js +2 -1
  94. package/lib/foreign/messages.d.ts +15 -0
  95. package/lib/foreign/messages.js +40 -0
  96. package/lib/foreign/mimocode.js +2 -1
  97. package/lib/foreign/openclaw.js +2 -1
  98. package/lib/foreign/opencode.js +2 -1
  99. package/lib/foreign/pi.js +2 -1
  100. package/lib/foreign/qoder.js +2 -1
  101. package/lib/foreign/qwen.js +2 -1
  102. package/lib/foreign/registry.js +7 -6
  103. package/lib/foreign/teleagent.js +2 -1
  104. package/lib/foreign/workbuddy.js +2 -1
  105. package/lib/foreign/zcode.js +2 -1
  106. package/lib/foreign/zed.js +2 -1
  107. package/lib/index.d.ts +223 -7
  108. package/lib/index.js +729 -54
  109. package/lib/market/git-file-writer.js +20 -19
  110. package/lib/market/github-repos.js +35 -19
  111. package/lib/market/index-parser.js +31 -30
  112. package/lib/market/messages-market.d.ts +138 -0
  113. package/lib/market/messages-market.js +305 -0
  114. package/lib/market/my-repo.d.ts +2 -2
  115. package/lib/market/my-repo.js +32 -29
  116. package/lib/market/prepare.js +18 -15
  117. package/lib/market/security.js +20 -19
  118. package/lib/market/types.js +2 -1
  119. package/lib/market/url.js +2 -1
  120. package/lib/migrations/index.js +6 -5
  121. package/lib/migrations/messages-migrations.d.ts +32 -0
  122. package/lib/migrations/messages-migrations.js +58 -0
  123. package/lib/profiles/dsh-profile-launcher.js +2 -1
  124. package/lib/profiles/dsh-profile-runtime.js +2 -1
  125. package/lib/profiles/messages.d.ts +7 -0
  126. package/lib/profiles/messages.js +27 -0
  127. package/lib/routes/backup.js +18 -2
  128. package/lib/routes/import.js +3 -3
  129. package/lib/routes/index.d.ts +1 -1
  130. package/lib/routes/kit.d.ts +3 -2
  131. package/lib/routes/kit.js +6 -1
  132. package/lib/routes/market.js +1 -1
  133. package/lib/routes/messages.d.ts +42 -0
  134. package/lib/routes/messages.js +100 -0
  135. package/lib/routes/profiles.js +12 -6
  136. package/lib/routes/recovery.js +378 -114
  137. package/lib/routes/snapshots.js +51 -4
  138. package/lib/routes/sync.js +68 -16
  139. package/lib/schema/config.d.ts +11 -1
  140. package/lib/schema/config.js +52 -20
  141. package/lib/schema/index.d.ts +8 -6
  142. package/lib/schema/index.js +8 -6
  143. package/lib/schema/manifest.js +19 -18
  144. package/lib/schema/messages.d.ts +47 -0
  145. package/lib/schema/messages.js +110 -0
  146. package/lib/schema/section-registry.d.ts +41 -14
  147. package/lib/schema/section-registry.js +35 -29
  148. package/lib/schema/versions.js +6 -5
  149. package/lib/security/encryption.js +16 -15
  150. package/lib/security/integrity.js +8 -7
  151. package/lib/security/messages.d.ts +30 -0
  152. package/lib/security/messages.js +77 -0
  153. package/lib/security/redaction.js +12 -0
  154. package/lib/security/secret-scanner.js +16 -13
  155. package/lib/security/vault.js +2 -1
  156. package/lib/security/zip-security.js +4 -3
  157. package/lib/sync/ancestor.js +2 -1
  158. package/lib/sync/autosync-config.d.ts +11 -0
  159. package/lib/sync/autosync-config.js +12 -0
  160. package/lib/sync/autosync-scheduler.d.ts +11 -1
  161. package/lib/sync/autosync-scheduler.js +115 -76
  162. package/lib/sync/backup-files.js +3 -2
  163. package/lib/sync/backup-scheduler.js +6 -5
  164. package/lib/sync/blob-store.js +2 -1
  165. package/lib/sync/git/git-transport.d.ts +55 -0
  166. package/lib/sync/git/git-transport.js +152 -2
  167. package/lib/sync/github-auth.js +10 -9
  168. package/lib/sync/layout.js +13 -12
  169. package/lib/sync/messages.d.ts +63 -0
  170. package/lib/sync/messages.js +149 -0
  171. package/lib/sync/review-queue.js +6 -5
  172. package/lib/sync/s3/messages.d.ts +7 -0
  173. package/lib/sync/s3/messages.js +16 -0
  174. package/lib/sync/s3/s3-providers.d.ts +4 -1
  175. package/lib/sync/s3/s3-providers.js +5 -5
  176. package/lib/sync/s3/s3-transport.js +1 -1
  177. package/lib/sync/s3/sigv4.js +2 -1
  178. package/lib/sync/snapshot-crypto.js +6 -5
  179. package/lib/sync/snapshot-json.js +3 -2
  180. package/lib/sync/sync-engine.d.ts +37 -15
  181. package/lib/sync/sync-engine.js +67 -37
  182. package/lib/sync/sync-history.js +7 -6
  183. package/lib/sync/sync-selection.d.ts +15 -4
  184. package/lib/sync/sync-selection.js +17 -5
  185. package/lib/sync/webdav/webdav-transport.d.ts +1 -0
  186. package/lib/sync/webdav/webdav-transport.js +4 -1
  187. package/lib/ui/artifact-view.js +4 -3
  188. package/lib/ui/commands.d.ts +1 -1
  189. package/lib/ui/commands.js +10 -0
  190. package/lib/ui/disk-usage-view.d.ts +33 -4
  191. package/lib/ui/disk-usage-view.js +29 -1
  192. package/lib/ui/errors.d.ts +1 -1
  193. package/lib/ui/errors.js +4 -3
  194. package/lib/ui/export-flow.js +24 -20
  195. package/lib/ui/foreign-view.d.ts +5 -1
  196. package/lib/ui/foreign-view.js +26 -2
  197. package/lib/ui/i18n.d.ts +65 -0
  198. package/lib/ui/i18n.js +114 -0
  199. package/lib/ui/import-wizard.d.ts +7 -0
  200. package/lib/ui/import-wizard.js +13 -10
  201. package/lib/ui/progress.d.ts +2 -2
  202. package/lib/ui/progress.js +1 -2
  203. package/lib/ui/report.d.ts +5 -5
  204. package/lib/ui/report.js +6 -6
  205. package/lib/ui/rollback-view.d.ts +756 -0
  206. package/lib/ui/rollback-view.js +724 -0
  207. package/lib/ui/selection-model.d.ts +41 -0
  208. package/lib/ui/selection-model.js +30 -0
  209. package/lib/ui/session-inventory-view.d.ts +97 -3
  210. package/lib/ui/session-inventory-view.js +76 -2
  211. package/lib/ui/session-issue-labels.d.ts +43 -0
  212. package/lib/ui/session-issue-labels.js +48 -0
  213. package/lib/ui/sync-settings-view.d.ts +33 -0
  214. package/lib/ui/sync-settings-view.js +40 -0
  215. package/lib/ui/types.d.ts +8 -3
  216. package/lib/ui/types.js +1 -1
  217. package/lib/utils/atomic-write.js +6 -5
  218. package/lib/utils/bundle-scan.d.ts +11 -1
  219. package/lib/utils/bundle-scan.js +12 -1
  220. package/lib/utils/env-lock.d.ts +10 -0
  221. package/lib/utils/env-lock.js +73 -46
  222. package/lib/utils/json.js +6 -5
  223. package/lib/utils/messages-utils.d.ts +96 -0
  224. package/lib/utils/messages-utils.js +216 -0
  225. package/lib/utils/proxy.js +18 -5
  226. package/lib/utils/recursive-walk.d.ts +22 -0
  227. package/lib/utils/recursive-walk.js +75 -1
  228. package/lib/utils/session-log-repair.js +10 -9
  229. package/lib/utils/zip.js +27 -26
  230. package/package.json +12 -2
  231. package/src/adapters/agent-instructions.ts +1 -1
  232. package/src/adapters/file-collection.test.ts +1 -0
  233. package/src/adapters/file-collection.ts +1 -1
  234. package/src/adapters/files.test.ts +27 -0
  235. package/src/adapters/index.ts +1 -1
  236. package/src/adapters/link-report.test.ts +22 -2
  237. package/src/adapters/link-report.ts +29 -4
  238. package/src/adapters/messages.ts +54 -0
  239. package/src/adapters/plugin-files.ts +3 -2
  240. package/src/adapters/plugins.ts +4 -3
  241. package/src/adapters/prompts.ts +7 -1
  242. package/src/adapters/self.test.ts +26 -0
  243. package/src/adapters/self.ts +8 -2
  244. package/src/adapters/sessions.ts +4 -2
  245. package/src/adapters/settings.test.ts +38 -1
  246. package/src/adapters/ui.test.ts +2 -2
  247. package/src/adapters/ui.ts +27 -26
  248. package/src/adapters/workspaces.ts +7 -3
  249. package/src/cli/actions.test.ts +28 -0
  250. package/src/cli/actions.ts +11 -2
  251. package/src/cli/help.ts +23 -10
  252. package/src/cli/index-guards.test.ts +193 -0
  253. package/src/cli/index.ts +106 -31
  254. package/src/cli/sessions-inspect.test.ts +15 -1
  255. package/src/cli/sessions-inspect.ts +3 -1
  256. package/src/cli/sessions-repair.test.ts +84 -0
  257. package/src/cli/sessions-repair.ts +33 -7
  258. package/src/cli/web/console-route-parity.test.ts +115 -0
  259. package/src/cli/web/page.ts +23 -12
  260. package/src/cli/web/routes.ts +2 -1
  261. package/src/cli/web/server.ts +4 -4
  262. package/src/cli/web/web.test.ts +2 -2
  263. package/src/client/ConfigManagerSection.tsx +30 -2
  264. package/src/client/about/AboutPanel.tsx +2 -2
  265. package/src/client/about/PluginUpdateDialog.tsx +1 -1
  266. package/src/client/about/ReleaseNotesDialog.tsx +2 -2
  267. package/src/client/about/about-view.test.ts +13 -3
  268. package/src/client/about/about-view.ts +10 -6
  269. package/src/client/about/release-notes-view.test.ts +14 -4
  270. package/src/client/about/release-notes-view.ts +4 -2
  271. package/src/client/api.ts +18 -6
  272. package/src/client/chat/ChatEntryView.tsx +391 -0
  273. package/src/client/chat/RollbackDiffTab.tsx +61 -0
  274. package/src/client/chat/RollbackFileIcon.tsx +96 -0
  275. package/src/client/chat/RollbackReviewDialog.tsx +591 -0
  276. package/src/client/chat/chat-entry-view.test.ts +1174 -0
  277. package/src/client/chat/chat-entry-view.ts +758 -0
  278. package/src/client/chat/chat-locales.ts +152 -0
  279. package/src/client/chat/chat-node-registration.ts +64 -0
  280. package/src/client/chat/chat-point-window.ts +173 -0
  281. package/src/client/chat/chat-slots.ts +107 -0
  282. package/src/client/chat/rollback-diff-tab.test.ts +105 -0
  283. package/src/client/chat/rollback-diff-tab.ts +164 -0
  284. package/src/client/chat/rollback-entry-view.test.ts +1469 -0
  285. package/src/client/chat/rollback-entry-view.ts +941 -0
  286. package/src/client/chat/sidebar-slots.ts +37 -0
  287. package/src/client/common/ConfirmDialog.tsx +7 -3
  288. package/src/client/common/ContentPicker.tsx +48 -10
  289. package/src/client/common/DiffTable.tsx +97 -0
  290. package/src/client/common/ErrorBanner.tsx +4 -4
  291. package/src/client/common/Icon.tsx +2 -0
  292. package/src/client/common/Modal.tsx +8 -1
  293. package/src/client/common/ProgressBar.tsx +8 -2
  294. package/src/client/common/ReportView.tsx +4 -4
  295. package/src/client/common/RunsCenter.tsx +1 -0
  296. package/src/client/common/client-route-parity.test.ts +78 -0
  297. package/src/client/common/info-hint-guard.test.ts +46 -13
  298. package/src/client/common/picker-lazy-units.test.ts +42 -0
  299. package/src/client/common/plan-text-redaction.test.ts +17 -6
  300. package/src/client/common/progress-view-edge.test.ts +8 -7
  301. package/src/client/common/progress-view.test.ts +9 -9
  302. package/src/client/common/progress-view.ts +2 -2
  303. package/src/client/common/routes.ts +28 -0
  304. package/src/client/common/ui.tsx +73 -10
  305. package/src/client/config-manager.module.css +996 -21
  306. package/src/client/css-scale-guard.test.ts +30 -0
  307. package/src/client/environment/EnvironmentPanel.tsx +11 -4
  308. package/src/client/environment/maintenance/DiskUsageCard.tsx +23 -2
  309. package/src/client/export/ExportView.tsx +13 -8
  310. package/src/client/history/HistoryPanel.tsx +4 -3
  311. package/src/client/history/history-api.ts +2 -2
  312. package/src/client/history/history-locales.ts +5 -1
  313. package/src/client/home/HomePanel.tsx +29 -8
  314. package/src/client/import/ForeignImportView.tsx +4 -5
  315. package/src/client/import/ImportWizardView.tsx +5 -3
  316. package/src/client/import/import-wizard-split.test.ts +3 -1
  317. package/src/client/import/import-wizard-steps.tsx +9 -9
  318. package/src/client/index.ts +186 -3
  319. package/src/client/library/LibraryActions.tsx +32 -7
  320. package/src/client/library/LibraryPanel.tsx +23 -3
  321. package/src/client/library/RestorePlanView.tsx +9 -66
  322. package/src/client/locales.ts +54 -5
  323. package/src/client/lucide-icons.d.ts +1 -0
  324. package/src/client/market/MarketPanel.tsx +13 -2
  325. package/src/client/market/MyConfigsView.tsx +5 -4
  326. package/src/client/market/MyConfigsWizard.tsx +10 -8
  327. package/src/client/market/market-api.test.ts +9 -8
  328. package/src/client/market/market-api.ts +2 -2
  329. package/src/client/market/market-locales.ts +3 -0
  330. package/src/client/market/market-view.test.ts +6 -6
  331. package/src/client/market/market-view.ts +3 -3
  332. package/src/client/market/my-configs-api.ts +2 -2
  333. package/src/client/market/my-configs-view.test.ts +23 -22
  334. package/src/client/market/my-configs-view.ts +8 -8
  335. package/src/client/recovery/IncompleteCopiesSection.tsx +2 -1
  336. package/src/client/recovery/RecoveryPanel.tsx +442 -283
  337. package/src/client/recovery/RollbackCard.tsx +665 -0
  338. package/src/client/recovery/RollbackDiffPane.tsx +58 -0
  339. package/src/client/recovery/RollbackFileChanges.tsx +163 -0
  340. package/src/client/recovery/incident-api.ts +2 -2
  341. package/src/client/recovery/recovery-api.ts +116 -6
  342. package/src/client/recovery/recovery-locales.test.ts +299 -0
  343. package/src/client/recovery/recovery-locales.ts +488 -149
  344. package/src/client/recovery/recovery-panel-layout.test.ts +132 -2
  345. package/src/client/recovery/rollback-file-changes.test.ts +73 -0
  346. package/src/client/recovery/session-dialog-mount.test.ts +54 -0
  347. package/src/client/run-store.ts +84 -21
  348. package/src/client/sync/AutosyncCard.tsx +25 -1
  349. package/src/client/sync/ChannelClearConfirmDialog.tsx +6 -3
  350. package/src/client/sync/ChannelConfigDialog.tsx +10 -10
  351. package/src/client/sync/DecryptPasswordCard.tsx +2 -2
  352. package/src/client/sync/SecurityOptionsCard.tsx +27 -17
  353. package/src/client/sync/SyncChannelEntryCard.tsx +14 -2
  354. package/src/client/sync/SyncConfirmView.tsx +46 -8
  355. package/src/client/sync/SyncLogList.tsx +1 -1
  356. package/src/client/sync/SyncPanel.tsx +31 -23
  357. package/src/client/sync/SyncRepositoryPicker.tsx +3 -5
  358. package/src/client/sync/SyncSectionPickerDialog.tsx +11 -2
  359. package/src/client/sync/SyncSettingsView.test.ts +20 -1
  360. package/src/client/sync/UnreadableSnapshotsBanner.tsx +1 -1
  361. package/src/client/sync/WorkDirCard.tsx +112 -0
  362. package/src/client/sync/history-model.test.ts +42 -9
  363. package/src/client/sync/history-model.ts +30 -15
  364. package/src/client/sync/sync-api.test.ts +57 -33
  365. package/src/client/sync/sync-api.ts +80 -6
  366. package/src/client/sync/sync-locales.ts +104 -3
  367. package/src/client/sync/sync-view-v2.test.ts +65 -13
  368. package/src/client/sync/sync-view.test.ts +107 -52
  369. package/src/client/sync/sync-view.ts +124 -41
  370. package/src/core/backup-plan.test.ts +28 -0
  371. package/src/core/backup-plan.ts +29 -17
  372. package/src/core/backup-verify.ts +24 -23
  373. package/src/core/backup.test.ts +76 -0
  374. package/src/core/backup.ts +55 -25
  375. package/src/core/boot-rescue.ts +4 -3
  376. package/src/core/boot-safety.ts +2 -1
  377. package/src/core/command-rollback.test.ts +536 -0
  378. package/src/core/command-rollback.ts +402 -0
  379. package/src/core/consult-source.ts +7 -6
  380. package/src/core/disk-usage.test.ts +257 -1
  381. package/src/core/disk-usage.ts +134 -14
  382. package/src/core/engine-locale.test.ts +593 -0
  383. package/src/core/engine-locale.ts +175 -0
  384. package/src/core/exporter.ts +3 -3
  385. package/src/core/fork-reconcile.test.ts +279 -0
  386. package/src/core/fork-reconcile.ts +234 -0
  387. package/src/core/journal.ts +6 -5
  388. package/src/core/local-plugin-host.ts +3 -2
  389. package/src/core/local-plugin-pack.ts +11 -6
  390. package/src/core/messages-core.ts +657 -0
  391. package/src/core/messages.ts +123 -17
  392. package/src/core/migration-consult.ts +21 -20
  393. package/src/core/migration-history.ts +19 -5
  394. package/src/core/model-tools.ts +28 -27
  395. package/src/core/phase3-host.ts +21 -5
  396. package/src/core/phase3-p2b-fingerprint.test.ts +22 -0
  397. package/src/core/plugin-cli.ts +18 -19
  398. package/src/core/reconcile.test.ts +117 -0
  399. package/src/core/reconcile.ts +85 -17
  400. package/src/core/recovery-orchestrator.ts +19 -18
  401. package/src/core/reinstall.ts +26 -21
  402. package/src/core/restore.ts +20 -17
  403. package/src/core/rollback-file-diff.test.ts +159 -0
  404. package/src/core/rollback-ignore-rules.ts +126 -0
  405. package/src/core/rollback-point.test.ts +2603 -0
  406. package/src/core/rollback-point.ts +3755 -0
  407. package/src/core/run-registry.ts +6 -5
  408. package/src/core/session-health.ts +15 -0
  409. package/src/core/session-meta.test.ts +117 -1
  410. package/src/core/session-meta.ts +149 -2
  411. package/src/core/session-title.test.ts +127 -0
  412. package/src/core/session-title.ts +189 -0
  413. package/src/core/startup-barrier.test.ts +69 -0
  414. package/src/core/startup-barrier.ts +27 -0
  415. package/src/core/transaction-coordinator.ts +4 -3
  416. package/src/core/types.ts +18 -1
  417. package/src/core/validator.ts +5 -4
  418. package/src/core/verify-recovery.ts +31 -30
  419. package/src/foreign/bundle.ts +3 -2
  420. package/src/foreign/continue.ts +2 -1
  421. package/src/foreign/crush.ts +2 -1
  422. package/src/foreign/file-budget.test.ts +2 -0
  423. package/src/foreign/gemini.ts +2 -1
  424. package/src/foreign/goose.ts +2 -1
  425. package/src/foreign/kilocode.ts +2 -1
  426. package/src/foreign/kimi.ts +2 -1
  427. package/src/foreign/messages.ts +44 -0
  428. package/src/foreign/mimocode.ts +2 -1
  429. package/src/foreign/openclaw.ts +2 -1
  430. package/src/foreign/opencode.ts +2 -1
  431. package/src/foreign/pi.ts +2 -1
  432. package/src/foreign/qoder.ts +2 -1
  433. package/src/foreign/qwen.ts +2 -1
  434. package/src/foreign/registry.ts +7 -6
  435. package/src/foreign/teleagent.ts +2 -1
  436. package/src/foreign/workbuddy.ts +2 -1
  437. package/src/foreign/zcode.ts +2 -1
  438. package/src/foreign/zed.ts +2 -1
  439. package/src/index.facade.test.ts +340 -1
  440. package/src/index.ts +813 -57
  441. package/src/market/git-file-writer.ts +20 -19
  442. package/src/market/github-repos.test.ts +23 -0
  443. package/src/market/github-repos.ts +37 -19
  444. package/src/market/index-parser.ts +31 -30
  445. package/src/market/messages-market.ts +325 -0
  446. package/src/market/my-repo.ts +32 -29
  447. package/src/market/prepare.ts +18 -15
  448. package/src/market/security.ts +20 -19
  449. package/src/market/types.ts +2 -1
  450. package/src/market/url.ts +2 -1
  451. package/src/migrations/index.ts +6 -5
  452. package/src/migrations/messages-migrations.ts +59 -0
  453. package/src/profiles/dsh-profile-launcher.ts +2 -1
  454. package/src/profiles/dsh-profile-runtime.ts +2 -1
  455. package/src/profiles/messages.ts +31 -0
  456. package/src/routes/backup.ts +18 -2
  457. package/src/routes/import.ts +3 -3
  458. package/src/routes/index.ts +1 -1
  459. package/src/routes/kit.ts +9 -3
  460. package/src/routes/market.ts +1 -1
  461. package/src/routes/messages.ts +104 -0
  462. package/src/routes/profiles.ts +12 -6
  463. package/src/routes/recovery.test.ts +405 -1
  464. package/src/routes/recovery.ts +377 -109
  465. package/src/routes/snapshots.ts +51 -4
  466. package/src/routes/sync.ts +67 -16
  467. package/src/schema/config.ts +53 -20
  468. package/src/schema/index.ts +7 -5
  469. package/src/schema/manifest.ts +19 -18
  470. package/src/schema/messages.ts +120 -0
  471. package/src/schema/registry.test.ts +19 -5
  472. package/src/schema/section-registry.ts +64 -39
  473. package/src/schema/versions.ts +6 -5
  474. package/src/security/encryption.ts +16 -15
  475. package/src/security/integrity.ts +8 -7
  476. package/src/security/messages.ts +87 -0
  477. package/src/security/redaction.test.ts +17 -1
  478. package/src/security/redaction.ts +13 -0
  479. package/src/security/secret-scanner.ts +19 -12
  480. package/src/security/security.test.ts +47 -0
  481. package/src/security/vault.ts +2 -1
  482. package/src/security/zip-security.ts +4 -3
  483. package/src/sync/ancestor.ts +2 -1
  484. package/src/sync/autosync-config.ts +21 -0
  485. package/src/sync/autosync-scheduler.test.ts +63 -7
  486. package/src/sync/autosync-scheduler.ts +118 -78
  487. package/src/sync/backup-files.ts +3 -2
  488. package/src/sync/backup-scheduler.ts +6 -5
  489. package/src/sync/blob-store.ts +2 -1
  490. package/src/sync/git/git-transport.test.ts +170 -8
  491. package/src/sync/git/git-transport.ts +176 -2
  492. package/src/sync/github-auth.ts +10 -9
  493. package/src/sync/layout.ts +13 -12
  494. package/src/sync/messages.ts +153 -0
  495. package/src/sync/review-queue.ts +6 -5
  496. package/src/sync/s3/messages.ts +16 -0
  497. package/src/sync/s3/s3-providers.ts +9 -6
  498. package/src/sync/s3/s3-transport.ts +1 -1
  499. package/src/sync/s3/sigv4.ts +3 -1
  500. package/src/sync/snapshot-crypto.ts +6 -5
  501. package/src/sync/snapshot-json.ts +3 -2
  502. package/src/sync/sync-engine-download-tombstone.test.ts +1 -1
  503. package/src/sync/sync-engine.test.ts +226 -8
  504. package/src/sync/sync-engine.ts +103 -41
  505. package/src/sync/sync-history.ts +7 -6
  506. package/src/sync/sync-selection.test.ts +12 -2
  507. package/src/sync/sync-selection.ts +18 -5
  508. package/src/sync/webdav/webdav-transport.ts +4 -1
  509. package/src/ui/artifact-view.ts +4 -3
  510. package/src/ui/commands.test.ts +1 -0
  511. package/src/ui/commands.ts +11 -1
  512. package/src/ui/disk-usage-view.test.ts +113 -6
  513. package/src/ui/disk-usage-view.ts +63 -7
  514. package/src/ui/errors.ts +4 -3
  515. package/src/ui/export-flow.ts +24 -20
  516. package/src/ui/foreign-view.test.ts +43 -0
  517. package/src/ui/foreign-view.ts +30 -3
  518. package/src/ui/i18n.ts +125 -0
  519. package/src/ui/import-wizard.ts +18 -10
  520. package/src/ui/progress.ts +2 -2
  521. package/src/ui/report.ts +7 -6
  522. package/src/ui/rollback-view.test.ts +819 -0
  523. package/src/ui/rollback-view.ts +1339 -0
  524. package/src/ui/selection-model.test.ts +33 -1
  525. package/src/ui/selection-model.ts +53 -0
  526. package/src/ui/session-inventory-view.test.ts +109 -0
  527. package/src/ui/session-inventory-view.ts +138 -3
  528. package/src/ui/session-issue-labels.test.ts +51 -0
  529. package/src/ui/session-issue-labels.ts +70 -0
  530. package/src/ui/sync-settings-view.test.ts +36 -0
  531. package/src/ui/sync-settings-view.ts +49 -0
  532. package/src/ui/types.ts +10 -4
  533. package/src/utils/atomic-write.ts +6 -5
  534. package/src/utils/bundle-scan.test.ts +2 -2
  535. package/src/utils/bundle-scan.ts +12 -1
  536. package/src/utils/env-lock.ts +83 -49
  537. package/src/utils/json.ts +7 -5
  538. package/src/utils/messages-utils.ts +232 -0
  539. package/src/utils/proxy.test.ts +25 -0
  540. package/src/utils/proxy.ts +19 -5
  541. package/src/utils/recursive-walk.test.ts +43 -0
  542. package/src/utils/recursive-walk.ts +75 -1
  543. package/src/utils/session-log-repair.ts +10 -9
  544. package/src/utils/zip.ts +27 -26
  545. package/lib/core/checkpoint.d.ts +0 -362
  546. package/lib/core/checkpoint.js +0 -1309
  547. package/src/core/checkpoint.test.ts +0 -665
  548. package/src/core/checkpoint.ts +0 -1614
package/README.zh-CN.md CHANGED
@@ -60,11 +60,11 @@ DSH 是你的 AI 助手工作台,里面存着你的各种设置:模型配置
60
60
 
61
61
  ### 在多台电脑间同步 DSH 配置
62
62
 
63
- 通过私有 Git 仓库或 WebDAV 在多台电脑间保持可移植配置同步——密钥默认不参与同步(同步载荷会被 SecretScanner 剥离);勾选「导出密钥」并设置加密密码后,`~/.dsh/.credentials.yaml` 会以 scrypt + AES-256-GCM 密文随加密快照上行,换机后可随同步写回本机凭据,远端(Git 仓库 / WebDAV 服务商)全程只见密文。
63
+ 通过私有 Git 仓库、WebDAV、S3 兼容对象存储(AWS S3 / 阿里云 OSS / 腾讯 COS / MinIO / 七牛 Kodo)或 GitHub Gist 在多台电脑间保持可移植配置同步——密钥默认不参与同步(同步载荷会被 SecretScanner 剥离);勾选「导出密钥」并设置加密密码后,`~/.dsh/.credentials.yaml` 会以 scrypt + AES-256-GCM 密文随加密快照上行,换机后可随同步写回本机凭据,远端(仓库 / WebDAV / 对象存储 / Gist)全程只见密文。
64
64
 
65
65
  ### 定时自动全量备份
66
66
 
67
- 开启定时备份(6h / 12h / 24h / 7d),DSH 会在后台按固定周期悄悄保留一份全新的全量配置备份——密钥永不包含,无需密码也能安心躺在磁盘上。
67
+ 在首页的「定时备份」卡里开启(6h / 12h / 24h / 7d,或自定义「每周固定星期与时刻」),DSH 会在后台按周期悄悄保留一份全新的全量配置备份——密钥永不包含,无需密码也能安心躺在磁盘上;保留多少份由同一张卡的「保留策略」(最近 N 份 + 每月 1 份 + 每年 1 份)决定,连续失败会在卡里标红。
68
68
 
69
69
  ### 从配置市场发现并安装共享配置
70
70
 
@@ -83,7 +83,7 @@ DSH 生态里这个方向有几个插件,它们解决的问题并不相同—
83
83
  | 插件 | 最擅长 | 本插件更进一步的地方 |
84
84
  |---|---|---|
85
85
  | [xiaoyuyu6420/dsh-backup](https://github.com/xiaoyuyu6420/dsh-backup) | 一条命令从 CLI 给整个 `~/.dsh` 打快照,另有会话体检 / 升级快照 / 救援控制台 | 写盘前可审阅的 GUI 流程(dry-run 预览、冲突逐项决策、失败自动回滚)、跨机路径重映射、加密凭据载荷、配置市场 |
86
- | [muyifc/dsh-config-sync](https://github.com/muyifc/dsh-config-sync) | 把 DSH 配置导出/导入成可移植的密码加密文件,可被工具调用 | 13–14 个分区(插件 / MCP / 技能 / 工作区 / 会话日志 …)、定时备份、Git + WebDAV 双通道同步、会话跨机迁移与路径重定基 |
86
+ | [muyifc/dsh-config-sync](https://github.com/muyifc/dsh-config-sync) | 把 DSH 配置导出/导入成可移植的密码加密文件,可被工具调用 | 13–14 个分区(插件 / MCP / 技能 / 工作区 / 会话日志 …)、定时备份、四条同步通道(Git / WebDAV / 对象存储 / Gist)、会话跨机迁移与路径重定基 |
87
87
  | [dickpy/dsh-cloud-sync](https://github.com/dickpy/dsh-cloud-sync) · [weibaohui/dsh-sync](https://github.com/weibaohui/dsh-sync) | 通过 WebDAV / S3 或私有 Git 镜像让多台机器保持一致 | 同步只是本插件五项能力之一——另有导出/导入、定时备份、配置市场与档案实例启停 |
88
88
  | `cp -r ~/.dsh`(或给 home 目录挂 Git) | 免费、零配置,纯文本配置够用 | 不处理密钥、不做路径重映射、抓不到 `link:` / `file:` 安装的本地插件、不动会话日志、没有冲突处理与回滚 |
89
89
 
@@ -95,24 +95,24 @@ DSH 生态里这个方向有几个插件,它们解决的问题并不相同—
95
95
 
96
96
  | 图标 | 功能 | 一句话说明 |
97
97
  |:---:|---|---|
98
- | 🚀 | **一键导出** | 点一下,把推荐配置打包成一个 ZIP |
98
+ | 🚀 | **一键导出** | 打开导出流程,默认已勾好推荐分区,点一下打包成 ZIP(可逐分区 / 逐条目调整) |
99
99
  | 📦 | **一键导入** | 在另一台电脑点一下,环境就回来了 |
100
- | 👀 | **先预览再导入** | 导入前完整预览,**绝不偷偷改你的配置** |
101
- | ⚔️ | **冲突处理** | 遇到同名配置,让你自己选:保留现有的 / 用导入的 |
100
+ | 👀 | **先预览再导入** | 先看「迁移前咨询」的结论与依据,再逐项选内容、逐项解决冲突,**绝不偷偷改你的配置** |
101
+ | ⚔️ | **冲突处理** | 遇到同名配置,让你自己选:保留当前 / 使用备份(可批量) |
102
102
  | 🗺️ | **路径自动映射** | 换了电脑路径变了?自动检测并让你重新指定 |
103
103
  | 🔒 | **密钥安全** | API Key 默认不导出;非加密导入后提醒重新填写,加密备份用密码解锁恢复 |
104
104
  | ↩️ | **自动回滚** | 导入失败自动恢复原样,不会弄坏现有配置 |
105
- | 📸 | **快照恢复** | 撤销一次导入:整文件还原 + 卸载新增插件(CLI 与 GUI 均支持) |
106
- | 🔄 | **远程同步** | 通过 **Git 私有仓库或 WebDAV** 推送 / 拉取可移植配置(密钥默认不参与同步;加密快照可选携带密文凭据) |
107
- | ⏰ | **定时全量备份** | 按固定周期(6h / 12h / 24h / 7d)自动全量备份,一劳永逸,密钥永不包含 |
108
- | 🛒 | **配置市场** | 浏览并一键安装社区分享的配置——供应链警示 + 逐项内容选择(可就地看到改动与高风险分区) |
109
- | 🗂️ | **档案 Profiles(DSH profile)** | 直接管理 `$DSH_HOME/profiles/<name>`:列表 / 新建(官方模板)/ 重命名 / 物理删除 / **启动该档案(独立实例)** / **停止实例**(行内按钮按运行状态在「启动 ↔ 停止」间切换) |
105
+ | 📸 | **快照恢复** | 在产物库对某份导入前快照点「恢复」:先看逐行对照的恢复计划,确认后整文件还原 + 卸载新增插件(CLI 与 GUI 均支持) |
106
+ | 🔄 | **远程同步** | 通过 **Git 私有仓库 / WebDAV / S3 兼容对象存储 / GitHub Gist** 推送 / 拉取可移植配置,四条通道各配各的(密钥默认不参与同步;加密快照可选携带密文凭据) |
107
+ | ⏰ | **定时全量备份** | 按固定周期(6h / 12h / 24h / 7d 或自定义每周固定时刻)自动全量备份,一劳永逸,密钥永不包含 |
108
+ | 🛒 | **配置市场** | 浏览并一键安装社区分享的配置——供应链警示 + 逐项内容选择(可就地看到改动与高风险分区);入口在产物库底栏「逛市场 / 发布到市场」或 ⌘K |
109
+ | 🗂️ | **档案 Profiles(DSH profile)** | 在「环境 → 档案」里直接管理 `$DSH_HOME/profiles/<name>`:列表 / 新建(官方模板)/ 重命名 / 物理删除 / **启动该档案(独立实例)** / **停止实例**(行内按钮按运行状态在「启动 ↔ 停止」间切换) |
110
110
  | 🧩 | **本地插件随备份迁移** | `link:` / `file:` 安装的本地开发插件会被打包进备份,换机不再丢失 |
111
111
  | 🗄️ | **保留策略可配(GFS 分层)** | 「最近 N 份 + 每月留 1 份 + 每年留 1 份」,默认值等价旧行为 |
112
112
  | 🌐 | **双语界面** | 界面、报告与错误详情跟随 DSH 应用语言(中文 / English) |
113
113
  | 🤖 | **Agent 工具** | Agent 会话内直接备份 / 快照 / 恢复 / 同步 |
114
- | 💾 | **磁盘占用体检** | 备份页逐项列出本插件自身占了多少盘(备份 / 快照 / 同步副本 / 缓存 / 暂存),三档回收策略一目了然;**一键清理只碰可重建缓存与过期备份**,快照与同步数据永不在此删除 |
115
- | ⬆️ | **版本更新检查** | 「关于」页只读探测 npm 上的最新版本(缓存 10 分钟);有新版本时既给可复制的升级命令,也提供一键**立即更新**(按该精确版本安装)——之后需重启 DSH 才生效,插件绝不代你重启;离线失败如实显示,不影响其它功能 |
114
+ | 💾 | **磁盘占用体检** | 「环境 → 维护与诊断」逐项列出本插件自身占了多少盘(备份 / 快照 / 同步副本 / 缓存 / 暂存),三档回收策略一目了然;**一键清理只碰可重建缓存与过期备份**,快照与同步数据永不在此删除 |
115
+ | ⬆️ | **版本更新检查** | 「关于」面板(导航右上角的图标)只读探测 npm 上的最新版本(缓存 10 分钟);有新版本时既给可复制的升级命令,也提供一键**立即更新**(按该精确版本安装)——之后需重启 DSH 才生效,插件绝不代你重启;离线失败如实显示,不影响其它功能 |
116
116
  | 🧭 | **兼容性讲清楚** | 导入前显示「来源 DSH 版本 / 平台 → 本机」,并用**结构化原因**解释评分(跨平台 / 分区缺失 / 版本超前…),而不是只丢一句「部分兼容」 |
117
117
  | 🧳 | **从其它 AI Agent 导入** | 读取本机 Claude Code / Cursor / Codex / Hermes / Antigravity 等的配置**与历史会话**,翻译成标准 bundle,再走既有的预览 / 冲突 / 回滚流程导入 |
118
118
 
@@ -120,21 +120,13 @@ DSH 生态里这个方向有几个插件,它们解决的问题并不相同—
120
120
 
121
121
  ## 📸 功能截图
122
122
 
123
- | 总览 | 备份与快照 |
123
+ | 首页 | 产物库 |
124
124
  |:---:|:---:|
125
- | ![总览](assets/screenshot-overview-zh.png) | ![备份与快照](assets/screenshot-backups-zh.png) |
125
+ | ![首页](assets/screenshot-overview-zh.png) | ![产物库](assets/screenshot-backups-zh.png) |
126
126
 
127
- | 导出备份 | 导入预览 |
127
+ | 同步(四条通道卡) | 环境 · 档案 |
128
128
  |:---:|:---:|
129
- | ![一键导出](assets/screenshot-export-zh.png) | ![导入预览](assets/screenshot-import-zh.png) |
130
-
131
- | 远程同步 | 配置市场 |
132
- |:---:|:---:|
133
- | ![远程同步](assets/screenshot-sync-zh.png) | ![配置市场](assets/screenshot-market-zh.png) |
134
-
135
- | 档案 Profiles |
136
- |:---:|
137
- | ![档案 Profiles](assets/screenshot-profiles-zh.png) |
129
+ | ![同步](assets/screenshot-sync-zh.png) | ![环境 · 档案](assets/screenshot-profiles-zh.png) |
138
130
 
139
131
  ---
140
132
 
@@ -152,10 +144,11 @@ DSH 生态里这个方向有几个插件,它们解决的问题并不相同—
152
144
 
153
145
  ```
154
146
  选择 ZIP → 校验文件 → 检查完整性 → 检查版本 → 兼容性检查
155
- → 扫描内容 → 生成导入计划 → 预览确认
156
- → 自动备份当前配置 → 执行导入 → 验证 → 完成
147
+ → 扫描内容 → 生成导入计划 → 迁移前咨询(结论 + 依据)
148
+ → 选择要导入的内容 → 冲突逐项决策 → 路径映射 / 补录密钥
149
+ → 确认导入 → 自动备份当前配置 → 执行导入 → 验证 → 完成
157
150
  │
158
- └─ 中途失败?→ 自动恢复原样(回滚)
151
+ └─ 中途失败?→ 自动恢复原样(回滚,可在确认页关闭)
159
152
  ```
160
153
 
161
154
  ---
@@ -196,7 +189,7 @@ dsh plugin --profile web add dsh-config-manager@latest
196
189
  > dsh plugin --profile web add "dsh-config-manager@$(npm view dsh-config-manager version)"
197
190
  > ```
198
191
  >
199
- > 重启 DSH 后,可在 **设置 → 备份与迁移 → 关于** 看到实际运行的版本(版本变化时也会自动弹出更新内容)。
192
+ > 重启 DSH 后,可在 **设置 → 备份与迁移 → 导航右上角的「关于」图标** 看到实际运行的版本(版本变化时也会自动弹出更新内容)。
200
193
 
201
194
  ### 从 GitHub 源码安装(`git+https://...`)
202
195
 
@@ -248,40 +241,53 @@ allowBuilds:
248
241
 
249
242
  ## 🚀 快速上手(3 分钟体验)
250
243
 
244
+ > **界面速览**:一级只有 4 页 —— **首页**(这台机器现在怎么样 + 立即备份 / 导出 / 导入 / 远程同步四个动作)、**产物库**(本机快照 / 备份文件 / 远端快照 / 市场配置,所有「东西」都在这张列表里)、**同步**(Git / WebDAV / 对象存储 / Gist 四张通道卡)、**环境**(档案 / 维护与诊断)。**导出、导入、逛市场、发布到市场**是**流程面板**:从首页工具栏或产物库底栏打开,切到别的页就收起、切回来接着做。导航右上角四个图标分别是 ⌘K 命令面板、活动记录、迁移历史、关于。
245
+
251
246
  ```
252
247
  电脑 A(导出)
253
- 1. 打开 DSH → 设置 → 「备份与迁移」
254
- 2. 点「导出配置」→ 选「快速导出」
255
- 3. 得到一个 dsh-config-2026-08-14.zip(可确认报告里没有密钥)
248
+ 1. 打开 DSH → 设置 → 「备份与迁移」→ 首页
249
+ 2. 点工具栏「导出」→ 面板里默认已勾好推荐分区(要改就点「选择要导出的内容」逐分区 / 逐条目调整)
250
+ 3. 点「开始导出」→ 完成后自动下载得到 dsh-config-<日期>-<随机后缀>.zip(报告里可确认没有密钥)
256
251
 
257
252
  把 ZIP 拷到电脑 B(导入)
258
- 1. 打开 DSH → 「备份与迁移」→「导入配置」
259
- 2. 选择 ZIP → 等待分析 → 查看「导入预览」
260
- 3. 有路径问题?→ 选择新路径(可批量映射)
261
- 4. 有同名配置冲突?→ 选择 保留现有的 / 用导入的
262
- 5. 确认导入 → 等待完成
263
- 6. 按提示重新填写缺失的 API Key
264
- 7. ✅ 设置 / 插件 / MCP / 技能 / 工作区 / 全局指令(AGENTS.md)都回来了
253
+ 1. 打开 DSH → 「备份与迁移」→ 首页点「导入」(或产物库底栏「从文件导入」)
254
+ 2. 选择 ZIP → 等待分析 → 先读「迁移前咨询」的结论与依据 → 点「下一步:选择要导入的内容」
255
+ 3. 逐项勾选要导入的内容(不勾选的既不导入、也不进快照)
256
+ 4. 有路径问题?→ 在「路径映射」里填新路径(支持批量前缀映射)
257
+ 5. 有同名配置冲突?→ 逐项选「保留当前 / 使用备份」(可一键全选其一)
258
+ 6. 「确认导入」→ 等待执行(执行前自动创建安全快照;「失败时整体回滚」可在确认页关闭)
259
+ 7. 按提示补录缺失的 API Key
260
+ 8. ✅ 设置 / 插件 / MCP / 技能 / 工作区 / 全局指令(AGENTS.md)都回来了
265
261
  ```
266
262
 
267
263
  ---
268
264
 
269
265
  ## 🧩 功能详解
270
266
 
271
- ### 📤 导出(两种方式)
267
+ ### 📤 导出(一个流程 + 内容选择器)
268
+
269
+ 打开「导出」流程面板(首页工具栏「导出」,或产物库底栏「手动导出」),一屏完成:
272
270
 
273
- | 方式 | 说明 |
271
+ | 区域 | 说明 |
274
272
  |---|---|
275
- | **快速导出**(推荐) | 一键导出推荐配置:设置 / UI / 模型 / 插件 / MCP / 技能 / Agent 预设 / 全局指令(AGENTS.md)/ 工作区等 |
276
- | **自定义导出** | 自己勾选要导出的分类 |
273
+ | 选择要导出的内容 | 打开内容选择器:**分区 → 最小可拆单元**逐项勾选;默认已勾好推荐分区(可移植、非设备专属),随时可改 |
274
+ | 安全选项 | 「加密备份」(scrypt + AES-256-GCM)与「导出密钥」两个独立开关;勾选导出密钥会自动联动加密(密钥绝不明文) |
275
+ | 文件名与备注 | 自定义文件名与备注(备注让你在产物库里搜得到),非法字符由字段错误提示当场指出 |
276
+ | 本次将导出 | 恒常显示的构成卡:真正会进包的每个分区与条目数、合计大小;**读不到的分区如实显示「读取中 / 读取失败」,不伪报 0** |
277
+ | 结果 | 完成后**自动下载**到浏览器下载目录(报告里也可再下载);报告逐条列出分区与告警 |
278
+
279
+ > 导出只读、不写任何配置。文件内含清单 + 各分区数据 + SHA-256 校验和,默认命名 `dsh-config-<日期>-<6 位随机>.zip`(撞名自动递进,不覆盖已有备份)。
277
280
 
278
- > 导出文件:`dsh-config-<日期>.zip`,内含清单 + 各分类数据 + SHA-256 校验和。
281
+ **导出补充:**
282
+ - **导出前就能看**:构成卡在导出之前就给出会进包的分区与预估体积(不含密钥),不必先导出再翻报告
283
+ - **自定义文件名与备注**:文件名默认自动生成,也可自己起名;备注会显示在产物库的**「备份文件」**列表里(备注随 `self` 分区一起被备份 / 同步带走)
279
284
 
280
285
  ### 📥 导入(安全流程)
281
286
 
282
287
  - **未确认不写入**:分析、预览阶段零修改
283
288
  - **先备份再导入**:执行前自动备份将被修改的配置
284
289
  - **失败自动回滚**:按你的选择整体回滚或跳过失败项继续
290
+ - **导入后的下一步清单**:结果页会列出需要重启 DSH 的项(按插件 / MCP)、待补录的凭据,以及可重试的失败 / 跳过项
285
291
 
286
292
  ### 👀 导入预览(Dry Run)
287
293
 
@@ -299,8 +305,10 @@ allowBuilds:
299
305
 
300
306
  | 选项 | 含义 |
301
307
  |---|---|
302
- | **保留现有的** | 不动目标电脑的原配置 |
303
- | **用导入的** | 用备份里的配置覆盖 |
308
+ | **保留当前** | 不动目标机现有的配置 |
309
+ | **使用备份** | 用备份里的配置覆盖 |
310
+
311
+ 列表顶部还有「全部保留当前配置 / 全部使用备份配置」两个批量按钮。
304
312
 
305
313
  > 说明:刻意**不提供**「稍后决定 / 再看看」选项——未决的冲突会让导入无法继续,每个冲突都必须在继续前做出选择。
306
314
 
@@ -320,7 +328,7 @@ allowBuilds:
320
328
  - **会带走什么** —— MCP Servers、技能、全局指令(落成 `AGENTS.md`),以及**历史会话连同这些对话所属的工作区**(29 个来源;会话会重新编码成 DSH 的会话日志格式,并按它记录的 `cwd` 归位)。
321
329
  - **不会带走什么** —— 密钥**值**一律不读:只记录键名,由导入计划提示补录。DSH 没有对等结构的东西(Claude Code 的 hooks、斜杠命令等)会**报出明确的码**,不会静默丢掉。
322
330
  - **如实跳过** —— 没记录 `cwd` 的对话无处归位,会列为跳过(绝不猜进别的项目);已知的有损项在导入**之前**就摆明。
323
- - **入口** —— 设置 →「备份与迁移」→ 导入 → **「从其它 agent 导入」**、⌘K 命令,或 CLI:`dcm import --from <来源> [--dry-run] [--out <路径>]`。
331
+ - **入口** —— 首页工具栏「导入」→ 面板里的**「从其它 agent 导入」**(首页另有直达入口)、⌘K 的「从其它 agent 导入」,或 CLI:`dcm import --from <来源> [--dry-run] [--out <路径>]`。
324
332
 
325
333
  ### 🔒 密钥处理
326
334
 
@@ -331,27 +339,32 @@ allowBuilds:
331
339
  | 加密备份导入 | 必须输入导出时的加密密码解锁:输入→验证密码→凭据自动恢复,**无密码无法导入** |
332
340
  | 非加密导入后 | 提示「3 个密钥需要重新填写」,输入后仅保存在内存中写入 |
333
341
 
334
- ### 🔄 远程同步(Git / WebDAV)
342
+ ### 🔄 远程同步(四条通道)
335
343
 
336
- 通过**两种通道之一**在机器间推送 / 拉取可移植配置——除传输方式外,使用方式完全一致:
344
+ 「同步」页把每条通道列成一张卡,**四张恒显示**(未配置的是矮态,点卡里的按钮配置)——Git 私有仓库 / WebDAV 服务器 / 对象存储(S3 兼容:AWS S3、阿里云 OSS、腾讯 COS、MinIO、七牛 Kodo)/ GitHub Gist:
337
345
 
338
- | | Git 私有仓库 | WebDAV |
346
+ | 通道 | 端点(非密字段) | 凭据(只进 DSH credentials,绝不回读) |
339
347
  |:---:|---|---|
340
- | **端点** | `repoUrl` | `webdav.url` |
341
- | **凭据** | 认证 token 存入 DSH credentials(`DSH_CONFIG_MANAGER_SYNC_TOKEN`) | `username` 存配置、可在界面回显;**密码永不同步、永不记日志**——存入 DSH credentials `DSH_CONFIG_MANAGER_SYNC_WEBDAV_PASSWORD` |
342
-
343
- - **远端保留跟本地同一套策略**:两通道都按你的备份计划保留——默认最新 **10** 个快照,可另设「每月 1 份 / 每年 1 份」分层;刚推上去的那份恒保留,更旧的自动删除。
344
- - **切换通道重新开始**:Git 与 WebDAV 的快照 / 共同祖先**互不共享**。切换通道后,同步从新远端的空基线重新开始——请先推送一个新快照。
348
+ | **Git 私有仓库** | `repoUrl`(可直接从当前 token 可见的**私有**仓库里选,或就地新建一个私有仓库) | 访问令牌 → `DSH_CONFIG_MANAGER_SYNC_TOKEN` |
349
+ | **WebDAV** | `webdav.url` | `username` 存配置、可在界面回显;**密码永不同步、永不记日志** → `DSH_CONFIG_MANAGER_SYNC_WEBDAV_PASSWORD` |
350
+ | **对象存储(S3 兼容)** | 端点 / region / bucket / 对象键前缀 / AccessKey ID(标识符,可回显) | AccessKey Secret → 该通道自己的凭据槽位(同步文件里只留「已配置」标记) |
351
+ | **GitHub Gist** | gist id / API 根 / 文件名前缀 | Gist token → 该通道自己的凭据槽位 |
352
+
353
+ - **每条通道各配各的**:同步分区、自动同步(开关 + 兜底轮询间隔)、加密与「导出密钥」、远端快照、加密 / 解密密码都**按通道独立**,在它自己那张卡内配置(已配置的卡可折叠,免得 4 张全展开撑爆画布)。
354
+ - **远端保留跟本地同一套策略**:按你的备份计划保留——默认最新 **10** 个快照,可另设「每月 1 份 / 每年 1 份」分层;刚推上去的那份恒保留,更旧的自动删除。
355
+ - **切换通道重新开始**:各通道的远端快照 / 共同祖先**互不共享**。换一条通道(或断开重配)就是从新远端的空基线重新开始——请先推送一个新快照。
345
356
  - **WebDAV 认证**采用 HTTP Basic:`username` 存配置、可在界面回显;`password` 则实时从 DSH credentials 槽位 `DSH_CONFIG_MANAGER_SYNC_WEBDAV_PASSWORD` 读取——绝不出现于任何同步文件或日志。
346
- - **插件自动安装**:拉取差异时,备份里新增的插件会在确认导入时**自动安装**,无需在差异列表里逐项手动勾选;只有**版本冲突**的插件仍需要你决定「保留当前 / 采用备份」。
357
+ - **插件自动安装**:拉取差异时,备份里新增的插件会在确认导入时**自动安装**,无需在差异列表里逐项手动勾选;只有**版本冲突**的插件仍需要你决定「保留当前 / 使用备份」。
358
+ - **推送前先预览**:「推送」按钮先给出只读预览(分区 + 各分区条目数 + 相对基线的改动标记;没有基线时提示这是首个基线),确认后才真正写远端。
347
359
  - **密钥默认不同步**:同步载荷逐分区过 `SecretScanner`(敏感字段值剥离),凭据分区结构性排除。勾选「导出密钥」并设置加密密码后,`~/.dsh/.credentials.yaml` 以 scrypt + AES-256-GCM 密文作为**独立凭据载荷**随加密快照上行(不放进任何分区);拉取侧解密后生成逐条「凭据迁移」项,你确认采纳才写回本机凭据(`credentials.set`)。加密/解密密码保存在本机 DSH 凭据库(`~/.dsh/.credentials.yaml` 的独立槽位):勾选「加密备份」后自动记住(输入框留空即沿用),取消勾选或点「删除已保存密码」即清除 —— 密码绝不写入同步文件、响应、日志或导出备份,也绝不回传浏览器;解密密码只在拉取的快照确实加密时才会被使用。**自动同步恒不含凭据**(无密码可用,遇到加密快照会跳过)。
348
360
 
349
361
  ### 🛒 配置市场(Marketplace)
350
362
 
351
- 浏览并一键安装社区分享的现成配置(模型 / Provider、插件、MCP、技能、Agent 预设……):
363
+ 浏览并一键安装社区分享的现成配置(模型 / Provider、插件、MCP、技能、Agent 预设……)。入口在**产物库底栏的「逛市场 / 发布到市场」**(也可用 ⌘K)——它是**流程面板**,不是一级页面:
352
364
 
353
365
  - **内置官方市场**——只读、绑定官方公开仓库(官方徽章,不可编辑);首次打开自动刷新,也支持手动拉取最新
354
- - **搜索与筛选**——关键词搜索、类别过滤、来源筛选(官方 / 个人)、排序(最近更新 / ⭐ 最多 / 名称 A–Z),并显示**来源仓库**的 ⭐ star 数(匿名查询,不触碰任何 token)
366
+ - **搜索与筛选**——关键词搜索(匹配名称 / 描述 / 作者 / **分类**)、类别过滤、**分区筛选**(已下载过的条目会列出自己的分区,其余条目标注提示后排除)、来源筛选(官方 / 个人)、排序(最近更新 / ⭐ 最多 / 名称 A–Z),并显示**来源仓库**的 ⭐ star 数(匿名查询,不触碰任何 token)
367
+ - **影响预览**——详情页在确认之前就列出「装它会改什么」(更新项 / 一致项 / 冲突项 / 待补录密钥 / 需要重启 DSH)
355
368
  - **供应链警示恒展示**——来源仓库 URL +「未经官方审核」+ 下载时间;**逐项内容选择**——选择页列出每个单元「本次将改动什么」并就地标出高风险分区(默认勾选,取消勾选即不导入、也不进快照);历史会话 / 任意文件类高风险内容仍直接禁止上架
356
369
  - **安装复用安全导入管道**——分析 → 预览 → 自动备份 → 执行 → 回滚;确认前零写入
357
370
  - **「我的配置」**——GitHub 登录(device flow)后一键上传到**你自己的公开仓库**,并自动向官方市场仓库提交**收录 PR**;管理已上传条目(收录状态徽章:未收录 / PR 待审核 / 已收录)、一键更新、装回本地、删除(自动下架 PR)
@@ -359,7 +372,7 @@ allowBuilds:
359
372
  ### 🗂️ 档案(Profiles = DSH 自带 profile)
360
373
 
361
374
  「档案」就是 DSH 自己的 profile(`$DSH_HOME/profiles/<name>`)——一套**插件组合(bundles)+ 依赖 + patch 层**,
362
- 用 `dsh --profile <name>` 启动。本页直接读写这个目录,不再自建一套「配置快照」:
375
+ 用 `dsh --profile <name>` 启动。「环境 → 档案」直接读写这个目录,不再自建一套「配置快照」:
363
376
 
364
377
  | 动作 | 说明 |
365
378
  |---|---|
@@ -369,11 +382,11 @@ allowBuilds:
369
382
  | 删除 | **物理删除整个目录**(含 node_modules);当前运行中的档案需额外勾选确认 |
370
383
  | 启动该档案 | **真正可用的切换**:以该档案另起一个**独立 DSH 实例**(自动挑空闲端口 + 自动打开浏览器),当前实例与正在跑的任务不受影响;只支持 **web 形态**档案:非 web 形态(如 base 模板)没有浏览器界面,点击后给出终端命令而不是静默失败 |
371
384
  | 停止实例 | 该档案有实例在跑时,行内「启动」自动变成「停止」(运行状态卡里也有一个);先请它自己退出(优雅期),超时才结束进程树,并如实告诉你是哪种;**实例运行中拒绝物理删除该档案** |
372
- | 不会重复启动 | 「哪些档案在跑」= 本插件启动的实例台账 ∪ **每个实例自报的心跳**(`<dataDir>/running/<profile>.json`,只含 pid/端口,**不含认证 token**)→ 哪怕某个档案是你手动 `dsh web` 起来的,本页也不会再启动第二个同名实例(明确提示已在运行);**当前这个实例本身**不给停止按钮(停自己会把你自己杀掉——请关窗口/终端,或到启动它的那个实例里停止) |
385
+ | 不会重复启动 | 「哪些档案在跑」= 本插件启动的实例台账 ∪ **每个实例自报的心跳**(`<dataDir>/running/<profile>.json`,只含 pid/端口,**不含认证 token**)→ 哪怕某个档案是你手动 `dsh web` 起来的,「档案」子视图也不会再启动第二个同名实例(明确提示已在运行);**当前这个实例本身**不给停止按钮(停自己会把你自己杀掉——请关窗口/终端,或到启动它的那个实例里停止) |
373
386
 
374
387
  > **为什么没有「设为下次启动」**(2026-09 该按钮与标记一并移除):DSH **没有「默认 / 下次启动 profile」这种状态** ——
375
388
  > profile 只由启动参数决定(`dsh <名>` / `--profile <名>`,`dsh web` 是硬编码别名),任何「下次启动用哪个」的标记
376
- > **都没有消费者**:你自己敲的 `dsh web` 重启后当然还是 web。真正可用的切换只有两种:① 本页的「启动该档案」
389
+ > **都没有消费者**:你自己敲的 `dsh web` 重启后当然还是 web。真正可用的切换只有两种:① 「环境 → 档案」里的「启动该档案」
377
390
  > 另起一个实例(不打断当前会话,随时可停);② 把启动命令/快捷方式换成 `dsh --profile <名>`
378
391
  > (生态里的 dshm、DSH Launcher 也都是「外部启动器 spawn 实例」这一条路)。
379
392
  > 本插件启动的实例记在 `<dataDir>/launches.json`(pid/端口/日志),所以**关得掉**;
@@ -390,14 +403,26 @@ allowBuilds:
390
403
  | 文件补偿 | skills / agentPresets / agentInstructions / pluginFiles / sessions 的 blob 写回原路径 |
391
404
  | 凭据 | DSH 不回读凭据值——只提示人工重新填写 |
392
405
 
393
- **GUI**:设置 → 「备份与迁移」→「快照恢复」tab → 选择快照 → 预览恢复计划(dry-run,零写入)→ 确认执行。
406
+ **GUI**:产物库 → 源筛选切到**「本机快照」**→ 行内 ⋯ → **「恢复」**→ 先看恢复计划(dry-run,零写入;git 风格的逐行对照)→ 确认执行。行内还有「查看与对比 / 迁移前咨询 / 置顶 / 删除」等能力,按该行是什么产物给。
407
+
408
+ **快照管理**:
409
+
410
+ - **保留份数可见**:保留多少份由你的**保留策略**决定(首页「定时备份」卡;默认保留最新 **10** 份),列表里有提示
411
+ - **置顶重要快照**:置顶的快照豁免自动清理,只能手动删除
412
+ - **手动删除**:不再需要这个回滚点时可直接删除(危险操作,有二次确认)
413
+
414
+ **备份文件**(产物库 → **「备份文件」**来源):
415
+
416
+ - 列出 `exports/` 里每一份导出 ZIP(手动导出 + 定时备份),带来源徽章、体积、时间与你写的**备注**
417
+ - 按文件名或备注**搜索**
418
+ - **查看与对比**:导入前先只读预览它包含什么(分区 + 各分区条目数)以及与当前配置的差异(零写入)
419
+ - 下载、直接导入恢复、删除
394
420
 
395
- **备份文件与磁盘占用**:「备份与迁移」→「快照恢复」tab 下的**「备份文件」**子页统一管理 `exports/` 里的导出产物
396
- (手动导出 + 定时备份)——可下载、直接导入恢复、查看内容、删除,并按文件名/备注搜索。
397
- 同页的**「磁盘占用」卡**会逐项列出本插件自己占用的空间(导出备份 / 导入前快照 / 同步配置与 Git 工作副本 /
398
- 市场缓存 / 临时暂存 / 日志 / 事务日志 …),标注每项的回收策略:**可随时重建**(缓存与暂存)、
399
- **有保留期**(导出产物 7 天、定时备份保留最近 N 个)、**用户数据 / 安全网**(快照与同步,永不自动清理)。
400
- 需要腾空间时点**「立即清理」**:默认只清可重建的缓存与暂存;要回收过期备份文件需显式勾选(并二次确认)。
421
+ **磁盘占用**:在**环境 → 维护与诊断**的**「磁盘占用」卡**里,逐项列出本插件自己占用的空间
422
+ (导出备份 / 导入前快照 / 同步配置与工作副本 / 市场缓存 / 临时暂存 / 日志 / 事务日志 …),
423
+ 标注每项的回收策略:**可随时重建**(缓存与暂存)、**有保留期**(导出产物 7 天、定时备份保留最近 N 个)、
424
+ **用户数据 / 安全网**(快照与同步,永不自动清理)。需要腾空间时点**「立即清理」**:
425
+ 默认只清可重建的缓存与暂存;要回收过期备份文件需显式勾选「同时回收过期备份文件」(并二次确认)。
401
426
  **快照与同步数据永远不会被这个按钮删掉**;目录读不到时如实显示「未统计」,不会伪报 0 字节。
402
427
 
403
428
  ---
@@ -415,19 +440,40 @@ npm install -g dsh-config-manager@latest --omit=peer
415
440
 
416
441
  > ⚠️ 只安装/更新插件(`dsh plugin --profile web add ...`)只启用 GUI,**不会**产生 `dsh-config-manager` 命令。请先执行上面这条安装命令,然后使用下面任意命令。
417
442
 
418
- 全部命令(`dsh-config-manager help` 也会列出):
443
+ 全部命令(`dsh-config-manager help` 也会按风险分组列出;`dsh-config-manager <命令> --help` 打印该命令的参数、退出码与示例):
419
444
 
420
445
  ```text
421
- dsh-config-manager help # 列出全部命令与参数
446
+ # 离线救急台(本机网页,最省打字)
447
+ dsh-config-manager web [--port <n>] [--no-open] [--home <dir>]
448
+ [--data-root <dir>] [--idle-timeout <min>]
449
+
450
+ # 只读检查(绝不改你的配置)
422
451
  dsh-config-manager snapshots [--data-dir <dir>] # 列出快照(最新在前)
423
- dsh-config-manager restore [--id <id>] [--dry-run]
452
+ dsh-config-manager verify [<文件|路径>] [--json] # 只读自检备份 ZIP
453
+ [--data-dir <dir>]
454
+ dsh-config-manager sessions list [--home <dir>] [--json] # 列出本机会话
455
+ dsh-config-manager sessions doctor [--home <dir>] [--json] # 会话体检 + 建议
456
+
457
+ # 备份与迁移(只写新文件)
458
+ dsh-config-manager backup [--sections <a,b,c>] [--out <path>] # 离线文件级备份
459
+ [--dry-run] [--data-dir <dir>]
460
+ dsh-config-manager import --from <来源> [--dry-run] # 外部 agent 配置 → bundle ZIP
461
+ [--out <路径>] [--cwd <dir>] [--data-dir <dir>]
462
+
463
+ # 修复(会写本机 —— 先用 --dry-run 预览)
464
+ dsh-config-manager restore [--id <id>] [--dry-run] # 回滚到某份导入前快照
465
+ [--data-dir <dir>] [--data-root <dir>]
424
466
  [--profile <name>] [--settings <path>]
467
+ dsh-config-manager sessions repair [--home <dir>] [--fix] # 离线会话布局归位
468
+ [--keep <dir>] [--map old=new]...
469
+ dsh-config-manager recover-stale-lock [--data-dir <dir>] # 回收残留锁(见下)
470
+
471
+ # 危险(改 DSH 安装本体 / 可能清数据)
425
472
  dsh-config-manager reinstall [--version <v>] [--yes] [--list]
426
- [--wipe-config] [--dry-run] # 一键重装 DSH 程序本体
427
- dsh-config-manager verify [--id <文件|路径>] [--json] # 只读自检备份 ZIP
428
- [--data-dir <dir>]
429
- dsh-config-manager backup [--sections <a,b,c>] [--out <path>] # 离线文件级备份
430
- [--dry-run] [--data-dir <dir>]
473
+ [--wipe-config] [--dry-run] [--data-root <dir>]
474
+
475
+ # 帮助
476
+ dsh-config-manager help [command] # 总览 / 单条命令详情
431
477
  ```
432
478
 
433
479
  **`reinstall` —— DSH 损坏时的救急重装。** 跨平台一键重装 `@deepseek-ai/dsh` 启动器(按操作系统自动选用正确命令:Windows 走 PowerShell、Unix 走 bash)。默认重装启动器 + 清全局残留缓存;交互式多选会询问是否勾选**危险**清理项(设置 / 插件 / 会话与凭据)——这些**默认不勾选**,且只要涉及删数据的动作,执行前都必须**二次确认输入 `YES`**。清空 `~/.dsh` 数据前会先做一份 `.reinstall-backup` 紧急备份(`snapshots/` 目录按设计绝不触碰)。
@@ -498,6 +544,42 @@ dsh-config-manager backup --sections skills,self # 收窄范围
498
544
 
499
545
  **典型救急流程**(DSH 起不来时):① `dsh-config-manager reinstall` 先把启动器重装回来(必要时顺带清理),② 若 DSH 报会话日志错误(`corrupt session log` / `duplicate JSONL session id`),先跑 `dsh-config-manager sessions repair --fix` 把日志目录离线归位,③ `dsh web` 重新启动 DSH,④ 从仓库装回插件,⑤ 从远程仓库拉取快照(或执行 `dsh-config-manager restore`)把配置恢复回来。整个流程中 CLI 全程可用,与 DSH 是否健康无关。
500
546
 
547
+ **`recover-stale-lock` —— 每次操作都突然失败时用这个。** 动你的配置之前,插件会先占一把小的环境锁(记录谁在操作 + 心跳),让两个操作永远不可能同时写配置。如果某个 `dsh web` 进程被**强杀**(任务管理器 / `kill -9`),锁文件会带着一个已经死掉的持有者留在盘上:下一次操作被拒,而且**重试多少次、重启 DSH 都没用** —— 因为插件刻意从不自行删锁(猜错就会把正在进行的操作踢掉)。
548
+
549
+ 症状与修法:
550
+
551
+ | 症状 | 含义 | 修法 |
552
+ |---|---|---|
553
+ | 「另一个任务正在运行,请稍后重试。」 | 有活着的操作持锁 | 等一会儿,它会自己清 |
554
+ | 「检测到上次异常退出残留的配置锁…重试或重启 DSH 均无效」(日志里是 `自动同步已跳过`) | 持有者进程**已被证明死亡**(残留锁) | 跑下面这条命令,或用 GUI **事故恢复 → 回收残留锁** |
555
+ | 同一句提示,但持有者 PID 被一个无关进程**复用**了(Windows 常见) | 心跳已陈旧很久,锁仍被判成残留 | 同样的修法 —— 心跳陈旧时间远超阈值后即可回收 |
556
+
557
+ ```bash
558
+ # 安全:先检查,证明持有者已死才回收(活着的锁绝不碰)
559
+ dsh-config-manager recover-stale-lock
560
+ ```
561
+
562
+ **`sessions repair` —— DSH 因为会话日志起不来时用这个。** DSH 校验每条会话日志必须正好待在自己 header 声明的目录里:`corrupt session log … header id and cwd identify …`,或 `duplicate JSONL session id … in multiple project directories`。这时插件帮不上忙(它只在 DSH *内部*加载),而这是唯一能在 DSH 停着时工作的修复路径。它读每条会话首帧的 cwd,把会话目录搬到 `projectKeyOf(cwd)` —— 位置从日志本身推导,绝不猜。
563
+
564
+ - **默认 dry run**(零写入);`--fix` 才真的搬。退出码:dry run 恒 0,`--fix` 有任何失败 / 冲突 / 回滚则 1。
565
+ - **`--map old=new`**(可重复)用于跨机恢复:前缀命中时先改写首帧 cwd 再搬目录(其余帧逐字节拷贝)。目标已存在时绝不覆盖。
566
+ - **`--keep <dir>`** 解决重复 id:你点名的副本保留,其余移入 `sessions/.cm-repair-quarantine-<时间戳>/` —— 只移动、绝不删除。不给 `--keep` 时只报告重复、不动。
567
+
568
+ ```bash
569
+ # 先看会搬什么(完全不写盘)
570
+ dsh-config-manager sessions repair
571
+ # 执行,并把源机前缀映射到本机
572
+ dsh-config-manager sessions repair --fix --map 'C:/Users/alice=D:/Work'
573
+ ```
574
+
575
+ 两台机器的 **DSH 基础路径不同**时(如 `/opt/dsh/.dsh` 对 Windows 盘符路径),备份里记着源机基础路径,导入会**自动重定基**:把它下面所有路径(会话 cwd、工作区路径…)落到你本机的路径上 —— 不用手填映射。用户映射仍在其后生效,可覆盖任何一条。
576
+
577
+ 在内容选择器里,勾选会话会连带勾选拥有它们的工作区(取消勾选工作区也会取消它的会话)。
578
+
579
+ 跨机恢复在 GUI 里不需要额外步骤:**导出会话现在会连带带上拥有它们的工作区**,导入向导里填的路径映射会同时改写工作区路径与会话首帧 cwd(并相应搬目录),然后才把这些会话登记到那些工作区上。
580
+
581
+ **插件装好了但备份看不到?** 检查 **设置 → 备份与迁移 → 导航右上角的「关于」图标**:它会显示插件清单是从哪个目录 / profile 读的、识别到几个插件。清单来自 `$DSH_HOME/profiles/<profile>/package.json` → `dependencies`(外加 `dsh.profile.bundles` 里声明、但不是依赖的项),`<profile>` 按 `config.profile` → `--profile` → `web` 解析。如果显示的路径不是你装插件的那个 profile(桌面端可能用别的 profile 或别的 `DSH_HOME`),那就是原因 —— 把 `--profile` / `DSH_HOME` 对齐即可。
582
+
501
583
  **`web` —— 离线救急台(不想在终端里敲命令时用这个)。** 它在本机起一个**只绑 127.0.0.1** 的小网页,
502
584
  把上面的诊断信息与救急动作都摊在浏览器里:
503
585
 
@@ -506,12 +588,43 @@ dsh-config-manager web # 启动并自动打开浏览器(终端里
506
588
  ```
507
589
 
508
590
  - **只读部分**:实例心跳 / SAFE MODE / 残留锁 / 快照 / 导出产物(可一键自检)/ 磁盘占用 / 会话体检 / 档案与实例状态。
509
- - **写动作(都要在网页里显式确认)**:会话布局归位、清理可重建缓存与过期导出产物、回收残留环境锁、
510
- 启动/停止某个档案的独立实例。它们调用的是与命令行**同一套实现**,结果页逐条如实回执。
591
+ - **写动作(每个都要在网页里显式确认,且都调用与命令行同一套实现)**:① 会话布局归位 ② 清理可重建缓存与过期导出产物
592
+ ③ 回收残留环境锁 ④ 启动 / 停止某个档案的独立实例 ⑤ **解锁加密备份**(只在内存里解密、只列条目,绝不写盘)
593
+ ⑥ **恢复快照**(先看逐条计划,零写入;恢复前先把当前文件复制到 `<snapshot>/pre-restore/`)⑦ **离线导出**(文件类分区,落盘后立即自检)
594
+ ⑧ **重装 DSH**(卸载 + 重装全局 CLI,**要求输入只打印在终端里的 6 位校验码**)。结果页逐条如实回执。
511
595
  - **安全**:只绑回环地址;启动时生成一次性 token(只打印在终端),换成一个 HttpOnly + SameSite=Strict 的
512
596
  会话 cookie,用过即废;页面零脚本、零外链。`Ctrl+C` 或空闲超时(缺省 30 分钟)即退出。
513
- - **门槛**:会话归位需要 DSH 已停止;有 SAFE MODE 未结案时写动作一律被拒(页面会写明原因)。
514
- 恢复快照(`restore`)与重装(`reinstall`)**不在网页里** —— 它们需要更强的确认,留在命令行/GUI。
597
+ - **门槛**:会话归位与恢复快照需要 DSH 已停止;有 SAFE MODE 未结案或残留环境锁时写动作一律被拒(页面会写明原因)。
598
+ **导入**(把 bundle 写回本机)留在 GUI/CLI —— 结构化分区需要 DSH 服务层在线。
599
+
600
+ ### 🌐 走代理?(GitHub 登录 / 同步)
601
+
602
+ Node 内置的 `fetch()` 默认**不读** `HTTP_PROXY` / `HTTPS_PROXY`,所以在「GitHub 只能经本地代理访问」的网络里,「用 GitHub 登录」以前会直接失败:`请求 GitHub 设备码失败:fetch failed` —— 哪怕你的浏览器和 `git` 都正常。
603
+
604
+ **现在插件会把自己的出站请求自动走你的代理** —— 只要保证代理环境变量对 DSH 进程可见:
605
+
606
+ ```bash
607
+ # macOS / Linux —— 启动 dsh 之前
608
+ export HTTPS_PROXY=http://127.0.0.1:7897
609
+ export NO_PROXY=localhost,127.0.0.1
610
+ dsh web
611
+ ```
612
+
613
+ ```powershell
614
+ # Windows PowerShell
615
+ $env:HTTPS_PROXY='http://127.0.0.1:7897'; dsh web
616
+ ```
617
+
618
+ 行为细节:
619
+
620
+ - **覆盖插件全部出站**:GitHub API + device flow 登录(`fetch`)与 WebDAV 同步(原生 `http`/`https`),`https` 目标含 `CONNECT` 隧道;
621
+ - **没配代理就零影响** —— 没有代理变量时行为一字不变;
622
+ - **尊重 `NO_PROXY`**(`*`、精确主机、`example.com` 后缀、可选 `:port`);
623
+ - **`DSH_CONFIG_MANAGER_PROXY=off`** 强制直连(即使有代理变量);
624
+ - URL 里的代理凭据只用于 `Proxy-Authorization`,且**绝不记日志**;启动日志会打印一份脱敏的代理摘要,便于确认路由是否生效;
625
+ - 这是**插件私有**行为:绝不改全局 / 进程级网络设置(不同于 `NODE_USE_ENV_PROXY`,那会影响整个宿主进程,包括模型 API 调用)。
626
+
627
+ 替代方案(宿主级):在启动 DSH **之前**设 `NODE_USE_ENV_PROXY=1`(Node 24+);注意这会把宿主自己的出站流量也一起走代理,不只是本插件。
515
628
 
516
629
  ### 🤖 Agent 可调用的模型工具
517
630
 
@@ -556,7 +669,7 @@ dsh-config-manager web # 启动并自动打开浏览器(终端里
556
669
  默认不会。默认备份**绝不包含任何密钥**,只记录哪些密钥需要重新填写。若你显式选择**加密备份**,密钥才会包含在内,但仅以 scrypt + AES-256-GCM 密文存在(每次导出随机 salt 与 IV)——绝不明文。
557
670
 
558
671
  **Q:导入会不会覆盖我现有的配置?**
559
- 不会偷偷覆盖。有冲突时让你选择:保留现有的 / 用导入的;导入前还会自动备份,失败可回滚。
672
+ 不会偷偷覆盖。有冲突时让你逐项选择:保留当前 / 使用备份(可批量);导入前还会自动创建安全快照,失败可回滚。
560
673
 
561
674
  **Q:换电脑(Windows → macOS)能用吗?**
562
675
  能。插件会自动检测失效的绝对路径,让你重新映射(支持批量替换)。
@@ -565,7 +678,7 @@ dsh-config-manager web # 启动并自动打开浏览器(终端里
565
678
  不能。校验和检查不通过会直接拒绝导入(防止损坏或篡改)。
566
679
 
567
680
  **Q:重复导入会重复吗?**
568
- 不会。按插件 ID / MCP 名称 / 技能名等稳定标识配对:完全一致的跳过,与目标机有差异的会列为**冲突由你决定**(保留本机 / 用导入的),不会静默覆盖。
681
+ 不会。按插件 ID / MCP 名称 / 技能名等稳定标识配对:完全一致的跳过,与目标机有差异的会列为**冲突由你决定**(保留当前 / 使用备份),不会静默覆盖。
569
682
 
570
683
  **Q:加密备份导入时需要密码吗?**
571
684
  需要。导入向导会要求输入导出时设置的加密密码并验证通过后才能继续执行;密码仅存于内存、绝不保存。密码错误或缺失都会阻止导入(密码正确时凭据直接从备份解密恢复,无需重新填写)。
@@ -580,7 +693,7 @@ dsh-config-manager web # 启动并自动打开浏览器(终端里
580
693
  1. **安装/更新插件或 MCP 后需重启 DSH 才生效**
581
694
  2. **部分界面状态不迁移**(如任务看板数据、面板宽度——它们存在浏览器里,不在 DSH 配置文件内)
582
695
  3. **keybindings / workflows 配置 / commands**:DSH 当前没有这些概念,因此不会导出相关内容。全局 agent 规则已由**全局指令(Agent Instructions)**承接(`~/.dsh/AGENTS.md`,注入每个会话);项目级 `AGENTS.md` / `CLAUDE.md` 属于各项目仓库本身,不在个人配置迁移范围内
583
- 4. **历史会话是显式可选项** —— DSH 自己的会话只有在导出 / 同步时**显式勾选 `sessions` 分区**才会带走(同步通道还要求两侧都放行);**其它 Agent 的历史会话在你选中那个来源时迁移**。DSH 会话格式里没有位置的对话状态(模型思考过程、图片、压缩检查点)一律**如实计数并报告**,绝不伪造
696
+ 4. **历史会话是显式可选项** —— DSH 自己的会话只有在导出 / 同步时**显式勾选 `sessions` 分区**才会带走(同步通道还要求两侧都放行);**MCP 服务器是另一个显式可选的同步分区**——`mcp` 分区是 `platformSpecific`,永不进默认同步集合,要在同步分区弹窗里勾选 **MCP Servers** 才会带走(自动同步跟着走,但拉取侧的 mcp 变更仍会落进差异确认,它是 medium 风险分区)。`command` / `cwd` 是绝对路径、或目标机缺运行时(npx / uvx / pipx)的服务器,会由导入分析给出提示——配置照常写入;**其它 Agent 的历史会话在你选中那个来源时迁移**。DSH 会话格式里没有位置的对话状态(模型思考过程、图片、压缩检查点)一律**如实计数并报告**,绝不伪造
584
697
  5. **加密备份**:密码丢失则无法解密(设计使然——请牢记密码)
585
698
  6. **快照恢复是离线的、诚实的**:离线引擎无法恢复的条目(快照无整文件备份时的 settings namespace / patch 行、存在 DSH storages 里的 workspace 记录)会如实列为跳过并指向在线回滚;凭据**值**绝不自动改写(只提示人工补录);无插件基线的旧快照只提示人工核对新增插件
586
699
  7. **从其它 Agent 导入有两处已知空白**:**Copilot 不支持导入历史会话**(其会话格式在本机无法取证,只导入它的配置);Cursor 的项目历史要靠它自己的目录 slug 反解,个别项目可能对不上。用**旧版本**导入过的会话请先删掉再重导(同一 id 二次导入会如实报**跳过** `session-id-conflict`,不会合并)
@@ -598,7 +711,7 @@ dsh-config-manager web # 启动并自动打开浏览器(终端里
598
711
  | 💬 **不确定是不是 Bug,想先问问** | [Discussions](https://github.com/xiajiajun516/dsh-config-manager/discussions) |
599
712
  | 🔒 **安全问题 / 密钥泄露** | [私密安全公告](https://github.com/xiajiajun516/dsh-config-manager/security/advisories/new)(请不要开公开 issue) |
600
713
 
601
- **在插件里就地反馈**:设置 → 备份与迁移 → **关于** → 「反馈问题」;或点「关于」里的**复制环境信息**按钮,插件版本 / DSH 版本 / 平台会自动带上,粘进 issue 即可 —— 不用手抄版本号。
714
+ **在插件里就地反馈**:设置 → 备份与迁移 → 导航右上角的**「关于」图标** → 「反馈问题」;或点那里的**复制环境信息**按钮,插件版本 / DSH 版本 / 平台会自动带上,粘进 issue 即可 —— 不用手抄版本号。
602
715
 
603
716
  **每条都会跟进**:新 issue 会立刻收到一条回复并打上 `needs-triage`,处理进度体现在标签上(`needs-info` → `confirmed` → `fixed`)。修好的问题会出现在 [CHANGELOG.md](CHANGELOG.md) 的对应版本条目里,带 issue 编号(例:#38 / #43 / #45)—— 这就是一条反馈最终的落地记录。
604
717
 
@@ -616,8 +729,16 @@ dsh-config-manager web # 启动并自动打开浏览器(终端里
616
729
  36×36 无底框的 `icon.svg`(issue #61,对齐官方插件图标约定)。反馈自带上游取证(宿主图位 48/36 与 40/30、
617
730
  官方随包发布的图标形态与官方 fixture),PR 里附 16/30/36/48 × 深浅双主题实况图,并对「不换成品牌蓝」写了
618
731
  可复核的理由(后片若同色,深色模式下两层会融成一块、16px 读不出前后关系)。
619
- - **问题报告**:`zhyx1996`(#38 同步「导出密钥」未生效)、`IPF-Sinon`(#39 凭据 `refs:` 块未被识别,并在自己的 fork
620
- 上完成实现与真机验证)、`zerginlaw`(#43「立即备份」空转却提示成功)—— 这三条报告各自驱动了一个修复。
732
+ - **iuuuuuuuu** —— [PR #67](https://github.com/xiajiajun516/dsh-config-manager/pull/67)(合并提交 `780af10`)、
733
+ [PR #68](https://github.com/xiajiajun516/dsh-config-manager/pull/68)(`16e13c1`)、
734
+ [PR #72](https://github.com/xiajiajun516/dsh-config-manager/pull/72)(`6e552a0`):① git 同步通道有了**仓库选择器** ——
735
+ 从当前 token 可见的**私有**仓库里选(按最近更新排序,公开仓库不进列表),或就地新建私有仓库并自动选中;新建请求体
736
+ 根本不带 `private`,客户端连表达「公开」的途径都没有,安全约束落在宿主侧;顺带修掉链接跟随边界判定的 `realpath` 口径
737
+ (Windows 8.3 短名与 macOS `/var` → `/private/var` 曾被误判 `outside-home`,备份报成功却静默丢内容)。
738
+ ② 「总览」首屏不再等一次全量预览:`plugins` 分区补上 `preview()`(不再逐个 spawn `npm pack`),`settings` 与
739
+ `credentialsStatus` 一次读回全部 namespace 而不是逐个 `describe`(真机 24 个 namespace × 12 个本地源插件,
740
+ 全量预览 27.6 s)。③ 修 issue #71「外壳里配好的 MCP 与 Skills 备份不到」:patch 行按层读取、写回原层,技能改经
741
+ 外壳的 `skills` 服务收编。三个 PR 均带单测与路由 / 源码级守卫。
621
742
 
622
743
  > 维护者与开发者:构建、测试、自动发布与完整技术说明见 [DEVELOPERS.md](DEVELOPERS.md)。
623
744
 
@@ -35,7 +35,7 @@ export class AgentInstructionsAdapter extends FileCollectionAdapter {
35
35
  * (单文件代价可忽略,且 `collect` 之后还要读它)。读不到 → 空清单(与「文件不存在 = 空分区」同语义)。
36
36
  */
37
37
  async listRelPaths(ctx) {
38
- const empty = { paths: [], skippedLinks: [], followedLinks: 0, unreadableDirs: [] };
38
+ const empty = { paths: [], skippedLinks: [], skippedDepDirs: [], followedLinks: 0, unreadableDirs: [] };
39
39
  const rel = AgentInstructionsAdapter.FILE;
40
40
  try {
41
41
  if (ctx.fs.statSize !== undefined) {
@@ -154,7 +154,7 @@ export class FileCollectionAdapter {
154
154
  // issue #37:用「跟随 junction/符号链接」的遍历,并把跟随/跳过的链接写进告警——
155
155
  // 此前链接目录及其全部内容被静默排除,备份仍报成功。
156
156
  // 枚举走 listRelPaths 钩子(单文件分区覆写它,避免对 home 根整目录递归)。
157
- let listing = { paths: [], skippedLinks: [], followedLinks: 0, unreadableDirs: [] };
157
+ let listing = { paths: [], skippedLinks: [], skippedDepDirs: [], followedLinks: 0, unreadableDirs: [] };
158
158
  try {
159
159
  listing = await this.listRelPaths(ctx);
160
160
  }
@@ -40,7 +40,7 @@ export declare function createAdapters(options?: AdapterRegistryOptions): Config
40
40
  export type { NamespaceProvider } from './settings.ts';
41
41
  export type { CredentialRefsProvider } from './credentials.ts';
42
42
  export { SettingsAdapter } from './settings.ts';
43
- export { UiAdapter, isUiNamespace, KNOWN_UI_NAMESPACE_PREFIXES, UI_MIGRATION_NOTES } from './ui.ts';
43
+ export { UiAdapter, isUiNamespace, KNOWN_UI_NAMESPACE_PREFIXES, uiMigrationNotes } from './ui.ts';
44
44
  export { ProvidersAdapter, DEFAULT_PROVIDER_NAMESPACES, type ProviderExportEntry, type ProviderExportSection } from './providers.ts';
45
45
  export { PluginsAdapter, USER_PATCH_FILE } from './plugins.ts';
46
46
  export type { LocalPluginPackHook } from './plugins.ts';
@@ -38,7 +38,7 @@ export function createAdapters(options = {}) {
38
38
  return adapters;
39
39
  }
40
40
  export { SettingsAdapter } from './settings.js';
41
- export { UiAdapter, isUiNamespace, KNOWN_UI_NAMESPACE_PREFIXES, UI_MIGRATION_NOTES } from './ui.js';
41
+ export { UiAdapter, isUiNamespace, KNOWN_UI_NAMESPACE_PREFIXES, uiMigrationNotes } from './ui.js';
42
42
  export { ProvidersAdapter, DEFAULT_PROVIDER_NAMESPACES } from './providers.js';
43
43
  export { PluginsAdapter, USER_PATCH_FILE } from './plugins.js';
44
44
  export { McpAdapter, extractMcpServers, buildMcpPatchLine } from './mcp.js';
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import type { FileSystemFacade } from '../core/types.ts';
11
11
  import type { MsgFunc } from '../core/messages.ts';
12
+ import './messages.ts';
12
13
  import type { RecursiveListing } from '../utils/recursive-walk.ts';
13
14
  /** 取遍历结果:宿主未实现 listRecursiveDetailed(旧版/测试 mock)时回退,行为与旧版一致。 */
14
15
  export declare function listFilesDetailed(fs: FileSystemFacade, dir: string): Promise<RecursiveListing>;