@chaoset/session-archive 0.2.2 → 0.2.4

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,5 +1,50 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.2.4](https://github.com/winliyou/dsh-plugins) (2026-08-23)
4
+
5
+ ### Bug Fixes
6
+
7
+ * **RemoteAPI: `SessionArchiveGateway` 缺少 0.2.3 引入的 `count()` 方法认领**——徽标轮询端点实际返回 404(客户端静默吞错,表现为计数不更新);补齐方法与 marker。
8
+ * `detail()` 达到 `detailMaxMessages` 后只递增计数、不再做文本提取;响应新增 `totalMessageCount` 与 `truncated`,客户端如实显示"共 N 条消息(已截断)"而非歧义计数。
9
+ * `deleteArchived` 对 ghost id 先经 `locate()` 探测孤儿文件:首行损坏、被 `persistence.list()` 静默跳过的日志计入 `failed('unenumerable')`,不再谎报成功并把文件留在磁盘上。
10
+ * rm 后约 300ms 复验:文件被进行中的生成流重建则再删一次,仍压不掉计入 `failed('reappeared')`。
11
+ * 客户端:列表浅比较(sessionId+updatedAt+size+live)未变化跳过重渲染;选择集自动剔除已消失项;批量异常提示带请求数量;零体积显示 "—";`detail.messages` 渲染前加形状防御。
12
+
13
+ ### Accessibility
14
+
15
+ * 行标题由 span 改为真 button(键盘可达);面板补 `role="dialog"` 与 aria-label;Escape 关闭面板。
16
+
17
+ ## [0.2.3](https://github.com/winliyou/dsh-plugins) (2026-08-22)
18
+
19
+ ### Features
20
+
21
+ * `count()` 轻端点 + 按 mtime 的标题缓存:面板关闭态的徽标轮询不再每 5 秒全量解析归档事件流。
22
+ * 删除失败原因端到端透出(`not-archived` / `busy` 等)。
23
+ * 客户端:成功通知独立样式;删除确认锁定选择集并显示数量;批量失败原因逐条展示;detail 加载失败可重试;复选框 aria-label。
24
+
25
+ ### Bug Fixes
26
+
27
+ * `deleteArchived`/`detail` 前置校验归档成员资格:未归档的持久化会话不再可能经远程端点被不可逆删除/读取。
28
+ * busy 判定 TOCTOU:rm 前重取 mtime 复核;unarchive 的存在性确认移入 registry 写锁临界区,并发删除不再能把已删会话"复活"回侧边栏。
29
+
30
+ ## [0.2.2](https://github.com/winliyou/dsh-plugins) (2026-08-22)
31
+
32
+ ### Dependencies
33
+
34
+ * update @deepseek-ai/* to 0.1.0-rc.8
35
+
36
+ ## [0.2.1](https://github.com/winliyou/dsh-plugins) (2026-08-22)
37
+
38
+ ### Refactor
39
+
40
+ * republish TypeScript-refactor build output (tsc + esbuild pipeline)
41
+
42
+ ## [0.2.0](https://github.com/winliyou/dsh-plugins) (2026-08-21)
43
+
44
+ ### Bug Fixes
45
+
46
+ * expanded badge keeps text/icon state aligned with the sidebar wide prop
47
+
3
48
  ## [0.1.3](https://github.com/winliyou/dsh-plugins) (2026-08-18)
4
49
 
5
50
  ### Bug Fixes
package/README.md CHANGED
@@ -51,10 +51,16 @@ dsh plugin --profile web add @chaoset/session-archive
51
51
  | 方法 | 参数 | 返回 |
52
52
  | --- | --- | --- |
53
53
  | `list()` | — | `{ items: ArchiveRow[] }` |
54
- | `detail(sessionId)` | 会话 id | `{ sessionId, header, title, messageCount, messages, live }` |
54
+ | `count()` | | `{ count }`(存在性过滤后的归档数量,徽标轮询轻端点) |
55
+ | `detail(sessionId)` | 会话 id | `{ sessionId, header, title, messageCount, totalMessageCount, truncated, messages, live }` |
55
56
  | `delete(sessionIds[])` | id 数组 | `{ deleted, failed, removedFromArchive }` |
56
57
  | `unarchive(sessionIds[])` | id 数组 | `{ restored, removedFromArchive }` |
57
58
 
59
+ > `delete` 的 `failed[].reason`:`not-archived`(非归档成员)、`live`(内存
60
+ > 中未归档会话)、`busy`(归档会话 60s 内仍有写入)、`unenumerable`(文件
61
+ > 存在但持久化枚举不到,如首行损坏的孤儿日志)、`reappeared`(删除后被
62
+ > 生成流重建、二次删除仍压不掉);其余为底层删除错误消息。
63
+
58
64
  > `delete` 的 `removedFromArchive` 恒为 0:删除保留归档 ghost id(见上),
59
65
  > 侧边栏不会重新显示已删除的会话;`unarchive` 的 `removedFromArchive` 为
60
66
  > 实际从归档集合移除的 id 数。
package/client/client.cjs CHANGED
@@ -74,10 +74,11 @@ window.__ModuleLoader__.load({
74
74
  ".sa_body{flex:1;min-height:0;padding:4px 12px 12px;overflow-y:auto}",
75
75
  ".sa_empty{color:var(--dsw-alias-label-tertiary);margin:24px 0;text-align:center;font-size:12px;line-height:18px}",
76
76
  ".sa_error{color:var(--dsw-alias-state-error-primary);margin:8px 0;font-size:12px;line-height:18px}",
77
+ ".sa_ok{color:var(--dsw-alias-state-success-primary);margin:8px 0;font-size:12px;line-height:18px}",
77
78
  ".sa_rows{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}",
78
79
  ".sa_row{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);border-radius:12px;flex-direction:column;gap:6px;padding:8px 10px;display:flex}",
79
80
  ".sa_rowHead{align-items:center;gap:8px;display:flex}",
80
- ".sa_rowTitle{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;font-weight:500;line-height:20px;overflow:hidden;cursor:pointer}",
81
+ ".sa_rowTitle{background:none;border:none;padding:0;text-align:left;font:inherit;min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;font-weight:500;line-height:20px;overflow:hidden;cursor:pointer}",
81
82
  ".sa_rowTitle:hover{text-decoration:underline}",
82
83
  ".sa_live{background:var(--dsw-alias-state-warn-tertiary);color:var(--dsw-alias-state-warn-label);height:18px;border-radius:9px;flex:none;align-items:center;padding:0 6px;font-size:11px;line-height:18px;display:inline-flex}",
83
84
  ".sa_rowMeta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;overflow-wrap:anywhere}",
@@ -127,6 +128,7 @@ window.__ModuleLoader__.load({
127
128
  user: "\u7528\u6237",
128
129
  assistant: "\u52A9\u624B",
129
130
  messages: "\u5171 {n} \u6761\u6D88\u606F",
131
+ messagesTruncated: "\u5171 {n} \u6761\u6D88\u606F\uFF08\u5DF2\u622A\u65AD\uFF09",
130
132
  noMessages: "\uFF08\u65E0\u6587\u672C\u6D88\u606F\uFF09",
131
133
  sizeBytes: "{n} B",
132
134
  sizeKB: "{n} KB",
@@ -159,6 +161,7 @@ window.__ModuleLoader__.load({
159
161
  user: "User",
160
162
  assistant: "Assistant",
161
163
  messages: "{n} messages",
164
+ messagesTruncated: "{n}+ messages",
162
165
  noMessages: "(no text messages)",
163
166
  sizeBytes: "{n} B",
164
167
  sizeKB: "{n} KB",
@@ -166,6 +169,7 @@ window.__ModuleLoader__.load({
166
169
  runningHint: "Running sessions cannot be deleted; stop them first"
167
170
  };
168
171
  function formatBytes(bytes, t) {
172
+ if (bytes === void 0 || bytes === null || Number(bytes) === 0) return "\u2014";
169
173
  if (bytes < 1024) return t("sizeBytes").replace("{n}", String(bytes));
170
174
  if (bytes < 1024 * 1024) return t("sizeKB").replace("{n}", (bytes / 1024).toFixed(1));
171
175
  return t("sizeMB").replace("{n}", (bytes / (1024 * 1024)).toFixed(1));
@@ -180,6 +184,16 @@ window.__ModuleLoader__.load({
180
184
  function shortId(id) {
181
185
  return id.length > 12 ? id.slice(0, 12) + "\u2026" : id;
182
186
  }
187
+ function sameItems(a, b) {
188
+ if (a.length !== b.length) return false;
189
+ for (let i = 0; i < a.length; i++) {
190
+ const x = a[i], y = b[i];
191
+ if (x === y) continue;
192
+ if (x === void 0 || y === void 0) return false;
193
+ if (x.sessionId !== y.sessionId || x.updatedAt !== y.updatedAt || x.size !== y.size || x.live !== y.live) return false;
194
+ }
195
+ return true;
196
+ }
183
197
  function ArchivePanel(props) {
184
198
  const t = props.t;
185
199
  const call = props.call;
@@ -217,7 +231,13 @@ window.__ModuleLoader__.load({
217
231
  setError(null);
218
232
  try {
219
233
  const result = await call("list");
220
- setItems(Array.isArray(result.items) ? result.items : []);
234
+ const next = Array.isArray(result.items) ? result.items : [];
235
+ setItems((current) => sameItems(current, next) ? current : next);
236
+ const nextIds = new Set(next.map((item) => item.sessionId));
237
+ setSelected((currentSelected) => {
238
+ const pruned = [...currentSelected].filter((id) => nextIds.has(id));
239
+ return pruned.length === currentSelected.size ? currentSelected : new Set(pruned);
240
+ });
221
241
  } catch (loadError) {
222
242
  setError(t("loadFailed") + ": " + (loadError && loadError.message || loadError));
223
243
  } finally {
@@ -230,10 +250,11 @@ window.__ModuleLoader__.load({
230
250
  load();
231
251
  }
232
252
  }, [open, load]);
253
+ const [badgeCount, setBadgeCount] = React.useState(0);
233
254
  const refreshSilently = React.useCallback(async () => {
234
255
  try {
235
- const result = await call("list");
236
- setItems(Array.isArray(result.items) ? result.items : []);
256
+ const result = await call("count");
257
+ setBadgeCount(typeof result.count === "number" ? result.count : 0);
237
258
  } catch {
238
259
  }
239
260
  }, [call]);
@@ -265,6 +286,14 @@ window.__ModuleLoader__.load({
265
286
  document.addEventListener("pointerdown", onPointerDown);
266
287
  return () => document.removeEventListener("pointerdown", onPointerDown);
267
288
  }, [open]);
289
+ React.useEffect(() => {
290
+ if (!open) return;
291
+ const onKeyDown = (event) => {
292
+ if (event.key === "Escape") setOpen(false);
293
+ };
294
+ document.addEventListener("keydown", onKeyDown);
295
+ return () => document.removeEventListener("keydown", onKeyDown);
296
+ }, [open]);
268
297
  const selectable = items.filter((item) => !item.live);
269
298
  const allSelected = selectable.length > 0 && selectable.every((item) => selected.has(item.sessionId));
270
299
  const toggleAll = (checked) => {
@@ -273,6 +302,7 @@ window.__ModuleLoader__.load({
273
302
  } else {
274
303
  setSelected(/* @__PURE__ */ new Set());
