dsh-config-manager 0.1.70 → 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 (558) 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/claude-sessions.d.ts +9 -1
  89. package/lib/foreign/claude-sessions.js +10 -2
  90. package/lib/foreign/continue.js +2 -1
  91. package/lib/foreign/crush.js +2 -1
  92. package/lib/foreign/gemini.js +2 -1
  93. package/lib/foreign/goose.js +2 -1
  94. package/lib/foreign/kilocode.js +2 -1
  95. package/lib/foreign/kimi.js +2 -1
  96. package/lib/foreign/messages.d.ts +15 -0
  97. package/lib/foreign/messages.js +40 -0
  98. package/lib/foreign/mimocode.js +2 -1
  99. package/lib/foreign/openclaw.js +2 -1
  100. package/lib/foreign/opencode.js +2 -1
  101. package/lib/foreign/pi.js +2 -1
  102. package/lib/foreign/qoder.js +2 -1
  103. package/lib/foreign/qwen.js +2 -1
  104. package/lib/foreign/registry.js +7 -6
  105. package/lib/foreign/session-ir.js +46 -10
  106. package/lib/foreign/teleagent.js +2 -1
  107. package/lib/foreign/workbuddy.js +2 -1
  108. package/lib/foreign/zcode.js +2 -1
  109. package/lib/foreign/zed.js +2 -1
  110. package/lib/index.d.ts +223 -7
  111. package/lib/index.js +729 -54
  112. package/lib/market/git-file-writer.js +20 -19
  113. package/lib/market/github-repos.js +35 -19
  114. package/lib/market/index-parser.js +31 -30
  115. package/lib/market/messages-market.d.ts +138 -0
  116. package/lib/market/messages-market.js +305 -0
  117. package/lib/market/my-repo.d.ts +2 -2
  118. package/lib/market/my-repo.js +32 -29
  119. package/lib/market/prepare.js +18 -15
  120. package/lib/market/security.js +20 -19
  121. package/lib/market/types.js +2 -1
  122. package/lib/market/url.js +2 -1
  123. package/lib/migrations/index.js +6 -5
  124. package/lib/migrations/messages-migrations.d.ts +32 -0
  125. package/lib/migrations/messages-migrations.js +58 -0
  126. package/lib/profiles/dsh-profile-launcher.js +2 -1
  127. package/lib/profiles/dsh-profile-runtime.js +2 -1
  128. package/lib/profiles/messages.d.ts +7 -0
  129. package/lib/profiles/messages.js +27 -0
  130. package/lib/routes/backup.js +18 -2
  131. package/lib/routes/import.js +3 -3
  132. package/lib/routes/index.d.ts +1 -1
  133. package/lib/routes/kit.d.ts +3 -2
  134. package/lib/routes/kit.js +6 -1
  135. package/lib/routes/market.js +1 -1
  136. package/lib/routes/messages.d.ts +42 -0
  137. package/lib/routes/messages.js +100 -0
  138. package/lib/routes/profiles.js +12 -6
  139. package/lib/routes/recovery.js +378 -114
  140. package/lib/routes/snapshots.js +51 -4
  141. package/lib/routes/sync.js +68 -16
  142. package/lib/schema/config.d.ts +11 -1
  143. package/lib/schema/config.js +52 -20
  144. package/lib/schema/index.d.ts +8 -6
  145. package/lib/schema/index.js +8 -6
  146. package/lib/schema/manifest.js +19 -18
  147. package/lib/schema/messages.d.ts +47 -0
  148. package/lib/schema/messages.js +110 -0
  149. package/lib/schema/section-registry.d.ts +41 -14
  150. package/lib/schema/section-registry.js +35 -29
  151. package/lib/schema/versions.js +6 -5
  152. package/lib/security/encryption.js +16 -15
  153. package/lib/security/integrity.js +8 -7
  154. package/lib/security/messages.d.ts +30 -0
  155. package/lib/security/messages.js +77 -0
  156. package/lib/security/redaction.js +12 -0
  157. package/lib/security/secret-scanner.js +16 -13
  158. package/lib/security/vault.js +2 -1
  159. package/lib/security/zip-security.js +4 -3
  160. package/lib/sync/ancestor.js +2 -1
  161. package/lib/sync/autosync-config.d.ts +11 -0
  162. package/lib/sync/autosync-config.js +12 -0
  163. package/lib/sync/autosync-scheduler.d.ts +11 -1
  164. package/lib/sync/autosync-scheduler.js +115 -76
  165. package/lib/sync/backup-files.js +3 -2
  166. package/lib/sync/backup-scheduler.js +6 -5
  167. package/lib/sync/blob-store.js +2 -1
  168. package/lib/sync/git/git-transport.d.ts +55 -0
  169. package/lib/sync/git/git-transport.js +152 -2
  170. package/lib/sync/github-auth.js +10 -9
  171. package/lib/sync/layout.js +13 -12
  172. package/lib/sync/messages.d.ts +63 -0
  173. package/lib/sync/messages.js +149 -0
  174. package/lib/sync/review-queue.js +6 -5
  175. package/lib/sync/s3/messages.d.ts +7 -0
  176. package/lib/sync/s3/messages.js +16 -0
  177. package/lib/sync/s3/s3-providers.d.ts +4 -1
  178. package/lib/sync/s3/s3-providers.js +5 -5
  179. package/lib/sync/s3/s3-transport.js +1 -1
  180. package/lib/sync/s3/sigv4.js +2 -1
  181. package/lib/sync/snapshot-crypto.js +6 -5
  182. package/lib/sync/snapshot-json.js +3 -2
  183. package/lib/sync/sync-engine.d.ts +37 -15
  184. package/lib/sync/sync-engine.js +67 -37
  185. package/lib/sync/sync-history.js +7 -6
  186. package/lib/sync/sync-selection.d.ts +15 -4
  187. package/lib/sync/sync-selection.js +17 -5
  188. package/lib/sync/webdav/webdav-transport.d.ts +1 -0
  189. package/lib/sync/webdav/webdav-transport.js +4 -1
  190. package/lib/ui/artifact-view.js +4 -3
  191. package/lib/ui/commands.d.ts +1 -1
  192. package/lib/ui/commands.js +10 -0
  193. package/lib/ui/disk-usage-view.d.ts +33 -4
  194. package/lib/ui/disk-usage-view.js +29 -1
  195. package/lib/ui/errors.d.ts +1 -1
  196. package/lib/ui/errors.js +4 -3
  197. package/lib/ui/export-flow.js +24 -20
  198. package/lib/ui/foreign-view.d.ts +5 -1
  199. package/lib/ui/foreign-view.js +26 -2
  200. package/lib/ui/i18n.d.ts +65 -0
  201. package/lib/ui/i18n.js +114 -0
  202. package/lib/ui/import-wizard.d.ts +7 -0
  203. package/lib/ui/import-wizard.js +13 -10
  204. package/lib/ui/progress.d.ts +2 -2
  205. package/lib/ui/progress.js +1 -2
  206. package/lib/ui/report.d.ts +5 -5
  207. package/lib/ui/report.js +6 -6
  208. package/lib/ui/rollback-view.d.ts +756 -0
  209. package/lib/ui/rollback-view.js +724 -0
  210. package/lib/ui/selection-model.d.ts +41 -0
  211. package/lib/ui/selection-model.js +30 -0
  212. package/lib/ui/session-inventory-view.d.ts +97 -3
  213. package/lib/ui/session-inventory-view.js +76 -2
  214. package/lib/ui/session-issue-labels.d.ts +43 -0
  215. package/lib/ui/session-issue-labels.js +48 -0
  216. package/lib/ui/sync-settings-view.d.ts +33 -0
  217. package/lib/ui/sync-settings-view.js +40 -0
  218. package/lib/ui/types.d.ts +8 -3
  219. package/lib/ui/types.js +1 -1
  220. package/lib/utils/atomic-write.js +6 -5
  221. package/lib/utils/bundle-scan.d.ts +11 -1
  222. package/lib/utils/bundle-scan.js +12 -1
  223. package/lib/utils/env-lock.d.ts +10 -0
  224. package/lib/utils/env-lock.js +73 -46
  225. package/lib/utils/json.js +6 -5
  226. package/lib/utils/messages-utils.d.ts +96 -0
  227. package/lib/utils/messages-utils.js +216 -0
  228. package/lib/utils/proxy.js +18 -5
  229. package/lib/utils/recursive-walk.d.ts +22 -0
  230. package/lib/utils/recursive-walk.js +75 -1
  231. package/lib/utils/session-log-repair.js +10 -9
  232. package/lib/utils/zip.js +27 -26
  233. package/package.json +12 -2
  234. package/src/adapters/agent-instructions.ts +1 -1
  235. package/src/adapters/file-collection.test.ts +1 -0
  236. package/src/adapters/file-collection.ts +1 -1
  237. package/src/adapters/files.test.ts +27 -0
  238. package/src/adapters/index.ts +1 -1
  239. package/src/adapters/link-report.test.ts +22 -2
  240. package/src/adapters/link-report.ts +29 -4
  241. package/src/adapters/messages.ts +54 -0
  242. package/src/adapters/plugin-files.ts +3 -2
  243. package/src/adapters/plugins.ts +4 -3
  244. package/src/adapters/prompts.ts +7 -1
  245. package/src/adapters/self.test.ts +26 -0
  246. package/src/adapters/self.ts +8 -2
  247. package/src/adapters/sessions.ts +4 -2
  248. package/src/adapters/settings.test.ts +38 -1
  249. package/src/adapters/ui.test.ts +2 -2
  250. package/src/adapters/ui.ts +27 -26
  251. package/src/adapters/workspaces.ts +7 -3
  252. package/src/cli/actions.test.ts +28 -0
  253. package/src/cli/actions.ts +11 -2
  254. package/src/cli/help.ts +23 -10
  255. package/src/cli/index-guards.test.ts +193 -0
  256. package/src/cli/index.ts +106 -31
  257. package/src/cli/sessions-inspect.test.ts +15 -1
  258. package/src/cli/sessions-inspect.ts +3 -1
  259. package/src/cli/sessions-repair.test.ts +84 -0
  260. package/src/cli/sessions-repair.ts +33 -7
  261. package/src/cli/web/console-route-parity.test.ts +115 -0
  262. package/src/cli/web/page.ts +23 -12
  263. package/src/cli/web/routes.ts +2 -1
  264. package/src/cli/web/server.ts +4 -4
  265. package/src/cli/web/web.test.ts +2 -2
  266. package/src/client/ConfigManagerSection.tsx +30 -2
  267. package/src/client/about/AboutPanel.tsx +2 -2
  268. package/src/client/about/PluginUpdateDialog.tsx +1 -1
  269. package/src/client/about/ReleaseNotesDialog.tsx +2 -2
  270. package/src/client/about/about-view.test.ts +13 -3
  271. package/src/client/about/about-view.ts +10 -6
  272. package/src/client/about/release-notes-view.test.ts +14 -4
  273. package/src/client/about/release-notes-view.ts +4 -2
  274. package/src/client/api.ts +18 -6
  275. package/src/client/chat/ChatEntryView.tsx +391 -0
  276. package/src/client/chat/RollbackDiffTab.tsx +61 -0
  277. package/src/client/chat/RollbackFileIcon.tsx +96 -0
  278. package/src/client/chat/RollbackReviewDialog.tsx +591 -0
  279. package/src/client/chat/chat-entry-view.test.ts +1174 -0
  280. package/src/client/chat/chat-entry-view.ts +758 -0
  281. package/src/client/chat/chat-locales.ts +152 -0
  282. package/src/client/chat/chat-node-registration.ts +64 -0
  283. package/src/client/chat/chat-point-window.ts +173 -0
  284. package/src/client/chat/chat-slots.ts +107 -0
  285. package/src/client/chat/rollback-diff-tab.test.ts +105 -0
  286. package/src/client/chat/rollback-diff-tab.ts +164 -0
  287. package/src/client/chat/rollback-entry-view.test.ts +1469 -0
  288. package/src/client/chat/rollback-entry-view.ts +941 -0
  289. package/src/client/chat/sidebar-slots.ts +37 -0
  290. package/src/client/common/ConfirmDialog.tsx +7 -3
  291. package/src/client/common/ContentPicker.tsx +48 -10
  292. package/src/client/common/DiffTable.tsx +97 -0
  293. package/src/client/common/ErrorBanner.tsx +4 -4
  294. package/src/client/common/Icon.tsx +2 -0
  295. package/src/client/common/Modal.tsx +8 -1
  296. package/src/client/common/ProgressBar.tsx +8 -2
  297. package/src/client/common/ReportView.tsx +4 -4
  298. package/src/client/common/RunsCenter.tsx +1 -0
  299. package/src/client/common/client-route-parity.test.ts +78 -0
  300. package/src/client/common/info-hint-guard.test.ts +46 -13
  301. package/src/client/common/picker-lazy-units.test.ts +42 -0
  302. package/src/client/common/plan-text-redaction.test.ts +17 -6
  303. package/src/client/common/progress-view-edge.test.ts +8 -7
  304. package/src/client/common/progress-view.test.ts +9 -9
  305. package/src/client/common/progress-view.ts +2 -2
  306. package/src/client/common/routes.ts +28 -0
  307. package/src/client/common/ui.tsx +73 -10
  308. package/src/client/config-manager.module.css +996 -21
  309. package/src/client/css-scale-guard.test.ts +30 -0
  310. package/src/client/environment/EnvironmentPanel.tsx +11 -4
  311. package/src/client/environment/maintenance/DiskUsageCard.tsx +23 -2
  312. package/src/client/export/ExportView.tsx +13 -8
  313. package/src/client/history/HistoryPanel.tsx +4 -3
  314. package/src/client/history/history-api.ts +2 -2
  315. package/src/client/history/history-locales.ts +5 -1
  316. package/src/client/home/HomePanel.tsx +29 -8
  317. package/src/client/import/ForeignImportView.tsx +4 -5
  318. package/src/client/import/ImportWizardView.tsx +5 -3
  319. package/src/client/import/import-wizard-split.test.ts +3 -1
  320. package/src/client/import/import-wizard-steps.tsx +9 -9
  321. package/src/client/index.ts +186 -3
  322. package/src/client/library/LibraryActions.tsx +32 -7
  323. package/src/client/library/LibraryPanel.tsx +23 -3
  324. package/src/client/library/RestorePlanView.tsx +9 -66
  325. package/src/client/locales.ts +54 -5
  326. package/src/client/lucide-icons.d.ts +1 -0
  327. package/src/client/market/MarketPanel.tsx +13 -2
  328. package/src/client/market/MyConfigsView.tsx +5 -4
  329. package/src/client/market/MyConfigsWizard.tsx +10 -8
  330. package/src/client/market/market-api.test.ts +9 -8
  331. package/src/client/market/market-api.ts +2 -2
  332. package/src/client/market/market-locales.ts +3 -0
  333. package/src/client/market/market-view.test.ts +6 -6
  334. package/src/client/market/market-view.ts +3 -3
  335. package/src/client/market/my-configs-api.ts +2 -2
  336. package/src/client/market/my-configs-view.test.ts +23 -22
  337. package/src/client/market/my-configs-view.ts +8 -8
  338. package/src/client/recovery/IncompleteCopiesSection.tsx +2 -1
  339. package/src/client/recovery/RecoveryPanel.tsx +442 -283
  340. package/src/client/recovery/RollbackCard.tsx +665 -0
  341. package/src/client/recovery/RollbackDiffPane.tsx +58 -0
  342. package/src/client/recovery/RollbackFileChanges.tsx +163 -0
  343. package/src/client/recovery/incident-api.ts +2 -2
  344. package/src/client/recovery/recovery-api.ts +116 -6
  345. package/src/client/recovery/recovery-locales.test.ts +299 -0
  346. package/src/client/recovery/recovery-locales.ts +488 -149
  347. package/src/client/recovery/recovery-panel-layout.test.ts +132 -2
  348. package/src/client/recovery/rollback-file-changes.test.ts +73 -0
  349. package/src/client/recovery/session-dialog-mount.test.ts +54 -0
  350. package/src/client/run-store.ts +84 -21
  351. package/src/client/sync/AutosyncCard.tsx +25 -1
  352. package/src/client/sync/ChannelClearConfirmDialog.tsx +6 -3
  353. package/src/client/sync/ChannelConfigDialog.tsx +10 -10
  354. package/src/client/sync/DecryptPasswordCard.tsx +2 -2
  355. package/src/client/sync/SecurityOptionsCard.tsx +27 -17
  356. package/src/client/sync/SyncChannelEntryCard.tsx +14 -2
  357. package/src/client/sync/SyncConfirmView.tsx +46 -8
  358. package/src/client/sync/SyncLogList.tsx +1 -1
  359. package/src/client/sync/SyncPanel.tsx +31 -23
  360. package/src/client/sync/SyncRepositoryPicker.tsx +3 -5
  361. package/src/client/sync/SyncSectionPickerDialog.tsx +11 -2
  362. package/src/client/sync/SyncSettingsView.test.ts +20 -1
  363. package/src/client/sync/UnreadableSnapshotsBanner.tsx +1 -1
  364. package/src/client/sync/WorkDirCard.tsx +112 -0
  365. package/src/client/sync/history-model.test.ts +42 -9
  366. package/src/client/sync/history-model.ts +30 -15
  367. package/src/client/sync/sync-api.test.ts +57 -33
  368. package/src/client/sync/sync-api.ts +80 -6
  369. package/src/client/sync/sync-locales.ts +104 -3
  370. package/src/client/sync/sync-view-v2.test.ts +65 -13
  371. package/src/client/sync/sync-view.test.ts +107 -52
  372. package/src/client/sync/sync-view.ts +124 -41
  373. package/src/core/backup-plan.test.ts +28 -0
  374. package/src/core/backup-plan.ts +29 -17
  375. package/src/core/backup-verify.ts +24 -23
  376. package/src/core/backup.test.ts +76 -0
  377. package/src/core/backup.ts +55 -25
  378. package/src/core/boot-rescue.ts +4 -3
  379. package/src/core/boot-safety.ts +2 -1
  380. package/src/core/command-rollback.test.ts +536 -0
  381. package/src/core/command-rollback.ts +402 -0
  382. package/src/core/consult-source.ts +7 -6
  383. package/src/core/disk-usage.test.ts +257 -1
  384. package/src/core/disk-usage.ts +134 -14
  385. package/src/core/engine-locale.test.ts +593 -0
  386. package/src/core/engine-locale.ts +175 -0
  387. package/src/core/exporter.ts +3 -3
  388. package/src/core/fork-reconcile.test.ts +279 -0
  389. package/src/core/fork-reconcile.ts +234 -0
  390. package/src/core/journal.ts +6 -5
  391. package/src/core/local-plugin-host.ts +3 -2
  392. package/src/core/local-plugin-pack.ts +11 -6
  393. package/src/core/messages-core.ts +657 -0
  394. package/src/core/messages.ts +123 -17
  395. package/src/core/migration-consult.ts +21 -20
  396. package/src/core/migration-history.ts +19 -5
  397. package/src/core/model-tools.ts +28 -27
  398. package/src/core/phase3-host.ts +21 -5
  399. package/src/core/phase3-p2b-fingerprint.test.ts +22 -0
  400. package/src/core/plugin-cli.ts +18 -19
  401. package/src/core/reconcile.test.ts +117 -0
  402. package/src/core/reconcile.ts +85 -17
  403. package/src/core/recovery-orchestrator.ts +19 -18
  404. package/src/core/reinstall.ts +26 -21
  405. package/src/core/restore.ts +20 -17
  406. package/src/core/rollback-file-diff.test.ts +159 -0
  407. package/src/core/rollback-ignore-rules.ts +126 -0
  408. package/src/core/rollback-point.test.ts +2603 -0
  409. package/src/core/rollback-point.ts +3755 -0
  410. package/src/core/run-registry.ts +6 -5
  411. package/src/core/session-health.ts +15 -0
  412. package/src/core/session-meta.test.ts +117 -1
  413. package/src/core/session-meta.ts +149 -2
  414. package/src/core/session-title.test.ts +127 -0
  415. package/src/core/session-title.ts +189 -0
  416. package/src/core/startup-barrier.test.ts +69 -0
  417. package/src/core/startup-barrier.ts +27 -0
  418. package/src/core/transaction-coordinator.ts +4 -3
  419. package/src/core/types.ts +18 -1
  420. package/src/core/validator.ts +5 -4
  421. package/src/core/verify-recovery.ts +31 -30
  422. package/src/foreign/bundle.ts +3 -2
  423. package/src/foreign/claude-sessions-bytes.test.ts +20 -7
  424. package/src/foreign/claude-sessions.test.ts +26 -1
  425. package/src/foreign/claude-sessions.ts +10 -2
  426. package/src/foreign/continue.ts +2 -1
  427. package/src/foreign/crush.ts +2 -1
  428. package/src/foreign/file-budget.test.ts +2 -0
  429. package/src/foreign/gemini.ts +2 -1
  430. package/src/foreign/goose.ts +2 -1
  431. package/src/foreign/kilocode.ts +2 -1
  432. package/src/foreign/kimi.ts +2 -1
  433. package/src/foreign/messages.ts +44 -0
  434. package/src/foreign/mimocode.ts +2 -1
  435. package/src/foreign/openclaw.ts +2 -1
  436. package/src/foreign/opencode.ts +2 -1
  437. package/src/foreign/pi.ts +2 -1
  438. package/src/foreign/qoder.ts +2 -1
  439. package/src/foreign/qwen.ts +2 -1
  440. package/src/foreign/reasonix.test.ts +5 -3
  441. package/src/foreign/registry.ts +7 -6
  442. package/src/foreign/session-ir.test.ts +54 -1
  443. package/src/foreign/session-ir.ts +44 -9
  444. package/src/foreign/teleagent.ts +2 -1
  445. package/src/foreign/workbuddy.ts +2 -1
  446. package/src/foreign/zcode.ts +2 -1
  447. package/src/foreign/zed.ts +2 -1
  448. package/src/index.facade.test.ts +340 -1
  449. package/src/index.ts +813 -57
  450. package/src/market/git-file-writer.ts +20 -19
  451. package/src/market/github-repos.test.ts +23 -0
  452. package/src/market/github-repos.ts +37 -19
  453. package/src/market/index-parser.ts +31 -30
  454. package/src/market/messages-market.ts +325 -0
  455. package/src/market/my-repo.ts +32 -29
  456. package/src/market/prepare.ts +18 -15
  457. package/src/market/security.ts +20 -19
  458. package/src/market/types.ts +2 -1
  459. package/src/market/url.ts +2 -1
  460. package/src/migrations/index.ts +6 -5
  461. package/src/migrations/messages-migrations.ts +59 -0
  462. package/src/profiles/dsh-profile-launcher.ts +2 -1
  463. package/src/profiles/dsh-profile-runtime.ts +2 -1
  464. package/src/profiles/messages.ts +31 -0
  465. package/src/routes/backup.ts +18 -2
  466. package/src/routes/foreign.test.ts +62 -4
  467. package/src/routes/import.ts +3 -3
  468. package/src/routes/index.ts +1 -1
  469. package/src/routes/kit.ts +9 -3
  470. package/src/routes/market.ts +1 -1
  471. package/src/routes/messages.ts +104 -0
  472. package/src/routes/profiles.ts +12 -6
  473. package/src/routes/recovery.test.ts +405 -1
  474. package/src/routes/recovery.ts +377 -109
  475. package/src/routes/snapshots.ts +51 -4
  476. package/src/routes/sync.ts +67 -16
  477. package/src/schema/config.ts +53 -20
  478. package/src/schema/index.ts +7 -5
  479. package/src/schema/manifest.ts +19 -18
  480. package/src/schema/messages.ts +120 -0
  481. package/src/schema/registry.test.ts +19 -5
  482. package/src/schema/section-registry.ts +64 -39
  483. package/src/schema/versions.ts +6 -5
  484. package/src/security/encryption.ts +16 -15
  485. package/src/security/integrity.ts +8 -7
  486. package/src/security/messages.ts +87 -0
  487. package/src/security/redaction.test.ts +17 -1
  488. package/src/security/redaction.ts +13 -0
  489. package/src/security/secret-scanner.ts +19 -12
  490. package/src/security/security.test.ts +47 -0
  491. package/src/security/vault.ts +2 -1
  492. package/src/security/zip-security.ts +4 -3
  493. package/src/sync/ancestor.ts +2 -1
  494. package/src/sync/autosync-config.ts +21 -0
  495. package/src/sync/autosync-scheduler.test.ts +63 -7
  496. package/src/sync/autosync-scheduler.ts +118 -78
  497. package/src/sync/backup-files.ts +3 -2
  498. package/src/sync/backup-scheduler.ts +6 -5
  499. package/src/sync/blob-store.ts +2 -1
  500. package/src/sync/git/git-transport.test.ts +170 -8
  501. package/src/sync/git/git-transport.ts +176 -2
  502. package/src/sync/github-auth.ts +10 -9
  503. package/src/sync/layout.ts +13 -12
  504. package/src/sync/messages.ts +153 -0
  505. package/src/sync/review-queue.ts +6 -5
  506. package/src/sync/s3/messages.ts +16 -0
  507. package/src/sync/s3/s3-providers.ts +9 -6
  508. package/src/sync/s3/s3-transport.ts +1 -1
  509. package/src/sync/s3/sigv4.ts +3 -1
  510. package/src/sync/snapshot-crypto.ts +6 -5
  511. package/src/sync/snapshot-json.ts +3 -2
  512. package/src/sync/sync-engine-download-tombstone.test.ts +1 -1
  513. package/src/sync/sync-engine.test.ts +226 -8
  514. package/src/sync/sync-engine.ts +103 -41
  515. package/src/sync/sync-history.ts +7 -6
  516. package/src/sync/sync-selection.test.ts +12 -2
  517. package/src/sync/sync-selection.ts +18 -5
  518. package/src/sync/webdav/webdav-transport.ts +4 -1
  519. package/src/ui/artifact-view.ts +4 -3
  520. package/src/ui/commands.test.ts +1 -0
  521. package/src/ui/commands.ts +11 -1
  522. package/src/ui/disk-usage-view.test.ts +113 -6
  523. package/src/ui/disk-usage-view.ts +63 -7
  524. package/src/ui/errors.ts +4 -3
  525. package/src/ui/export-flow.ts +24 -20
  526. package/src/ui/foreign-view.test.ts +43 -0
  527. package/src/ui/foreign-view.ts +30 -3
  528. package/src/ui/i18n.ts +125 -0
  529. package/src/ui/import-wizard.ts +18 -10
  530. package/src/ui/progress.ts +2 -2
  531. package/src/ui/report.ts +7 -6
  532. package/src/ui/rollback-view.test.ts +819 -0
  533. package/src/ui/rollback-view.ts +1339 -0
  534. package/src/ui/selection-model.test.ts +33 -1
  535. package/src/ui/selection-model.ts +53 -0
  536. package/src/ui/session-inventory-view.test.ts +109 -0
  537. package/src/ui/session-inventory-view.ts +138 -3
  538. package/src/ui/session-issue-labels.test.ts +51 -0
  539. package/src/ui/session-issue-labels.ts +70 -0
  540. package/src/ui/sync-settings-view.test.ts +36 -0
  541. package/src/ui/sync-settings-view.ts +49 -0
  542. package/src/ui/types.ts +10 -4
  543. package/src/utils/atomic-write.ts +6 -5
  544. package/src/utils/bundle-scan.test.ts +2 -2
  545. package/src/utils/bundle-scan.ts +12 -1
  546. package/src/utils/env-lock.ts +83 -49
  547. package/src/utils/json.ts +7 -5
  548. package/src/utils/messages-utils.ts +232 -0
  549. package/src/utils/proxy.test.ts +25 -0
  550. package/src/utils/proxy.ts +19 -5
  551. package/src/utils/recursive-walk.test.ts +43 -0
  552. package/src/utils/recursive-walk.ts +75 -1
  553. package/src/utils/session-log-repair.ts +10 -9
  554. package/src/utils/zip.ts +27 -26
  555. package/lib/core/checkpoint.d.ts +0 -362
  556. package/lib/core/checkpoint.js +0 -1309
  557. package/src/core/checkpoint.test.ts +0 -665
  558. package/src/core/checkpoint.ts +0 -1614
