dsh-config-manager 0.1.30 → 0.1.32

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 (89) hide show
  1. package/README.md +1 -0
  2. package/README.zh-CN.md +1 -0
  3. package/lib/adapters/index.d.ts +2 -0
  4. package/lib/adapters/index.js +1 -1
  5. package/lib/adapters/index.js.map +1 -1
  6. package/lib/adapters/plugin-files.d.ts +3 -1
  7. package/lib/adapters/plugin-files.js +38 -4
  8. package/lib/adapters/plugin-files.js.map +1 -1
  9. package/lib/client.d.ts +70 -24
  10. package/lib/client.js +645 -172
  11. package/lib/client.js.map +1 -1
  12. package/lib/core/exporter.d.ts +1 -1
  13. package/lib/core/exporter.js +21 -14
  14. package/lib/core/exporter.js.map +1 -1
  15. package/lib/core/messages.d.ts +2 -0
  16. package/lib/core/messages.js +4 -0
  17. package/lib/core/messages.js.map +1 -1
  18. package/lib/index.d.ts +20 -1
  19. package/lib/index.js +222 -18
  20. package/lib/index.js.map +1 -1
  21. package/lib/security/encryption.d.ts +49 -0
  22. package/lib/security/encryption.js +134 -0
  23. package/lib/security/encryption.js.map +1 -1
  24. package/lib/sync/autosync-scheduler.d.ts +12 -0
  25. package/lib/sync/autosync-scheduler.js +131 -71
  26. package/lib/sync/autosync-scheduler.js.map +1 -1
  27. package/lib/sync/git/git-transport.d.ts +0 -2
  28. package/lib/sync/git/git-transport.js +2 -2
  29. package/lib/sync/git/git-transport.js.map +1 -1
  30. package/lib/sync/sync-config.d.ts +1 -2
  31. package/lib/sync/sync-config.js +5 -7
  32. package/lib/sync/sync-config.js.map +1 -1
  33. package/lib/sync/sync-engine.d.ts +41 -2
  34. package/lib/sync/sync-engine.js +81 -4
  35. package/lib/sync/sync-engine.js.map +1 -1
  36. package/lib/sync/sync-selection.d.ts +24 -0
  37. package/lib/sync/sync-selection.js +92 -0
  38. package/lib/sync/sync-selection.js.map +1 -0
  39. package/lib/ui/export-flow.js +1 -1
  40. package/lib/ui/export-flow.js.map +1 -1
  41. package/lib/ui/flow.d.ts +1 -1
  42. package/lib/ui/import-wizard.d.ts +23 -0
  43. package/lib/ui/import-wizard.js +39 -4
  44. package/lib/ui/import-wizard.js.map +1 -1
  45. package/lib/ui/test-helpers.d.ts +3 -0
  46. package/lib/ui/test-helpers.js +4 -0
  47. package/lib/ui/test-helpers.js.map +1 -1
  48. package/lib/ui/types.d.ts +8 -0
  49. package/lib/ui/types.js.map +1 -1
  50. package/package.json +1 -1
  51. package/src/adapters/files.test.ts +36 -0
  52. package/src/adapters/index.ts +3 -1
  53. package/src/adapters/plugin-files.ts +35 -4
  54. package/src/client/CLIENT_DEPENDENCIES.md +3 -2
  55. package/src/client/api.ts +13 -0
  56. package/src/client/config-manager.module.css +8 -0
  57. package/src/client/export/ExportView.tsx +34 -16
  58. package/src/client/import/ImportWizardView.tsx +86 -3
  59. package/src/client/import/import-file-select.test.ts +2 -2
  60. package/src/client/locales.ts +22 -6
  61. package/src/client/run-store.test.ts +2 -0
  62. package/src/client/run-store.ts +34 -4
  63. package/src/client/sync/SyncSettingsView.tsx +181 -38
  64. package/src/client/sync/sync-api.test.ts +97 -15
  65. package/src/client/sync/sync-api.ts +42 -18
  66. package/src/client/sync/sync-locales.ts +36 -10
  67. package/src/client/sync/sync-view-v2.test.ts +2 -1
  68. package/src/client/sync/sync-view.test.ts +125 -3
  69. package/src/client/sync/sync-view.ts +148 -5
  70. package/src/core/exporter.ts +21 -15
  71. package/src/core/messages.ts +4 -0
  72. package/src/index.sync.test.ts +39 -3
  73. package/src/index.ts +234 -18
  74. package/src/security/encryption.ts +163 -0
  75. package/src/security/security.test.ts +150 -0
  76. package/src/sync/autosync-scheduler.test.ts +59 -1
  77. package/src/sync/autosync-scheduler.ts +141 -70
  78. package/src/sync/git/git-transport.ts +2 -4
  79. package/src/sync/sync-config.test.ts +4 -5
  80. package/src/sync/sync-config.ts +6 -8
  81. package/src/sync/sync-engine.test.ts +161 -0
  82. package/src/sync/sync-engine.ts +89 -5
  83. package/src/sync/sync-selection.test.ts +89 -0
  84. package/src/sync/sync-selection.ts +106 -0
  85. package/src/ui/export-flow.ts +1 -1
  86. package/src/ui/flow.ts +1 -1
  87. package/src/ui/import-wizard.ts +42 -4
  88. package/src/ui/test-helpers.ts +4 -0
  89. package/src/ui/types.ts +6 -0
