dsh-config-manager 0.1.32 → 0.1.33

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 (56) hide show
  1. package/lib/client.d.ts +48 -3
  2. package/lib/client.js +446 -106
  3. package/lib/client.js.map +1 -1
  4. package/lib/core/messages.d.ts +3 -0
  5. package/lib/core/messages.js +6 -0
  6. package/lib/core/messages.js.map +1 -1
  7. package/lib/index.d.ts +6 -0
  8. package/lib/index.js +113 -8
  9. package/lib/index.js.map +1 -1
  10. package/lib/sync/autosync-scheduler.js +25 -0
  11. package/lib/sync/autosync-scheduler.js.map +1 -1
  12. package/lib/sync/layout.js +5 -0
  13. package/lib/sync/layout.js.map +1 -1
  14. package/lib/sync/snapshot-crypto.d.ts +8 -0
  15. package/lib/sync/snapshot-crypto.js +37 -0
  16. package/lib/sync/snapshot-crypto.js.map +1 -0
  17. package/lib/sync/sync-engine.d.ts +24 -1
  18. package/lib/sync/sync-engine.js +74 -26
  19. package/lib/sync/sync-engine.js.map +1 -1
  20. package/lib/sync/sync-selection.d.ts +4 -0
  21. package/lib/sync/sync-selection.js +10 -1
  22. package/lib/sync/sync-selection.js.map +1 -1
  23. package/lib/sync/transport.d.ts +20 -5
  24. package/lib/sync/transport.js +16 -3
  25. package/lib/sync/transport.js.map +1 -1
  26. package/lib/sync/webdav/webdav-transport.d.ts +1 -1
  27. package/lib/sync/webdav/webdav-transport.js +6 -1
  28. package/lib/sync/webdav/webdav-transport.js.map +1 -1
  29. package/package.json +1 -1
  30. package/src/client/import/ImportWizardView.tsx +6 -2
  31. package/src/client/import/import-file-select.test.ts +39 -0
  32. package/src/client/import/import-file-select.ts +14 -0
  33. package/src/client/sync/SyncSettingsView.tsx +302 -19
  34. package/src/client/sync/history-model.test.ts +1 -0
  35. package/src/client/sync/history-model.ts +1 -0
  36. package/src/client/sync/sync-api.test.ts +45 -0
  37. package/src/client/sync/sync-api.ts +37 -2
  38. package/src/client/sync/sync-locales.ts +34 -0
  39. package/src/core/messages.ts +6 -0
  40. package/src/index.sync.test.ts +37 -2
  41. package/src/index.ts +116 -10
  42. package/src/sync/ancestor.test.ts +7 -4
  43. package/src/sync/autosync-scheduler.test.ts +47 -0
  44. package/src/sync/autosync-scheduler.ts +25 -0
  45. package/src/sync/git/git-transport.test.ts +2 -2
  46. package/src/sync/layout.test.ts +13 -7
  47. package/src/sync/layout.ts +5 -0
  48. package/src/sync/snapshot-crypto.test.ts +57 -0
  49. package/src/sync/snapshot-crypto.ts +45 -0
  50. package/src/sync/sync-engine.test.ts +133 -7
  51. package/src/sync/sync-engine.ts +88 -27
  52. package/src/sync/sync-selection.test.ts +21 -3
  53. package/src/sync/sync-selection.ts +11 -1
  54. package/src/sync/transport.test.ts +4 -3
  55. package/src/sync/transport.ts +32 -7
  56. package/src/sync/webdav/webdav-transport.ts +7 -2
package/lib/client.d.ts CHANGED
@@ -692,6 +692,10 @@ interface SyncSelectionPayload {
692
692
  mode: 'default' | 'advanced';
693
693
  /** 高级模式勾选分区;default 模式可为空数组 */
694
694
  sections: SectionId[];
695
+ /** 手动推送默认加密快照(密码每次推送输入,不持久化) */
696
+ encrypt?: boolean;
697
+ /** 手动推送默认导出真实凭据值(必须同时 encrypt) */
698
+ includeSecrets?: boolean;
695
699
  }
