@chaoset/session-archive 0.3.12 → 0.3.14-alpha.0

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.3.12 (2026-09-12)
3
+ ## 0.3.14-alpha.0 (2026-09-15)
4
+
5
+ ### Fixes
6
+
7
+ * 同步稳定线 0.3.13 的全仓审查修复:count/list/delete/unarchive 改逐 id
8
+ `stat()`(不再全量枚举)、标题/详情事件流分块读取(块长 200,峰值内存
9
+ 有界)、unarchive 补 `failed` 语义(unenumerable/not-archived/
10
+ not-restorable)、absent 快速路径纳入 exclusive 临界区、二次 rm 异常
11
+ 真实上报、失败原因本地化与部分成功如实提示
12
+ * 跟进 DSH 宿主 0.1.6-alpha.1:归档集合移除改调官方新增的
13
+ `WorkspaceRegistry.unarchiveSession()`,删除此前复用私有写入通道
14
+ (`enqueueOperation` → `requireState` → `setState`)的 hack。新方法不做
15
+ 存在性检查、内部串行化写入,因此「文件仍存在」的 confirm 复核仍由本插件
16
+ 在调用前完成,并与 `deleteArchived` 经 exclusive 互斥;registry 缺失该
17
+ 方法时恢复返回空(列表仍按存在性过滤幽灵 id)
4
18
 
5
19
  ### Fixes
6
20
 
package/README.md CHANGED
@@ -2,12 +2,13 @@
2
2
 
3
3
  补上 DSH 缺失的「归档后半程」:web 侧边栏底部新增**归档**面板。
4
4
 
5
- - **查看归档**:列出全部归档会话(标题、目录、时间、体积、运行状态);点击
5
+ - **查看归档**:列出全部归档会话(标题、目录、时间、体积);点击
6
6
  会话可展开**只读浏览**其聊天内容(用户/助手文本消息)。
7
- - **批量恢复**:勾选多个会话一键移回会话树,恢复其在原工作区的位置。
7
+ - **批量恢复**:勾选多个会话一键移回会话树,恢复其在原工作区的位置;无法
8
+ 恢复的会话(文件已删等)逐条给出原因。
8
9
  - **彻底删除**:删除勾选会话的持久化文件与会话目录;两段式确认(第一次点击
9
- 进入确认态,4 秒内再次点击执行)避免误删。有近期写入的会话(生成流可能
10
- 还在落盘)拒绝删除;若宿主允许归档运行中会话,插件同样拒绝。
10
+ 进入确认态,4 秒内再次点击执行)避免误删。正在生成落盘的会话(沉降观察窗
11
+ 内体积仍在增长)拒绝删除;若宿主允许归档运行中会话,插件同样拒绝。
11
12
  - 工具条提供全选与已选计数;侧边栏徽标实时显示归档数量(订阅宿主归档集合,
12
13
  轻量轮询兜底)。
13
14
 
@@ -27,12 +28,13 @@ dsh plugin --profile web remove @chaoset/session-archive
27
28
 
28
29
  ## 工作原理
29
30
 
30
- - **列表**:宿主归档集合 ∩ 持久化会话列表;标题折叠自会话事件流的最后一个
31
- `session/title` 事件,体积来自文件 stat。
31
+ - **列表**:宿主归档集合 ∩ 逐 id 持久化快照(官方 `stat(id)`,不枚举实例上
32
+ 的全部历史会话);标题折叠自会话事件流的最后一个 `session/title` 事件
33
+ (事件流分块读取,峰值内存有界),体积来自文件 stat。
32
34
  - **查看**:只读解析会话事件流,提取用户/助手文本消息;超过 `detailMaxMessages`
33
35
  条时截断并如实标注。
34
36
  - **恢复**:仅从归档集合移除仍存在持久化文件的会话 id,会话数据不动;文件已删
35
- 的会话拒绝恢复。
37
+ 的会话拒绝恢复,并在 `failed` 里逐条给出原因。
36
38
  - **删除**:live 会话拒绝;每个会话删除持久化文件与会话目录。删除后**保留**
37
39
  该会话在归档集合中的占位 id——否则仍挂在内存中的会话会因「不再归档」立刻
38
40
  重新出现在侧边栏(效果等同恢复);列表按文件存在性过滤,面板与侧边栏都不再
@@ -46,14 +48,18 @@ dsh plugin --profile web remove @chaoset/session-archive
46
48
  | `count()` | — | `{ count }`(存在性过滤后的归档数量,徽标轮询轻端点) |
47
49
  | `detail(sessionId)` | 会话 id | `{ sessionId, header, title, messageCount, totalMessageCount, truncated, messages, live }` |
48
50
  | `delete(sessionIds[])` | id 数组 | `{ deleted, failed, removedFromArchive }` |
49
- | `unarchive(sessionIds[])` | id 数组 | `{ restored, removedFromArchive }` |
51
+ | `unarchive(sessionIds[])` | id 数组 | `{ restored, failed, removedFromArchive }` |
50
52
 
51
- > `delete` 的 `failed[].reason`:`not-archived`(非归档成员)、`live`(内存中
52
- > 未归档会话)、`busy`(归档会话 60s 内仍有写入)、`unenumerable`(文件存在但
53
- > 持久化枚举不到)、`reappeared`(删除后被生成流重建);其余为底层删除错误消息。
53
+ > `delete` 与 `unarchive` 共用 `failed[].reason` 词表:`not-archived`(非归档
54
+ > 成员)、`live`(内存中未归档会话)、`busy`(内存存在且沉降观察窗内体积仍在
55
+ > 增长——活跃生成流)、`unenumerable`(文件存在但持久化枚举不到,或文件已删)、
56
+ > `unlocatable`(枚举得到但无法定位路径)、`reappeared`(删除后被生成流重建,
57
+ > 二次删除仍压不掉)、`not-restorable`(仅 unarchive:confirm 复核时文件已不在);
58
+ > 其余为底层删除错误消息。
54
59
 
55
60
  > `delete` 的 `removedFromArchive` 恒为 0(删除保留归档占位 id,见上);
56
- > `unarchive` 的为实际从归档集合移除的 id 数。
61
+ > `unarchive` 的为实际从归档集合移除的 id 数。`restored` 之外的每个请求 id
62
+ > 都会在 `failed` 里给出原因。
57
63
 
58
64
  `ArchiveRow`:`{ sessionId, title, cwd, createdAt, updatedAt, size, live }`。
59
65
 
