dsh-config-manager 0.1.83 → 0.1.85
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.
- package/lib/adapters/file-collection.d.ts +9 -2
- package/lib/adapters/file-collection.js +22 -3
- package/lib/adapters/self.d.ts +7 -3
- package/lib/client.d.ts +153 -399
- package/lib/client.js +1526 -2229
- package/lib/core/messages.d.ts +1 -0
- package/lib/core/messages.js +2 -0
- package/lib/core/restore.js +7 -1
- package/lib/index.d.ts +6 -4
- package/lib/index.js +7 -7
- package/lib/routes/sync.js +92 -70
- package/lib/sync/git/git-transport.d.ts +2 -0
- package/lib/sync/git/git-transport.js +75 -22
- package/lib/sync/messages.d.ts +2 -0
- package/lib/sync/messages.js +4 -0
- package/lib/sync/sync-engine.d.ts +4 -4
- package/lib/sync/sync-engine.js +3 -4
- package/lib/ui/i18n.d.ts +2 -84
- package/lib/ui/i18n.js +4 -168
- package/package.json +1 -1
- package/src/adapters/file-collection.ts +22 -3
- package/src/adapters/self.test.ts +43 -0
- package/src/adapters/self.ts +7 -3
- package/src/client/ConfigManagerSection.tsx +1 -18
- package/src/client/about/AboutPanel.tsx +4 -11
- package/src/client/about/ReleaseNotesDialog.tsx +1 -2
- package/src/client/chat/chat-locales.ts +0 -8
- package/src/client/common/CommandPalette.tsx +0 -1
- package/src/client/common/ContentPicker.tsx +10 -1
- package/src/client/common/info-hint-guard.test.ts +4 -4
- package/src/client/config-manager.module.css +2 -32
- package/src/client/environment/EnvironmentPanel.tsx +10 -9
- package/src/client/environment/maintenance/DiskUsageCard.tsx +10 -10
- package/src/client/export/ExportView.tsx +10 -13
- package/src/client/history/HistoryPanel.tsx +9 -11
- package/src/client/history/history-locales.ts +4 -40
- package/src/client/home/BackupScheduleCard.tsx +0 -2
- package/src/client/home/HomePanel.tsx +75 -49
- package/src/client/import/ForeignImportView.tsx +6 -7
- package/src/client/import/ImportWizardView.tsx +8 -9
- package/src/client/import/import-wizard-steps.tsx +20 -15
- package/src/client/library/BackupInspectView.tsx +3 -11
- package/src/client/library/LibraryActions.tsx +2 -1
- package/src/client/library/LibraryPanel.tsx +6 -3
- package/src/client/locales.ts +122 -278
- package/src/client/market/MarketImportReview.tsx +6 -5
- package/src/client/market/MarketPanel.tsx +2 -2
- package/src/client/market/MyConfigsLoginCard.tsx +0 -3
- package/src/client/market/MyConfigsView.tsx +3 -4
- package/src/client/market/MyConfigsWizard.tsx +8 -4
- package/src/client/market/market-locales.ts +20 -60
- package/src/client/recovery/IncompleteCopiesSection.tsx +6 -8
- package/src/client/recovery/RecoveryPanel.tsx +48 -73
- package/src/client/recovery/RollbackCard.tsx +27 -20
- package/src/client/recovery/recovery-locales.test.ts +1 -3
- package/src/client/recovery/recovery-locales.ts +71 -133
- package/src/client/recovery/recovery-panel-layout.test.ts +4 -2
- package/src/client/sync/DecryptPasswordCard.tsx +2 -2
- package/src/client/sync/MergeModal.tsx +3 -1
- package/src/client/sync/MergePreviewView.tsx +14 -16
- package/src/client/sync/PushPreviewCard.tsx +0 -1
- package/src/client/sync/SecurityOptionsCard.tsx +5 -1
- package/src/client/sync/SyncChannelEntryCard.tsx +3 -10
- package/src/client/sync/SyncConfirmView.tsx +23 -20
- package/src/client/sync/SyncLogList.tsx +5 -2
- package/src/client/sync/SyncPanel.tsx +10 -9
- package/src/client/sync/SyncProbeRow.tsx +6 -8
- package/src/client/sync/SyncSectionPickerDialog.tsx +3 -3
- package/src/client/sync/WorkDirCard.tsx +6 -7
- package/src/client/sync/preview-failure.test.ts +58 -0
- package/src/client/sync/preview-failure.ts +47 -0
- package/src/client/sync/sync-api.ts +19 -3
- package/src/client/sync/sync-entry.test.ts +6 -0
- package/src/client/sync/sync-entry.ts +4 -1
- package/src/client/sync/sync-locales.ts +31 -147
- package/src/client/sync/sync-push-preview.test.ts +1 -1
- package/src/client/sync/sync-view.ts +1 -4
- package/src/core/messages.ts +2 -0
- package/src/core/restore.ts +8 -1
- package/src/index.ts +8 -8
- package/src/routes/sync.ts +91 -69
- package/src/sync/git/git-clone-auth.test.ts +61 -0
- package/src/sync/git/git-transport.test.ts +75 -1
- package/src/sync/git/git-transport.ts +74 -20
- package/src/sync/messages.ts +4 -0
- package/src/sync/sync-engine.ts +6 -6
- package/src/sync/sync-preview-empty.test.ts +58 -0
- package/src/ui/i18n.ts +4 -168
|
@@ -116,11 +116,18 @@ export declare abstract class FileCollectionAdapter implements ConfigAdapter<Fil
|
|
|
116
116
|
/** 单元清单(零 I/O:直接由 export 产物归并)。 */
|
|
117
117
|
listUnits(section: ExportSection<FilesSection>): ExportUnit[];
|
|
118
118
|
/**
|
|
119
|
-
*
|
|
119
|
+
* **身份内容**(相对 baseDir 路径 + 盘上/包内字节 → 参与哈希与导出的字节)。
|
|
120
120
|
*
|
|
121
121
|
* 缺省 = **原字节**:对文件类分区来说「相对路径 + 内容哈希」就是身份语义,不得改动。
|
|
122
122
|
* 覆写者只应用于剔除**不属于「配置身份」的易变字段**(见 SelfAdapter 的两个调度配置:
|
|
123
|
-
* 运行态每轮都被改写,整文件哈希会恒判 Conflict —— issue #73
|
|
123
|
+
* 运行态每轮都被改写,整文件哈希会恒判 Conflict —— issue #73;同一批字段还会让
|
|
124
|
+
* 分区 hash 每轮都变 → 自动同步每轮真推一次 —— issue #127)。
|
|
125
|
+
*
|
|
126
|
+
* 用途有两处,且**必须共用同一份字节**,否则「判等」与「落地」分叉:
|
|
127
|
+
* 1. analyzeImport 的幂等判定(包内 vs 盘上);
|
|
128
|
+
* 2. collect() 的导出载荷与 contentHash —— hashSection 按字节算分区 hash,
|
|
129
|
+
* 载荷里留着易变字段就等于每轮都判「本地有改动」。
|
|
130
|
+
* 两条契约:
|
|
124
131
|
* 1. **必须收敛**:applyItem 写盘后再分析一次必须判 Skip,否则同步永不收敛;
|
|
125
132
|
* 2. **未改写时返回同一引用** —— 调用方据此复用导入侧已算好的 contentHash,
|
|
126
133
|
* 不给 sessions 这类大分区白算一遍哈希。
|
|
@@ -206,10 +206,22 @@ export class FileCollectionAdapter {
|
|
|
206
206
|
unitBytes += read.sizeBytes;
|
|
207
207
|
if (unitBytes > room)
|
|
208
208
|
break;
|
|
209
|
+
// 身份字节(issue #127):`comparableContent` 定义的「参与哈希的身份内容」同时作为
|
|
210
|
+
// **导出载荷**写出。否则基线与包内字节的口径不一致 —— 子类剔掉的易变字段仍躺在载荷里,
|
|
211
|
+
// hashSection 照样每轮都变(真机现场:self 分区因 sync-autosync.json 的运行态每 ~60s
|
|
212
|
+
// 被判「本地有改动」,一天推 40+ 个内容几乎相同的快照)。
|
|
213
|
+
// 缺省实现返回同一引用 → 其余分区字节/哈希逐字节不变(`files.test.ts` 的 contentHash 断言照旧)。
|
|
214
|
+
const identity = mode === 'content' ? this.comparableContent(member.relPath, read.data) : read.data;
|
|
209
215
|
pending.push({
|
|
210
216
|
rel: member.rel,
|
|
211
217
|
sizeBytes: read.sizeBytes,
|
|
212
|
-
entry: {
|
|
218
|
+
entry: {
|
|
219
|
+
relativePath: member.relPath,
|
|
220
|
+
data: identity,
|
|
221
|
+
contentHash: mode === 'content'
|
|
222
|
+
? (identity === read.data ? read.contentHash : sha256Hex(identity))
|
|
223
|
+
: read.contentHash,
|
|
224
|
+
},
|
|
213
225
|
});
|
|
214
226
|
}
|
|
215
227
|
if (unitBytes > room) {
|
|
@@ -291,11 +303,18 @@ export class FileCollectionAdapter {
|
|
|
291
303
|
return unitsFromFiles(this.id, section.data.files ?? [], (rel) => this.unitIdOf(rel));
|
|
292
304
|
}
|
|
293
305
|
/**
|
|
294
|
-
*
|
|
306
|
+
* **身份内容**(相对 baseDir 路径 + 盘上/包内字节 → 参与哈希与导出的字节)。
|
|
295
307
|
*
|
|
296
308
|
* 缺省 = **原字节**:对文件类分区来说「相对路径 + 内容哈希」就是身份语义,不得改动。
|
|
297
309
|
* 覆写者只应用于剔除**不属于「配置身份」的易变字段**(见 SelfAdapter 的两个调度配置:
|
|
298
|
-
* 运行态每轮都被改写,整文件哈希会恒判 Conflict —— issue #73
|
|
310
|
+
* 运行态每轮都被改写,整文件哈希会恒判 Conflict —— issue #73;同一批字段还会让
|
|
311
|
+
* 分区 hash 每轮都变 → 自动同步每轮真推一次 —— issue #127)。
|
|
312
|
+
*
|
|
313
|
+
* 用途有两处,且**必须共用同一份字节**,否则「判等」与「落地」分叉:
|
|
314
|
+
* 1. analyzeImport 的幂等判定(包内 vs 盘上);
|
|
315
|
+
* 2. collect() 的导出载荷与 contentHash —— hashSection 按字节算分区 hash,
|
|
316
|
+
* 载荷里留着易变字段就等于每轮都判「本地有改动」。
|
|
317
|
+
* 两条契约:
|
|
299
318
|
* 1. **必须收敛**:applyItem 写盘后再分析一次必须判 Skip,否则同步永不收敛;
|
|
300
319
|
* 2. **未改写时返回同一引用** —— 调用方据此复用导入侧已算好的 contentHash,
|
|
301
320
|
* 不给 sessions 这类大分区白算一遍哈希。
|
package/lib/adapters/self.d.ts
CHANGED
|
@@ -20,9 +20,13 @@
|
|
|
20
20
|
* 快照/回滚路径一致);**清单来自覆写的 listRelPaths()(白名单),export() 与 preview() 都经
|
|
21
21
|
* 基类 collect()**(self 目录内存在大量非配置子目录,不能像 skills/sessions 那样整体递归)。
|
|
22
22
|
*
|
|
23
|
-
*
|
|
24
|
-
* backup-schedule.json
|
|
25
|
-
*
|
|
23
|
+
* **例外:两个调度配置的身份字节见覆写的 comparableContent()** —— sync-autosync.json /
|
|
24
|
+
* backup-schedule.json 内含每次执行收尾都被改写的运行态字段(lastRunAt / lastRunStatus /
|
|
25
|
+
* lastRunHistoryId / consecutiveFailures …),整文件哈希会恒判 Conflict(每轮同步都重现,
|
|
26
|
+
* 用户点「应用」还会把远端陈旧运行态倒灌回本机;issue #73);同一批字段还会让 self 分区
|
|
27
|
+
* 的 hashSection 每轮都变 —— 自动同步的「本地有改动」检测因此**永远为真**,每次远端轮询
|
|
28
|
+
* (缺省 60s)都真推一个新快照(issue #127:真机 41 次/天、内容仅差一个 lastRunAt)。
|
|
29
|
+
* 现在这份字节同时用于导出载荷与哈希(见基类 collect()),运行态只留在本机文件里。
|
|
26
30
|
*
|
|
27
31
|
* 为什么必须靠 listRelPaths() 而不是覆写 export() 来收窄(2026-10 真机报告):
|
|
28
32
|
* `preview()` / `listRelPaths()` 是后来才加进基类的。本类此前只覆写 export(),于是只读预览
|