package/README.md CHANGED
@@ -47,7 +47,7 @@ DSH is your AI assistant workbench — it holds your settings: model configs, pl
47
47
 
48
48
  ### Backup DeepSeek Harness configuration
49
49
 
50
- Create a portable backup of your DSH settings, model providers, plugins, MCP servers, skills, agent presets and workspace — one ZIP file, no secret values included by default. (DSH's own profiles — `$DSH_HOME/profiles/<name>`, i.e. which plugin stack to boot — are machine-local and are **not** part of the backup; the **Profiles** page manages them instead — list / create / rename / delete, plus launching or stopping an independent instance for one.)
50
+ Create a portable backup of your DSH settings, model providers, plugins, MCP servers, skills, agent presets and workspace — one ZIP file, no secret values included by default. (DSH's own profiles — `$DSH_HOME/profiles/<name>`, i.e. which plugin stack to boot — are machine-local and are **not** part of the backup; the **Environment → Profiles** view manages them instead — list / create / rename / delete, plus launching or stopping an independent instance for one.)
51
51
 
52
52
  ### Restore DeepSeek Harness on another machine
53
53
 
@@ -59,11 +59,11 @@ Move your complete DeepSeek Harness setup without manually reinstalling plugins,
59
59
 
60
60
  ### Sync DSH configuration across machines
61
61
 
62
- Keep portable configuration synchronized between machines through a private Git repository or WebDAV — secrets do not sync by default (the payload is run through the SecretScanner); check "Export secrets" with an encryption password and `~/.dsh/.credentials.yaml` travels as scrypt + AES-256-GCM ciphertext inside the encrypted snapshot, so another machine can restore the credentials while the remote (Git host / WebDAV provider) only ever sees ciphertext.
62
+ Keep portable configuration synchronized between machines through a private Git repository, WebDAV, an S3-compatible object store (AWS S3 / Alibaba OSS / Tencent COS / MinIO / Qiniu Kodo) or GitHub Gist — secrets do not sync by default (the payload is run through the SecretScanner); check "Export secrets" with an encryption password and `~/.dsh/.credentials.yaml` travels as scrypt + AES-256-GCM ciphertext inside the encrypted snapshot, so another machine can restore the credentials while the remote (Git host / WebDAV / object store / Gist) only ever sees ciphertext.
63
63
 
64
64
  ### Schedule automatic full backups
65
65
 
66
- Turn on scheduled backups (6h / 12h / 24h / 7d — or a **custom weekly weekday & time**) and DSH quietly keeps a fresh full backup of your configuration in the background — secrets are never included, so it stays safe on disk without a password. Consecutive failures are highlighted in red in the settings card.
66
+ Turn on scheduled backups in the **Home → Scheduled backup** card (6h / 12h / 24h / 7d — or a **custom weekly weekday & time**) and DSH quietly keeps a fresh full backup of your configuration in the background — secrets are never included, so it stays safe on disk without a password. How many are kept is decided by the **retention policy** in the same card (last N + one per month + one per year), and consecutive failures are highlighted in red.
67
67
 
68
68
  ### Discover & install configurations from the marketplace
69
69
 
@@ -82,7 +82,7 @@ Several DSH plugins live in this space and they solve different problems — pic
82
82
  | Plugin | Strongest at | Where DSH Config Manager goes further |
83
83
  |---|---|---|
84
84
  | [xiaoyuyu6420/dsh-backup](https://github.com/xiaoyuyu6420/dsh-backup) | One-command `~/.dsh` snapshots from the CLI, plus session doctor / upgrade snapshots / rescue console | Review-before-write GUI flow (dry-run preview, per-item conflict decisions, automatic rollback), cross-machine path remapping, encrypted credential payload, configuration marketplace |
85
- | [muyifc/dsh-config-sync](https://github.com/muyifc/dsh-config-sync) | Export / import DSH configuration to a portable, password-encrypted file, callable from tool calls | 13–14 sections (plugins / MCP / skills / workspaces / session logs …), scheduled backups, Git + WebDAV sync per channel, session migration with path rebase |
85
+ | [muyifc/dsh-config-sync](https://github.com/muyifc/dsh-config-sync) | Export / import DSH configuration to a portable, password-encrypted file, callable from tool calls | 13–14 sections (plugins / MCP / skills / workspaces / session logs …), scheduled backups, four sync channels (Git / WebDAV / object storage / Gist), session migration with path rebase |
86
86
  | [dickpy/dsh-cloud-sync](https://github.com/dickpy/dsh-cloud-sync) · [weibaohui/dsh-sync](https://github.com/weibaohui/dsh-sync) | Keeping machines consistent through WebDAV / S3 or a private Git mirror | Sync is one of five capabilities here — alongside export/import, scheduling, marketplace and profile instance launch/stop |
87
87
  | `cp -r ~/.dsh` (or Git on the home dir) | Free, zero setup, fine for a purely textual config | No secret handling, no path remapping, no capture of `link:` / `file:` plugin installs, no session-log work, no conflict handling or rollback |
88
88
 
@@ -94,24 +94,24 @@ Several DSH plugins live in this space and they solve different problems — pic
94
94
 
95
95
  | Icon | Feature | In one line |
96
96
  |:---:|---|---|
97
- | 🚀 | **One-click Export** | Package your recommended config into a ZIP |
97
+ | 🚀 | **One-click Export** | Open the export flow — the recommended sections are pre-ticked — and package a ZIP in one click (adjust section by section, item by item if you want) |
98
98
  | 📦 | **One-click Import** | Restore your environment on another machine |
99
- | 👀 | **Preview before import** | Full preview first — **never touches your config silently** |
100
- | ⚔️ | **Conflict handling** | Keep Current / Use Imported — you decide |
99
+ | 👀 | **Preview before import** | Read the migration consult verdict and its evidence first, then pick content item by item and resolve conflicts one by one — **never touches your config silently** |
100
+ | ⚔️ | **Conflict handling** | Keep current / Use backup — you decide (with bulk buttons) |
101
101
  | 🗺️ | **Path auto-mapping** | Detects dead absolute paths and lets you remap them |
102
102
  | 🔒 | **Secret safety** | API Keys are not exported by default — non-encrypted imports ask you to re-enter; encrypted backups restore them with the password |
103
103
  | ↩️ | **Automatic rollback** | Failed import restores everything automatically |
104
- | 📸 | **Snapshot restore** | Undo an import: whole-file restore + uninstall added plugins (CLI & GUI) |
105
- | 🔄 | **Remote Sync** | Push/pull portable config via **Git private repo or WebDAV** (secrets do not sync by default; encrypted snapshots can optionally carry encrypted credentials) |
106
- | ⏰ | **Scheduled backups** | Full backup on a fixed cadence (6h / 12h / 24h / 7d) — set-and-forget, secrets never included |
107
- | 🛒 | **Config Marketplace** | Browse & one-click install community configs — supply-chain warnings + per-item content selection (change summary + in-place high-risk flags) |
108
- | 🗂️ | **Profiles (DSH profiles)** | Manage `$DSH_HOME/profiles/<name>` directly: list / create from a shipped template / rename / hard delete / **launch this profile (independent instance)** / **stop the instance** (the row button flips between Launch and Stop with the running state) |
104
+ | 📸 | **Snapshot restore** | In the Library, hit "Restore" on a pre-import snapshot: review the line-by-line restore plan, then whole-file restore + uninstall added plugins (CLI & GUI) |
105
+ | 🔄 | **Remote Sync** | Push/pull portable config via **Git private repo / WebDAV / S3-compatible object storage / GitHub Gist** — each channel is configured on its own (secrets do not sync by default; encrypted snapshots can optionally carry encrypted credentials) |
106
+ | ⏰ | **Scheduled backups** | Full backup on a fixed cadence (6h / 12h / 24h / 7d, or a custom weekly time) — set-and-forget, secrets never included |
107
+ | 🛒 | **Config Marketplace** | Browse & one-click install community configs — supply-chain warnings + per-item content selection (change summary + in-place high-risk flags); entry: Library footer "Browse market / Publish to market", or ⌘K |
108
+ | 🗂️ | **Profiles (DSH profiles)** | Under **Environment → Profiles**, manage `$DSH_HOME/profiles/<name>` directly: list / create from a shipped template / rename / hard delete / **launch this profile (independent instance)** / **stop the instance** (the row button flips between Launch and Stop with the running state) |
109
109
  | 🌐 | **Bilingual UI** | Interface, reports and error details follow the DSH app language (中文 / English) |
110
110
  | 🧩 | **Local plugin migration** | `link:` / `file:` development plugins are packed into the backup, so switching machines does not lose them |
111
111
  | 🗄️ | **Configurable retention (GFS tiers)** | "keep the last N + one per month + one per year" — the defaults are equivalent to the previous behaviour |
112
112
  | 🤖 | **Agent tools** | Backup / snapshot / restore / sync right from an agent session |
113
- | 💾 | **Disk usage report** | The backups page shows how much space the plugin's own artifacts take (backups / snapshots / sync copies / caches / staging) with a three-tier cleanup policy; **one-click cleanup only touches regenerable caches and expired backups** — snapshots and sync data are never removed there |
114
- | ⬆️ | **Update check** | The About page reads the latest version from npm (read-only, cached 10 minutes); when there is a newer one it offers a copyable upgrade command **and** a one-click **Update now** that installs exactly that version — DSH must then be restarted, and the plugin never restarts it for you. Offline failures are reported honestly and affect nothing else |
113
+ | 💾 | **Disk usage report** | **Environment → Maintenance & Diagnostics** shows how much space the plugin's own artifacts take (backups / snapshots / sync copies / caches / staging) with a three-tier cleanup policy; **one-click cleanup only touches regenerable caches and expired backups** — snapshots and sync data are never removed there |
114
+ | ⬆️ | **Update check** | The About panel (top-right nav icon) reads the latest version from npm (read-only, cached 10 minutes); when there is a newer one it offers a copyable upgrade command **and** a one-click **Update now** that installs exactly that version — DSH must then be restarted, and the plugin never restarts it for you. Offline failures are reported honestly and affect nothing else |
115
115
  | 🧭 | **Compatibility explained** | Before importing you see "source DSH version / platform → local" plus **structured reasons** for the score (cross-platform / missing sections / newer source …) instead of a bare "partial" |
116
116
  | 🧳 | **Import from other AI agents** | Read Claude Code / Cursor / Codex / Hermes / Antigravity … configuration **and chat history** on this machine, translate it into a standard bundle, then import through the usual preview / conflict / rollback flow |
117
117
 
@@ -119,21 +119,13 @@ Several DSH plugins live in this space and they solve different problems — pic
119
119
 
120
120
  ## 📸 Screenshots
121
121
 
122
- | Overview | Backups & Snapshots |
122
+ | Home | Library |
123
123
  |:---:|:---:|
124
- | ![Overview](assets/screenshot-overview-en.png) | ![Backups and snapshots](assets/screenshot-backups-en.png) |
124
+ | ![Home](assets/screenshot-overview-en.png) | ![Library](assets/screenshot-backups-en.png) |
125
125
 
126
- | Export | Import Preview |
126
+ | Sync (four channel cards) | Environment · Profiles |
127
127
  |:---:|:---:|
128
- | ![One-click Export](assets/screenshot-export-en.png) | ![Import Preview](assets/screenshot-import-en.png) |
129
-
130
- | Remote Sync | Configuration Market |
131
- |:---:|:---:|
132
- | ![Remote Sync](assets/screenshot-sync-en.png) | ![Configuration Market](assets/screenshot-market-en.png) |
133
-
134
- | Profiles (DSH profiles) |
135
- |:---:|
136
- | ![Profiles](assets/screenshot-profiles-en.png) |
128
+ | ![Sync](assets/screenshot-sync-en.png) | ![Environment · Profiles](assets/screenshot-profiles-en.png) |
137
129
 
138
130
  ---
139
131
 
@@ -151,10 +143,11 @@ Every step confirms and backs up first — **it never modifies your config direc
151
143
 
152
144
  ```
153
145
  Select ZIP → validate file → check integrity → check schema → compatibility check
154
- → scan contents → build import plan → preview & confirm
155
- → auto-backup current config → apply → validate → done
146
+ → scan contents → build import plan → migration consult (verdict + evidence)
147
+ → choose what to import → per-item conflict decisions → path mapping / secrets re-entry
148
+ → confirm import → auto-backup current config → apply → validate → done
156
149
  │
157
- └─ failed midway? → automatically restored (rollback)
150
+ └─ failed midway? → automatically restored (rollback, can be switched off on the confirm page)
158
151
  ```
159
152
 
160
153
  ---
@@ -195,7 +188,7 @@ dsh plugin --profile web add dsh-config-manager@latest
195
188
  > dsh plugin --profile web add "dsh-config-manager@$(npm view dsh-config-manager version)"
196
189
  > ```
197
190
  >
198
- > After restarting DSH, **Settings → Backup & Migration → About** shows the version you are actually running (and pops up the release notes whenever it changes).
191
+ > After restarting DSH, **Settings → Backup & Migration → the About icon at the top right** shows the version you are actually running (and pops up the release notes whenever it changes).
199
192
  >
200
193
  > - Or disable the age gate entirely with a one-liner (adds `minimumReleaseAge: 0` at the top of the profile's `pnpm-workspace.yaml`):
201
194
  > ```powershell
@@ -247,34 +240,42 @@ allowBuilds:
247
240
 
248
241
  ## 🚀 Quick start (3-minute tour)
249
242
 
243
+ > **Where things are**: there are only 4 top-level pages — **Home** (how this machine is doing, plus the four actions Back up now / Export / Import / Remote sync), **Library** (local snapshots / backup files / remote snapshots / marketplace configs — every "thing" lives in this one list), **Sync** (four channel cards: Git / WebDAV / object storage / Gist) and **Environment** (Profiles / Maintenance & Diagnostics). **Export, import, browse market and publish to market are flow panels**: open them from the Home toolbar or the Library footer, switch pages to collapse, switch back to continue. The four icons at the top right are the ⌘K command palette, activity, migration history and About.
244
+
250
245
  ```
251
246
  Machine A (export)
252
- 1. Open DSH → Settings → "Backup & Migration"
253
- 2. Click "Export Configuration" → choose "Quick Export"
254
- 3. You get dsh-config-2026-08-14.zip (the report confirms no secrets inside)
247
+ 1. Open DSH → Settings → "Backup & Migration" → Home
248
+ 2. Click "Export" in the toolbar → the recommended sections are already ticked (change them via "Choose what to export")
249
+ 3. Click "Start export" → the ZIP is downloaded automatically as dsh-config-<date>-<random>.zip (the report confirms no secrets inside)
255
250
 
256
251
  Copy the ZIP to Machine B (import)
257
- 1. Open DSH → "Backup & Migration" → "Import Configuration"
258
- 2. Select the ZIP → wait for analysis → review the "Import Preview"
259
- 3. Path issues? → choose new paths (batch mapping supported)
260
- 4. Conflicts? → choose Keep Current / Use Imported
261
- 5. Confirm import → wait
262
- 6. Re-enter any missing API Keys as prompted
263
- 7. ✅ Settings / plugins / MCP / skills / workspace / global instructions (AGENTS.md) are back
252
+ 1. Open DSH → "Backup & Migration" → click "Import" on Home (or "Import from file" in the Library footer)
253
+ 2. Select the ZIP → wait for analysis → read the migration consult verdict and evidence → "Next: choose what to import"
254
+ 3. Tick the content you want (anything unticked is neither imported nor snapshotted)
255
+ 4. Path issues? → fill in new paths under "Path mapping" (batch prefix mapping supported)
256
+ 5. Conflicts? → pick "Keep current / Use backup" per item (bulk buttons included)
257
+ 6. "Confirm import" → wait (a safety snapshot is taken first; "roll back everything on failure" can be switched off on the confirm page)
258
+ 7. Re-enter any missing API Keys as prompted
259
+ 8. ✅ Settings / plugins / MCP / skills / workspace / global instructions (AGENTS.md) are back
264
260
  ```
265
261
 
266
262
  ---
267
263
 
268
264
  ## 🧩 Features
269
265
 
270
- ### 📤 Export (two modes)
266
+ ### 📤 Export (one flow + a content picker)
267
+
268
+ Open the **Export** flow panel (Home toolbar → "Export", or the Library footer → "Manual export") and do it on one screen:
271
269
 
272
- | Mode | Description |
270
+ | Area | Description |
273
271
  |---|---|
274
- | **Quick Export** (recommended) | One-click: settings / UI / models / plugins / MCP / skills / agent presets / global instructions (AGENTS.md) / workspaces… |
275
- | **Custom Export** | Tick the categories you want |
272
+ | Choose what to export | Opens the content picker: **section → smallest splittable unit**, ticked item by item; the recommended sections (portable, not device-specific) are pre-ticked and can be changed any time |
273
+ | Security options | Two independent switches: "Encrypt backup" (scrypt + AES-256-GCM) and "Export secrets"; ticking Export secrets auto-enables encryption (secrets are never plaintext) |
274
+ | File name & note | Your own file name plus a note (the note makes it findable in the Library); illegal characters are pointed out right at the field |
275
+ | What will be exported | An always-visible composition card: every section that will really go in, its item count and total size; **unreadable sections say "loading / read failed" instead of a fake 0** |
276
+ | Result | On completion the ZIP is **downloaded automatically** to your browser's download folder (the report offers it again); the report lists sections and warnings item by item |
276
277
 
277
- > Output: `dsh-config-<date>.zip` with manifest + per-category data + SHA-256 checksums.
278
+ > Export is read-only — it writes no configuration. The file carries a manifest + per-section data + SHA-256 checksums and defaults to `dsh-config-<date>-<6 random chars>.zip` (a name clash increments instead of overwriting an existing backup).
278
279
 
279
280
  **Export extras:**
280
281
  - **Preview before export** — see what will be packaged (section count + estimated size, no secrets) before anything is written
@@ -303,8 +304,10 @@ When the target already has a same-named item, you choose:
303
304
 
304
305
  | Option | Meaning |
305
306
  |---|---|
306
- | **Keep Current** | Leave the target's config untouched |
307
- | **Use Imported** | Overwrite with the backup's value |
307
+ | **Keep current** | Leave the target's config untouched |
308
+ | **Use backup** | Overwrite with the backup's value |
309
+
310
+ There are also two bulk buttons at the top of the list ("Keep all current" / "Use all from backup").
308
311
 
309
312
  > Note: a "decide later / review" option is intentionally **not** offered — an undecided conflict would block the import from proceeding. Every conflict must be resolved before continuing.
310
313
 
@@ -324,7 +327,7 @@ You do not have to rebuild another agent's setup by hand.
324
327
  - **What travels** — MCP servers, skills, global instructions (as `AGENTS.md`), and **chat history together with the workspaces those conversations belong to** (29 sources; conversations are re-encoded into DSH's session-log format and placed by their recorded `cwd`).
325
328
  - **What does not** — secret **values** are never read: only the key names are recorded so the plan can ask you to re-enter them. Structures DSH has no equivalent for (Claude Code hooks, slash commands, …) are reported as explicit codes rather than silently dropped.
326
329
  - **Honest skips** — a conversation with no recorded `cwd` cannot be placed and is reported as skipped (never guessed into some other project); known lossy items are listed **before** the import runs.
327
- - **Entry points** — Settings → "Backup & Migration" → Import → **"Import from another agent"**, the ⌘K command, or the CLI: `dcm import --from <source> [--dry-run] [--out <path>]`.
330
+ - **Entry points** — Home toolbar → "Import" → **"Import from another agent"** (Home also has a direct entry), the ⌘K command, or the CLI: `dcm import --from <source> [--dry-run] [--out <path>]`.
328
331
 
329
332
  ### 🔒 Secrets
330
333
 
@@ -335,25 +338,29 @@ You do not have to rebuild another agent's setup by hand.
335
338
  | Encrypted backup import | The export-time password is required: enter → verify → credentials are restored; **no password, no import** |
336
339
  | After non-encrypted import | "3 secrets need re-entry" — values stay in memory only |
337
340
 
338
- ### 🔄 Remote Sync (Git / WebDAV)
341
+ ### 🔄 Remote Sync (four channels)
339
342
 
340
- Push / pull your portable config between machines through **either of two channels** — usage is identical except for the transport itself:
343
+ The **Sync** page renders one card per channel, **all four always visible** (unconfigured ones are a short state with the configure button inside) — Git private repo / WebDAV server / object storage (S3-compatible: AWS S3, Alibaba OSS, Tencent COS, MinIO, Qiniu Kodo) / GitHub Gist:
341
344
 
342
- | | Git private repo | WebDAV |
345
+ | Channel | Endpoint (non-secret fields) | Credentials (DSH credentials only, never read back) |
343
346
  |:---:|---|---|
344
- | **Endpoint** | `repoUrl` | `webdav.url` |
345
- | **Credentials** | auth token in DSH credentials (`DSH_CONFIG_MANAGER_SYNC_TOKEN`) | `username` stored in the config (echoed in the UI); **password never synced / never logged** — DSH credentials `DSH_CONFIG_MANAGER_SYNC_WEBDAV_PASSWORD` |
346
-
347
- - **Remote retention follows your backup schedule**: both channels keep the same policy as local backups — by default the newest **10** snapshots, plus optional "one per month / one per year" tiers — and the snapshot you just pushed is always kept; older ones are deleted automatically.
348
- - **Switching channels starts fresh**: Git and WebDAV do **not** share snapshots or a common ancestor. When you switch transport, sync begins again from the new remote's empty baseline — push a fresh snapshot first.
347
+ | **Git private repo** | `repoUrl` (pick from the **private** repos the current token can see, or create a new private one inline) | access token → `DSH_CONFIG_MANAGER_SYNC_TOKEN` |
348
+ | **WebDAV** | `webdav.url` | `username` stored in the config (echoed in the UI); **password never synced / never logged** → `DSH_CONFIG_MANAGER_SYNC_WEBDAV_PASSWORD` |
349
+ | **Object storage (S3-compatible)** | endpoint / region / bucket / object key prefix / AccessKey ID (an identifier, may be echoed) | AccessKey Secret → that channel's own credential slot (the sync file keeps only a "configured" marker) |
350
+ | **GitHub Gist** | gist id / API base / file prefix | Gist token → that channel's own credential slot |
351
+
352
+ - **Every channel is configured on its own**: sync sections, auto sync (switch + fallback poll interval), encryption and "Export secrets", remote snapshots and the encrypt/decrypt passwords are all **per channel**, inside that channel's own card (configured cards collapse, so four expanded cards cannot overflow the canvas).
353
+ - **Remote retention follows your backup schedule**: by default the newest **10** snapshots, plus optional "one per month / one per year" tiers — and the snapshot you just pushed is always kept; older ones are deleted automatically.
354
+ - **Switching channels starts fresh**: channels do **not** share snapshots or a common ancestor. When you switch transport (or reconfigure one), sync begins again from the new remote's empty baseline — push a fresh snapshot first.
355
+ - **Changing a Git repository address just works — and the working copy has a repair entry**: the working copy under `<dataDir>/sync/work` re-points its `origin` (fetch **and** push URL) at the configured `repoUrl` on **every** sync (zero write commands when they already match), so switching between two reachable addresses of the same repository (LAN → VPN/Tailscale, host rename…) no longer leaves sync talking to the old address — the failure used to look like a plain network timeout. The Git card shows the working copy's path and origin plus a warn badge when it still points elsewhere, and offers "re-point repository address" (non-destructive) and "clone working copy again" (deletes `<dataDir>/sync/work` and re-clones — **discards commits that were never pushed**, hence the danger confirmation). SSH host-key failures and "the remote is not the same history" now come with actionable messages instead of raw git stderr.
349
356
  - **WebDAV auth** uses HTTP Basic: the `username` is stored in the config and may be echoed back into the UI, while the `password` is read live from the DSH credentials slot `DSH_CONFIG_MANAGER_SYNC_WEBDAV_PASSWORD` — it never appears in any sync file or log.
350
- - **Plugins auto-install**: when pulling diffs, plugins that are new in the backup are **installed automatically** on confirm — no manual per-item ticking in the diff list. Only **version-conflict** plugins still ask you to pick "Keep Current / Use Imported".
357
+ - **Plugins auto-install**: when pulling diffs, plugins that are new in the backup are **installed automatically** on confirm — no manual per-item ticking in the diff list. Only **version-conflict** plugins still ask you to pick "Keep current / Use backup".
351
358
  - **Push preview before uploading** — the Push button first shows a read-only preview of what will be sent (sections + per-section counts + changed-vs-baseline markers, first-baseline notice) and only writes the remote after you confirm.
352
359
  - **Secrets do not sync by default**: every section goes through the `SecretScanner` (sensitive field values stripped) and the credential section is structurally excluded. With "Export secrets" checked and an encryption password set, `~/.dsh/.credentials.yaml` travels as scrypt + AES-256-GCM ciphertext in a **separate credentials payload** of the encrypted snapshot (never inside any section); the receiving side decrypts it into per-ref "credential migration" items that are written back to the local credential store (`credentials.set`) only after you confirm. The encryption/decryption password is kept in a dedicated local DSH credential slot (`~/.dsh/.credentials.yaml`): it is remembered once "Encrypt backup" is checked (leave the fields empty to reuse it) and cleared when you uncheck it or press "Delete saved password" — never written to sync files, responses, logs or the exported backup, and never sent back to the browser. The decryption password is only ever used when the pulled snapshot is actually encrypted. **Auto sync never carries credentials** (it has no password and skips encrypted snapshots).
353
360
 
354
361
  ### 🛒 Configuration Marketplace
355
362
 
356
- Browse and install ready-made configurations (model providers, plugins, MCP servers, skills, agent presets…) shared by the community:
363
+ Browse and install ready-made configurations (model providers, plugins, MCP servers, skills, agent presets…) shared by the community. The entry point is the **Library footer ("Browse market / Publish to market")** (or ⌘K) — it is a **flow panel**, not a top-level page:
357
364
 
358
365
  - **Built-in official market** — read-only, bound to the official public repo (official badge shown, not editable); first open auto-refreshes, manual refresh also available
359
366
  - **Search & filter** — keyword search (matches name / description / author / **categories**), category filter, **section filter** (items already downloaded list their sections; others are excluded with a hint), source filter (Official / Community), sorting (recently updated / most starred / name A–Z), and a ⭐ badge showing the **source repo's** star count (queried anonymously, no token involved)
@@ -365,7 +372,7 @@ Browse and install ready-made configurations (model providers, plugins, MCP serv
365
372
  ### 🗂️ Profiles (= DSH's own profiles)
366
373
 
367
374
  A "profile" here is DSH's own profile (`$DSH_HOME/profiles/<name>`) — one **plugin stack (bundles) + dependencies + patch layer**,
368
- launched with `dsh --profile <name>`. This page reads and writes that directory directly instead of keeping its own config snapshots:
375
+ launched with `dsh --profile <name>`. **Environment → Profiles** reads and writes that directory directly instead of keeping its own config snapshots:
369
376
 
370
377
  | Action | What it does |
371
378
  |---|---|
@@ -380,12 +387,12 @@ launched with `dsh --profile <name>`. This page reads and writes that directory
380
387
  > **Why there is no "set as next launch"** (button and marker removed in 2026-09): DSH has **no "default / next launch
381
388
  > profile" state** — the profile comes only from the launch arguments (`dsh <name>` / `--profile <name>`; `dsh web` is a
382
389
  > hard-coded alias), so any "which profile to use next" marker has **no consumer at all**: the `dsh web` you type
383
- > yourself still boots web after a restart. Only two mechanisms really switch profiles: ① this page's "launch this
390
+ > yourself still boots web after a restart. Only two mechanisms really switch profiles: ① the Profiles view's "launch this
384
391
  > profile" (an extra instance, no interruption, stoppable at any time), ② pointing your launch command/shortcut at
385
392
  > `dsh --profile <name>` (ecosystem tools such as dshm and DSH Launcher all spawn instances from an external launcher).
386
393
  > Instances started by this plugin are recorded in `<dataDir>/launches.json` (pid/port/log), which is why they can be
387
394
  > stopped; third-party plugins must be installed into that profile separately (`dsh plugin --profile <name> add <pkg>`).
388
- > The tab lives at Settings → "Backup & Migration" → **Profiles**.
395
+ > The view lives at Settings → "Backup & Migration" → **Environment → Profiles**.
389
396
 
390
397
  ### 📸 Snapshot restore (undo an import)
391
398
 
@@ -398,30 +405,27 @@ Every import creates a **safety snapshot** first. If something feels off afterwa
398
405
  | File compensation | skills / agentPresets / agentInstructions / pluginFiles / sessions blobs are written back to their original paths |
399
406
  | Credentials | DSH never reads credential values back — you get a manual re-entry hint instead |
400
407
 
401
- **GUI**: Settings → "Backup & Migration" → **Snapshots & Restore** tab → pick a snapshot → preview the plan (dry-run, zero writes) → confirm.
408
+ **GUI**: Library → switch the source filter to **"Local snapshots"** → the row's ⋯ menu → **"Restore"** → review the plan (dry-run, zero writes; a git-style line-by-line comparison) → confirm. The same menu offers "Inspect & compare / Migration consult / Pin / Delete", depending on what that row is.
402
409
 
403
410
  **Snapshot management:**
404
- - **Retention is visible** — up to **10** snapshots are kept automatically (oldest pruned); the hint is shown in the list
411
+ - **Retention is visible** — how many snapshots are kept is up to your **retention policy** (Home → Scheduled backup card; the default keeps the newest **10**); the hint is shown in the list
405
412
  - **Pin important snapshots** — a pinned snapshot is exempt from auto-pruning and can only be deleted manually
406
413
  - **Manual delete** — remove any snapshot (danger, confirmed) when you no longer need that rollback point
407
414
 
408
- **Backup Files management** (same tab → "Backup Files"):
409
- - List every export ZIP (manual + scheduled) with source badge, size, time and your custom **note**
415
+ **Backup files** (Library → **"Backup files"** source):
416
+
417
+ - Every export ZIP in `exports/` (manual + scheduled) with its source badge, size, time and your **note**
410
418
  - **Search** by file name or note
411
419
  - **Inspect / Compare** — read-only preview of what the backup contains (sections + per-section counts) and the diff against your current config (zero writes) before deciding to import
420
+ - Download, import straight back, delete
412
421
 
413
- ---
414
-
415
-
416
- **Backup files & disk usage**: the **"Backup Files"** sub-tab (Backups → snapshot tab) manages everything in
417
- `exports/` (manual exports + scheduled backups): download, import straight back, inspect, delete, search by
418
- name or note. The **"Disk Usage"** card on the same page lists what this plugin itself occupies (exports,
419
- pre-import snapshots, sync config and Git working copies, marketplace cache, temp staging, logs, transaction
420
- log, …) and labels each item's cleanup policy: **regenerated on demand** (caches/staging), **retained**
421
- (exports for 7 days, scheduled backups keep the latest N), or **your data / safety net** (snapshots and sync —
422
- never auto-cleaned). **"Clean now"** clears only regenerable caches by default; reclaiming expired backups is
423
- an explicit opt-in with a confirmation. Snapshots and sync data are never touched, and unreadable directories
424
- are reported as "not measured" instead of a misleading 0 bytes.
422
+ **Disk usage** (Environment → Maintenance & Diagnostics): the "Disk usage" card lists what this plugin
423
+ itself occupies (exports, pre-import snapshots, sync config and working copies, marketplace cache, temp
424
+ staging, logs, transaction log, …) and labels each item's cleanup policy: **regenerated on demand**
425
+ (caches/staging), **retained** (exports for 7 days, scheduled backups keep the latest N), or **your data /
426
+ safety net** (snapshots and sync — never auto-cleaned). **"Clean now"** clears only regenerable caches by
427
+ default; reclaiming expired backups is an explicit opt-in with a confirmation. Snapshots and sync data are
428
+ never touched, and unreadable directories are reported as "not measured" instead of a misleading 0 bytes.
425
429
 
426
430
  ---
427
431
 
@@ -575,7 +579,18 @@ In the content picker, selecting sessions also selects the workspaces that own t
575
579
 
576
580
  Cross-machine restores need no extra step in the GUI: **exporting sessions now carries the workspaces that own them**, and the path mapping you fill in the import wizard rewrites both the workspace paths and the sessions' first-frame cwd (relocating the directories accordingly) before the sessions are attached to those workspaces.
577
581
 
578
- **Plugins installed but the backup doesn't see them?** Check **Settings → DSH Config Manager → About**: it now shows which directory / profile the plugin list was read from, and how many plugins were detected. The list comes from `$DSH_HOME/profiles/<profile>/package.json` → `dependencies` (plus anything declared in `dsh.profile.bundles` that is not a dependency), where `<profile>` is resolved as `config.profile` → `--profile` → `web`. If the shown path is not the profile you installed into (Desktop builds may use a different profile or a different `DSH_HOME`), that is the cause — align `--profile` / `DSH_HOME` with it.
582
+ **Plugins installed but the backup doesn't see them?** Check **Settings → Backup & Migration → the About icon at the top right**: it shows which directory / profile the plugin list was read from, and how many plugins were detected. The list comes from `$DSH_HOME/profiles/<profile>/package.json` → `dependencies` (plus anything declared in `dsh.profile.bundles` that is not a dependency), where `<profile>` is resolved as `config.profile` → `--profile` → `web`. If the shown path is not the profile you installed into (Desktop builds may use a different profile or a different `DSH_HOME`), that is the cause — align `--profile` / `DSH_HOME` with it.
583
+
584
+ **`web` — the offline rescue console (for when you would rather click than type).** It starts a small web page bound to **127.0.0.1 only** and lays out the same diagnostics and rescue actions in a browser:
585
+
586
+ ```bash
587
+ dsh-config-manager web # starts it and opens your browser (the terminal prints a one-time token URL)
588
+ ```
589
+
590
+ - **Read-only:** running instances / SAFE MODE / leftover lock / snapshots / exported backups (with one-click verification) / disk usage / session health / profiles and their instances.
591
+ - **Write actions (each needs an explicit confirmation in the page, and every one calls the same implementation as the CLI):** ① relocate misplaced sessions ② clear rebuildable caches and expired exports ③ reclaim a stale environment lock ④ start/stop a profile's standalone instance ⑤ **unlock an encrypted backup** (decrypted in memory, lists entries only — never written to disk) ⑥ **restore a snapshot** (see the per-item plan first, zero writes; restoring copies current files to `<snapshot>/pre-restore/` first) ⑦ **offline export** (file-based sections, self-checked right after writing) ⑧ **reinstall DSH** (uninstall + reinstall the global CLI; **requires a 6-character code printed only in the terminal**).
592
+ - **Safety:** loopback-only binding; a one-time token printed to your terminal is exchanged for an HttpOnly + SameSite=Strict session cookie; the page has no scripts and no external resources. `Ctrl+C` or the idle timeout (30 minutes by default) shuts it down.
593
+ - **Preconditions:** session relocation and restore need DSH stopped; with an unresolved SAFE MODE transaction or a leftover environment lock every write action is refused (the page says why). **Import** (writing a bundle back into this machine) stays on the GUI/CLI — structural sections need live DSH services.
579
594
 
580
595
  ### 🌐 Behind a proxy? (GitHub login / sync)
581
596
 
@@ -606,17 +621,6 @@ How it behaves:
606
621
 
607
622
  Alternative (host-wide): set `NODE_USE_ENV_PROXY=1` **before starting DSH** (Node 24+); note this also routes the host's own outbound traffic, not just this plugin's.
608
623
 
609
- **`web` — the offline rescue console (for when you would rather click than type).** It starts a small web page bound to **127.0.0.1 only** and lays out the same diagnostics and rescue actions in a browser:
610
-
611
- ```bash
612
- dsh-config-manager web # starts it and opens your browser (the terminal prints a one-time token URL)
613
- ```
614
-
615
- - **Read-only:** running instances / SAFE MODE / leftover lock / snapshots / exported backups (with one-click verification) / disk usage / session health / profiles and their instances.
616
- - **Write actions (each needs an explicit confirmation in the page, and every one calls the same implementation as the CLI):** ① relocate misplaced sessions ② clear rebuildable caches and expired exports ③ reclaim a stale environment lock ④ start/stop a profile's standalone instance ⑤ **unlock an encrypted backup** (decrypted in memory, lists entries only — never written to disk) ⑥ **restore a snapshot** (see the per-item plan first, zero writes; restoring copies current files to `<snapshot>/pre-restore/` first) ⑦ **offline export** (file-based sections, self-checked right after writing) ⑧ **reinstall DSH** (uninstall + reinstall the global CLI; **requires a 6-character code printed only in the terminal**).
617
- - **Safety:** loopback-only binding; a one-time token printed to your terminal is exchanged for an HttpOnly + SameSite=Strict session cookie; the page has no scripts and no external resources. `Ctrl+C` or the idle timeout (30 minutes by default) shuts it down.
618
- - **Preconditions:** session relocation and restore need DSH stopped; with an unresolved SAFE MODE transaction or a leftover environment lock every write action is refused (the page says why). **Import** (writing a bundle back into this machine) stays on the GUI/CLI — structural sections need live DSH services.
619
-
620
624
  ### 🤖 Agent tools (for AI assistants)
621
625
 
622
626
  The plugin also registers **5 model tools** that an AI agent (a DSH assistant session) can call directly — the same backup / snapshot / sync engines, no GUI needed:
@@ -660,7 +664,7 @@ Once the plugin is installed the tools appear automatically in every agent sessi
660
664
  Not by default. The default backup **never contains any secret value** — only records which keys you'll need to re-enter. If you explicitly choose an **encrypted backup**, secrets are included, but only as scrypt + AES-256-GCM ciphertext (random salt & IV per export) — never plaintext.
661
665
 
662
666
  **Q: Will importing overwrite my existing config?**
663
- Not silently. Conflicts ask you to choose (Keep Current / Use Imported); the target is auto-backed-up and can roll back.
667
+ Not silently. Conflicts ask you to choose per item (Keep current / Use backup, with bulk buttons); the target is auto-snapshotted first and can roll back.
664
668
 
665
669
  **Q: Does it work across platforms (Windows → macOS)?**
666
670
  Yes. Dead absolute paths are detected and remapped (batch replacement supported).
@@ -669,7 +673,7 @@ Yes. Dead absolute paths are detected and remapped (batch replacement supported)
669
673
  No. A checksum mismatch rejects the import outright (protects against corruption or tampering).
670
674
 
671
675
  **Q: Will re-importing duplicate things?**
672
- No. Items are matched by stable IDs (plugin ID / MCP name / skill name…): identical ones are skipped, and ones that differ from the target surface as **conflicts you decide** (Keep Current / Use Imported) — nothing is overwritten silently.
676
+ No. Items are matched by stable IDs (plugin ID / MCP name / skill name…): identical ones are skipped, and ones that differ from the target surface as **conflicts you decide** (Keep current / Use backup) — nothing is overwritten silently.
673
677
 
674
678
  **Q: Why is the console quiet after `dsh web` — how do I get the plugin logs back?**
675
679
  By design. Routine progress logs (mount banner, scheduler skips, export/backup completion) are emitted at `info`, and the shipped default level is `warn` — so only warnings and errors reach the terminal. Set `DSH_CONFIG_MANAGER_LOG_LEVEL=info` (or `debug`) before starting DSH to bring the verbose lines back.
@@ -684,7 +688,7 @@ Yes. The import wizard asks for the export-time encryption password and verifies
684
688
  1. **Installing / updating plugins or MCP takes effect after restarting DSH**
685
689
  2. **Some UI state is not migrated** (e.g. task board data, panel widths — they live in the browser, not in DSH's config files)
686
690
  3. **keybindings / workflow configs / commands** — DSH has no such concepts, so nothing is exported for them. Global agent rules are covered by **Agent Instructions** (`~/.dsh/AGENTS.md`, injected into every session); per-project `AGENTS.md`/`CLAUDE.md` belong to each project's repo and are not migrated
687
- 4. **History/session migration is opt-in** — DSH's own sessions are only exported/synced when you explicitly select the `sessions` section (the sync channel additionally needs both sides to allow it); **another agent's chat history is migrated when you pick that source** in the foreign import. Conversation state that DSH's session format has no room for (model reasoning traces, images, compaction checkpoints) is counted and reported, never fabricated
691
+ 4. **History/session migration is opt-in** — DSH's own sessions are only exported/synced when you explicitly select the `sessions` section (the sync channel additionally needs both sides to allow it); **MCP servers are the other opt-in sync section** — the `mcp` section is `platformSpecific`, so it is never in the default sync set; tick **MCP Servers** in the sync-section dialog to carry it (auto sync follows along, but a pulled `mcp` change still lands in the diff review, since it is a medium-risk section). Servers whose `command` / `cwd` are absolute paths, or whose runtime (npx / uvx / pipx) is missing on the target, are reported by the import analysis — the config is written anyway; **another agent's chat history is migrated when you pick that source** in the foreign import. Conversation state that DSH's session format has no room for (model reasoning traces, images, compaction checkpoints) is counted and reported, never fabricated
688
692
  5. **Encrypted backups**: a lost password means the `secrets.enc` can't be decrypted (by design — keep your password safe)
689
693
  6. **Snapshot restore is offline and honest**: entries the offline engine can't restore (settings namespaces / patch lines when the snapshot has no whole-file backup, workspace records stored in DSH storages) are reported as skipped with a pointer to online rollback; credential **values** are never auto-written (manual re-entry hint only); old snapshots without a plugin baseline only get a hint to remove added plugins manually
690
694
  7. **Foreign-agent import has two known blanks**: **Copilot has no chat-history import** (its session format could not be verified on this machine, so only its configuration is imported), and Cursor's per-project history is located through Cursor's own folder-slug scheme, which may not resolve for every project. Conversations already imported with an older build should be deleted and re-imported first (a second import of the same id is reported as a **skipped** `session-id-conflict`, not merged)
@@ -702,7 +706,7 @@ Found a bug, a misaligned panel, a button that does nothing — or just have an
702
706
  | 💬 **Not sure whether it is a bug — just asking** | [Discussions](https://github.com/xiajiajun516/dsh-config-manager/discussions) |
703
707
  | 🔒 **Security issue / leaked credential** | [Private security advisory](https://github.com/xiajiajun516/dsh-config-manager/security/advisories/new) (please do not open a public issue) |
704
708
 
705
- **Report straight from the plugin**: Settings → Backup & Migration → **About** → "Issues"; or hit **Copy environment info** on that page — plugin version / DSH version / platform are included, so you can paste it into the issue instead of typing version numbers.
709
+ **Report straight from the plugin**: Settings → Backup & Migration → the **About icon at the top right** → "Issues"; or hit **Copy environment info** there — plugin version / DSH version / platform are included, so you can paste it into the issue instead of typing version numbers.
706
710
 
707
711
  **Every report gets followed up**: a new issue receives an immediate reply and the `needs-triage` label, and progress is visible in the labels (`needs-info` → `confirmed` → `fixed`). Fixed problems end up in [CHANGELOG.md](CHANGELOG.md) under the release that fixed them, tagged with the issue number (e.g. #38 / #43 / #45) — that is where a report finally lands.
708
712
 
@@ -723,9 +727,20 @@ Found a bug, a misaligned panel, a button that does nothing — or just have an
723
727
  The report came with upstream evidence (host artwork frames of 48/36 px and 40/30 px, the official published bundle
724
728
  icons, the fixture SVG) and the PR shipped a 16/30/36/48 × dark/light acceptance sheet plus a written argument for
725
729
  keeping the proposal's palette over the plugin's brand blue.
726
- - **Bug reports**: `zhyx1996` (#38 sync "Export secrets" did nothing), `IPF-Sinon` (#39 the `.credentials.yaml` `refs:` block
727
- was not recognized — they also implemented and machine-tested a fix in their own fork), `zerginlaw` (#43 "Back up now"
728
- silently no-oped while toasting success). Each report drove one fix.
730
+ - **iuuuuuuuu** — [PR #67](https://github.com/xiajiajun516/dsh-config-manager/pull/67) (merge `780af10`),
731
+ [PR #68](https://github.com/xiajiajun516/dsh-config-manager/pull/68) (`16e13c1`) and
732
+ [PR #72](https://github.com/xiajiajun516/dsh-config-manager/pull/72) (`6e552a0`): (1) a **repository picker** for the git
733
+ sync channel — choose from the **private** repositories the token can see (sorted by most recently updated; public
734
+ repositories are never listed), or create a private one inline; the create request does not even carry `private`, so
735
+ there is no way to express "public" on the client and the constraint lives on the host side. Along the way it fixed
736
+ the link-traversal boundary check that mixed `realpath` spellings (Windows 8.3 short names and macOS `/var` →
737
+ `/private/var` were misjudged `outside-home`, so linked content was silently dropped while the backup reported
738
+ success). (2) The Overview first paint no longer waits for a full read-only preview — the `plugins` section gained a
739
+ `preview()` (no more one `npm pack` per local plugin) and `settings` / `credentialsStatus` are read back in one call
740
+ instead of one `describe` per namespace (24 namespaces × 12 local plugins, 27.6 s of preview on a real machine).
741
+ (3) The issue #71 fix — MCP servers and skills configured in the shell were not backed up at all: patch rows are now
742
+ read per layer and written back to their own layer, and skills are collected through the shell's `skills` service.
743
+ All three shipped with unit tests and route / source-level guards.
729
744
 
730
745
  > Maintainers & developers: see [DEVELOPERS.md](DEVELOPERS.md) for build, testing, auto-publishing and full technical notes.
731
746