package/README.md CHANGED
@@ -193,6 +193,7 @@ Push / pull your portable config between machines through **either of two channe
193
193
  - **Same snapshot retention for both channels**: only the newest **10** snapshots are kept on the remote (`MAX_REMOTE_SNAPSHOTS=10`); older ones are deleted automatically.
194
194
  - **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.
195
195
  - **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.
196
+ - **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".
196
197
 
197
198
  ### 🗂️ Profiles
198
199
 
package/README.zh-CN.md CHANGED
@@ -192,6 +192,7 @@ dsh plugin --profile web add dsh-config-manager@latest --config.auto-install-pee
192
192
  - **两通道保留策略一致**:远端只保留最新 **10** 个快照(`MAX_REMOTE_SNAPSHOTS=10`),更旧的自动删除。
193
193
  - **切换通道重新开始**:Git 与 WebDAV 的快照 / 共同祖先**互不共享**。切换通道后,同步从新远端的空基线重新开始——请先推送一个新快照。
194
194
  - **WebDAV 认证**采用 HTTP Basic:`username` 存配置、可在界面回显;`password` 则实时从 DSH credentials 槽位 `DSH_CONFIG_MANAGER_SYNC_WEBDAV_PASSWORD` 读取——绝不出现于任何同步文件或日志。
195
+ - **插件自动安装**:拉取差异时,备份里新增的插件会在确认导入时**自动安装**,无需在差异列表里逐项手动勾选;只有**版本冲突**的插件仍需要你决定「保留当前 / 采用备份」。
195
196
 
196
197
  ### 🗂️ 配置档案(Profiles)
197
198
 