275
304
  }
305
+ setConfirmingDelete(false);
276
306
  };
277
307
  const toggleOne = (sessionId, checked) => {
278
308
  setSelected((current) => {
@@ -281,6 +311,7 @@ window.__ModuleLoader__.load({
281
311
  else next.delete(sessionId);
282
312
  return next;
283
313
  });
314
+ setConfirmingDelete(false);
284
315
  };
285
316
  const toggleDetail = (item) => {
286
317
  if (expanded === item.sessionId) {
@@ -288,7 +319,8 @@ window.__ModuleLoader__.load({
288
319
  return;
289
320
  }
290
321
  setExpanded(item.sessionId);
291
- if (!details.has(item.sessionId)) {
322
+ const cached = details.get(item.sessionId);
323
+ if (cached === void 0 || cached.error !== void 0) {
292
324
  setDetailLoading((current) => new Set(current).add(item.sessionId));
293
325
  call("detail", item.sessionId).then((detail) => {
294
326
  setDetails((current) => new Map(current).set(item.sessionId, detail));
@@ -318,7 +350,10 @@ window.__ModuleLoader__.load({
318
350
  const doneIds = result.deleted || result.restored || [];
319
351
  const n = doneIds.length;
320
352
  if (result.failed && result.failed.length > 0) {
321
- setNotice({ kind: "error", text: t(failKey).replace("{n}", String(result.failed.length)) });
353
+ const reasonText = (reason) => reason === "live" ? t("live") : reason === "busy" ? t("runningHint") : String(reason ?? "error");
354
+ const detail = result.failed.slice(0, 3).map((item) => shortId(item.sessionId) + ": " + reasonText(item.reason)).join("; ");
355
+ const more = result.failed.length > 3 ? " (+" + (result.failed.length - 3) + ")" : "";
356
+ setNotice({ kind: "error", text: t(failKey).replace("{n}", String(result.failed.length)) + " \u2014 " + detail + more });
322
357
  } else {
323
358
  setNotice({ kind: "ok", text: t(doneKey).replace("{n}", String(n)) });
324
359
  }
@@ -330,7 +365,7 @@ window.__ModuleLoader__.load({
330
365
  setConfirmingDelete(false);
331
366
  await load();
332
367
  } catch (actionError) {
333
- setNotice({ kind: "error", text: t(failKey).replace("{n}", "?") + ": " + (actionError && actionError.message || actionError) });
368
+ setNotice({ kind: "error", text: t(failKey).replace("{n}", String(ids.length)) + ": " + (actionError && actionError.message || actionError) });
334
369
  } finally {
335
370
  setBusy(false);
336
371
  }
@@ -370,11 +405,11 @@ window.__ModuleLoader__.load({
370
405
  )
371
406
  ),
372
407
  iconOnly ? null : React.createElement("span", { className: "sa_badgeLabel" }, t("badge")),
373
- iconOnly ? null : React.createElement("span", { className: "sa_badgeCount" }, String(items.length))
408
+ iconOnly ? null : React.createElement("span", { className: "sa_badgeCount" }, String(open ? items.length : badgeCount))
374
409
  ),
375
410
  open ? React.createElement(
376
411
  "div",
377
- { className: "sa_panel" },
412
+ { className: "sa_panel", role: "dialog", "aria-label": t("panelTitle") },
378
413
  React.createElement(
379
414
  "div",
380
415
  { className: "sa_header" },
@@ -413,12 +448,12 @@ window.__ModuleLoader__.load({
413
448
  type: "button",
414
449
  disabled: busy || !hasSelection,
415
450
  onClick: deleteSelected
416
- }, confirmingDelete ? t("deleteConfirm") : t("delete"))
451
+ }, confirmingDelete ? selected.size > 1 ? t("confirmAll").replace("{n}", String(selected.size)) : t("deleteConfirm") : t("delete"))
417
452
  ),
418
453
  React.createElement(
419
454
  "div",
420
455
  { className: "sa_body" },
421
- notice !== null ? React.createElement("p", { className: "sa_error" + (notice.kind === "ok" ? "" : ""), role: "status" }, notice.text) : null,
456
+ notice !== null ? React.createElement("p", { className: notice.kind === "ok" ? "sa_ok" : "sa_error", role: "status" }, notice.text) : null,
422
457
  error !== null ? React.createElement("p", { className: "sa_error", role: "alert" }, error) : null,
423
458
  loading && items.length === 0 ? React.createElement("p", { className: "sa_empty" }, "\u2026") : null,
424
459
  !loading && items.length === 0 && error === null ? React.createElement("p", { className: "sa_empty" }, t("empty")) : null,
@@ -441,11 +476,12 @@ window.__ModuleLoader__.load({
441
476
  checked: selected.has(item.sessionId),
442
477
  disabled: busy || item.live,
443
478
  title: item.live ? t("runningHint") : void 0,
479
+ "aria-label": item.title !== null && item.title !== void 0 && item.title !== "" ? item.title : t("noneTitle"),
444
480
  onChange: (e) => toggleOne(item.sessionId, e.target.checked)
445
481
  }),
446
482
  React.createElement(
447
- "span",
448
- { className: "sa_rowTitle", onClick: () => toggleDetail(item), title: t("view") },
483
+ "button",
484
+ { className: "sa_rowTitle", type: "button", onClick: () => toggleDetail(item), title: t("view") },
449
485
  item.title !== null && item.title !== void 0 && item.title !== "" ? item.title : t("noneTitle")
450
486
  ),
451
487
  item.live ? React.createElement("span", { className: "sa_live" }, t("live")) : null
@@ -464,7 +500,7 @@ window.__ModuleLoader__.load({
464
500
  "span",
465
501
  { className: "sa_rowMeta" },
466
502
  React.createElement("code", null, shortId(item.sessionId)),
467
- detail !== void 0 && !detail.error && detail.messageCount !== void 0 ? " \xB7 " + t("messages").replace("{n}", String(detail.messageCount)) : null
503
+ detail !== void 0 && !detail.error && detail.messageCount !== void 0 ? " \xB7 " + (detail.truncated === true ? t("messagesTruncated").replace("{n}", String(detail.totalMessageCount !== void 0 ? detail.totalMessageCount : detail.messageCount)) : t("messages").replace("{n}", String(detail.messageCount))) : null
468
504
  ),
469
505
  React.createElement(
470
506
  "div",
@@ -481,7 +517,7 @@ window.__ModuleLoader__.load({
481
517
  "div",
482
518
  { className: "sa_detail" },
483
519
  detailPending ? React.createElement("p", { className: "sa_empty" }, "\u2026") : null,
484
- detail === void 0 ? null : detail.error !== void 0 ? React.createElement("p", { className: "sa_error" }, detail.error) : detail.messages.length === 0 ? React.createElement("p", { className: "sa_empty" }, t("noMessages")) : detail.messages.map((message, index) => React.createElement(
520
+ detail === void 0 ? null : detail.error !== void 0 ? React.createElement("p", { className: "sa_error" }, detail.error) : !Array.isArray(detail.messages) ? React.createElement("p", { className: "sa_error" }, t("detailLoadFailed")) : detail.messages.length === 0 ? React.createElement("p", { className: "sa_empty" }, t("noMessages")) : detail.messages.map((message, index) => React.createElement(
485
521
  "div",
486
522
  { className: "sa_msg", key: index },
487
523
  React.createElement("span", { className: "sa_msgRole" }, message.role === "user" ? t("user") : t("assistant") + " \xB7 " + formatTime(message.time)),
@@ -501,6 +537,7 @@ window.__ModuleLoader__.load({
501
537
  package: "@chaoset/session-archive",
502
538
  descriptors: [
503
539
  { id: "@chaoset/session-archive#sessionArchive/list", service: "sessionArchive", namespace: "sessionArchive", method: "list", invocation: { kind: "direct" }, parameters: [], result: { mode: "strict", typeSymbol: "sessionArchive/list:result", schema: passthroughSchema } },
540
+ { id: "@chaoset/session-archive#sessionArchive/count", service: "sessionArchive", namespace: "sessionArchive", method: "count", invocation: { kind: "direct" }, parameters: [], result: { mode: "strict", typeSymbol: "sessionArchive/count:result", schema: passthroughSchema } },
504
541
  { id: "@chaoset/session-archive#sessionArchive/detail", service: "sessionArchive", namespace: "sessionArchive", method: "detail", invocation: { kind: "direct" }, parameters: [{ name: "sessionId", wire: "sessionId", source: "json", codec: { mode: "strict", typeSymbol: "sessionArchive/detail:sessionId", schema: passthroughSchema } }], result: { mode: "strict", typeSymbol: "sessionArchive/detail:result", schema: passthroughSchema } },
505
542
  { id: "@chaoset/session-archive#sessionArchive/delete", service: "sessionArchive", namespace: "sessionArchive", method: "delete", invocation: { kind: "direct" }, parameters: [{ name: "sessionIds", wire: "sessionIds", source: "json", codec: { mode: "strict", typeSymbol: "sessionArchive/delete:sessionIds", schema: passthroughSchema } }], result: { mode: "strict", typeSymbol: "sessionArchive/delete:result", schema: passthroughSchema } },
506
543
  { id: "@chaoset/session-archive#sessionArchive/unarchive", service: "sessionArchive", namespace: "sessionArchive", method: "unarchive", invocation: { kind: "direct" }, parameters: [{ name: "sessionIds", wire: "sessionIds", source: "json", codec: { mode: "strict", typeSymbol: "sessionArchive/unarchive:sessionIds", schema: passthroughSchema } }], result: { mode: "strict", typeSymbol: "sessionArchive/unarchive:result", schema: passthroughSchema } }
package/client/index.tsx CHANGED
@@ -36,10 +36,11 @@ var css = [
36
36
  ".sa_body{flex:1;min-height:0;padding:4px 12px 12px;overflow-y:auto}",
37
37
  ".sa_empty{color:var(--dsw-alias-label-tertiary);margin:24px 0;text-align:center;font-size:12px;line-height:18px}",
38
38
  ".sa_error{color:var(--dsw-alias-state-error-primary);margin:8px 0;font-size:12px;line-height:18px}",
39
+ ".sa_ok{color:var(--dsw-alias-state-success-primary);margin:8px 0;font-size:12px;line-height:18px}",
39
40
  ".sa_rows{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}",
40
41
  ".sa_row{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);border-radius:12px;flex-direction:column;gap:6px;padding:8px 10px;display:flex}",
41
42
  ".sa_rowHead{align-items:center;gap:8px;display:flex}",
42
- ".sa_rowTitle{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;font-weight:500;line-height:20px;overflow:hidden;cursor:pointer}",
43
+ ".sa_rowTitle{background:none;border:none;padding:0;text-align:left;font:inherit;min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;font-weight:500;line-height:20px;overflow:hidden;cursor:pointer}",
43
44
  ".sa_rowTitle:hover{text-decoration:underline}",
44
45
  ".sa_live{background:var(--dsw-alias-state-warn-tertiary);color:var(--dsw-alias-state-warn-label);height:18px;border-radius:9px;flex:none;align-items:center;padding:0 6px;font-size:11px;line-height:18px;display:inline-flex}",
45
46
  ".sa_rowMeta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;overflow-wrap:anywhere}",
@@ -90,6 +91,7 @@ const zh = {
90
91
  user: "用户",
91
92
  assistant: "助手",
92
93
  messages: "共 {n} 条消息",
94
+ messagesTruncated: "共 {n} 条消息(已截断)",
93
95
  noMessages: "(无文本消息)",
94
96
  sizeBytes: "{n} B",
95
97
  sizeKB: "{n} KB",
@@ -122,6 +124,7 @@ const en = {
122
124
  user: "User",
123
125
  assistant: "Assistant",
124
126
  messages: "{n} messages",
127
+ messagesTruncated: "{n}+ messages",
125
128
  noMessages: "(no text messages)",
126
129
  sizeBytes: "{n} B",
127
130
  sizeKB: "{n} KB",
@@ -131,6 +134,8 @@ const en = {
131
134
 
132
135
  // ── 工具函数 ─────────────────────────────────────────────────────────
133
136
  function formatBytes(bytes: any, t: any) {
137
+ // 0/缺失(文件已不可 stat)显示占位符,避免误导性的 "0 B"。
138
+ if (bytes === void 0 || bytes === null || Number(bytes) === 0) return "—";
134
139
  if (bytes < 1024) return t("sizeBytes").replace("{n}", String(bytes));
135
140
  if (bytes < 1024 * 1024) return t("sizeKB").replace("{n}", (bytes / 1024).toFixed(1));
136
141
  return t("sizeMB").replace("{n}", (bytes / (1024 * 1024)).toFixed(1));
@@ -141,6 +146,18 @@ function formatTime(ms: any) {
141
146
  function shortId(id: any) {
142
147
  return id.length > 12 ? id.slice(0, 12) + "…" : id;
143
148
  }
149
+ // 列表浅比较(sessionId+updatedAt+size+live):数据没变就不 setItems,
150
+ // 静默刷新/重复刷新不再触发整表 reconcile。
151
+ function sameItems(a: any[], b: any[]) {
152
+ if (a.length !== b.length) return false;
153
+ for (let i = 0; i < a.length; i++) {
154
+ const x = a[i], y = b[i];
155
+ if (x === y) continue;
156
+ if (x === void 0 || y === void 0) return false;
157
+ if (x.sessionId !== y.sessionId || x.updatedAt !== y.updatedAt || x.size !== y.size || x.live !== y.live) return false;
158
+ }
159
+ return true;
160
+ }
144
161
 
145
162
  // ── 归档面板 ─────────────────────────────────────────────────────────
146
163
  function ArchivePanel(props: any) {
@@ -186,7 +203,15 @@ function ArchivePanel(props: any) {
186
203
  setError(null);
187
204
  try {
188
205
  const result = await call("list");
189
- setItems(Array.isArray(result.items) ? result.items : []);
206
+ const next = Array.isArray(result.items) ? result.items : [];
207
+ setItems((current) => (sameItems(current, next) ? current : next));
208
+ // 选择集剔除已从列表消失的 id:残留勾选会让"已选 N 项"虚高,
209
+ // 还可能把幽灵 id 发给批量操作(host 有幂等兜底,但不该依赖它)。
210
+ const nextIds = new Set(next.map((item: any) => item.sessionId));
211
+ setSelected((currentSelected) => {
212
+ const pruned = [...currentSelected].filter((id) => nextIds.has(id));
213
+ return pruned.length === currentSelected.size ? currentSelected : new Set(pruned);
214
+ });
190
215
  } catch (loadError: any) {
191
216
  setError(t("loadFailed") + ": " + (loadError && loadError.message || loadError));
192
217
  } finally {
@@ -201,10 +226,13 @@ function ArchivePanel(props: any) {
201
226
  // 后台静默刷新归档计数:侧边栏徽标要在「聊天列表里出现归档」时就同步显示数量,
202
227
  // 而不是等到打开弹窗才更新。面板打开时由上面的 load() 负责,这里只在关闭态轮询,
203
228
  // 避免刷新打断用户在面板里的勾选/操作;同时监听标签页重新可见。
229
+ // 关闭态走 count() 轻端点:list() 要解析每个归档会话的完整事件流,
230
+ // 5 秒一次的徽标轮询用它是持续的性能债;count 只读每个文件的首行头。
231
+ const [badgeCount, setBadgeCount] = React.useState(0);
204
232
  const refreshSilently = React.useCallback(async () => {
205
233
  try {
206
- const result = await call("list");
207
- setItems(Array.isArray(result.items) ? result.items : []);
234
+ const result = await call("count");
235
+ setBadgeCount(typeof result.count === "number" ? result.count : 0);
208
236
  } catch {}
209
237
  }, [call]);
210
238
  React.useEffect(() => {
@@ -235,6 +263,16 @@ function ArchivePanel(props: any) {
235
263
  return () => document.removeEventListener("pointerdown", onPointerDown);
236
264
  }, [open]);
237
265
 
266
+ // Esc 关闭面板(仅 open 时监听):对话框惯例,键盘用户此前只能找 ✕。
267
+ React.useEffect(() => {
268
+ if (!open) return;
269
+ const onKeyDown = (event: any) => {
270
+ if (event.key === "Escape") setOpen(false);
271
+ };
272
+ document.addEventListener("keydown", onKeyDown);
273
+ return () => document.removeEventListener("keydown", onKeyDown);
274
+ }, [open]);
275
+
238
276
  const selectable = items.filter((item) => !item.live);
239
277
  const allSelected = selectable.length > 0 && selectable.every((item) => selected.has(item.sessionId));
240
278
 
@@ -244,6 +282,9 @@ function ArchivePanel(props: any) {
244
282
  } else {
245
283
  setSelected(new Set());
246
284
  }
285
+ // 选择集变化即解除两段式删除的 armed 态:否则 4 秒窗口内改勾选,
286
+ // 第二次点击会把确认"误嫁"给新的选择集。
287
+ setConfirmingDelete(false);
247
288
  };
248
289
  const toggleOne = (sessionId: any, checked: any) => {
249
290
  setSelected((current) => {
@@ -251,6 +292,7 @@ function ArchivePanel(props: any) {
251
292
  if (checked) next.add(sessionId); else next.delete(sessionId);
252
293
  return next;
253
294
  });
295
+ setConfirmingDelete(false);
254
296
  };
255
297
 
256
298
  const toggleDetail = (item: any) => {
@@ -259,7 +301,10 @@ function ArchivePanel(props: any) {
259
301
  return;
260
302
  }
261
303
  setExpanded(item.sessionId);
262
- if (!details.has(item.sessionId)) {
304
+ const cached = details.get(item.sessionId);
305
+ // 失败结果不缓存拦截:之前把 {error} 写进 Map 后 has() 恒真,唯一出路是
306
+ // 刷新页面;现在再次点击即重新请求。
307
+ if (cached === void 0 || cached.error !== void 0) {
263
308
  setDetailLoading((current) => new Set(current).add(item.sessionId));
264
309
  call("detail", item.sessionId).then((detail: any) => {
265
310
  setDetails((current) => new Map(current).set(item.sessionId, detail));
@@ -290,7 +335,15 @@ function ArchivePanel(props: any) {
290
335
  const doneIds = result.deleted || result.restored || [];
291
336
  const n = doneIds.length;
292
337
  if (result.failed && result.failed.length > 0) {
293
- setNotice({ kind: "error", text: t(failKey).replace("{n}", String(result.failed.length)) });
338
+ // host 对每个失败项都给了 reason(live/busy/not-archived/具体错误),
339
+ // 只报数量会让用户不知道为什么失败、该等多久重试。
340
+ const reasonText = (reason: any) =>
341
+ reason === "live" ? t("live") : reason === "busy" ? t("runningHint") : String(reason ?? "error");
342
+ const detail = result.failed.slice(0, 3)
343
+ .map((item: any) => shortId(item.sessionId) + ": " + reasonText(item.reason))
344
+ .join("; ");
345
+ const more = result.failed.length > 3 ? " (+" + (result.failed.length - 3) + ")" : "";
346
+ setNotice({ kind: "error", text: t(failKey).replace("{n}", String(result.failed.length)) + " — " + detail + more });
294
347
  } else {
295
348
  setNotice({ kind: "ok", text: t(doneKey).replace("{n}", String(n)) });
296
349
  }
@@ -302,7 +355,8 @@ function ArchivePanel(props: any) {
302
355
  setConfirmingDelete(false);
303
356
  await load();
304
357
  } catch (actionError: any) {
305
- setNotice({ kind: "error", text: t(failKey).replace("{n}", "?") + ": " + (actionError && actionError.message || actionError) });
358
+ // 异常分支同样带数量:用请求发出时的 ids.length,不用无意义的 "?"
359
+ setNotice({ kind: "error", text: t(failKey).replace("{n}", String(ids.length)) + ": " + (actionError && actionError.message || actionError) });
306
360
  } finally {
307
361
  setBusy(false);
308
362
  }
@@ -340,11 +394,11 @@ function ArchivePanel(props: any) {
340
394
  )
341
395
  ),
342
396
  iconOnly ? null : React.createElement("span", { className: "sa_badgeLabel" }, t("badge")),
343
- iconOnly ? null : React.createElement("span", { className: "sa_badgeCount" }, String(items.length))
397
+ iconOnly ? null : React.createElement("span", { className: "sa_badgeCount" }, String(open ? items.length : badgeCount))
344
398
  ),
345
399
  open ? React.createElement(
346
400
  "div",
347
- { className: "sa_panel" },
401
+ { className: "sa_panel", role: "dialog", "aria-label": t("panelTitle") },
348
402
  React.createElement(
349
403
  "div",
350
404
  { className: "sa_header" },
@@ -381,12 +435,14 @@ function ArchivePanel(props: any) {
381
435
  type: "button",
382
436
  disabled: busy || !hasSelection,
383
437
  onClick: deleteSelected
384
- }, confirmingDelete ? t("deleteConfirm") : t("delete"))
438
+ }, confirmingDelete
439
+ ? (selected.size > 1 ? t("confirmAll").replace("{n}", String(selected.size)) : t("deleteConfirm"))
440
+ : t("delete"))
385
441
  ),
386
442
  React.createElement(
387
443
  "div",
388
444
  { className: "sa_body" },
389
- notice !== null ? React.createElement("p", { className: "sa_error" + (notice.kind === "ok" ? "" : ""), role: "status" }, notice.text) : null,
445
+ notice !== null ? React.createElement("p", { className: notice.kind === "ok" ? "sa_ok" : "sa_error", role: "status" }, notice.text) : null,
390
446
  error !== null ? React.createElement("p", { className: "sa_error", role: "alert" }, error) : null,
391
447
  loading && items.length === 0 ? React.createElement("p", { className: "sa_empty" }, "…") : null,
392
448
  !loading && items.length === 0 && error === null ? React.createElement("p", { className: "sa_empty" }, t("empty")) : null,
@@ -409,11 +465,12 @@ function ArchivePanel(props: any) {
409
465
  checked: selected.has(item.sessionId),
410
466
  disabled: busy || item.live,
411
467
  title: item.live ? t("runningHint") : void 0,
468
+ "aria-label": item.title !== null && item.title !== void 0 && item.title !== "" ? item.title : t("noneTitle"),
412
469
  onChange: (e: any) => toggleOne(item.sessionId, e.target.checked)
413
470
  }),
414
471
  React.createElement(
415
- "span",
416
- { className: "sa_rowTitle", onClick: () => toggleDetail(item), title: t("view") },
472
+ "button",
473
+ { className: "sa_rowTitle", type: "button", onClick: () => toggleDetail(item), title: t("view") },
417
474
  item.title !== null && item.title !== void 0 && item.title !== "" ? item.title : t("noneTitle")
418
475
  ),
419
476
  item.live ? React.createElement("span", { className: "sa_live" }, t("live")) : null
@@ -429,7 +486,9 @@ function ArchivePanel(props: any) {
429
486
  React.createElement("span", { className: "sa_rowMeta" },
430
487
  React.createElement("code", null, shortId(item.sessionId)),
431
488
  detail !== void 0 && !detail.error && detail.messageCount !== void 0
432
- ? " · " + t("messages").replace("{n}", String(detail.messageCount))
489
+ ? " · " + (detail.truncated === true
490
+ ? t("messagesTruncated").replace("{n}", String(detail.totalMessageCount !== void 0 ? detail.totalMessageCount : detail.messageCount))
491
+ : t("messages").replace("{n}", String(detail.messageCount)))
433
492
  : null
434
493
  ),
435
494
  React.createElement(
@@ -449,6 +508,7 @@ function ArchivePanel(props: any) {
449
508
  detailPending ? React.createElement("p", { className: "sa_empty" }, "…") : null,
450
509
  detail === void 0 ? null :
451
510
  detail.error !== void 0 ? React.createElement("p", { className: "sa_error" }, detail.error) :
511
+ !Array.isArray(detail.messages) ? React.createElement("p", { className: "sa_error" }, t("detailLoadFailed")) :
452
512
  detail.messages.length === 0 ? React.createElement("p", { className: "sa_empty" }, t("noMessages")) :
453
513
  detail.messages.map((message: any, index: any) => React.createElement(
454
514
  "div",
@@ -474,6 +534,7 @@ const REMOTE_CONTRIBUTION: TypertRemoteContribution = {
474
534
  package: "@chaoset/session-archive",
475
535
  descriptors: [
476
536
  { id: "@chaoset/session-archive#sessionArchive/list", service: "sessionArchive", namespace: "sessionArchive", method: "list", invocation: { kind: "direct" }, parameters: [], result: { mode: "strict", typeSymbol: "sessionArchive/list:result", schema: passthroughSchema } },
537
+ { id: "@chaoset/session-archive#sessionArchive/count", service: "sessionArchive", namespace: "sessionArchive", method: "count", invocation: { kind: "direct" }, parameters: [], result: { mode: "strict", typeSymbol: "sessionArchive/count:result", schema: passthroughSchema } },
477
538
  { id: "@chaoset/session-archive#sessionArchive/detail", service: "sessionArchive", namespace: "sessionArchive", method: "detail", invocation: { kind: "direct" }, parameters: [{ name: "sessionId", wire: "sessionId", source: "json", codec: { mode: "strict", typeSymbol: "sessionArchive/detail:sessionId", schema: passthroughSchema } }], result: { mode: "strict", typeSymbol: "sessionArchive/detail:result", schema: passthroughSchema } },
478
539
  { id: "@chaoset/session-archive#sessionArchive/delete", service: "sessionArchive", namespace: "sessionArchive", method: "delete", invocation: { kind: "direct" }, parameters: [{ name: "sessionIds", wire: "sessionIds", source: "json", codec: { mode: "strict", typeSymbol: "sessionArchive/delete:sessionIds", schema: passthroughSchema } }], result: { mode: "strict", typeSymbol: "sessionArchive/delete:result", schema: passthroughSchema } },
479
540
  { id: "@chaoset/session-archive#sessionArchive/unarchive", service: "sessionArchive", namespace: "sessionArchive", method: "unarchive", invocation: { kind: "direct" }, parameters: [{ name: "sessionIds", wire: "sessionIds", source: "json", codec: { mode: "strict", typeSymbol: "sessionArchive/unarchive:sessionIds", schema: passthroughSchema } }], result: { mode: "strict", typeSymbol: "sessionArchive/unarchive:result", schema: passthroughSchema } }
package/lib/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ // ── dsh.d.ts augmentations (appended by scripts/build.mjs) ──
1
2
  import type { Context as CordisContext } from "@deepseek-ai/cordis";
2
3
 
3
4
  declare module "@deepseek-ai/cordis" {
@@ -77,11 +78,18 @@ export declare const config: {
77
78
  * 只读操作失败各自容错:单个会话的标题/详情读取失败不拖垮列表。
78
79
  */
79
80
  export declare function createArchiveHost(ctx: Context, cfg: Record<string, any>): {
81
+ /** 归档会话计数(存在性过滤后的真实数量)。侧边栏徽标的关闭态轮询
82
+ * 只调这里:persistence.list() 只读每个文件的首行头,比 list() 的
83
+ * 全事件流解析便宜一个数量级以上。 */
84
+ count(): Promise<{
85
+ count: number;
86
+ }>;
80
87
  /** 列出全部归档会话(存在性过滤:文件已删的幽灵归档记录不显示)。 */
81
88
  list(): Promise<{
82
89
  items: any[];
83
90
  }>;
84
- /** 读取一个归档会话的只读详情(标题 + 文本消息)。 */
91
+ /** 读取一个归档会话的只读详情(标题 + 文本消息)。仅归档会话可读:
92
+ * detail 是对外暴露的远程端点,不校验成员资格就能读到任意未归档会话。 */
85
93
  detail(sessionId: string): Promise<{
86
94
  sessionId: string;
87
95
  header: {
@@ -92,6 +100,8 @@ export declare function createArchiveHost(ctx: Context, cfg: Record<string, any>
92
100
  };
93
101
  title: string | null;
94
102
  messageCount: number;
103
+ totalMessageCount: number;
104
+ truncated: boolean;
95
105
  messages: {
96
106
  role: string;
97
107
  text: string;
@@ -106,6 +116,11 @@ export declare function createArchiveHost(ctx: Context, cfg: Record<string, any>
106
116
  * 集合中"作为显示条件)会立刻把仍在内存中的会话重新显示出来,等同
107
117
  * "恢复"。ghost id 由 list() 的存在性过滤隐藏,面板与侧边栏均不再
108
118
  * 显示该会话;`removedFromArchive` 因此恒为 0。
119
+ *
120
+ * 失败语义(failed[].reason):'not-archived' 非归档成员;'live' 内存
121
+ * 未归档会话;'busy' 归档会话 60s 内仍有写入;'unenumerable' 文件存在
122
+ * 但持久化枚举不到(首行损坏的孤儿);'reappeared' 删除后被生成流重建、
123
+ * 二次删除仍压不掉;其余为底层删除错误消息。
109
124
  */
110
125
  deleteArchived(sessionIds: string[]): Promise<{
111
126
  deleted: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAYnD,eAAO,MAAM,IAAI,oBAAoB,CAAC;AAEtC,oDAAoD;AACpD,eAAO,MAAM,MAAM,UAA0D,CAAC;AAY9E,eAAO,MAAM,MAAM;IARjB,iCAAiC;;IAEjC,8BAA8B;;IAE9B,4BAA4B;;CAIa,CAAC;AAiE5C;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IA8EpE,sCAAsC;IAChC,IAAI;;;IAeV,gCAAgC;IAC1B,MAAM,YAAY,MAAM;;;YAkBxB,GAAG;YACH,SAAS;YACT,aAAa;YACb,WAAW;;;;;;;;;;;IASjB;;;;;;;OAOG;IACG,cAAc,aAAa,MAAM,EAAE;;;;;;;;IAqCzC;;;;OAIG;IACG,SAAS,aAAa,MAAM,EAAE;;;;EAevC;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAYnD,eAAO,MAAM,IAAI,oBAAoB,CAAC;AAEtC,oDAAoD;AACpD,eAAO,MAAM,MAAM,UAA0D,CAAC;AAY9E,eAAO,MAAM,MAAM;IARjB,iCAAiC;;IAEjC,8BAA8B;;IAE9B,4BAA4B;;CAIa,CAAC;AAiE5C;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAoIpE;;0BAEsB;IAChB,KAAK;;;IAUX,sCAAsC;IAChC,IAAI;;;IAeV;+CAC2C;IACrC,MAAM,YAAY,MAAM;;;YA4BxB,GAAG;YACH,SAAS;YACT,aAAa;YACb,WAAW;;;;;;;;;;;;;IAWjB;;;;;;;;;;;;OAYG;IACG,cAAc,aAAa,MAAM,EAAE;;;;;;;;IA8EzC;;;;OAIG;IACG,SAAS,aAAa,MAAM,EAAE;;;;EAwBvC;AAED,iCAAiC;AACjC,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,GAAG,CAmBrD"}
package/lib/index.js CHANGED
@@ -140,8 +140,11 @@ export function createArchiveHost(ctx, cfg) {
140
140
  /** 归档瞬间的生成流兜底:会话仍在内存且文件最近有写入(60s 内)时
141
141
  * 视为忙碌——删除文件后进行中的请求会把半截日志 append 回来。 */
142
142
  const isBusy = (sessionId, file) => file !== null && ctx.sessions.get(sessionId) !== undefined && Date.now() - file.mtimeMs < 60_000;
143
- /** 从归档集合移除若干 id(恢复用;删除不调用——见 deleteArchived),返回实际移除的 id。 */
144
- async function removeFromArchiveSet(ids) {
143
+ /** 从归档集合移除若干 id(恢复用;删除不调用——见 deleteArchived),返回实际移除的 id。
144
+ * confirm registry 写锁临界区内逐个复核 id 是否仍可恢复(文件仍存在):
145
+ * 存在性检查放在锁外的话,并发 deleteArchived 可在检查与移除之间删掉文件,
146
+ * 结果"文件没了、归档标记也没了",内存中的会话立刻重回侧边栏。 */
147
+ async function removeFromArchiveSet(ids, confirm) {
145
148
  const set = new Set(ids);
146
149
  const canWrite = registry !== undefined &&
147
150
  typeof registry.enqueueOperation === 'function' &&
@@ -153,8 +156,23 @@ export function createArchiveHost(ctx, cfg) {
153
156
  await registry.enqueueOperation(async () => {
154
157
  const state = registry.requireState();
155
158
  const current = Array.isArray(state.archivedSessionIds) ? state.archivedSessionIds : [];
156
- removedIds = current.filter((id) => set.has(id));
157
- const remaining = current.filter((id) => !set.has(id));
159
+ let eligible = current.filter((id) => set.has(id));
160
+ if (confirm !== undefined) {
161
+ const confirmed = [];
162
+ for (const id of eligible) {
163
+ try {
164
+ if (await confirm(id))
165
+ confirmed.push(id);
166
+ }
167
+ catch { }
168
+ }
169
+ eligible = confirmed;
170
+ }
171
+ removedIds = eligible;
172
+ // 只有真正移除的 id 才离开归档集合;未通过复核的保持原状(仍是 ghost
173
+ // 或正常归档),不能因为请求过就一并抹掉。
174
+ const removedSet = new Set(removedIds);
175
+ const remaining = current.filter((id) => !removedSet.has(id));
158
176
  if (removedIds.length > 0)
159
177
  await registry.setState({ ...state, archivedSessionIds: remaining });
160
178
  });
@@ -173,15 +191,58 @@ export function createArchiveHost(ctx, cfg) {
173
191
  return null;
174
192
  }
175
193
  }
176
- /** 单个归档会话的展示行。标题读取失败回退 null(面板显示目录名)。 */
194
+ /** ghost 分支的孤儿探测:不经持久化枚举,直接 locate({id}) + stat 判断文件
195
+ * 是否实际存在(persistence.list() 会静默跳过首行损坏的日志,"枚举不到"
196
+ * 不等于"文件不存在")。cwd 未知的 ghost id 只能探到缺省位置(_no-cwd 一类),
197
+ * 尽力而为。返回存在的路径;无法定位或不存在返回 null。 */
198
+ async function probeOrphanFile(sessionId) {
199
+ try {
200
+ const location = persistence.locate({ id: sessionId });
201
+ if (location === undefined || typeof location.path !== 'string' || location.path.length === 0)
202
+ return null;
203
+ await stat(location.path);
204
+ return location.path;
205
+ }
206
+ catch {
207
+ return null;
208
+ }
209
+ }
210
+ /** 删除后的复验:先等 settleMs 给进行中的写入留出落盘时间,再确认文件没有
211
+ * 被宿主 materialize 的 mkdir -p 整体重建(stat 任意失败——含 ENOENT——都
212
+ * 视为已消失)。返回 true 表示文件仍在(重现)。 */
213
+ async function filePresentAfterSettle(path, settleMs) {
214
+ if (settleMs > 0)
215
+ await new Promise((resolve) => setTimeout(resolve, settleMs));
216
+ try {
217
+ await stat(path);
218
+ return true;
219
+ }
220
+ catch {
221
+ return false;
222
+ }
223
+ }
224
+ /** 单个归档会话的展示行。标题读取失败回退 null(面板显示目录名)。
225
+ * 标题按 mtime 缓存:jsonl 后端没有后缀读取钩子,readFrom(id,0) 会解析
226
+ * 整条事件流,而面板关闭态的徽标轮询每 5 秒打一次 list——不缓存的话
227
+ * 就是"读整本会话只为取一行标题"的持续开销。mtime 不变即命中缓存。 */
228
+ const titleCache = new Map();
177
229
  async function rowFor(sessionId, header) {
178
230
  const file = await fileInfo(header);
179
231
  let title = null;
180
- try {
181
- const { events } = await persistence.readFrom(sessionId, 0);
182
- title = foldTitle(events);
232
+ if (file !== null) {
233
+ const cached = titleCache.get(sessionId);
234
+ if (cached !== undefined && cached.mtimeMs === file.mtimeMs) {
235
+ title = cached.title;
236
+ }
237
+ else {
238
+ try {
239
+ const { events } = await persistence.readFrom(sessionId, 0);
240
+ title = foldTitle(events);
241
+ }
242
+ catch { }
243
+ titleCache.set(sessionId, { mtimeMs: file.mtimeMs, title });
244
+ }
183
245
  }
184
- catch { }
185
246
  return {
186
247
  sessionId,
187
248
  title,
@@ -193,6 +254,21 @@ export function createArchiveHost(ctx, cfg) {
193
254
  };
194
255
  }
195
256
  return {
257
+ /** 归档会话计数(存在性过滤后的真实数量)。侧边栏徽标的关闭态轮询
258
+ * 只调这里:persistence.list() 只读每个文件的首行头,比 list() 的
259
+ * 全事件流解析便宜一个数量级以上。 */
260
+ async count() {
261
+ const archived = [...archivedSet()];
262
+ if (archived.length === 0)
263
+ return { count: 0 };
264
+ const headers = await persistence.list();
265
+ const persisted = new Set(headers.map((header) => header.id));
266
+ let count = 0;
267
+ for (const sessionId of archived)
268
+ if (persisted.has(sessionId))
269
+ count++;
270
+ return { count };
271
+ },
196
272
  /** 列出全部归档会话(存在性过滤:文件已删的幽灵归档记录不显示)。 */
197
273
  async list() {
198
274
  const archived = [...archivedSet()];
@@ -210,14 +286,25 @@ export function createArchiveHost(ctx, cfg) {
210
286
  const items = await limitedConcurrency(cfg.titleReadConcurrency, rows.map(({ sessionId, header }) => () => rowFor(sessionId, header)));
211
287
  return { items };
212
288
  },
213
- /** 读取一个归档会话的只读详情(标题 + 文本消息)。 */
289
+ /** 读取一个归档会话的只读详情(标题 + 文本消息)。仅归档会话可读:
290
+ * detail 是对外暴露的远程端点,不校验成员资格就能读到任意未归档会话。 */
214
291
  async detail(sessionId) {
292
+ if (!archivedSet().has(sessionId)) {
293
+ throw Object.assign(new Error('session not archived: ' + sessionId), { code: 'NOT_ARCHIVED' });
294
+ }
215
295
  const { meta, events } = await persistence.readFrom(sessionId, 0);
216
296
  const title = foldTitle(events);
217
297
  const messages = [];
298
+ let totalMessageCount = 0;
218
299
  for (const event of events) {
219
300
  if (event.type !== 'user/message' && event.type !== 'assistant/message')
220
301
  continue;
302
+ // 达到上限后只计数、不再提取文本:截断语义要如实上报,尾部消息也不必
303
+ // 做字符串拼接(大日志下这部分是纯浪费)。
304
+ if (messages.length >= cfg.detailMaxMessages) {
305
+ totalMessageCount++;
306
+ continue;
307
+ }
221
308
  const text = messageText(event.data, cfg.messagePreviewChars);
222
309
  if (text.length === 0)
223
310
  continue;
@@ -226,8 +313,7 @@ export function createArchiveHost(ctx, cfg) {
226
313
  text,
227
314
  time: event.time,
228
315
  });
229
- if (messages.length >= cfg.detailMaxMessages)
230
- break;
316
+ totalMessageCount++;
231
317
  }
232
318
  return {
233
319
  sessionId,
@@ -239,6 +325,8 @@ export function createArchiveHost(ctx, cfg) {
239
325
  },
240
326
  title,
241
327
  messageCount: messages.length,
328
+ totalMessageCount,
329
+ truncated: totalMessageCount > messages.length,
242
330
  messages,
243
331
  live: isLive(sessionId),
244
332
  };
@@ -250,21 +338,42 @@ export function createArchiveHost(ctx, cfg) {
250
338
  * 集合中"作为显示条件)会立刻把仍在内存中的会话重新显示出来,等同
251
339
  * "恢复"。ghost id 由 list() 的存在性过滤隐藏,面板与侧边栏均不再
252
340
  * 显示该会话;`removedFromArchive` 因此恒为 0。
341
+ *
342
+ * 失败语义(failed[].reason):'not-archived' 非归档成员;'live' 内存
343
+ * 未归档会话;'busy' 归档会话 60s 内仍有写入;'unenumerable' 文件存在
344
+ * 但持久化枚举不到(首行损坏的孤儿);'reappeared' 删除后被生成流重建、
345
+ * 二次删除仍压不掉;其余为底层删除错误消息。
253
346
  */
254
347
  async deleteArchived(sessionIds) {
255
348
  const unique = [...new Set(sessionIds)];
256
349
  const deleted = [];
257
350
  const failed = [];
351
+ // 归档成员前置校验:persistence.list() 含所有持久化会话而非仅归档
352
+ // 会话,不校验的话任何"未归档、不在内存"的会话 id 都会绕过 live/busy
353
+ // 两道保护被不可逆物理删除。
354
+ const archived = archivedSet();
258
355
  const headers = await persistence.list();
259
356
  const headersById = new Map(headers.map((item) => [item.id, item]));
260
357
  for (const sessionId of unique) {
358
+ if (!archived.has(sessionId)) {
359
+ failed.push({ sessionId, reason: 'not-archived' });
360
+ continue;
361
+ }
261
362
  if (isLive(sessionId)) {
262
363
  failed.push({ sessionId, reason: 'live' });
263
364
  continue;
264
365
  }
265
366
  const header = headersById.get(sessionId);
266
367
  if (header === undefined) {
267
- // 会话文件已不存在:幂等删除(ghost id 保留在归档集合中)。
368
+ // ghost id(枚举不到)。但"枚举不到 ≠ 文件不存在":首行损坏的日志
369
+ // 会被 persistence.list() 静默跳过,直接当 ghost 报成功会把永远
370
+ // 删不掉的孤儿文件留在磁盘上。先 locate({id}) 探测,探到文件即
371
+ // "有文件但不可枚举",计入 failed 而非谎报成功。
372
+ if ((await probeOrphanFile(sessionId)) !== null) {
373
+ failed.push({ sessionId, reason: 'unenumerable' });
374
+ continue;
375
+ }
376
+ // 真不存在:幂等删除(ghost id 保留在归档集合中)。
268
377
  deleted.push(sessionId);
269
378
  continue;
270
379
  }
@@ -278,8 +387,37 @@ export function createArchiveHost(ctx, cfg) {
278
387
  continue;
279
388
  }
280
389
  try {
390
+ // TOCTOU 复核:isBusy 读的是 stat 快照,检查与 rm 之间生成流可能
391
+ // 恰好落盘;删前重取一次 mtime 再判一次 busy。
392
+ let fresh = null;
393
+ try {
394
+ fresh = await stat(file.path);
395
+ }
396
+ catch { }
397
+ if (fresh === null) {
398
+ deleted.push(sessionId);
399
+ continue;
400
+ }
401
+ if (ctx.sessions.get(sessionId) !== undefined && Date.now() - fresh.mtimeMs < 60_000) {
402
+ failed.push({ sessionId, reason: 'busy' });
403
+ continue;
404
+ }
281
405
  await rm(file.path, { force: true });
282
406
  await rm(dirname(file.path), { recursive: true, force: true });
407
+ // rm 后复验:目录被删后,宿主 materialize 的 mkdir -p 仍可能把路径
408
+ // 整体重建(生成流恰在删除窗口内落盘)。等约 300ms 再 stat;若重现
409
+ // 则再删一次,仍未删掉计入 failed('reappeared'),不谎报成功。
410
+ if (await filePresentAfterSettle(file.path, 300)) {
411
+ try {
412
+ await rm(file.path, { force: true });
413
+ await rm(dirname(file.path), { recursive: true, force: true });
414
+ }
415
+ catch { }
416
+ if (await filePresentAfterSettle(file.path, 300)) {
417
+ failed.push({ sessionId, reason: 'reappeared' });
418
+ continue;
419
+ }
420
+ }
283
421
  deleted.push(sessionId);
284
422
  }
285
423
  catch (error) {
@@ -296,17 +434,23 @@ export function createArchiveHost(ctx, cfg) {
296
434
  async unarchive(sessionIds) {
297
435
  const unique = [...new Set(sessionIds)];
298
436
  const headers = await persistence.list();
299
- const restorable = [];
437
+ const headersById = new Map(headers.map((item) => [item.id, item]));
438
+ // 锁外先做一遍廉价过滤(明显不可恢复的直接淘汰),锁内由 confirm 复核,
439
+ // 消除与并发 deleteArchived 的检查-移除窗口。
440
+ const candidates = [];
300
441
  for (const sessionId of unique) {
301
- const header = headers.find((item) => item.id === sessionId);
442
+ const header = headersById.get(sessionId);
302
443
  if (header === undefined)
303
444
  continue; // 持久化记录已删:拒绝恢复
304
- const file = await fileInfo(header);
305
- if (file === null)
306
- continue; // 有记录无文件:拒绝恢复
307
- restorable.push(sessionId);
445
+ candidates.push({ sessionId, header });
308
446
  }
309
- const restored = await removeFromArchiveSet(restorable);
447
+ const restored = await removeFromArchiveSet(candidates.map(({ sessionId }) => sessionId), async (sessionId) => {
448
+ const header = headersById.get(sessionId);
449
+ if (header === undefined)
450
+ return false;
451
+ const file = await fileInfo(header);
452
+ return file !== null; // 有记录无文件:拒绝恢复
453
+ });
310
454
  return { restored, removedFromArchive: restored.length };
311
455
  },
312
456
  };
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/lib/remote.d.ts CHANGED
@@ -14,7 +14,8 @@
14
14
  import type { Context } from "@deepseek-ai/cordis";
15
15
  declare const TypertRemoteService: typeof import("@deepseek-ai/dsh-typert-protocol").TypertRemoteService;
16
16
  /**
17
- * 归档管理远程服务:list 列出归档会话;detail 读取会话内容;
17
+ * 归档管理远程服务:list 列出归档会话;count 归档计数(徽标轮询轻端点);
18
+ * detail 读取会话内容;
18
19
  * delete 批量删除归档会话(文件删除,归档集合保留 ghost id 防止内存会话
19
20
  * 重现侧边栏);unarchive 批量恢复归档(仅限仍存在文件的会话)。
20
21
  * 所有逻辑委托给 host 模块(lib/index.ts 传入的 archiveHost)。
@@ -28,6 +29,7 @@ export declare class SessionArchiveGateway extends TypertRemoteService {
28
29
  serviceKey: string;
29
30
  });
30
31
  list(): any;
32
+ count(): any;
31
33
  detail(sessionId: string): any;
32
34
  delete(sessionIds: string[]): any;
33
35
  unarchive(sessionIds: string[]): any;
@@ -1 +1 @@
1
- {"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAyBnD,QAAA,MAAgB,mBAAmB,uEAAuB,CAAC;AA2B3D;;;;;;;GAOG;AACH,qBAAa,qBAAsB,SAAQ,mBAAmB;IAC5D,OAAO,CAAC,IAAI,CAAM;IAClB,YAAY,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAIlE;IACD,IAAI,QAEH;IACD,MAAM,CAAC,SAAS,EAAE,MAAM,OAKvB;IACD,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAK1B;IACD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAK7B;CACF"}
1
+ {"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAyBnD,QAAA,MAAgB,mBAAmB,uEAAuB,CAAC;AA2B3D;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,SAAQ,mBAAmB;IAC5D,OAAO,CAAC,IAAI,CAAM;IAClB,YAAY,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAIlE;IACD,IAAI,QAEH;IACD,KAAK,QAEJ;IACD,MAAM,CAAC,SAAS,EAAE,MAAM,OAKvB;IACD,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAK1B;IACD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAK7B;CACF"}
package/lib/remote.js CHANGED
@@ -63,7 +63,8 @@ function runPendingMarks(instance) {
63
63
  }
64
64
  }
65
65
  /**
66
- * 归档管理远程服务:list 列出归档会话;detail 读取会话内容;
66
+ * 归档管理远程服务:list 列出归档会话;count 归档计数(徽标轮询轻端点);
67
+ * detail 读取会话内容;
67
68
  * delete 批量删除归档会话(文件删除,归档集合保留 ghost id 防止内存会话
68
69
  * 重现侧边栏);unarchive 批量恢复归档(仅限仍存在文件的会话)。
69
70
  * 所有逻辑委托给 host 模块(lib/index.ts 传入的 archiveHost)。
@@ -80,6 +81,9 @@ export class SessionArchiveGateway extends TypertRemoteService {
80
81
  list() {
81
82
  return this.host.list();
82
83
  }
84
+ count() {
85
+ return this.host.count();
86
+ }
83
87
  detail(sessionId) {
84
88
  if (typeof sessionId !== "string" || sessionId.length === 0) {
85
89
  throw new TypeError("detail expects a session id string");
@@ -100,6 +104,7 @@ export class SessionArchiveGateway extends TypertRemoteService {
100
104
  }
101
105
  }
102
106
  markRemoteMethod(SessionArchiveGateway.prototype, "list");
107
+ markRemoteMethod(SessionArchiveGateway.prototype, "count");
103
108
  markRemoteMethod(SessionArchiveGateway.prototype, "detail");
104
109
  markRemoteMethod(SessionArchiveGateway.prototype, "delete");
105
110
  markRemoteMethod(SessionArchiveGateway.prototype, "unarchive");
package/lib/remote.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"typert.host.d.ts","sourceRoot":"","sources":["../src/typert.host.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;GAaG;AAEH,QAAA,MAAM,WAAW,qBAAmB,CAAC;AAOrC,eAAO,MAAM,MAAM;;;;;;;;;;YAoBC,IAAI;;;;;;;;;;oBAvBZ,IAAI;oBAAQ,KAAK;;;;;;;;;;;;;YAiCL,IAAI;YAA4C,IAAI;YAAK,MAAM;;;;QAqC5E,QAAQ;QAAM,MAAM;QAAM,OAAO;;CAC3C,CAAC"}
1
+ {"version":3,"file":"typert.host.d.ts","sourceRoot":"","sources":["../src/typert.host.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;GAaG;AAEH,QAAA,MAAM,WAAW,qBAAmB,CAAC;AAOrC,eAAO,MAAM,MAAM;;;;;;;;;;YA8BC,IAAI;;;;;;;;;;oBAjCZ,IAAI;oBAAQ,KAAK;;;;;;;;;;;;;YA2CL,IAAI;YAA4C,IAAI;YAAK,MAAM;;;;QAqC5E,QAAQ;QAAM,MAAM;QAAM,OAAO;;CAC3C,CAAC"}
@@ -34,6 +34,16 @@ export const TYPERT = {
34
34
  result: codec('@chaoset/session-archive/types#ArchiveListResult'),
35
35
  sourceLocation: { file: 'packages/session-archive/src/remote.ts', line: 1, column: 1 },
36
36
  },
37
+ {
38
+ id: '@chaoset/session-archive#sessionArchive/count',
39
+ service: 'sessionArchive',
40
+ namespace: 'sessionArchive',
41
+ method: 'count',
42
+ invocation: { kind: 'direct' },
43
+ parameters: [],
44
+ result: codec('@chaoset/session-archive/types#ArchiveCountResult'),
45
+ sourceLocation: { file: 'packages/session-archive/src/remote.ts', line: 1, column: 1 },
46
+ },
37
47
  {
38
48
  id: '@chaoset/session-archive#sessionArchive/detail',
39
49
  service: 'sessionArchive',
@@ -1 +1 @@
1
- {"version":3,"file":"typert.host.js","sourceRoot":"","sources":["../src/typert.host.ts"],"names":[],"mappings":"AAAA,cAAc;AACd;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC;AACrC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC7B,IAAI,EAAE,QAAQ;IACd,UAAU;IACV,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;CAC3C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,OAAO,EAAE,0BAA0B;IACnC,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,EAAE;IACX,WAAW,EAAE;QACX;YACE,EAAE,EAAE,8CAA8C;YAClD,OAAO,EAAE,gBAAgB;YACzB,SAAS,EAAE,gBAAgB;YAC3B,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC9B,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,KAAK,CAAC,kDAAkD,CAAC;YACjE,cAAc,EAAE,EAAE,IAAI,EAAE,wCAAwC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACvF;QACD;YACE,EAAE,EAAE,gDAAgD;YACpD,OAAO,EAAE,gBAAgB;YACzB,SAAS,EAAE,gBAAgB;YAC3B,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC9B,UAAU,EAAE;gBACV;oBACE,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,WAAW;oBACjB,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,KAAK,CAAC,0CAA0C,CAAC;iBACzD;aACF;YACD,MAAM,EAAE,KAAK,CAAC,oDAAoD,CAAC;YACnE,cAAc,EAAE,EAAE,IAAI,EAAE,wCAAwC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACvF;QACD;YACE,EAAE,EAAE,gDAAgD;YACpD,OAAO,EAAE,gBAAgB;YACzB,SAAS,EAAE,gBAAgB;YAC3B,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC9B,UAAU,EAAE;gBACV;oBACE,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,YAAY;oBAClB,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,KAAK,CAAC,+CAA+C,CAAC;iBAC9D;aACF;YACD,MAAM,EAAE,KAAK,CAAC,6CAA6C,CAAC;YAC5D,cAAc,EAAE,EAAE,IAAI,EAAE,wCAAwC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACvF;QACD;YACE,EAAE,EAAE,mDAAmD;YACvD,OAAO,EAAE,gBAAgB;YACzB,SAAS,EAAE,gBAAgB;YAC3B,MAAM,EAAE,WAAW;YACnB,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC9B,UAAU,EAAE;gBACV;oBACE,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,YAAY;oBAClB,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,KAAK,CAAC,+CAA+C,CAAC;iBAC9D;aACF;YACD,MAAM,EAAE,KAAK,CAAC,gDAAgD,CAAC;YAC/D,cAAc,EAAE,EAAE,IAAI,EAAE,wCAAwC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACvF;KACF;IACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;CACjD,CAAC"}
1
+ {"version":3,"file":"typert.host.js","sourceRoot":"","sources":["../src/typert.host.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.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "DSH plugin: browse archived sessions, inspect their content, batch-restore or permanently delete them with multi-select",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -48,5 +48,8 @@
48
48
  },
49
49
  "publishConfig": {
50
50
  "access": "public"
51
+ },
52
+ "engines": {
53
+ "node": ">=22.19.0"
51
54
  }
52
55
  }