dsh-session-cloud 0.1.4 → 0.1.5

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/CHANGELOG.md CHANGED
@@ -1,6 +1,20 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.4(未发布)
3
+ ## 0.1.5
4
+
5
+ ### 修复
6
+
7
+ - **状态自愈:曾被「ENOENT 静默跳过」污染的会话恢复上传**
8
+ 根因:旧版把 locate 失败的会话按「未物化」静默记录 `localRevision` 却
9
+ 从未上传过一个字节,`needsSync` 因此永远判定「已同步」——即使修复了
10
+ 文件名推导,这些会话也不会重新进同步队列(表现为「成功 0」且无报错)。
11
+ 修复:
12
+ - `needsSync` 自愈判定:`uploadedBytes === 0` 且无恢复抑制标记的条目
13
+ 一律视为待同步,被污染的会话自动重新上传,无需手工清理 state;
14
+ - `markRestoredSynced` 写入 `restoredAt` 标记区分「恢复落位待续写」
15
+ 的合法抑制条目,自愈判定不误伤(恢复后未续写不回传)。
16
+
17
+ ## 0.1.4
4
18
 
5
19
  适配 dsh 0.1.3-alpha.1(源码版)的两处兼容修复:
6
20
 
@@ -97,6 +97,11 @@ export class SyncEngine {
97
97
  this.backoff.delete(snapshot.header.id);
98
98
  return true;
99
99
  }
100
+ // 自愈:从未上传过任何字节、又不是恢复抑制(restoredAt)的条目,其
101
+ // localRevision 记录不可信——历史上被「ENOENT 静默跳过」污染过的会话
102
+ // 曾因此永远卡在「已同步」假象里。一律视为待同步,宁可重试不可漏传。
103
+ if (state !== undefined && state.uploadedBytes === 0 && !state.restoredAt)
104
+ return true;
100
105
  if (state?.localRevision === snapshot.revision && wait === undefined)
101
106
  return false;
102
107
  return true;
@@ -292,6 +292,7 @@ export async function markRestoredSynced(deps, sessionIds) {
292
292
  lastSegmentIndex: -1,
293
293
  lastTag: '',
294
294
  localRevision: snapshot.revision,
295
+ restoredAt: Date.now(),
295
296
  eventCount: 0,
296
297
  updatedAt: 0,
297
298
  status: 'ok',
@@ -14,6 +14,8 @@ export interface SessionSyncState {
14
14
  lastTag: string;
15
15
  /** 上次处理到的 sessionPersistence revision(不透明令牌) */
16
16
  localRevision: string;
17
+ /** 恢复抑制标记(markRestoredSynced 写入):本地续写前不回传 */
18
+ restoredAt?: number;
17
19
  /** meta 折叠累积 */
18
20
  eventCount: number;
19
21
  title?: string;
package/lib/sync/state.js CHANGED
@@ -12,6 +12,7 @@ const sessionStateSchema = z.object({
12
12
  lastSegmentIndex: z.number().int().min(-1),
13
13
  lastTag: z.string(),
14
14
  localRevision: z.string(),
15
+ restoredAt: z.number().optional(),
15
16
  eventCount: z.number().int().nonnegative(),
16
17
  title: z.string().optional(),
17
18
  updatedAt: z.number(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-session-cloud",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "E2E-encrypted cloud mirror plugin for deepseek-harness sessions",
5
5
  "type": "module",
6
6
  "publishConfig": {