@@ -67,6 +73,9 @@ config 字段(`cordis.patch.yml` 或 `~/.dsh/plugins/session-archive/config.js
67
73
 
68
74
  ## 限制
69
75
 
70
- - 有近期写入或运行中的会话拒绝删除——先停止会话、等写入完成再删除。
76
+ - 正在生成落盘的会话拒绝删除——归档会话不在会话列表、无流可停,请稍后重试
77
+ (沉降观察窗内体积不再增长即可删)。
78
+ - 首行损坏的孤儿日志被宿主枚举静默跳过:面板既看不到也无法经面板删除(删除
79
+ 会因 `unenumerable` 被拒绝),只能手动清理文件。
71
80
  - 无官方 unarchive API,恢复归档通过 registry 写入通道实现;若未来 DSH 提供
72
81
  官方 API,插件会切换过去(行为不变)。
package/client/client.cjs CHANGED
@@ -140,11 +140,11 @@ window.__ModuleLoader__.load({
140
140
  selected: "\u5DF2\u9009 {n} \u9879",
141
141
  restore: "\u6062\u590D\u6240\u9009",
142
142
  restoreDone: "\u5DF2\u6062\u590D {n} \u4E2A\u5F52\u6863\u4F1A\u8BDD",
143
- restoreFailed: "\u6062\u590D\u5931\u8D25",
143
+ restoreFailed: "\u6062\u590D\u5931\u8D25\uFF1A{n} \u4E2A",
144
144
  delete: "\u5220\u9664\u6240\u9009",
145
145
  deleteConfirm: "\u518D\u6B21\u70B9\u51FB\u786E\u8BA4\u5220\u9664",
146
146
  deleteDone: "\u5DF2\u5220\u9664 {n} \u4E2A\u5F52\u6863\u4F1A\u8BDD",
147
- deleteFailed: "\u90E8\u5206\u5220\u9664\u5931\u8D25\uFF1A{n} \u4E2A",
147
+ deleteFailed: "\u5220\u9664\u5931\u8D25\uFF1A{n} \u4E2A",
148
148
  confirmAll: "\u786E\u8BA4\u5220\u9664\u5168\u90E8 {n} \u4E2A\uFF1F",
149
149
  noSelection: "\u8BF7\u5148\u52FE\u9009\u4F1A\u8BDD",
150
150
  view: "\u67E5\u770B",
@@ -160,7 +160,13 @@ window.__ModuleLoader__.load({
160
160
  sizeBytes: "{n} B",
161
161
  sizeKB: "{n} KB",
162
162
  sizeMB: "{n} MB",
163
- runningHint: "\u8FD0\u884C\u4E2D\u7684\u4F1A\u8BDD\u4E0D\u80FD\u5220\u9664\uFF0C\u8BF7\u5148\u505C\u6B62"
163
+ runningHint: "\u8BE5\u4F1A\u8BDD\u4ECD\u5728\u751F\u6210\u843D\u76D8\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",
164
+ batchError: "\u6279\u91CF\u64CD\u4F5C\u5931\u8D25\uFF08{n} \u9879\uFF09",
165
+ reasonUnenumerable: "\u4F1A\u8BDD\u6587\u4EF6\u679A\u4E3E\u4E0D\u5230",
166
+ reasonUnlocatable: "\u65E0\u6CD5\u5B9A\u4F4D\u4F1A\u8BDD\u6587\u4EF6",
167
+ reasonReappeared: "\u5220\u9664\u540E\u88AB\u91CD\u5EFA",
168
+ reasonNotArchived: "\u4E0D\u662F\u5F52\u6863\u4F1A\u8BDD",
169
+ reasonNotRestorable: "\u6587\u4EF6\u5DF2\u4E0D\u5728\uFF0C\u65E0\u6CD5\u6062\u590D"
164
170
  };
165
171
  var en = {
166
172
  badge: "Archive",
@@ -174,11 +180,11 @@ window.__ModuleLoader__.load({
174
180
  selected: "{n} selected",
175
181
  restore: "Restore",
176
182
  restoreDone: "Restored {n} archived sessions",
177
- restoreFailed: "Restore failed",
183
+ restoreFailed: "Restore failed: {n}",
178
184
  delete: "Delete",
179
185
  deleteConfirm: "Click again to confirm delete",
180
186
  deleteDone: "Deleted {n} archived sessions",
181
- deleteFailed: "Some deletions failed: {n}",
187
+ deleteFailed: "Deletion failed: {n}",
182
188
  confirmAll: "Delete all {n}?",
183
189
  noSelection: "Select sessions first",
184
190
  view: "View",
@@ -194,7 +200,13 @@ window.__ModuleLoader__.load({
194
200
  sizeBytes: "{n} B",
195
201
  sizeKB: "{n} KB",
196
202
  sizeMB: "{n} MB",
197
- runningHint: "Running sessions cannot be deleted; stop them first"
203
+ runningHint: "Session still writing; retry shortly",
204
+ batchError: "Batch operation failed ({n})",
205
+ reasonUnenumerable: "session log not enumerable",
206
+ reasonUnlocatable: "session file cannot be located",
207
+ reasonReappeared: "recreated after delete",
208
+ reasonNotArchived: "not an archived session",
209
+ reasonNotRestorable: "file no longer present"
198
210
  };
199
211
  function formatBytes(bytes, t) {
200
212
  if (bytes === void 0 || bytes === null || Number(bytes) === 0) return "\u2014";
@@ -444,13 +456,27 @@ window.__ModuleLoader__.load({
444
456
  const result = await call(action, ids);
445
457
  const doneIds = result.deleted || result.restored || [];
446
458
  const n = doneIds.length;
447
- if (result.failed && result.failed.length > 0) {
448
- const reasonText = (reason) => reason === "live" ? t("live") : reason === "busy" ? t("runningHint") : String(reason ?? "error");
459
+ const doneText = t(doneKey).replace("{n}", String(n));
460
+ if (Array.isArray(result.failed) && result.failed.length > 0) {
461
+ const reasonText = (reason) => {
462
+ const map = {
463
+ live: t("live"),
464
+ busy: t("runningHint"),
465
+ unenumerable: t("reasonUnenumerable"),
466
+ unlocatable: t("reasonUnlocatable"),
467
+ reappeared: t("reasonReappeared"),
468
+ "not-archived": t("reasonNotArchived"),
469
+ "not-restorable": t("reasonNotRestorable")
470
+ };
471
+ return map[String(reason)] ?? String(reason ?? "error");
472
+ };
449
473
  const detail = result.failed.slice(0, 3).map((item) => shortId(item.sessionId) + ": " + reasonText(item.reason)).join("; ");
450
474
  const more = result.failed.length > 3 ? " (+" + (result.failed.length - 3) + ")" : "";
451
- setNotice({ kind: "error", text: t(failKey).replace("{n}", String(result.failed.length)) + " \u2014 " + detail + more });
475
+ const failText = t(failKey).replace("{n}", String(result.failed.length)) + " \u2014 " + detail + more;
476
+ if (n > 0) setNotice({ kind: "warn", text: doneText + "\uFF1B" + failText });
477
+ else setNotice({ kind: "error", text: failText });
452
478
  } else {
453
- setNotice({ kind: "ok", text: t(doneKey).replace("{n}", String(n)) });
479
+ setNotice({ kind: "ok", text: doneText });
454
480
  }
455
481
  if (doneIds.length > 0) {
456
482
  const done = new Set(doneIds);
@@ -466,7 +492,7 @@ window.__ModuleLoader__.load({
466
492
  setConfirmingDelete(false);
467
493
  await load();
468
494
  } catch (actionError) {
469
- setNotice({ kind: "error", text: t(failKey).replace("{n}", String(ids.length)) + ": " + (actionError && actionError.message || actionError) });
495
+ setNotice({ kind: "error", text: t("batchError").replace("{n}", String(ids.length)) + ": " + (actionError && actionError.message || actionError) });
470
496
  } finally {
471
497
  setBusy(false);
472
498
  }
package/client/index.tsx CHANGED
@@ -103,11 +103,11 @@ const zh = {
103
103
  selected: "已选 {n} 项",
104
104
  restore: "恢复所选",
105
105
  restoreDone: "已恢复 {n} 个归档会话",
106
- restoreFailed: "恢复失败",
106
+ restoreFailed: "恢复失败:{n} 个",
107
107
  delete: "删除所选",
108
108
  deleteConfirm: "再次点击确认删除",
109
109
  deleteDone: "已删除 {n} 个归档会话",
110
- deleteFailed: "部分删除失败:{n} 个",
110
+ deleteFailed: "删除失败:{n} 个",
111
111
  confirmAll: "确认删除全部 {n} 个?",
112
112
  noSelection: "请先勾选会话",
113
113
  view: "查看",
@@ -123,7 +123,13 @@ const zh = {
123
123
  sizeBytes: "{n} B",
124
124
  sizeKB: "{n} KB",
125
125
  sizeMB: "{n} MB",
126
- runningHint: "运行中的会话不能删除,请先停止"
126
+ runningHint: "该会话仍在生成落盘,请稍后重试",
127
+ batchError: "批量操作失败({n} 项)",
128
+ reasonUnenumerable: "会话文件枚举不到",
129
+ reasonUnlocatable: "无法定位会话文件",
130
+ reasonReappeared: "删除后被重建",
131
+ reasonNotArchived: "不是归档会话",
132
+ reasonNotRestorable: "文件已不在,无法恢复"
127
133
  };
128
134
  const en = {
129
135
  badge: "Archive",
@@ -137,11 +143,11 @@ const en = {
137
143
  selected: "{n} selected",
138
144
  restore: "Restore",
139
145
  restoreDone: "Restored {n} archived sessions",
140
- restoreFailed: "Restore failed",
146
+ restoreFailed: "Restore failed: {n}",
141
147
  delete: "Delete",
142
148
  deleteConfirm: "Click again to confirm delete",
143
149
  deleteDone: "Deleted {n} archived sessions",
144
- deleteFailed: "Some deletions failed: {n}",
150
+ deleteFailed: "Deletion failed: {n}",
145
151
  confirmAll: "Delete all {n}?",
146
152
  noSelection: "Select sessions first",
147
153
  view: "View",
@@ -157,7 +163,13 @@ const en = {
157
163
  sizeBytes: "{n} B",
158
164
  sizeKB: "{n} KB",
159
165
  sizeMB: "{n} MB",
160
- runningHint: "Running sessions cannot be deleted; stop them first"
166
+ runningHint: "Session still writing; retry shortly",
167
+ batchError: "Batch operation failed ({n})",
168
+ reasonUnenumerable: "session log not enumerable",
169
+ reasonUnlocatable: "session file cannot be located",
170
+ reasonReappeared: "recreated after delete",
171
+ reasonNotArchived: "not an archived session",
172
+ reasonNotRestorable: "file no longer present"
161
173
  };
162
174
 
163
175
  // ── 工具函数 ─────────────────────────────────────────────────────────
@@ -432,18 +444,34 @@ function ArchivePanel(props: any) {
432
444
  const result = await call(action, ids);
433
445
  const doneIds = result.deleted || result.restored || [];
434
446
  const n = doneIds.length;
435
- if (result.failed && result.failed.length > 0) {
436
- // host 对每个失败项都给了 reason(live/busy/not-archived/具体错误),
437
- // 只报数量会让用户不知道为什么失败、该等多久重试。
438
- const reasonText = (reason: any) =>
439
- reason === "live" ? t("live") : reason === "busy" ? t("runningHint") : String(reason ?? "error");
447
+ const doneText = t(doneKey).replace("{n}", String(n));
448
+ if (Array.isArray(result.failed) && result.failed.length > 0) {
449
+ // host 对每个失败项都给了 reason( live/busy/unenumerable/not-archived
450
+ // /not-restorable/具体错误),只报数量会让用户不知道为什么失败、该等
451
+ // 多久重试。全部本地化,未知 reason 原样透出兜底。
452
+ const reasonText = (reason: any) => {
453
+ const map: Record<string, any> = {
454
+ live: t("live"),
455
+ busy: t("runningHint"),
456
+ unenumerable: t("reasonUnenumerable"),
457
+ unlocatable: t("reasonUnlocatable"),
458
+ reappeared: t("reasonReappeared"),
459
+ "not-archived": t("reasonNotArchived"),
460
+ "not-restorable": t("reasonNotRestorable"),
461
+ };
462
+ return map[String(reason)] ?? String(reason ?? "error");
463
+ };
440
464
  const detail = result.failed.slice(0, 3)
441
465
  .map((item: any) => shortId(item.sessionId) + ": " + reasonText(item.reason))
442
466
  .join("; ");
443
467
  const more = result.failed.length > 3 ? " (+" + (result.failed.length - 3) + ")" : "";
444
- setNotice({ kind: "error", text: t(failKey).replace("{n}", String(result.failed.length)) + " — " + detail + more });
468
+ const failText = t(failKey).replace("{n}", String(result.failed.length)) + " — " + detail + more;
469
+ // 全失败才用 error 样式;部分成功是 warn,成功计数也要如实带上,
470
+ // 不能只报失败让用户以为一个都没成。
471
+ if (n > 0) setNotice({ kind: "warn", text: doneText + ";" + failText });
472
+ else setNotice({ kind: "error", text: failText });
445
473
  } else {
446
- setNotice({ kind: "ok", text: t(doneKey).replace("{n}", String(n)) });
474
+ setNotice({ kind: "ok", text: doneText });
447
475
  }
448
476
  if (doneIds.length > 0) {
449
477
  const done = new Set(doneIds);
@@ -461,8 +489,8 @@ function ArchivePanel(props: any) {
461
489
  setConfirmingDelete(false);
462
490
  await load();
463
491
  } catch (actionError: any) {
464
- // 异常分支同样带数量:用请求发出时的 ids.length,不用无意义的 "?"。
465
- setNotice({ kind: "error", text: t(failKey).replace("{n}", String(ids.length)) + ": " + (actionError && actionError.message || actionError) });
492
+ // 异常分支(整单失败,不是部分失败):带请求发出时的数量,与部分失败分支措辞区分。
493
+ setNotice({ kind: "error", text: t("batchError").replace("{n}", String(ids.length)) + ": " + (actionError && actionError.message || actionError) });
466
494
  } finally {
467
495
  setBusy(false);
468
496
  }
package/lib/index.d.ts CHANGED
@@ -48,11 +48,12 @@ export interface LocatableSessionPersistence {
48
48
  *
49
49
  * host 端全部逻辑基于官方 service 契约类型(@deepseek-ai/dsh-workspace /
50
50
  * dsh-session / dsh-session-persistence / dsh-session-title 的官方 d.ts),
51
- * 面向 DSH 0.1.5-alpha 宿主线,不保留旧宿主版本兼容:
52
- * 1. list() — archivedSessionIds ∩ sessionPersistence.list(),
53
- * 每条附带标题(官方 foldSessionTitle 折叠)、目录、
54
- * 创建时间、最后修改时间(文件 mtime)、体积与
55
- * live 状态(会话仍在内存中运行时禁止删除)。
51
+ * 面向 DSH 0.1.6-alpha 宿主线,不保留旧宿主版本兼容:
52
+ * 1. list() — archivedSessionIds ∩ 逐 id persistence.stat(),
53
+ * 每条附带标题(官方 foldSessionTitle 折叠,事件流
54
+ * 分块读取)、目录、创建时间、最后修改时间(文件
55
+ * mtime)、体积与 live 状态(会话仍在内存中运行时
56
+ * 禁止删除)。
56
57
  * 2. detail(id) — open(id,'read') 句柄只读会话事件流(标题 + 文本
57
58
  * 消息 user/assistant),供面板"查看"展开。
58
59
  * 3. delete(ids) — 批量彻底删除:live 会话拒绝;逐个删除持久化文件
@@ -69,11 +70,13 @@ export interface LocatableSessionPersistence {
69
70
  * 会话 id(文件已删的 ghost id 拒绝恢复,防止已彻底
70
71
  * 删除的会话"复活"回侧边栏);会话数据不动。
71
72
  *
72
- * 归档集合(workspaceRegistry.archivedSessionIds)的移除没有官方 API
73
- * (官方只有 archiveSession 方向),这里复用 registry 自身的串行化写入
74
- * 通道(enqueueOperation → requireState → setState,与 archiveSession
75
- * 相同的路径;官方 d.ts 上为 private,运行时探测);若 registry 内部形状
76
- * 变化,自动降级为"仅删文件",归档列表会以存在性过滤幽灵 id,功能仍正确。
73
+ * 归档集合(workspaceRegistry.archivedSessionIds)的移除走官方 API
74
+ * unarchiveSession(DSH 0.1.6 新增;此前只有 archiveSession 方向,本插件
75
+ * 曾复用 registry 私有写入通道 enqueueOperation → requireState → setState,
76
+ * 0.1.6 起已删除该 hack)。官方 unarchiveSession 不做存在性检查、内部串行
77
+ * 化写入,因此"文件仍存在"的复核仍由本插件在调用前完成,并与 deleteArchived
78
+ * 经 exclusive 互斥(见下);若 registry 缺失该方法(旧宿主/残缺 mock),
79
+ * 恢复返回空,归档列表仍以存在性过滤幽灵 id,功能正确。
77
80
  *
78
81
  * 本文件运行时不依赖任何 dsh 内部包(纯 ESM + ctx.* service + 官方
79
82
  * foldSessionTitle 纯函数),可独立安装;官方包仅作为 devDependency 提供
@@ -98,8 +101,7 @@ export declare const config: {
98
101
  */
99
102
  export declare function createArchiveHost(ctx: Context, cfg: Record<string, any>): {
100
103
  /** 归档会话计数(存在性过滤后的真实数量)。侧边栏徽标的关闭态轮询
101
- * 只调这里:persistence.list() 只读每个文件的首行头,比 list() 的
102
- * 全事件流解析便宜一个数量级以上。 */
104
+ * 只调这里:逐 id stat 只读元数据头,不枚举全部历史会话。 */
103
105
  count(): Promise<{
104
106
  count: number;
105
107
  }>;
@@ -122,9 +124,9 @@ export declare function createArchiveHost(ctx: Context, cfg: Record<string, any>
122
124
  totalMessageCount: number;
123
125
  truncated: boolean;
124
126
  messages: {
125
- role: string;
127
+ role: 'user' | 'assistant';
126
128
  text: string;
127
- time: number;
129
+ time: unknown;
128
130
  }[];
129
131
  live: boolean;
130
132
  }>;
@@ -154,9 +156,19 @@ export declare function createArchiveHost(ctx: Context, cfg: Record<string, any>
154
156
  * 批量恢复归档会话(仅从归档集合移除,会话数据不动)。只恢复仍存在
155
157
  * 持久化文件的会话:文件已删的 ghost id(已彻底删除的会话)拒绝恢复,
156
158
  * 避免删除后的会话再次出现在侧边栏对话列表。
159
+ *
160
+ * 与 delete 对称的失败语义(failed[].reason):'not-archived' 非归档
161
+ * 成员;'unenumerable' 持久化枚举不到(文件已删/首行损坏);其余为
162
+ * confirm 复核淘汰('not-restorable')或底层错误消息。restored 之外的
163
+ * 每个请求 id 都必须在 failed 里有下落——客户端据此把「已恢复 0 个」
164
+ * 渲染为失败而非成功。
157
165
  */
158
166
  unarchive(sessionIds: string[]): Promise<{
159
167
  restored: string[];
168
+ failed: {
169
+ sessionId: string;
170
+ reason: string;
171
+ }[];
160
172
  removedFromArchive: number;
161
173
  }>;
162
174
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAGV,SAAS,EACV,MAAM,0BAA0B,CAAC;AAgBlC,eAAO,MAAM,IAAI,oBAAoB,CAAC;AAEtC,oDAAoD;AACpD,eAAO,MAAM,MAAM,UAA0D,CAAC;AA4D9E,eAAO,MAAM,MAAM;IARjB,iCAAiC;;IAEjC,8BAA8B;;IAE9B,4BAA4B;;CAIa,CAAC;AA4E5C;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IA+NpE;;0BAEsB;IAChB,KAAK;;;IAUX,sCAAsC;IAChC,IAAI;;;IAeV;+CAC2C;IACrC,MAAM,YAAY,MAAM;;;YAoCxB,GAAG;YACH,SAAS;YACT,aAAa;YACb,WAAW;;;;;;;;;;;;;IAWjB;;;;;;;;;;;;;OAaG;IACG,cAAc,aAAa,MAAM,EAAE;;;;;;;;IA2GzC;;;;OAIG;IACG,SAAS,aAAa,MAAM,EAAE;;;;EAwBvC;AAED,iCAAiC;AACjC,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,GAAG,CAmBrD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAGV,SAAS,EACV,MAAM,0BAA0B,CAAC;AAgBlC,eAAO,MAAM,IAAI,oBAAoB,CAAC;AAEtC,oDAAoD;AACpD,eAAO,MAAM,MAAM,UAA0D,CAAC;AA4D9E,eAAO,MAAM,MAAM;IARjB,iCAAiC;;IAEjC,8BAA8B;;IAE9B,4BAA4B;;CAIa,CAAC;AAsG5C;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAqPpE;0CACsC;IAChC,KAAK;;;IAOX,sCAAsC;IAChC,IAAI;;;IAcV;+CAC2C;IACrC,MAAM,YAAY,MAAM;;;YA8CxB,GAAG;YACH,SAAS;YACT,aAAa;YACb,WAAW;;;;;;;kBAxCe,MAAM,GAAG,WAAW;kBAAQ,MAAM;kBAAQ,OAAO;;;;IAmDjF;;;;;;;;;;;;;OAaG;IACG,cAAc,aAAa,MAAM,EAAE;;;uBAGN,MAAM;oBAAU,MAAM;;;;IA4IzD;;;;;;;;;;OAUG;IACG,SAAS,aAAa,MAAM,EAAE;;;uBAID,MAAM;oBAAU,MAAM;;;;EA8B5D;AAED,iCAAiC;AACjC,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,GAAG,CAmBrD"}
package/lib/index.js CHANGED
@@ -7,11 +7,12 @@
7
7
  *
8
8
  * host 端全部逻辑基于官方 service 契约类型(@deepseek-ai/dsh-workspace /
9
9
  * dsh-session / dsh-session-persistence / dsh-session-title 的官方 d.ts),
10
- * 面向 DSH 0.1.5-alpha 宿主线,不保留旧宿主版本兼容:
11
- * 1. list() — archivedSessionIds ∩ sessionPersistence.list(),
12
- * 每条附带标题(官方 foldSessionTitle 折叠)、目录、
13
- * 创建时间、最后修改时间(文件 mtime)、体积与
14
- * live 状态(会话仍在内存中运行时禁止删除)。
10
+ * 面向 DSH 0.1.6-alpha 宿主线,不保留旧宿主版本兼容:
11
+ * 1. list() — archivedSessionIds ∩ 逐 id persistence.stat(),
12
+ * 每条附带标题(官方 foldSessionTitle 折叠,事件流
13
+ * 分块读取)、目录、创建时间、最后修改时间(文件
14
+ * mtime)、体积与 live 状态(会话仍在内存中运行时
15
+ * 禁止删除)。
15
16
  * 2. detail(id) — open(id,'read') 句柄只读会话事件流(标题 + 文本
16
17
  * 消息 user/assistant),供面板"查看"展开。
17
18
  * 3. delete(ids) — 批量彻底删除:live 会话拒绝;逐个删除持久化文件
@@ -28,11 +29,13 @@
28
29
  * 会话 id(文件已删的 ghost id 拒绝恢复,防止已彻底
29
30
  * 删除的会话"复活"回侧边栏);会话数据不动。
30
31
  *
31
- * 归档集合(workspaceRegistry.archivedSessionIds)的移除没有官方 API
32
- * (官方只有 archiveSession 方向),这里复用 registry 自身的串行化写入
33
- * 通道(enqueueOperation → requireState → setState,与 archiveSession
34
- * 相同的路径;官方 d.ts 上为 private,运行时探测);若 registry 内部形状
35
- * 变化,自动降级为"仅删文件",归档列表会以存在性过滤幽灵 id,功能仍正确。
32
+ * 归档集合(workspaceRegistry.archivedSessionIds)的移除走官方 API
33
+ * unarchiveSession(DSH 0.1.6 新增;此前只有 archiveSession 方向,本插件
34
+ * 曾复用 registry 私有写入通道 enqueueOperation → requireState → setState,
35
+ * 0.1.6 起已删除该 hack)。官方 unarchiveSession 不做存在性检查、内部串行
36
+ * 化写入,因此"文件仍存在"的复核仍由本插件在调用前完成,并与 deleteArchived
37
+ * 经 exclusive 互斥(见下);若 registry 缺失该方法(旧宿主/残缺 mock),
38
+ * 恢复返回空,归档列表仍以存在性过滤幽灵 id,功能正确。
36
39
  *
37
40
  * 本文件运行时不依赖任何 dsh 内部包(纯 ESM + ctx.* service + 官方
38
41
  * foldSessionTitle 纯函数),可独立安装;官方包仅作为 devDependency 提供
@@ -136,20 +139,47 @@ function normalizeConfig(source, defaults = DEFAULT_CONFIG) {
136
139
  titleReadConcurrency: positiveInt(merged.titleReadConcurrency, defaults.titleReadConcurrency),
137
140
  };
138
141
  }
142
+ /** 标题/详情分块读取的块长(事件数,官方契约 read(offset,length) 的上界,
143
+ * 超界返回空数组)。此前 read(0) 一次性物化全部事件:大日志下峰值内存
144
+ * O(整条日志)、同步 JSON.parse 集中在宿主事件循环上,面板打开(并发 4 路
145
+ * 标题读)拖慢的是整个宿主而不只是面板;分块后峰值 O(块)。 */
146
+ const READ_CHUNK_EVENTS = 200;
139
147
  /**
140
- * 读取一个会话的完整事件流与头(官方契约路径:open 一个 read 句柄再
141
- * read(0),用完 close——不 close 会漏句柄;头从句柄上取)。
148
+ * 分块遍历一条会话的事件流(升序、全量),每块交给 onChunk 消费后即可弃,
149
+ * 返回句柄上的会话头。用完 close——不 close 会漏句柄。
142
150
  */
143
- async function readSession(persistence, sessionId) {
151
+ async function scanSession(persistence, sessionId, onChunk) {
144
152
  const handle = await persistence.open(sessionId, 'read');
145
153
  try {
146
- const { events } = await handle.read(0);
147
- return { header: handle.header, events: [...events] };
154
+ for (let offset = 0;; offset += READ_CHUNK_EVENTS) {
155
+ const { events } = await handle.read(offset, READ_CHUNK_EVENTS);
156
+ if (events.length === 0)
157
+ break;
158
+ onChunk(events);
159
+ if (events.length < READ_CHUNK_EVENTS)
160
+ break;
161
+ }
162
+ return handle.header;
148
163
  }
149
164
  finally {
150
165
  await handle.close();
151
166
  }
152
167
  }
168
+ /**
169
+ * 读取会话标题(官方 foldSessionTitle 折叠)。fold 只消费最后一个
170
+ * session/title 事件——只收集 title 事件再折叠,与全量折叠语义一致
171
+ * (latest-wins),内存 O(title 事件数)(正常日志恒为 1)。
172
+ */
173
+ async function readTitle(persistence, sessionId) {
174
+ const titleEvents = [];
175
+ await scanSession(persistence, sessionId, (events) => {
176
+ for (const event of events) {
177
+ if (event.type === 'session/title')
178
+ titleEvents.push(event);
179
+ }
180
+ });
181
+ return foldSessionTitle(titleEvents)?.title ?? null;
182
+ }
153
183
  /** 等待 ms 毫秒(沉降观察、删除窗口用)。 */
154
184
  function delay(ms) {
155
185
  return new Promise((resolve) => setTimeout(resolve, ms));
@@ -202,6 +232,41 @@ export function createArchiveHost(ctx, cfg) {
202
232
  * 因此 live 仅对"内存存在且**未归档**"的会话为真(防将来误用),
203
233
  * 归档面板中恒为 false。 */
204
234
  const isLive = (sessionId) => ctx.sessions.get(sessionId) !== undefined && !archivedSet().has(sessionId);
235
+ /**
236
+ * 批量查一组 id 的持久化快照,返回 Map(只含枚举得到的 id)。
237
+ *
238
+ * 优先逐 id 走官方契约 stat(id)——只读该会话的元数据头,成本 O(项目目录数)/id;
239
+ * 此前四个端点(count/list/delete/unarchive)都用全量 persistence.list():
240
+ * 枚举实例上**所有**会话(每文件读头)只为挑出几个归档 id,而 count 是
241
+ * 每 5 秒每标签页的徽标轮询端点,实例积累数千历史会话后是持续的全树扫。
242
+ * 枚举不到(stat 返回 undefined 或抛错——jsonl 后端对重复 id 会抛异常)
243
+ * 的 id 不出现在 Map 里,与 list() 时代「不在快照表里」的幽灵语义对齐:
244
+ * list() 同样静默跳过首行损坏的日志;stat 抛错按枚举不到处理方向更保守
245
+ * (删除/恢复一律拒绝)。stat 不在契约上的宿主回退一次全量 list()。
246
+ */
247
+ async function snapshotsByIds(ids) {
248
+ const result = new Map();
249
+ if (ids.length === 0)
250
+ return result;
251
+ if (typeof persistence.stat !== 'function') {
252
+ const wanted = new Set(ids);
253
+ for (const snapshot of await persistence.list()) {
254
+ if (wanted.has(snapshot.header.id) && !result.has(snapshot.header.id)) {
255
+ result.set(snapshot.header.id, snapshot);
256
+ }
257
+ }
258
+ return result;
259
+ }
260
+ await limitedConcurrency(8, ids.map((id) => async () => {
261
+ try {
262
+ const snapshot = await persistence.stat(id);
263
+ if (snapshot !== undefined)
264
+ result.set(id, snapshot);
265
+ }
266
+ catch { }
267
+ }));
268
+ return result;
269
+ }
205
270
  /**
206
271
  * 沉降观察:等一个写入沉降窗口后重取文件 stat(null = 文件已消失)。
207
272
  * 归档瞬间的生成流兜底用:归档会话会因 web 客户端重连恢复 tab 而长期
@@ -212,17 +277,22 @@ export function createArchiveHost(ctx, cfg) {
212
277
  * 沉降窗口内体积必然增长;一次性落盘不会。增长与否由调用点对比前后
213
278
  * 两次 stat 的 size 判定。
214
279
  */
215
- const settleStat = (path) => delay(REAPPEAR_SETTLE_MS).then(() => stat(path).catch(() => null));
280
+ const settleStat = (path) => delay(REAPPEAR_SETTLE_MS).then(() => stat(path).then((info) => ({ size: info.size, mtimeMs: info.mtimeMs }),
281
+ // 只有 ENOENT 才是「文件已消失」:EACCES 等错误下把 null 当已消失会
282
+ // 谎报 deleted;上抛交给删除临界区的 catch 以真实原因计入 failed。
283
+ (error) => { if (error?.code === 'ENOENT')
284
+ return null; throw error; }));
216
285
  /**
217
286
  * delete ↔ unarchive 临界区的互斥串行化(插件闭包内的 promise 链)。
218
287
  * 两者的「检查 → 生效」窗口必须互斥,否则并发时会出现两种错位:
219
288
  * - unarchive 的 confirm 看到 located → deleteArchived 随后 rm →
220
- * setState 仍把 id 移出归档集合:文件没了、归档标记也没了,内存
289
+ * unarchiveSession 仍把 id 移出归档集合:文件没了、归档标记也没了,内存
221
290
  * 会话重回侧边栏(等同误恢复);
222
291
  * - 反向:恢复刚落地,先行发起的删除把新恢复会话的文件清掉。
223
- * registry 的 enqueueOperation 只串行化归档集合写入,deleteArchived
224
- * 不经过它,因此这里自行串行化。delete 的临界区不获取 registry 锁、
225
- * 本临界区只在已持有 registry 写锁时进入,无循环等待。
292
+ * registry 的官方写入 API(archiveSession / unarchiveSession)内部自行
293
+ * 串行化归档集合写入,deleteArchived 不经过它,因此这里自行串行化。
294
+ * delete 的临界区与 unarchive 的 confirm → unarchiveSession 段经本链互斥;
295
+ * 本插件不持有 registry 写锁,只串行化自己的"检查 → 生效"窗口,无循环等待。
226
296
  */
227
297
  let exclusiveTail = Promise.resolve();
228
298
  function exclusive(section) {
@@ -233,53 +303,38 @@ export function createArchiveHost(ctx, cfg) {
233
303
  /**
234
304
  * 从归档集合移除若干 id(恢复用;删除不调用——见 deleteArchived),返回实际移除的 id。
235
305
  *
236
- * 归档集合的移除没有官方 API(官方只有 archiveSession 方向),这里复用
237
- * registry 自身的串行化写入通道 enqueueOperation → requireState → setState
238
- * (与官方 archiveSession 相同的路径)。三者在 0.1.5 官方 d.ts 上是 private
239
- * ——宿主内部形状,这里以显式断言收窄并在运行时探测可用性:形状一旦
240
- * 变化自动降级为"仅删文件",归档列表按存在性过滤幽灵 id,功能仍正确。
241
- *
242
- * confirm 在 registry 写锁临界区内逐个复核 id 是否仍可恢复(文件仍存在);
243
- * confirm → setState 段再与 deleteArchived 的删除临界区经 exclusive 互斥
244
- * ——registry 写锁只挡住其他归档集合写入者,挡不住不经过它的删除。
306
+ * 走官方 unarchiveSession(DSH 0.1.6 的公开契约;0.1.5 时代复用私有写入
307
+ * 通道的 hack 已删除)。官方方法不做存在性检查、幂等(未归档的 id 直接
308
+ * resolve),因此:
309
+ * - confirm 在调用前逐个复核 id 是否仍可恢复(文件仍存在);未通过复核
310
+ * 的保持原状(仍是 ghost 或正常归档),不能因为请求过就一并抹掉;
311
+ * - confirm → unarchiveSession 段与 deleteArchived 的删除临界区经
312
+ * exclusive 互斥(见 exclusive)——官方写入串行只挡住其他归档集合
313
+ * 写入者,挡不住不经过它的删除;
314
+ * - registry 缺失该方法(旧宿主/残缺 mock)时返回空:列表按存在性过滤
315
+ * 幽灵 id,功能仍正确。
245
316
  */
246
317
  async function removeFromArchiveSet(ids, confirm) {
247
- const set = new Set(ids);
248
- // 显式断言:私有写入通道的形状(官方 d.ts 未承诺),运行时探测兜底。
249
- // 用索引签名绕开 private 成员的交叉归约——这是对宿主内部形状的受控依赖。
250
- const writable = registry;
251
- const canWrite = typeof writable.enqueueOperation === 'function' &&
252
- typeof writable.requireState === 'function' &&
253
- typeof writable.setState === 'function';
254
- if (!canWrite)
318
+ const unarchiveSession = registry.unarchiveSession;
319
+ if (typeof unarchiveSession !== 'function')
255
320
  return []; // 降级:仅删文件,列表按存在性过滤幽灵 id
256
- let removedIds = [];
257
- await writable.enqueueOperation(async () => {
258
- const state = writable.requireState();
259
- const current = [...state.archivedSessionIds];
260
- let eligible = current.filter((id) => set.has(id));
261
- // confirm → setState 与 deleteArchived 的删除临界区互斥(见 exclusive)。
321
+ const removedIds = [];
322
+ for (const sessionId of new Set(ids)) {
323
+ // confirm → 移除与 deleteArchived 的删除临界区互斥(见 exclusive)。
262
324
  await exclusive(async () => {
263
325
  if (confirm !== undefined) {
264
- const confirmed = [];
265
- for (const id of eligible) {
266
- try {
267
- if (await confirm(id))
268
- confirmed.push(id);
269
- }
270
- catch { }
326
+ try {
327
+ if (!(await confirm(sessionId)))
328
+ return;
329
+ }
330
+ catch {
331
+ return;
271
332
  }
272
- eligible = confirmed;
273
333
  }
274
- removedIds = eligible;
275
- // 只有真正移除的 id 才离开归档集合;未通过复核的保持原状(仍是 ghost
276
- // 或正常归档),不能因为请求过就一并抹掉。
277
- const removedSet = new Set(removedIds);
278
- const remaining = current.filter((id) => !removedSet.has(id));
279
- if (removedIds.length > 0)
280
- await writable.setState({ ...state, archivedSessionIds: remaining });
334
+ await unarchiveSession.call(registry, sessionId);
335
+ removedIds.push(sessionId);
281
336
  });
282
- });
337
+ }
283
338
  return removedIds;
284
339
  }
285
340
  /**
@@ -344,8 +399,9 @@ export function createArchiveHost(ctx, cfg) {
344
399
  }
345
400
  }
346
401
  /** 删除后的复验:先等 settleMs 给进行中的写入留出落盘时间,再确认文件没有
347
- * 被宿主 materialize 的 mkdir -p 整体重建(stat 任意失败——含 ENOENT——都
348
- * 视为已消失)。返回 true 表示文件仍在(重现)。 */
402
+ * 被宿主 materialize 的 mkdir -p 整体重建。返回 true 表示文件仍在(重现)。
403
+ * 只有 ENOENT 视为已消失;EACCES 等 stat 错误按「仍在」处理,让上层走
404
+ * 二次删除并以真实错误上报,不谎报 deleted。 */
349
405
  async function filePresentAfterSettle(path, settleMs) {
350
406
  if (settleMs > 0)
351
407
  await delay(settleMs);
@@ -353,8 +409,10 @@ export function createArchiveHost(ctx, cfg) {
353
409
  await stat(path);
354
410
  return true;
355
411
  }
356
- catch {
357
- return false;
412
+ catch (error) {
413
+ if (error?.code === 'ENOENT')
414
+ return false;
415
+ return true;
358
416
  }
359
417
  }
360
418
  /** 单个归档会话的展示行。标题读取失败回退 null(面板显示目录名)。
@@ -377,7 +435,7 @@ export function createArchiveHost(ctx, cfg) {
377
435
  }
378
436
  else {
379
437
  try {
380
- title = foldSessionTitle((await readSession(persistence, sessionId)).events)?.title ?? null;
438
+ title = await readTitle(persistence, sessionId);
381
439
  }
382
440
  catch { }
383
441
  if (titleCache.size >= TITLE_CACHE_LIMIT) {
@@ -390,7 +448,7 @@ export function createArchiveHost(ctx, cfg) {
390
448
  }
391
449
  else {
392
450
  try {
393
- title = foldSessionTitle((await readSession(persistence, sessionId)).events)?.title ?? null;
451
+ title = await readTitle(persistence, sessionId);
394
452
  }
395
453
  catch { }
396
454
  }
@@ -406,33 +464,26 @@ export function createArchiveHost(ctx, cfg) {
406
464
  }
407
465
  return {
408
466
  /** 归档会话计数(存在性过滤后的真实数量)。侧边栏徽标的关闭态轮询
409
- * 只调这里:persistence.list() 只读每个文件的首行头,比 list() 的
410
- * 全事件流解析便宜一个数量级以上。 */
467
+ * 只调这里:逐 id stat 只读元数据头,不枚举全部历史会话。 */
411
468
  async count() {
412
469
  const archived = [...archivedSet()];
413
470
  if (archived.length === 0)
414
471
  return { count: 0 };
415
- const snapshots = await persistence.list();
416
- const persisted = new Set(snapshots.map((snapshot) => snapshot.header.id));
417
- let count = 0;
418
- for (const sessionId of archived)
419
- if (persisted.has(sessionId))
420
- count++;
421
- return { count };
472
+ const snapshots = await snapshotsByIds(archived);
473
+ return { count: snapshots.size };
422
474
  },
423
475
  /** 列出全部归档会话(存在性过滤:文件已删的幽灵归档记录不显示)。 */
424
476
  async list() {
425
477
  const archived = [...archivedSet()];
426
478
  if (archived.length === 0)
427
479
  return { items: [] };
428
- const snapshots = await persistence.list();
429
- const byId = new Map(snapshots.map((snapshot) => [snapshot.header.id, snapshot.header]));
480
+ const snapshots = await snapshotsByIds(archived);
430
481
  const rows = [];
431
482
  for (const sessionId of archived) {
432
- const header = byId.get(sessionId);
433
- if (header === undefined)
483
+ const snapshot = snapshots.get(sessionId);
484
+ if (snapshot === undefined)
434
485
  continue; // 幽灵 id:会话文件已不存在
435
- rows.push({ sessionId, header });
486
+ rows.push({ sessionId, header: snapshot.header });
436
487
  }
437
488
  const items = await limitedConcurrency(cfg.titleReadConcurrency, rows.map(({ sessionId, header }) => () => rowFor(sessionId, header)));
438
489
  return { items };
@@ -444,33 +495,43 @@ export function createArchiveHost(ctx, cfg) {
444
495
  throw Object.assign(new Error('session not archived: ' + sessionId), { code: 'NOT_ARCHIVED' });
445
496
  }
446
497
  const id = sessionId;
447
- const { header: meta, events } = await readSession(persistence, id);
448
- const title = foldSessionTitle(events)?.title ?? null;
498
+ // 事件流分块消费(readSession 时代 read(0) 一次性物化全部事件):
499
+ // 头从句柄上取,消息逐块提取,达到上限后只计数不再拼接文本;
500
+ // title 事件同趟收集(fold 只消费最后一个,全量物化没有必要)。
501
+ const titleEvents = [];
449
502
  const messages = [];
450
503
  let totalMessageCount = 0;
451
- for (const event of events) {
452
- if (event.type !== 'user/message' && event.type !== 'assistant/message')
453
- continue;
454
- // 达到上限后只计数、不再提取文本:截断语义要如实上报,尾部消息也不必
455
- // 做字符串拼接(大日志下这部分是纯浪费)。
456
- if (messages.length >= cfg.detailMaxMessages) {
504
+ const meta = await scanSession(persistence, id, (events) => {
505
+ for (const event of events) {
506
+ if (event.type === 'session/title') {
507
+ titleEvents.push(event);
508
+ continue;
509
+ }
510
+ if (event.type !== 'user/message' && event.type !== 'assistant/message')
511
+ continue;
512
+ // 官方事件 data:user/message 是 UserMessage 本体(content 在自身),
513
+ // assistant/message 是包装对象(content 在 .message.content)。
514
+ // message 可缺(损坏/异构日志)——detail 是整会话只读端点,一条
515
+ // 畸形事件不应让整个请求 TypeError。
516
+ const text = messageText(event.type === 'user/message' ? event.data.content : event.data.message?.content, cfg.messagePreviewChars);
517
+ // 空文本消息(纯工具调用等)在任何位置都不计入总数——截断线两侧
518
+ // 口径一致。放在上限判定之前:不提取文本就无法区分空与非空,
519
+ // 提取成本受 messagePreviewChars 上界约束。
520
+ if (text.length === 0)
521
+ continue;
522
+ if (messages.length >= cfg.detailMaxMessages) {
523
+ totalMessageCount++;
524
+ continue;
525
+ }
526
+ messages.push({
527
+ role: event.type === 'user/message' ? 'user' : 'assistant',
528
+ text,
529
+ time: event.time,
530
+ });
457
531
  totalMessageCount++;
458
- continue;
459
532
  }
460
- // 官方事件 data:user/message 是 UserMessage 本体(content 在自身),
461
- // assistant/message 是包装对象(content 在 .message.content)。
462
- // message 可缺(损坏/异构日志)——detail 是整会话只读端点,一条
463
- // 畸形事件不应让整个请求 TypeError。
464
- const text = messageText(event.type === 'user/message' ? event.data.content : event.data.message?.content, cfg.messagePreviewChars);
465
- if (text.length === 0)
466
- continue;
467
- messages.push({
468
- role: event.type === 'user/message' ? 'user' : 'assistant',
469
- text,
470
- time: event.time,
471
- });
472
- totalMessageCount++;
473
- }
533
+ });
534
+ const title = foldSessionTitle(titleEvents)?.title ?? null;
474
535
  return {
475
536
  sessionId,
476
537
  header: {
@@ -505,12 +566,76 @@ export function createArchiveHost(ctx, cfg) {
505
566
  const unique = [...new Set(sessionIds)];
506
567
  const deleted = [];
507
568
  const failed = [];
508
- // 归档成员前置校验:persistence.list() 含所有持久化会话而非仅归档
509
- // 会话,不校验的话任何"未归档、不在内存"的会话 id 都会绕过 live/busy
510
- // 两道保护被不可逆物理删除。
569
+ // 归档成员前置校验:persistence 覆盖所有持久化会话而非仅归档会话,
570
+ // 不校验的话任何"未归档、不在内存"的会话 id 都会绕过 live/busy
571
+ // 两道保护被不可逆物理删除。快照只 stat 归档成员:非成员在循环里
572
+ // 前置拒绝,不必查持久层。
511
573
  const archived = archivedSet();
512
- const snapshots = await persistence.list();
513
- const headersById = new Map(snapshots.map((snapshot) => [snapshot.header.id, snapshot.header]));
574
+ const snapshots = await snapshotsByIds(unique.filter((id) => archived.has(id)));
575
+ /** 常规删除流(located 路径),必须在 exclusive 临界区内调用:
576
+ * TOCTOU 复核 → busy 沉降观察 → rm → 重现复验。 */
577
+ const deleteLocatedFile = async (sessionId, path) => {
578
+ try {
579
+ // TOCTOU 复核:fileInfo 的 stat 是快照,检查与 rm 之间文件可能
580
+ // 恰好变化;rm 前重取一次。只有 ENOENT 才是「已消失」,其余错误
581
+ // 上抛以真实原因计入 failed。
582
+ let fresh = await stat(path).then((info) => ({ size: info.size, mtimeMs: info.mtimeMs }), (error) => { if (error?.code === 'ENOENT')
583
+ return null; throw error; });
584
+ if (fresh === null) {
585
+ deleted.push(sessionId);
586
+ return;
587
+ }
588
+ // 生成流兜底:内存中的会话且 mtime 在窗口内,沉降观察一次,文件
589
+ // 仍在增长说明活跃写入方在 append(删除后会把半截日志写回来),
590
+ // 拒绝;体积静止则只是一次性落盘/迁移/flush 刷新过 mtime,照删。
591
+ const inMemory = ctx.sessions.get(sessionId) !== undefined;
592
+ if (inMemory && Date.now() - fresh.mtimeMs < BUSY_WRITE_WINDOW_MS) {
593
+ const second = await settleStat(path);
594
+ if (second === null) {
595
+ deleted.push(sessionId);
596
+ return;
597
+ }
598
+ if (second.size > fresh.size) {
599
+ failed.push({ sessionId, reason: 'busy' });
600
+ return;
601
+ }
602
+ fresh = second;
603
+ }
604
+ await rm(path, { force: true });
605
+ await removeSessionDirIfOwned(sessionId, path, (message) => ctx.logger?.warn?.(message));
606
+ // rm 后复验:防宿主 materialize 的 mkdir -p 把路径在删除窗口内重建。
607
+ // 重现只可能来自活跃写入方(内存中的生成流,或刚写完不久、客户端
608
+ // 重连即恢复的 tab)。据此分两档:
609
+ // - 可能活跃(内存存在 或 60s 内有写入):维持原 300ms settle 两段
610
+ // 复验;重现则再删一次,仍未删掉计入 failed('reappeared')。
611
+ // - 冷文件(不在内存且超过 60s 无写入):未来写入需要用户主动继续
612
+ // 对话,不会落在删除窗口内——做零等待的即时复验即可。批量清理
613
+ // 陈旧归档不再为每个文件白付 2×300ms。
614
+ const plausiblyActive = inMemory || Date.now() - fresh.mtimeMs < BUSY_WRITE_WINDOW_MS;
615
+ const settleMs = plausiblyActive ? REAPPEAR_SETTLE_MS : 0;
616
+ if (await filePresentAfterSettle(path, settleMs)) {
617
+ try {
618
+ await rm(path, { force: true });
619
+ await removeSessionDirIfOwned(sessionId, path, (message) => ctx.logger?.warn?.(message));
620
+ }
621
+ catch (error) {
622
+ // 二次删除失败必须以真实原因上报:吞掉会让 EPERM/EBUSY 被
623
+ // 误标为 reappeared,把排障方向带偏。
624
+ ctx.logger?.warn?.(`session-archive: second delete failed for ${sessionId}: ${String(error)}`);
625
+ failed.push({ sessionId, reason: error?.message ?? 'delete-failed' });
626
+ return;
627
+ }
628
+ if (await filePresentAfterSettle(path, settleMs)) {
629
+ failed.push({ sessionId, reason: 'reappeared' });
630
+ return;
631
+ }
632
+ }
633
+ deleted.push(sessionId);
634
+ }
635
+ catch (error) {
636
+ failed.push({ sessionId, reason: error?.message ?? 'delete-failed' });
637
+ }
638
+ };
514
639
  for (const sessionId of unique) {
515
640
  const id = sessionId;
516
641
  if (!archived.has(sessionId)) {
@@ -521,31 +646,50 @@ export function createArchiveHost(ctx, cfg) {
521
646
  failed.push({ sessionId, reason: 'live' });
522
647
  continue;
523
648
  }
524
- if (headersById.get(sessionId) === undefined) {
649
+ if (snapshots.get(sessionId) === undefined) {
525
650
  // ghost id(枚举不到)。"枚举不到 ≠ 文件不存在":首行损坏的日志会被
526
- // persistence.list() 静默跳过;而 jsonl 后端按 cwd 分目录,ghost
527
- // 探测没有 header、拿不到 cwd,locate 只能探缺省目录(_no-cwd 一类)
528
- // ——既探不到真实文件,也确认不了缺失。因此 ghost 一律不能当
529
- // "已删"报成功(0.3.9 谎报成功的同源变体),计入 failed;ghost id
530
- // 留在归档集合,由 list() 的存在性过滤隐藏,面板与侧边栏均不可见。
651
+ // persistence 静默跳过;而 jsonl 后端按 cwd 分目录,ghost 探测没有
652
+ // header、拿不到 cwd,locate 只能探缺省目录(_no-cwd 一类)——既探
653
+ // 不到真实文件,也确认不了缺失。因此 ghost 一律不能当"已删"报成功
654
+ // (0.3.9 谎报成功的同源变体),计入 failed;ghost id 留在归档集合,
655
+ // 由 list() 的存在性过滤隐藏,面板与侧边栏均不可见。
531
656
  failed.push({ sessionId, reason: 'unenumerable' });
532
657
  continue;
533
658
  }
534
- const header = headersById.get(sessionId);
659
+ const header = snapshots.get(sessionId).header;
535
660
  const file = await fileInfo(header);
536
661
  if (file.state === 'unknown') {
537
662
  // 文件存在(枚举得到)但无法定位路径:删不得也不该谎报成功。
538
663
  failed.push({ sessionId, reason: 'unlocatable' });
539
664
  continue;
540
665
  }
666
+ // ── 与 unarchive 的 confirm → unarchiveSession 互斥的删除临界区(exclusive)。
667
+ // rm 及其全部前置判定(含 absent 复核)都在窗口内:unarchive 要么
668
+ // 整体先落地(此处复验归档成员资格失败、拒绝删除),要么整体等删除
669
+ // 完成(confirm 探到 absent、拒绝恢复)——"文件被删的同时归档标记
670
+ // 被移除"的错位不存在。
541
671
  if (file.state === 'absent') {
542
- deleted.push(sessionId);
672
+ // absent 不是无脑幂等成功:fileInfo 的目录扫描是快照,宿主格式
673
+ // 迁移(写临时文件+rename)的瞬间目录可能扫空,报已删前锁内重扫
674
+ // 一次;重扫发现文件在,转常规删除流。
675
+ await exclusive(async () => {
676
+ if (!archivedSet().has(sessionId)) {
677
+ failed.push({ sessionId, reason: 'not-archived' });
678
+ return;
679
+ }
680
+ const fresh = await fileInfo(header);
681
+ if (fresh.state === 'unknown') {
682
+ failed.push({ sessionId, reason: 'unlocatable' });
683
+ return;
684
+ }
685
+ if (fresh.state === 'absent') {
686
+ deleted.push(sessionId);
687
+ return;
688
+ }
689
+ await deleteLocatedFile(sessionId, fresh.path);
690
+ });
543
691
  continue;
544
692
  }
545
- // ── 与 unarchive 的 confirm → setState 互斥的删除临界区(exclusive)。
546
- // rm 及其全部前置判定都在窗口内:unarchive 要么整体先落地(此处复验
547
- // 归档成员资格失败、拒绝删除),要么整体等删除完成(confirm 探到
548
- // absent、拒绝恢复)——"文件被删的同时归档标记被移除"的错位不存在。
549
693
  await exclusive(async () => {
550
694
  // 归档成员锁内复验:快照之后、删除之前,unarchive 可能已把 id 移出
551
695
  // 集合——删除先行发起也不能清掉刚恢复的会话文件。
@@ -553,58 +697,7 @@ export function createArchiveHost(ctx, cfg) {
553
697
  failed.push({ sessionId, reason: 'not-archived' });
554
698
  return;
555
699
  }
556
- try {
557
- // TOCTOU 复核:fileInfo 的 stat 是快照,检查与 rm 之间文件可能
558
- // 恰好变化;rm 前重取一次。
559
- let fresh = await stat(file.path).catch(() => null);
560
- if (fresh === null) {
561
- deleted.push(sessionId);
562
- return;
563
- }
564
- // 生成流兜底:内存中的会话且 mtime 在窗口内,沉降观察一次,文件
565
- // 仍在增长说明活跃写入方在 append(删除后会把半截日志写回来),
566
- // 拒绝;体积静止则只是一次性落盘/迁移/flush 刷新过 mtime,照删。
567
- const inMemory = ctx.sessions.get(sessionId) !== undefined;
568
- if (inMemory && Date.now() - fresh.mtimeMs < BUSY_WRITE_WINDOW_MS) {
569
- const second = await settleStat(file.path);
570
- if (second === null) {
571
- deleted.push(sessionId);
572
- return;
573
- }
574
- if (second.size > fresh.size) {
575
- failed.push({ sessionId, reason: 'busy' });
576
- return;
577
- }
578
- fresh = second;
579
- }
580
- await rm(file.path, { force: true });
581
- await removeSessionDirIfOwned(sessionId, file.path, (message) => ctx.logger?.warn?.(message));
582
- // rm 后复验:防宿主 materialize 的 mkdir -p 把路径在删除窗口内重建。
583
- // 重现只可能来自活跃写入方(内存中的生成流,或刚写完不久、客户端
584
- // 重连即恢复的 tab)。据此分两档:
585
- // - 可能活跃(内存存在 或 60s 内有写入):维持原 300ms settle 两段
586
- // 复验;重现则再删一次,仍未删掉计入 failed('reappeared')。
587
- // - 冷文件(不在内存且超过 60s 无写入):未来写入需要用户主动继续
588
- // 对话,不会落在删除窗口内——做零等待的即时复验即可。批量清理
589
- // 陈旧归档不再为每个文件白付 2×300ms。
590
- const plausiblyActive = inMemory || Date.now() - fresh.mtimeMs < BUSY_WRITE_WINDOW_MS;
591
- const settleMs = plausiblyActive ? REAPPEAR_SETTLE_MS : 0;
592
- if (await filePresentAfterSettle(file.path, settleMs)) {
593
- try {
594
- await rm(file.path, { force: true });
595
- await removeSessionDirIfOwned(sessionId, file.path, (message) => ctx.logger?.warn?.(message));
596
- }
597
- catch { }
598
- if (await filePresentAfterSettle(file.path, settleMs)) {
599
- failed.push({ sessionId, reason: 'reappeared' });
600
- return;
601
- }
602
- }
603
- deleted.push(sessionId);
604
- }
605
- catch (error) {
606
- failed.push({ sessionId, reason: error?.message ?? 'delete-failed' });
607
- }
700
+ await deleteLocatedFile(sessionId, file.path);
608
701
  });
609
702
  }
610
703
  return { deleted, failed, removedFromArchive: 0 };
@@ -613,28 +706,46 @@ export function createArchiveHost(ctx, cfg) {
613
706
  * 批量恢复归档会话(仅从归档集合移除,会话数据不动)。只恢复仍存在
614
707
  * 持久化文件的会话:文件已删的 ghost id(已彻底删除的会话)拒绝恢复,
615
708
  * 避免删除后的会话再次出现在侧边栏对话列表。
709
+ *
710
+ * 与 delete 对称的失败语义(failed[].reason):'not-archived' 非归档
711
+ * 成员;'unenumerable' 持久化枚举不到(文件已删/首行损坏);其余为
712
+ * confirm 复核淘汰('not-restorable')或底层错误消息。restored 之外的
713
+ * 每个请求 id 都必须在 failed 里有下落——客户端据此把「已恢复 0 个」
714
+ * 渲染为失败而非成功。
616
715
  */
617
716
  async unarchive(sessionIds) {
618
717
  const unique = [...new Set(sessionIds)];
619
- const snapshots = await persistence.list();
620
- const headersById = new Map(snapshots.map((snapshot) => [snapshot.header.id, snapshot.header]));
718
+ const archived = archivedSet();
719
+ const snapshots = await snapshotsByIds(unique.filter((id) => archived.has(id)));
720
+ const failed = [];
621
721
  // 锁外先做一遍廉价过滤(明显不可恢复的直接淘汰),锁内由 confirm 复核,
622
722
  // 消除与并发 deleteArchived 的检查-移除窗口。
623
723
  const candidates = [];
624
724
  for (const sessionId of unique) {
625
- const header = headersById.get(sessionId);
626
- if (header === undefined)
627
- continue; // 持久化记录已删:拒绝恢复
628
- candidates.push({ sessionId, header });
725
+ if (!archived.has(sessionId)) {
726
+ failed.push({ sessionId, reason: 'not-archived' });
727
+ continue;
728
+ }
729
+ if (snapshots.get(sessionId) === undefined) {
730
+ failed.push({ sessionId, reason: 'unenumerable' }); // 持久化记录已删:拒绝恢复
731
+ continue;
732
+ }
733
+ candidates.push(sessionId);
629
734
  }
630
- const restored = await removeFromArchiveSet(candidates.map(({ sessionId }) => sessionId), async (sessionId) => {
631
- const header = headersById.get(sessionId);
632
- if (header === undefined)
735
+ const restored = await removeFromArchiveSet(candidates, async (sessionId) => {
736
+ const snapshot = snapshots.get(sessionId);
737
+ if (snapshot === undefined)
633
738
  return false;
634
- const file = await fileInfo(header);
635
- return file.state === 'located'; // located 才确认文件在:absent 拒绝,unknown 谨慎拒绝
739
+ const file = await fileInfo(snapshot.header);
740
+ if (file.state !== 'located') {
741
+ // located 才确认文件在:absent(快照后文件消失)/unknown(无法确认)
742
+ // 谨慎拒绝,并如实计入 failed。
743
+ failed.push({ sessionId, reason: 'not-restorable' });
744
+ return false;
745
+ }
746
+ return true;
636
747
  });
637
- return { restored, removedFromArchive: restored.length };
748
+ return { restored, failed, removedFromArchive: restored.length };
638
749
  },
639
750
  };
640
751
  }
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chaoset/session-archive",
3
- "version": "0.3.12",
3
+ "version": "0.3.14-alpha.0",
4
4
  "description": "DSH plugin: browse archived sessions, inspect their content, batch-restore or permanently delete them with multi-select",
5
5
  "engines": {
6
6
  "node": ">=22.19.0"
@@ -23,7 +23,7 @@
23
23
  "./package.json": "./package.json"
24
24
  },
25
25
  "dsh": {
26
- "host": "0.1.5-rc.2",
26
+ "host": "0.1.6-alpha.1",
27
27
  "bundle": {
28
28
  "patch": "./cordis.patch.yml"
29
29
  },
@@ -37,14 +37,14 @@
37
37
  }
38
38
  },
39
39
  "optionalDependencies": {
40
- "@deepseek-ai/dsh-typert-protocol": "^0.1.5-rc.2"
40
+ "@deepseek-ai/dsh-typert-protocol": "^0.1.6-alpha.1"
41
41
  },
42
42
  "devDependencies": {
43
- "@deepseek-ai/dsh-scope": "^0.1.5-rc.2",
44
- "@deepseek-ai/dsh-session": "^0.1.5-rc.2",
45
- "@deepseek-ai/dsh-session-persistence": "^0.1.5-rc.2",
46
- "@deepseek-ai/dsh-session-title": "^0.1.5-rc.2",
47
- "@deepseek-ai/dsh-workspace": "^0.1.5-rc.2"
43
+ "@deepseek-ai/dsh-scope": "^0.1.6-alpha.1",
44
+ "@deepseek-ai/dsh-session": "^0.1.6-alpha.1",
45
+ "@deepseek-ai/dsh-session-persistence": "^0.1.6-alpha.1",
46
+ "@deepseek-ai/dsh-session-title": "^0.1.6-alpha.1",
47
+ "@deepseek-ai/dsh-workspace": "^0.1.6-alpha.1"
48
48
  },
49
49
  "repository": {
50
50
  "type": "git",