696
700
  /** webdav 通道状态字段(无任何 secret 值;password 只报 passwordConfigured 布尔) */
697
701
  interface WebDavStatusResponse {
@@ -704,6 +708,19 @@ interface WebDavStatusResponse {
704
708
  /** DSH credentials 中是否已存在密码(值永不返回) */
705
709
  passwordConfigured: boolean;
706
710
  }
711
+ /** POST /sync/config 响应:保存成功后的轻量凭据状态(无 secret 值;UI 直接合并刷新徽章)。 */
712
+ interface SyncConfigSaveResponse {
713
+ ok: boolean;
714
+ configured: boolean;
715
+ transport: SyncTransportType;
716
+ /** git 通道:token 是否已配置(值永不返回) */
717
+ credentialConfigured: boolean;
718
+ /** webdav 通道:username/password 是否已配置(值永不返回;git 通道为 undefined) */
719
+ webdav?: {
720
+ usernameConfigured: boolean;
721
+ passwordConfigured: boolean;
722
+ };
723
+ }
707
724
  /** 可同步分区条目(status.syncSections 项)。只含 portable —— 与 SyncEngine 同步通道一致。 */
708
725
  interface SyncSectionInfo {
709
726
  id: SectionId;
@@ -716,7 +733,8 @@ interface SyncSectionInfo {
716
733
  * 扁平形状与 Host parseSyncBody 一致:git 携带 repoUrl/token;
717
734
  * webdav 携带 url/username/password(顶层,不嵌套 webdav 对象)。
718
735
  * git 可执行文件固定使用系统 PATH 中的 git,不再接受自定义路径。
719
- * sections 可选(高级/自定义导出模式):只推送勾选分区;缺省 = 默认模式全部推荐分区。 */
736
+ * sections 可选(高级/自定义导出模式):只推送勾选分区;缺省 = 默认模式全部推荐分区。
737
+ * encrypt/encryptPassword/includeSecrets:加密快照(含可选密钥导出;密码仅内存传输,绝不落盘)。 */
720
738
  interface SyncPushPayload {
721
739
  /** 通道类型;缺省 'git' */
722
740
  transport?: SyncTransportType;
@@ -728,11 +746,20 @@ interface SyncPushPayload {
728
746
  password?: string;
729
747
  /** 仅同步指定分区(缺省 = 全部 portable 推荐分区;即「默认/快速导出」vs「高级/自定义导出」) */
730
748
  sections?: SectionId[];
731
- }
732
- /** pull 请求体(strategy 缺省 merge:冲突保留待决策;snapshotId 缺省 = 最新) */
749
+ /** 加密快照(sections 载荷整体加密;开启时必须提供 encryptPassword) */
750
+ encrypt?: boolean;
751
+ /** 加密密码(仅本次请求体内存传输,Host 绝不落盘/落日志;encrypt=true 时必填) */
752
+ encryptPassword?: string;
753
+ /** 导出真实凭据值(必须同时 encrypt=true,否则 Host 拒绝:密钥绝不明文进同步通道) */
754
+ includeSecrets?: boolean;
755
+ }
756
+ /** pull 请求体(strategy 缺省 merge:冲突保留待决策;snapshotId 缺省 = 最新;
757
+ * decryptPassword 可选:拉取加密快照时提供,仅内存传输)。 */
733
758
  interface SyncPullPayload extends SyncPushPayload {
734
759
  strategy?: 'merge' | 'replace' | 'skipExisting';
735
760
  snapshotId?: string;
761
+ /** 解密密码(拉取/一键同步遇到加密快照时提供;仅内存传输,绝不落盘) */
762
+ decryptPassword?: string;
736
763
  }
737
764
  /** GET /sync/snapshots-list 响应:远端历史快照列表(按 createdAt 倒序)。 */
738
765
  interface SyncSnapshotsListResponse {
@@ -948,6 +975,9 @@ declare class SyncApi {
948
975
  /** 保存同步分区选择(POST /sync/selection):模式 + 勾选分区持久化到 Host。
949
976
  * 自动同步调度器与手动 push 共用此配置(刷新/重启后仍然生效)。 */
950
977
  saveSelection(payload: SyncSelectionPayload): Promise<SyncSelectionPayload>;
978
+ /** 保存同步通道配置(POST /sync/config):url/username/password(git: repoUrl/token)持久化。
979
+ * password/token 经 Host 写入 DSH credentials(值永不回传);返回凭据布尔供 UI 刷新徽章。 */
980
+ saveConfig(payload: SyncPushPayload): Promise<SyncConfigSaveResponse>;
951
981
  /** 一键回滚:按 restoreId 调用 backup→rollback */
952
982
  rollback(payload: {
953
983
  restoreId: string;
@@ -1241,6 +1271,9 @@ declare const zh$1: {
1241
1271
  readonly 'config.tokenHint': "将安全写入 DSH credentials(引用名 {ref}),不会写入同步文件或日志。留空表示沿用已保存的凭据。";
1242
1272
  readonly 'config.tokenSaved': "凭据已配置";
1243
1273
  readonly 'config.tokenPlaceholder': "ghp_…(可选)";
1274
+ readonly 'config.save': "保存配置";
1275
+ readonly 'config.saving': "保存中…";
1276
+ readonly 'config.saveHint': "表单改动会自动保存(密码/token 安全写入 DSH credentials,不会写入同步文件或日志);也可点击按钮立即保存。";
1244
1277
  readonly 'channel.title': "同步通道";
1245
1278
  readonly 'channel.hint': "选择远程同步通道:Git 私有仓库或 WebDAV 服务器。";
1246
1279
  readonly 'channel.git': "Git 私有仓库";
@@ -1324,6 +1357,18 @@ declare const zh$1: {
1324
1357
  readonly 'mode.sectionPortable': "可移植";
1325
1358
  readonly 'mode.sectionRecommended': "推荐";
1326
1359
  readonly 'mode.persistHint': "模式与分区选择已保存到本机:自动同步和手动推送都会使用此配置(重启后仍生效)。";
1360
+ readonly 'mode.security': "加密与密钥导出(安全选项)";
1361
+ readonly 'mode.encrypt': "加密备份";
1362
+ readonly 'mode.encryptHint': "用密码加密同步快照(AES-256-GCM)。密码仅本次推送使用、绝不落盘;自动同步无法解密加密快照,会自动跳过并在同步历史中提示。";
1363
+ readonly 'mode.password': "加密密码";
1364
+ readonly 'mode.passwordConfirm': "确认密码";
1365
+ readonly 'mode.passwordMismatch': "两次输入的密码不一致";
1366
+ readonly 'mode.passwordRequired': "加密必须设置密码";
1367
+ readonly 'mode.includeSecrets': "导出密钥";
1368
+ readonly 'mode.includeSecretsHint': "把真实凭据值写入加密快照(勾选时自动选中加密;密钥绝不进入未加密快照)。";
1369
+ readonly 'mode.encryptAutosyncNotice': "加密快照仅通过手动推送/拉取使用;自动同步无密码,遇到加密快照会跳过并在历史中提示。";
1370
+ readonly 'mode.decryptPassword': "解密密码(加密快照拉取/同步用,可选)";
1371
+ readonly 'mode.decryptPasswordHint': "拉取或一键同步遇到加密快照时输入;不输入则加密快照无法读取(自动同步会跳过并在历史中提示)。";
1327
1372
  readonly 'autosync.title': "自动同步";
1328
1373
  readonly 'autosync.description': "开启后,DSH 在后台保持配置一致:本地配置有改动时自动上传,检测到远端有新快照时才自动拉取合并;定时器仅作兜底轮询,无变化不重复动作。仅在无冲突且无需人工干预时才自动写入本地。";
1329
1374
  readonly 'autosync.enable': "启用自动同步";