@@ -17,6 +17,8 @@ export interface AdapterRegistryOptions {
17
17
  credentialsRefs?: CredentialRefsProvider;
18
18
  /** pluginFiles 白名单(相对 ~/.dsh 根;缺省 dsh-ssh.json + pet.json) */
19
19
  pluginFiles?: string[];
20
+ /** pluginFiles 约定的配置目录(相对 ~/.dsh 根),递归收集其下所有插件配置文件 */
21
+ pluginFilesDir?: string;
20
22
  /** 是否包含 sessions 分区(默认关,研究报告 §4.9) */
21
23
  includeSessions?: boolean;
22
24
  /** 插件自身包名:导出 plugins 分区时不列自己(避免自引用;缺省 dsh-config-manager) */
@@ -26,7 +26,7 @@ export function createAdapters(options = {}) {
26
26
  new AgentInstructionsAdapter(),
27
27
  new WorkspacesAdapter(),
28
28
  new CredentialsAdapter({ namespaces, refs: options.credentialsRefs }),
29
- new PluginFilesAdapter(options.pluginFiles),
29
+ new PluginFilesAdapter(options.pluginFiles, options.pluginFilesDir),
30
30
  ];
31
31
  if (options.includeSessions)
32
32
  adapters.push(new SessionsAdapter());
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,eAAe,EAA0B,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAA+B,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAehD,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,UAAkC,EAAE;IACjE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAoB;QAChC,IAAI,eAAe,CAAC,UAAU,CAAC;QAC/B,IAAI,SAAS,CAAC,UAAU,CAAC;QACzB,IAAI,gBAAgB,EAAE;QACtB,IAAI,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC;QAC1C,IAAI,UAAU,EAAE;QAChB,IAAI,cAAc,EAAE;QACpB,IAAI,aAAa,EAAE;QACnB,IAAI,mBAAmB,EAAE;QACzB,IAAI,wBAAwB,EAAE;QAC9B,IAAI,iBAAiB,EAAE;QACvB,IAAI,kBAAkB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC;QACrE,IAAI,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC;KAC5C,CAAC;IACF,IAAI,OAAO,CAAC,eAAe;QAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;IAClE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAKD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAwD,MAAM,gBAAgB,CAAC;AACrI,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAA8C,MAAM,UAAU,CAAC;AACxH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAqD,MAAM,cAAc,CAAC;AACvJ,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,eAAe,EAA0B,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAA+B,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAiBhD,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,UAAkC,EAAE;IACjE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAoB;QAChC,IAAI,eAAe,CAAC,UAAU,CAAC;QAC/B,IAAI,SAAS,CAAC,UAAU,CAAC;QACzB,IAAI,gBAAgB,EAAE;QACtB,IAAI,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC;QAC1C,IAAI,UAAU,EAAE;QAChB,IAAI,cAAc,EAAE;QACpB,IAAI,aAAa,EAAE;QACnB,IAAI,mBAAmB,EAAE;QACzB,IAAI,wBAAwB,EAAE;QAC9B,IAAI,iBAAiB,EAAE;QACvB,IAAI,kBAAkB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC;QACrE,IAAI,kBAAkB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,cAAc,CAAC;KACpE,CAAC;IACF,IAAI,OAAO,CAAC,eAAe;QAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;IAClE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAKD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAwD,MAAM,gBAAgB,CAAC;AACrI,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAA8C,MAAM,UAAU,CAAC;AACxH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAqD,MAAM,cAAc,CAAC;AACvJ,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -8,7 +8,9 @@ export declare class PluginFilesAdapter implements ConfigAdapter<FilesSection> {
8
8
  readonly defaultIncluded = false;
9
9
  readonly portability: "deviceSpecific";
10
10
  private readonly whitelist;
11
- constructor(whitelist?: string[]);
11
+ /** 约定配置目录(相对 ~/.dsh 根,如 'plugin-config');递归收集其下所有文件。undefined = 不收集。 */
12
+ private readonly collectDir?;
13
+ constructor(whitelist?: string[], collectDir?: string);
12
14
  export(ctx: HostContext, _options: ExportOptions): Promise<ExportSection<FilesSection>>;
13
15
  analyzeImport(data: FilesSection, ctx: ImportContext): Promise<PlanItem[]>;
14
16
  applyItem(item: PlanItem, ctx: ImportContext): Promise<ApplyResult>;
@@ -1,10 +1,14 @@
1
1
  /**
2
2
  * pluginFiles 分区 adapter(可选,设计 §3.3/§1.2):
3
- * 数据源 = 插件自有配置文件白名单(dsh-ssh.json、pet.json 等,相对 ~/.dsh 根)。
4
- * 白名单机制避免扫描整个主目录;默认关闭(defaultIncluded=false,用户显式勾选才导出)。
3
+ * 数据源 = 插件自有配置文件(相对 ~/.dsh 根):
4
+ * 1. 白名单固定文件(dsh-ssh.json、pet.json 等,避免扫描整个主目录);
5
+ * 2. 约定的插件配置目录(collectDir,如 plugin-config/)递归收集其下所有文件。
6
+ * relativePath 一律是「相对 ~/.dsh 根」的完整路径(与白名单文件一致),
7
+ * 导入时按同一相对路径写回原位置。默认关闭(defaultIncluded=false,用户显式勾选才导出)。
5
8
  */
6
9
  import { sha256Hex } from "../utils/hashing.js";
7
10
  import { zhMsg } from "../core/messages.js";
11
+ import { isPathSafe } from "../utils/paths.js";
8
12
  export const DEFAULT_PLUGIN_FILE_WHITELIST = ['dsh-ssh.json', 'pet.json'];
9
13
  export class PluginFilesAdapter {
10
14
  id = 'pluginFiles';
@@ -12,18 +16,48 @@ export class PluginFilesAdapter {
12
16
  defaultIncluded = false;
13
17
  portability = 'deviceSpecific';
14
18
  whitelist;
15
- constructor(whitelist = [...DEFAULT_PLUGIN_FILE_WHITELIST]) {
19
+ /** 约定配置目录(相对 ~/.dsh 根,如 'plugin-config');递归收集其下所有文件。undefined = 不收集。 */
20
+ collectDir;
21
+ constructor(whitelist = [...DEFAULT_PLUGIN_FILE_WHITELIST], collectDir) {
16
22
  this.whitelist = whitelist;
23
+ if (collectDir !== undefined && collectDir !== '' && !isPathSafe(collectDir)) {
24
+ throw new Error(`pluginFiles collectDir 非法(须为相对 ~/.dsh 根的安全路径): ${collectDir}`);
25
+ }
26
+ this.collectDir = collectDir === '' ? undefined : collectDir;
17
27
  }
18
28
  async export(ctx, _options) {
19
29
  const files = [];
30
+ const seen = new Set();
31
+ // 1) 白名单固定文件(不存在则跳过,dsh-ssh.json 等为按需创建)
20
32
  for (const rel of this.whitelist) {
21
33
  try {
22
34
  const data = await ctx.fs.readFile(rel);
23
35
  files.push({ relativePath: rel, data, contentHash: sha256Hex(data) });
36
+ seen.add(rel);
24
37
  }
25
38
  catch {
26
- // 白名单文件不存在则跳过(dsh-ssh.json 等为按需创建)
39
+ /* 白名单文件不存在则跳过 */
40
+ }
41
+ }
42
+ // 2) 约定配置目录递归收集(相对 ~/.dsh 根的完整路径;与白名单文件去重)
43
+ if (this.collectDir !== undefined) {
44
+ let rels = [];
45
+ try {
46
+ rels = await ctx.fs.listRecursive(this.collectDir);
47
+ }
48
+ catch {
49
+ // 目录不存在视为空
50
+ }
51
+ for (const rel of rels) {
52
+ if (seen.has(rel))
53
+ continue;
54
+ try {
55
+ const data = await ctx.fs.readFile(rel);
56
+ files.push({ relativePath: rel, data, contentHash: sha256Hex(data) });
57
+ }
58
+ catch {
59
+ continue;
60
+ }
27
61
  }
28
62
  }
29
63
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-files.js","sourceRoot":"","sources":["../../src/adapters/plugin-files.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-files.js","sourceRoot":"","sources":["../../src/adapters/plugin-files.ts"],"names":[],"mappings":"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"}
package/lib/client.d.ts CHANGED
@@ -544,6 +544,8 @@ interface UploadResponse {
544
544
  zipPath: string;
545
545
  name: string;
546
546
  sizeBytes: number;
547
+ /** zip=普通备份;encrypted=整体加密备份容器(需先 decryptArchive 解锁才能按 ZIP 解析) */
548
+ containerType: 'zip' | 'encrypted';
547
549
  }
548
550
  /** decrypt-verify 端点响应:校验加密备份密码是否可解开 secrets.enc(零写入) */
549
551
  interface DecryptVerifyResponse {
@@ -604,6 +606,10 @@ declare class ConfigManagerApi {
604
606
  createImportPlan(zipPath: string, decisions: ImportDecisions): Promise<ImportPlan>;
605
607
  /** 验证加密备份的解密密码(只读零写入):成功返回将恢复的凭据数;密码错误抛 ConfigManagerApiError */
606
608
  verifyDecrypt(zipPath: string, password: string): Promise<DecryptVerifyResponse>;
609
+ /** ImportPort.decryptArchive:解锁整体加密备份容器 → 返回可被 analyze/plan/execute 引用的明文 ZIP 路径 */
610
+ decryptArchive(zipPath: string, password: string): Promise<{
611
+ zipPath: string;
612
+ }>;
607
613
  /** ImportPort.executeImportPlan:快照→分阶段 apply→validate→commit/rollback */
608
614
  executeImportPlan(zipPath: string, plan: ImportPlan, opts: {
609
615
  confirm: boolean;
@@ -645,7 +651,8 @@ interface SyncPullReport {
645
651
  ok: boolean;
646
652
  snapshotId: string;
647
653
  changes: PullChange[];
648
- /** 是否存在需要人工决策的项(Conflict / MissingSecret / MissingDependency / Install / 路径问题) */
654
+ /** 是否存在需要人工决策的项(Conflict / MissingSecret / MissingDependency / 路径问题)。
655
+ * 插件 Install 不算 —— 插件安装随同步自动采用(product requirement)。 */
649
656
  needsReview: boolean;
650
657
  message?: string;
651
658
  }
@@ -653,15 +660,6 @@ interface SyncPullReport {
653
660
  //#region src/client/sync/sync-api.d.ts
654
661
  /** 远程同步通道类型:git(默认)或 webdav */
655
662
  type SyncTransportType = 'git' | 'webdav';
656
- /** WebDAV 通道配置(仅请求体携带;password 为 secret,只存在于请求体,Host 写入 credentials 后值不回传) */
657
- interface WebDavRequestPayload {
658
- /** WebDAV 远端根地址(https://…),快照存于 {url}/snapshots/ 下 */
659
- url?: string;
660
- /** HTTP Basic 用户名(非敏感) */
661
- username?: string;
662
- /** HTTP Basic 密码(secret:仅请求体,绝不持久化到同步文件/日志/URL) */
663
- password?: string;
664
- }
665
663
  /** GET /sync/status 响应:配置/凭据/上次同步的只读事实(无任何 secret 值) */
666
664
  interface SyncStatusResponse {
667
665
  ok: boolean;
@@ -669,7 +667,6 @@ interface SyncStatusResponse {
669
667
  configured: boolean;
670
668
  /** git 通道:上次使用的仓库地址(不含 token,可回显) */
671
669
  repoUrl?: string;
672
- gitBin?: string;
673
670
  /** git 通道:DSH credentials 中是否已存在 token(describe 只报状态,值永不返回) */
674
671
  credentialConfigured: boolean;
675
672
  credentialWritable: boolean;
@@ -683,28 +680,54 @@ interface SyncStatusResponse {
683
680
  type: string;
684
681
  ref: string;
685
682
  };
683
+ /** 可同步分区目录(「高级/自定义导出」勾选列表;host adapters 唯一事实源,只含 portable) */
684
+ syncSections?: SyncSectionInfo[];
685
+ /** 当前分区选择(默认/高级模式 + 勾选分区;UI 回填用,自动同步与手动 push 共用) */
686
+ syncSelection?: SyncSelectionPayload;
686
687
  /** 自动同步当前状态(供 UI 顶部开关回填;§3.9) */
687
688
  autosync?: AutosyncStatusResponse;
688
689
  }
690
+ /** 同步分区选择(POST /sync/selection 请求体 + status.syncSelection 响应;持久化于 Host)。 */
691
+ interface SyncSelectionPayload {
692
+ mode: 'default' | 'advanced';
693
+ /** 高级模式勾选分区;default 模式可为空数组 */
694
+ sections: SectionId[];
695
+ }
689
696
  /** webdav 通道状态字段(无任何 secret 值;password 只报 passwordConfigured 布尔) */
690
697
  interface WebDavStatusResponse {
691
698
  /** 上次使用的服务器地址(可回显;不含 userinfo) */
692
699
  url?: string;
693
- /** 是否已填过用户名(布尔;便于 UI 提示。username 值由 Host 不回传) */
700
+ /** 上次使用的用户名(非敏感,可回显;供表单回填) */
701
+ username?: string;
702
+ /** 是否已填过用户名(布尔;便于 UI 提示徽章) */
694
703
  usernameConfigured: boolean;
695
704
  /** DSH credentials 中是否已存在密码(值永不返回) */
696
705
  passwordConfigured: boolean;
697
706
  }
707
+ /** 可同步分区条目(status.syncSections 项)。只含 portable —— 与 SyncEngine 同步通道一致。 */
708
+ interface SyncSectionInfo {
709
+ id: SectionId;
710
+ /** 展示名(host adapter displayName) */
711
+ displayName: string;
712
+ portability: 'portable' | 'deviceSpecific' | 'platformSpecific';
713
+ defaultIncluded: boolean;
714
+ }
698
715
  /** push 请求体(token 可选:非空则 Host 先写入 DSH credentials 再使用)。
699
- * git 通道携带 repoUrl/gitBin/token;webdav 通道携带 webdav.url/username/password。 */
716
+ * 扁平形状与 Host parseSyncBody 一致:git 携带 repoUrl/token;
717
+ * webdav 携带 url/username/password(顶层,不嵌套 webdav 对象)。
718
+ * git 可执行文件固定使用系统 PATH 中的 git,不再接受自定义路径。
719
+ * sections 可选(高级/自定义导出模式):只推送勾选分区;缺省 = 默认模式全部推荐分区。 */
700
720
  interface SyncPushPayload {
701
721
  /** 通道类型;缺省 'git' */
702
722
  transport?: SyncTransportType;
703
723
  repoUrl?: string;
704
- gitBin?: string;
705
724
  token?: string;
706
- /** webdav 通道配置(transport='webdav' 时使用) */
707
- webdav?: WebDavRequestPayload;
725
+ /** webdav 通道字段(transport='webdav' 时使用;扁平顶层) */
726
+ url?: string;
727
+ username?: string;
728
+ password?: string;
729
+ /** 仅同步指定分区(缺省 = 全部 portable 推荐分区;即「默认/快速导出」vs「高级/自定义导出」) */
730
+ sections?: SectionId[];
708
731
  }
709
732
  /** pull 请求体(strategy 缺省 merge:冲突保留待决策;snapshotId 缺省 = 最新) */
710
733
  interface SyncPullPayload extends SyncPushPayload {
@@ -922,6 +945,9 @@ declare class SyncApi {
922
945
  autosyncStatus(): Promise<AutosyncStatusResponse>;
923
946
  /** 自动同步配置更新(POST /sync/autosync)。 */
924
947
  autosyncUpdate(payload: AutosyncUpdatePayload): Promise<AutosyncStatusResponse>;
948
+ /** 保存同步分区选择(POST /sync/selection):模式 + 勾选分区持久化到 Host。
949
+ * 自动同步调度器与手动 push 共用此配置(刷新/重启后仍然生效)。 */
950
+ saveSelection(payload: SyncSelectionPayload): Promise<SyncSelectionPayload>;
925
951
  /** 一键回滚:按 restoreId 调用 backup→rollback */
926
952
  rollback(payload: {
927
953
  restoreId: string;
@@ -1086,12 +1112,15 @@ declare const zh$2: {
1086
1112
  readonly 'export.mode.quickHint': "一键导出推荐分区(可迁移、不含设备专属数据),适合常规备份。";
1087
1113
  readonly 'export.mode.custom': "自定义导出";
1088
1114
  readonly 'export.mode.customHint': "按分组逐项勾选要导出的分区。";
1089
- readonly 'export.includeSecrets': "包含真实密钥(加密备份)";
1090
- readonly 'export.includeSecretsHint': "勾选后导出将包含密钥,并以密码加密(AES-256-GCM)。密码仅用于本次加密,不会写入备份或任何配置文件。";
1115
+ readonly 'export.security': "安全选项";
1116
+ readonly 'export.encrypt': "加密备份";
1117
+ readonly 'export.encryptHint': "用密码加密整个备份文件(AES-256-GCM)。密码仅用于本次加密,不会写入备份或任何配置文件;导入时必须输入该密码才能解锁。";
1091
1118
  readonly 'export.password': "备份加密密码";
1092
1119
  readonly 'export.passwordConfirm': "确认密码";
1093
1120
  readonly 'export.passwordMismatch': "两次输入的密码不一致";
1094
- readonly 'export.passwordRequired': "包含密钥时必须设置加密密码";
1121
+ readonly 'export.passwordRequired': "加密备份必须设置密码";
1122
+ readonly 'export.includeSecrets': "导出密钥";
1123
+ readonly 'export.includeSecretsHint': "把真实密钥(凭据值)写入备份。密钥必须以加密形式保存:勾选时会自动选中「加密备份」;取消「加密备份」会同时取消「导出密钥」。";
1095
1124
  readonly 'export.run': "开始导出";
1096
1125
  readonly 'export.running': "正在导出…";
1097
1126
  readonly 'export.download': "下载备份文件";
@@ -1133,6 +1162,11 @@ declare const zh$2: {
1133
1162
  readonly 'import.decrypt.badge': "加密备份";
1134
1163
  readonly 'import.decrypt.title': "解密备份";
1135
1164
  readonly 'import.decrypt.hint': "此备份包含加密的凭据,必须输入导出时设置的加密密码才能解锁并继续导入。";
1165
+ readonly 'import.decryptArchive.title': "解锁加密备份";
1166
+ readonly 'import.decryptArchive.hint': "此备份已整体加密(整个文件被密码保护)。输入导出时设置的密码才能解密并继续导入;密码仅本次使用,绝不落盘。";
1167
+ readonly 'import.decryptArchive.passwordPlaceholder': "输入备份加密密码";
1168
+ readonly 'import.decryptArchive.unlock': "解锁并继续";
1169
+ readonly 'import.decryptArchive.unlocking': "解锁中…";
1136
1170
  readonly 'import.decrypt.passwordPlaceholder': "输入备份加密密码";
1137
1171
  readonly 'import.decrypt.verify': "验证密码";
1138
1172
  readonly 'import.decrypt.verifying': "验证中…";
@@ -1207,8 +1241,6 @@ declare const zh$1: {
1207
1241
  readonly 'config.tokenHint': "将安全写入 DSH credentials(引用名 {ref}),不会写入同步文件或日志。留空表示沿用已保存的凭据。";
1208
1242
  readonly 'config.tokenSaved': "凭据已配置";
1209
1243
  readonly 'config.tokenPlaceholder': "ghp_…(可选)";
1210
- readonly 'config.gitBin': "git 可执行文件(可选)";
1211
- readonly 'config.gitBinHint': "缺省使用 PATH 中的 git。";
1212
1244
  readonly 'channel.title': "同步通道";
1213
1245
  readonly 'channel.hint': "选择远程同步通道:Git 私有仓库或 WebDAV 服务器。";
1214
1246
  readonly 'channel.git': "Git 私有仓库";
@@ -1222,6 +1254,7 @@ declare const zh$1: {
1222
1254
  readonly 'webdav.passwordHint': "将安全写入 DSH credentials(引用名 {ref}),不会写入同步文件或日志。留空表示沿用已保存的凭据。";
1223
1255
  readonly 'webdav.passwordSaved': "凭据已配置";
1224
1256
  readonly 'webdav.passwordPlaceholder': "密码(可选)";
1257
+ readonly 'webdav.presetHint': "选择常见 WebDAV 服务器可快速填入地址;含 <占位符> 的模板请替换为你的真实服务器/用户名。";
1225
1258
  readonly 'github.title': "GitHub 登录";
1226
1259
  readonly 'github.description': "通过 GitHub OAuth 设备码流程授权:无需手动输入 token,在浏览器中确认授权后,token 自动写入 DSH credentials。";
1227
1260
  readonly 'github.login': "使用 GitHub 登录";
@@ -1278,11 +1311,24 @@ declare const zh$1: {
1278
1311
  readonly 'syncflow.rollingBack': "正在回滚…";
1279
1312
  readonly 'syncflow.rollbackDone': "已回滚到应用前";
1280
1313
  readonly 'syncflow.needsRestart': "部分改动需要重启 DSH 后生效";
1314
+ readonly 'mode.title': "同步模式";
1315
+ readonly 'mode.hint': "选择推送时导出哪些分区:默认 = 推荐分区一键推送(快速导出);高级 = 自定义勾选(自定义导出)。";
1316
+ readonly 'mode.default': "默认(快速导出)";
1317
+ readonly 'mode.defaultHint': "一键推送全部推荐分区(settings、providers、plugins、prompts、skills 等),无需配置。";
1318
+ readonly 'mode.advanced': "高级(自定义导出)";
1319
+ readonly 'mode.advancedHint': "手动勾选要推送的分区(等同导出备份的自定义导出);仅可移植分区可参与同步。";
1320
+ readonly 'mode.sectionsTitle': "同步分区";
1321
+ readonly 'mode.sectionsHint': "仅可移植分区可同步:设备相关(插件文件、凭据状态、会话)与平台相关(MCP、工作区)分区不参与远程同步。";
1322
+ readonly 'mode.atLeastOne': "请至少勾选一个同步分区";
1323
+ readonly 'mode.defaultCount': "将同步 {n} 个推荐分区";
1324
+ readonly 'mode.sectionPortable': "可移植";
1325
+ readonly 'mode.sectionRecommended': "推荐";
1326
+ readonly 'mode.persistHint': "模式与分区选择已保存到本机:自动同步和手动推送都会使用此配置(重启后仍生效)。";
1281
1327
  readonly 'autosync.title': "自动同步";
1282
- readonly 'autosync.description': "开启后,DSH 将按固定间隔自动执行双向同步(拉取合并 + 上传);DSH 启动时还会触发一次「自动下载合并(不上传)」以保持本地为最新。仅在无冲突且无需人工干预时才自动写入。";
1328
+ readonly 'autosync.description': "开启后,DSH 在后台保持配置一致:本地配置有改动时自动上传,检测到远端有新快照时才自动拉取合并;定时器仅作兜底轮询,无变化不重复动作。仅在无冲突且无需人工干预时才自动写入本地。";
1283
1329
  readonly 'autosync.enable': "启用自动同步";
1284
- readonly 'autosync.interval': "同步间隔";
1285
- readonly 'autosync.intervalHint': "DSH 启动时自动下载合并不上传。";
1330
+ readonly 'autosync.interval': "兜底轮询间隔";
1331
+ readonly 'autosync.intervalHint': "间隔到点 / DSH 启动时检查远端是否有新快照,有才拉取合并(不上传本地);本地配置改动会触发上传。";
1286
1332
  readonly 'autosync.interval5m': "5 分钟";
1287
1333
  readonly 'autosync.interval15m': "15 分钟";
1288
1334
  readonly 'autosync.interval30m': "30 分钟";