@chaoset/session-archive 0.2.3 → 0.3.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,5 +1,71 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.3.0](https://github.com/winliyou/dsh-plugins) (2026-08-25)
4
+
5
+ ### Features
6
+
7
+ * **实时徽标与列表**:订阅宿主 workspaces 服务的归档集合 store——会话菜单点「归档」、其它标签页变更、宿主推送 `host/archived-sessions-changed` 都即时反映到侧边栏徽标与打开中的面板,不再等 5s 轮询;集合含 ghost id 与 `count()` 口径不同,故仅作触发信号、数目仍以 `count()` 为准;store 不可用时经 `ctx.get` 探测降级为纯轮询(不写 inject,插件不因等待挂起)
8
+ * `count()` 调用失败自动退回一次 `list()` 取数并同步徽标:任何 host 版本组合(如宿主进程旧于 lib、端点缺失)下徽标都能自我纠正,不再卡在过期值
9
+ * **徽标 hover 与「设置」入口对齐**:几何与官方侧边栏设置触发按钮逐字一致(`calc(100% + 4px)` 宽 / 42px 高 / 负外边距 / 非对称内边距 / 12px 圆角 / 同一 hover 变量;收起态 36×36 圆形、图标 18px)。根因修复:`.sa_root` 是 `footerActions`(flex 容器)的直接 flex 项会收缩到内容宽,显式 `width:100%` 撑满后 hover 命中面积与设置入口完全一致
10
+
11
+ ### Bug Fixes
12
+
13
+ * `deleteArchived` 冷文件快速路径:不在内存且 60s 内无写入的归档删除跳过固定 2×300ms settle 复验(重现只可能来自内存生成流或刚写过的 tab),批量清理陈旧归档从 ~12s/20 个降到 <1s;可能活跃的会话维持原两段复验与 `reappeared` 语义
14
+ * 徽标关闭态轮询在标签页隐藏时暂停 interval,恢复可见立即刷一次并重启(隐藏页轮询是纯浪费);面板打开期间新增 30s 静默刷新(`sameItems` 比较,数据不变不重渲染、不打断勾选)
15
+ * 批量删除成功后清理 `details`/`expanded` 缓存:内存不再随操作缓慢增长,展开态不再指向已删除的行
16
+
17
+ ### Accessibility / UI
18
+
19
+ * 面板焦点管理:打开时焦点移入面板、关闭时归还徽标按钮(`prevOpen` 防首次挂载误触发)
20
+ * 徽标按钮补回 `aria-label`(icon-only 场景 accessible name 自带语义与数量,不依赖 `title`)
21
+ * warn 级通知独立 warn 色(`state-warn-primary`),不再与错误同红
22
+ * 面板 150ms 入场动画(淡入 + 轻微上移,respect `prefers-reduced-motion`);z-index 层级来源注释
23
+
24
+ ## [0.2.4](https://github.com/winliyou/dsh-plugins) (2026-08-23)
25
+
26
+ ### Bug Fixes
27
+
28
+ * **RemoteAPI: `SessionArchiveGateway` 缺少 0.2.3 引入的 `count()` 方法认领**——徽标轮询端点实际返回 404(客户端静默吞错,表现为计数不更新);补齐方法与 marker。
29
+ * `detail()` 达到 `detailMaxMessages` 后只递增计数、不再做文本提取;响应新增 `totalMessageCount` 与 `truncated`,客户端如实显示"共 N 条消息(已截断)"而非歧义计数。
30
+ * `deleteArchived` 对 ghost id 先经 `locate()` 探测孤儿文件:首行损坏、被 `persistence.list()` 静默跳过的日志计入 `failed('unenumerable')`,不再谎报成功并把文件留在磁盘上。
31
+ * rm 后约 300ms 复验:文件被进行中的生成流重建则再删一次,仍压不掉计入 `failed('reappeared')`。
32
+ * 客户端:列表浅比较(sessionId+updatedAt+size+live)未变化跳过重渲染;选择集自动剔除已消失项;批量异常提示带请求数量;零体积显示 "—";`detail.messages` 渲染前加形状防御。
33
+
34
+ ### Accessibility
35
+
36
+ * 行标题由 span 改为真 button(键盘可达);面板补 `role="dialog"` 与 aria-label;Escape 关闭面板。
37
+
38
+ ## [0.2.3](https://github.com/winliyou/dsh-plugins) (2026-08-22)
39
+
40
+ ### Features
41
+
42
+ * `count()` 轻端点 + 按 mtime 的标题缓存:面板关闭态的徽标轮询不再每 5 秒全量解析归档事件流。
43
+ * 删除失败原因端到端透出(`not-archived` / `busy` 等)。
44
+ * 客户端:成功通知独立样式;删除确认锁定选择集并显示数量;批量失败原因逐条展示;detail 加载失败可重试;复选框 aria-label。
45
+
46
+ ### Bug Fixes
47
+
48
+ * `deleteArchived`/`detail` 前置校验归档成员资格:未归档的持久化会话不再可能经远程端点被不可逆删除/读取。
49
+ * busy 判定 TOCTOU:rm 前重取 mtime 复核;unarchive 的存在性确认移入 registry 写锁临界区,并发删除不再能把已删会话"复活"回侧边栏。
50
+
51
+ ## [0.2.2](https://github.com/winliyou/dsh-plugins) (2026-08-22)
52
+
53
+ ### Dependencies
54
+
55
+ * update @deepseek-ai/* to 0.1.0-rc.8
56
+
57
+ ## [0.2.1](https://github.com/winliyou/dsh-plugins) (2026-08-22)
58
+
59
+ ### Refactor
60
+
61
+ * republish TypeScript-refactor build output (tsc + esbuild pipeline)
62
+
63
+ ## [0.2.0](https://github.com/winliyou/dsh-plugins) (2026-08-21)
64
+
65
+ ### Bug Fixes
66
+
67
+ * expanded badge keeps text/icon state aligned with the sidebar wide prop
68
+
3
69
  ## [0.1.3](https://github.com/winliyou/dsh-plugins) (2026-08-18)
4
70
 
5
71
  ### 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
@@ -41,15 +41,33 @@ window.__ModuleLoader__.load({
41
41
  module.exports = __toCommonJS(index_exports);
42
42
  var React = __toESM(require("react"), 1);
43
43
  var css = [
44
- ".sa_badge{width:100%;height:49px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:none;border-radius:12px;align-items:center;gap:8px;padding:0 8px 0 6px;font-family:inherit;font-size:14px;display:inline-flex;overflow:hidden}",
44
+ // sa_root footerActions(display:flex)的直接 flex 项(slot 出口为
45
+ // display:contents 不参与布局):不设宽度的话 flex 项收缩到内容宽,
46
+ // 徽标的 width:calc(100% + 4px) 只等于内容宽,hover 高亮比「设置」
47
+ // 入口窄一圈。显式撑满 + min-width:0,与 settingsArea 块级容器里的
48
+ // 设置按钮获得同样的整行命中面积。
49
+ ".sa_root{display:flex;min-width:0;width:100%}",
50
+ // 徽标几何与官方侧边栏「设置」触发按钮(dsh-client-ui-settings-general
51
+ // 的 .trigger / .rail)逐字对齐:同样的 calc(+4px) 宽度、42px 高、负外边距、
52
+ // 非对称内边距、12px 圆角与同一 hover 变量——保证归档入口的 hover 命中
53
+ // 面积与视觉节奏和设置入口完全一致(收起态同为 36×36 圆形)。
54
+ ".sa_badge{box-sizing:border-box;cursor:pointer;width:calc(100% + 4px);height:42px;color:var(--dsw-alias-label-primary);background:0 0;border:none;border-radius:12px;flex:none;align-items:center;gap:8px;margin:4px -2px;padding:0 10px 0 8px;font-family:inherit;font-size:14px;line-height:22px;display:flex;overflow:hidden}",
45
55
  ".sa_badge:hover{background:var(--dsw-alias-interactive-bg-hover)}",
46
- ".sa_badgeIcon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;color:var(--dsw-alias-label-primary)}",
47
- ".sa_badgeIcon svg{width:18px;height:18px;display:block}",
56
+ ".sa_badgeIcon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;color:var(--dsw-alias-label-primary)}",
57
+ ".sa_badgeIcon svg{width:16px;height:16px;display:block}",
48
58
  ".sa_badgeLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}",
49
59
  ".sa_badgeCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;margin-left:auto;font-size:12px;line-height:16px}",
50
- ".sa_badge--collapsed{width:auto;justify-content:center;padding:0}",
60
+ ".sa_badge--collapsed{border-radius:50%;justify-content:center;gap:0;width:36px;height:36px;margin:8px 0 10px;padding:0}",
51
61
  ".sa_badge--collapsed .sa_badgeLabel,.sa_badge--collapsed .sa_badgeCount{display:none}",
62
+ ".sa_badge--collapsed .sa_badgeIcon,.sa_badge--collapsed .sa_badgeIcon svg{width:18px;height:18px}",
63
+ // z-index 30:仅高于侧边栏内容层、低于宿主模态遮罩(如设置面板 overlay),
64
+ // 与"从侧边栏弹出的浮层"层级预期一致;调整前先核对宿主浮层层级表。
52
65
  ".sa_panel{z-index:30;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:440px;max-width:calc(100vw - 24px);max-height:62vh;box-shadow:var(--dsw-shadow-lv2);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:12px;flex-direction:column;display:flex;position:fixed;bottom:128px;left:12px;overflow:hidden}",
66
+ // 入场动画:150ms 淡入 + 轻微上移(退出直接卸载,不做退场动画);
67
+ // 系统开启「减少动态效果」时完全禁用。
68
+ "@media (prefers-reduced-motion:no-preference){.sa_panel{animation:sa-panel-in .15s ease-out}}",
69
+ "@keyframes sa-panel-in{from{opacity:0;transform:translateY(4px)}}",
70
+ ".sa_panel:focus{outline:none}",
53
71
  ".sa_header{box-sizing:border-box;border-bottom:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:8px 12px;display:flex}",
54
72
  ".sa_title{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}",
55
73
  ".sa_iconBtn{font:inherit;cursor:pointer;border:0;border-radius:8px;width:36px;height:36px;color:var(--dsw-alias-label-secondary,#666);background:0 0;display:inline-flex;align-items:center;justify-content:center;font-size:18px}",
@@ -75,10 +93,12 @@ window.__ModuleLoader__.load({
75
93
  ".sa_empty{color:var(--dsw-alias-label-tertiary);margin:24px 0;text-align:center;font-size:12px;line-height:18px}",
76
94
  ".sa_error{color:var(--dsw-alias-state-error-primary);margin:8px 0;font-size:12px;line-height:18px}",
77
95
  ".sa_ok{color:var(--dsw-alias-state-success-primary);margin:8px 0;font-size:12px;line-height:18px}",
96
+ // 提示级通知(如「请先勾选会话」)不该与错误同色:用 warn 色区分严重度。
97
+ ".sa_warn{color:var(--dsw-alias-state-warn-primary);margin:8px 0;font-size:12px;line-height:18px}",
78
98
  ".sa_rows{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}",
79
99
  ".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}",
80
100
  ".sa_rowHead{align-items:center;gap:8px;display:flex}",
81
- ".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}",
101
+ ".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}",
82
102
  ".sa_rowTitle:hover{text-decoration:underline}",
83
103
  ".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}",
84
104
  ".sa_rowMeta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;overflow-wrap:anywhere}",
@@ -128,6 +148,7 @@ window.__ModuleLoader__.load({
128
148
  user: "\u7528\u6237",
129
149
  assistant: "\u52A9\u624B",
130
150
  messages: "\u5171 {n} \u6761\u6D88\u606F",
151
+ messagesTruncated: "\u5171 {n} \u6761\u6D88\u606F\uFF08\u5DF2\u622A\u65AD\uFF09",
131
152
  noMessages: "\uFF08\u65E0\u6587\u672C\u6D88\u606F\uFF09",
132
153
  sizeBytes: "{n} B",
133
154
  sizeKB: "{n} KB",
@@ -160,6 +181,7 @@ window.__ModuleLoader__.load({
160
181
  user: "User",
161
182
  assistant: "Assistant",
162
183
  messages: "{n} messages",
184
+ messagesTruncated: "{n}+ messages",
163
185
  noMessages: "(no text messages)",
164
186
  sizeBytes: "{n} B",
165
187
  sizeKB: "{n} KB",
@@ -167,6 +189,7 @@ window.__ModuleLoader__.load({
167
189
  runningHint: "Running sessions cannot be deleted; stop them first"
168
190
  };
169
191
  function formatBytes(bytes, t) {
192
+ if (bytes === void 0 || bytes === null || Number(bytes) === 0) return "\u2014";
170
193
  if (bytes < 1024) return t("sizeBytes").replace("{n}", String(bytes));
171
194
  if (bytes < 1024 * 1024) return t("sizeKB").replace("{n}", (bytes / 1024).toFixed(1));
172
195
  return t("sizeMB").replace("{n}", (bytes / (1024 * 1024)).toFixed(1));
@@ -181,6 +204,16 @@ window.__ModuleLoader__.load({
181
204
  function shortId(id) {
182
205
  return id.length > 12 ? id.slice(0, 12) + "\u2026" : id;
183
206
  }
207
+ function sameItems(a, b) {
208
+ if (a.length !== b.length) return false;
209
+ for (let i = 0; i < a.length; i++) {
210
+ const x = a[i], y = b[i];
211
+ if (x === y) continue;
212
+ if (x === void 0 || y === void 0) return false;
213
+ if (x.sessionId !== y.sessionId || x.updatedAt !== y.updatedAt || x.size !== y.size || x.live !== y.live) return false;
214
+ }
215
+ return true;
216
+ }
184
217
  function ArchivePanel(props) {
185
218
  const t = props.t;
186
219
  const call = props.call;
@@ -213,45 +246,118 @@ window.__ModuleLoader__.load({
213
246
  const [busy, setBusy] = React.useState(false);
214
247
  const [confirmingDelete, setConfirmingDelete] = React.useState(false);
215
248
  const [notice, setNotice] = React.useState(null);
249
+ const [badgeCount, setBadgeCount] = React.useState(0);
250
+ const applyItems = React.useCallback((next) => {
251
+ setItems((current) => sameItems(current, next) ? current : next);
252
+ setBadgeCount(next.length);
253
+ const nextIds = new Set(next.map((item) => item.sessionId));
254
+ setSelected((currentSelected) => {
255
+ const pruned = [...currentSelected].filter((id) => nextIds.has(id));
256
+ return pruned.length === currentSelected.size ? currentSelected : new Set(pruned);
257
+ });
258
+ }, []);
216
259
  const load = React.useCallback(async () => {
217
260
  setLoading(true);
218
261
  setError(null);
219
262
  try {
220
263
  const result = await call("list");
221
- setItems(Array.isArray(result.items) ? result.items : []);
264
+ applyItems(Array.isArray(result.items) ? result.items : []);
222
265
  } catch (loadError) {
223
266
  setError(t("loadFailed") + ": " + (loadError && loadError.message || loadError));
224
267
  } finally {
225
268
  setLoading(false);
226
269
  }
227
- }, [call, t]);
270
+ }, [call, applyItems, t]);
271
+ const silentList = React.useCallback(async () => {
272
+ try {
273
+ const result = await call("list");
274
+ applyItems(Array.isArray(result.items) ? result.items : []);
275
+ } catch {
276
+ }
277
+ }, [call, applyItems]);
228
278
  React.useEffect(() => {
229
279
  if (open) {
230
280
  setNotice(null);
231
281
  load();
232
282
  }
233
283
  }, [open, load]);
234
- const [badgeCount, setBadgeCount] = React.useState(0);
235
284
  const refreshSilently = React.useCallback(async () => {
236
285
  try {
237
286
  const result = await call("count");
238
287
  setBadgeCount(typeof result.count === "number" ? result.count : 0);
239
288
  } catch {
289
+ try {
290
+ const result = await call("list");
291
+ applyItems(Array.isArray(result.items) ? result.items : []);
292
+ } catch {
293
+ }
240
294
  }
241
- }, [call]);
295
+ }, [call, applyItems]);
242
296
  React.useEffect(() => {
243
297
  if (open) return;
244
- refreshSilently();
245
- const id = globalThis.setInterval(refreshSilently, 5e3);
298
+ let id = 0;
299
+ const start = () => {
300
+ if (id === 0) id = globalThis.setInterval(refreshSilently, 5e3);
301
+ };
302
+ const stop = () => {
303
+ if (id !== 0) {
304
+ globalThis.clearInterval(id);
305
+ id = 0;
306
+ }
307
+ };
246
308
  const onVis = () => {
247
- if (document.visibilityState === "visible") refreshSilently();
309
+ if (document.visibilityState === "visible") {
310
+ refreshSilently();
311
+ start();
312
+ } else stop();
248
313
  };
314
+ if (document.visibilityState === "visible") {
315
+ refreshSilently();
316
+ start();
317
+ }
249
318
  document.addEventListener("visibilitychange", onVis);
250
319
  return () => {
251
- clearInterval(id);
320
+ stop();
252
321
  document.removeEventListener("visibilitychange", onVis);
253
322
  };
254
323
  }, [open, refreshSilently]);
324
+ React.useEffect(() => {
325
+ if (!open) return;
326
+ const id = globalThis.setInterval(silentList, 3e4);
327
+ const onVis = () => {
328
+ if (document.visibilityState === "visible") silentList();
329
+ };
330
+ document.addEventListener("visibilitychange", onVis);
331
+ return () => {
332
+ globalThis.clearInterval(id);
333
+ document.removeEventListener("visibilitychange", onVis);
334
+ };
335
+ }, [open, silentList]);
336
+ const openRef = React.useRef(open);
337
+ React.useEffect(() => {
338
+ openRef.current = open;
339
+ }, [open]);
340
+ React.useEffect(() => {
341
+ const subscribeArchived = props.subscribeArchived;
342
+ const archivedCountOf = props.archivedCountOf;
343
+ if (typeof subscribeArchived !== "function" || typeof archivedCountOf !== "function") return;
344
+ let lastCount = archivedCountOf();
345
+ const unsubscribe = subscribeArchived(() => {
346
+ const n = archivedCountOf();
347
+ if (typeof n !== "number" || n < 0 || n === lastCount) return;
348
+ lastCount = n;
349
+ refreshSilently();
350
+ if (openRef.current) silentList();
351
+ });
352
+ return unsubscribe;
353
+ }, [props.subscribeArchived, props.archivedCountOf, refreshSilently, silentList]);
354
+ const panelRef = React.useRef(null);
355
+ const prevOpenRef = React.useRef(false);
356
+ React.useEffect(() => {
357
+ if (open && !prevOpenRef.current) panelRef.current?.focus?.();
358
+ else if (!open && prevOpenRef.current) badgeRef.current?.focus?.();
359
+ prevOpenRef.current = open;
360
+ }, [open]);
255
361
  React.useEffect(() => {
256
362
  if (notice === null) return;
257
363
  const id = globalThis.setTimeout(() => setNotice(null), 4e3);
@@ -267,6 +373,14 @@ window.__ModuleLoader__.load({
267
373
  document.addEventListener("pointerdown", onPointerDown);
268
374
  return () => document.removeEventListener("pointerdown", onPointerDown);
269
375
  }, [open]);
376
+ React.useEffect(() => {
377
+ if (!open) return;
378
+ const onKeyDown = (event) => {
379
+ if (event.key === "Escape") setOpen(false);
380
+ };
381
+ document.addEventListener("keydown", onKeyDown);
382
+ return () => document.removeEventListener("keydown", onKeyDown);
383
+ }, [open]);
270
384
  const selectable = items.filter((item) => !item.live);
271
385
  const allSelected = selectable.length > 0 && selectable.every((item) => selected.has(item.sessionId));
272
386
  const toggleAll = (checked) => {
@@ -333,12 +447,18 @@ window.__ModuleLoader__.load({
333
447
  if (doneIds.length > 0) {
334
448
  const done = new Set(doneIds);
335
449
  setItems((current) => current.filter((item) => !done.has(item.sessionId)));
450
+ setDetails((current) => {
451
+ const next = new Map(current);
452
+ for (const id of done) next.delete(id);
453
+ return next.size === current.size ? current : next;
454
+ });
455
+ setExpanded((current) => current !== null && done.has(current) ? null : current);
336
456
  }
337
457
  setSelected(/* @__PURE__ */ new Set());
338
458
  setConfirmingDelete(false);
339
459
  await load();
340
460
  } catch (actionError) {
341
- setNotice({ kind: "error", text: t(failKey).replace("{n}", "?") + ": " + (actionError && actionError.message || actionError) });
461
+ setNotice({ kind: "error", text: t(failKey).replace("{n}", String(ids.length)) + ": " + (actionError && actionError.message || actionError) });
342
462
  } finally {
343
463
  setBusy(false);
344
464
  }
@@ -353,6 +473,8 @@ window.__ModuleLoader__.load({
353
473
  runBatch("delete", "deleteDone", "deleteFailed");
354
474
  };
355
475
  const hasSelection = selected.size > 0;
476
+ const shownCount = open ? items.length : badgeCount;
477
+ const badgeTitle = t("badge") + (shownCount > 0 ? " (" + String(shownCount) + ")" : "");
356
478
  return React.createElement(
357
479
  "div",
358
480
  { className: "sa_root", ref: rootRef },
@@ -364,7 +486,8 @@ window.__ModuleLoader__.load({
364
486
  type: "button",
365
487
  onClick: () => setOpen(!open),
366
488
  "aria-expanded": open,
367
- title: t("badge")
489
+ "aria-label": badgeTitle,
490
+ title: badgeTitle
368
491
  },
369
492
  React.createElement(
370
493
  "span",
@@ -382,7 +505,7 @@ window.__ModuleLoader__.load({
382
505
  ),
383
506
  open ? React.createElement(
384
507
  "div",
385
- { className: "sa_panel" },
508
+ { className: "sa_panel", role: "dialog", "aria-label": t("panelTitle"), tabIndex: -1, ref: panelRef },
386
509
  React.createElement(
387
510
  "div",
388
511
  { className: "sa_header" },
@@ -426,7 +549,7 @@ window.__ModuleLoader__.load({
426
549
  React.createElement(
427
550
  "div",
428
551
  { className: "sa_body" },
429
- notice !== null ? React.createElement("p", { className: notice.kind === "ok" ? "sa_ok" : "sa_error", role: "status" }, notice.text) : null,
552
+ notice !== null ? React.createElement("p", { className: notice.kind === "ok" ? "sa_ok" : notice.kind === "warn" ? "sa_warn" : "sa_error", role: "status" }, notice.text) : null,
430
553
  error !== null ? React.createElement("p", { className: "sa_error", role: "alert" }, error) : null,
431
554
  loading && items.length === 0 ? React.createElement("p", { className: "sa_empty" }, "\u2026") : null,
432
555
  !loading && items.length === 0 && error === null ? React.createElement("p", { className: "sa_empty" }, t("empty")) : null,
@@ -453,8 +576,8 @@ window.__ModuleLoader__.load({
453
576
  onChange: (e) => toggleOne(item.sessionId, e.target.checked)
454
577
  }),
455
578
  React.createElement(
456
- "span",
457
- { className: "sa_rowTitle", onClick: () => toggleDetail(item), title: t("view") },
579
+ "button",
580
+ { className: "sa_rowTitle", type: "button", onClick: () => toggleDetail(item), title: t("view") },
458
581
  item.title !== null && item.title !== void 0 && item.title !== "" ? item.title : t("noneTitle")
459
582
  ),
460
583
  item.live ? React.createElement("span", { className: "sa_live" }, t("live")) : null
@@ -473,7 +596,7 @@ window.__ModuleLoader__.load({
473
596
  "span",
474
597
  { className: "sa_rowMeta" },
475
598
  React.createElement("code", null, shortId(item.sessionId)),
476
- detail !== void 0 && !detail.error && detail.messageCount !== void 0 ? " \xB7 " + t("messages").replace("{n}", String(detail.messageCount)) : null
599
+ 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
477
600
  ),
478
601
  React.createElement(
479
602
  "div",
@@ -490,7 +613,7 @@ window.__ModuleLoader__.load({
490
613
  "div",
491
614
  { className: "sa_detail" },
492
615
  detailPending ? React.createElement("p", { className: "sa_empty" }, "\u2026") : null,
493
- 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(
616
+ 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(
494
617
  "div",
495
618
  { className: "sa_msg", key: index },
496
619
  React.createElement("span", { className: "sa_msgRole" }, message.role === "user" ? t("user") : t("assistant") + " \xB7 " + formatTime(message.time)),
@@ -526,12 +649,21 @@ window.__ModuleLoader__.load({
526
649
  if (!result.ok) throw new Error(method + " failed: " + result.error.code + ": " + result.error.message);
527
650
  return result.value;
528
651
  });
652
+ const workspaces = ctx.get("workspaces");
653
+ const archivedStore = workspaces !== null && typeof workspaces === "object" && workspaces.list !== void 0 && typeof workspaces.list.subscribe === "function" && typeof workspaces.list.getSnapshot === "function" ? workspaces.list : void 0;
529
654
  ctx.slots.inject("sidebar.footer.action", () => ctx.slots.register({
530
655
  name: "sidebar.footer.action",
531
656
  id: "session-archive",
532
657
  order: 20,
533
658
  locale: NS,
534
- inject: () => ({ call })
659
+ inject: () => ({
660
+ call,
661
+ subscribeArchived: archivedStore !== void 0 ? (fn) => archivedStore.subscribe(fn) : void 0,
662
+ archivedCountOf: archivedStore !== void 0 ? () => {
663
+ const snapshot = archivedStore.getSnapshot();
664
+ return Array.isArray(snapshot?.archivedSessionIds) ? snapshot.archivedSessionIds.length : -1;
665
+ } : void 0
666
+ })
535
667
  }, ArchivePanel));
536
668
  }
537
669
 
package/client/index.tsx CHANGED
@@ -3,15 +3,33 @@ import type { TypertRemoteContribution } from "@deepseek-ai/dsh-typert-protocol"
3
3
 
4
4
  // ── 样式(注入 style 标签,复用 DSH 设计变量)────────────────────────
5
5
  var css = [
6
- ".sa_badge{width:100%;height:49px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:none;border-radius:12px;align-items:center;gap:8px;padding:0 8px 0 6px;font-family:inherit;font-size:14px;display:inline-flex;overflow:hidden}",
6
+ // sa_root footerActions(display:flex)的直接 flex 项(slot 出口为
7
+ // display:contents 不参与布局):不设宽度的话 flex 项收缩到内容宽,
8
+ // 徽标的 width:calc(100% + 4px) 只等于内容宽,hover 高亮比「设置」
9
+ // 入口窄一圈。显式撑满 + min-width:0,与 settingsArea 块级容器里的
10
+ // 设置按钮获得同样的整行命中面积。
11
+ ".sa_root{display:flex;min-width:0;width:100%}",
12
+ // 徽标几何与官方侧边栏「设置」触发按钮(dsh-client-ui-settings-general
13
+ // 的 .trigger / .rail)逐字对齐:同样的 calc(+4px) 宽度、42px 高、负外边距、
14
+ // 非对称内边距、12px 圆角与同一 hover 变量——保证归档入口的 hover 命中
15
+ // 面积与视觉节奏和设置入口完全一致(收起态同为 36×36 圆形)。
16
+ ".sa_badge{box-sizing:border-box;cursor:pointer;width:calc(100% + 4px);height:42px;color:var(--dsw-alias-label-primary);background:0 0;border:none;border-radius:12px;flex:none;align-items:center;gap:8px;margin:4px -2px;padding:0 10px 0 8px;font-family:inherit;font-size:14px;line-height:22px;display:flex;overflow:hidden}",
7
17
  ".sa_badge:hover{background:var(--dsw-alias-interactive-bg-hover)}",
8
- ".sa_badgeIcon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;color:var(--dsw-alias-label-primary)}",
9
- ".sa_badgeIcon svg{width:18px;height:18px;display:block}",
18
+ ".sa_badgeIcon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;color:var(--dsw-alias-label-primary)}",
19
+ ".sa_badgeIcon svg{width:16px;height:16px;display:block}",
10
20
  ".sa_badgeLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}",
11
21
  ".sa_badgeCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;margin-left:auto;font-size:12px;line-height:16px}",
12
- ".sa_badge--collapsed{width:auto;justify-content:center;padding:0}",
22
+ ".sa_badge--collapsed{border-radius:50%;justify-content:center;gap:0;width:36px;height:36px;margin:8px 0 10px;padding:0}",
13
23
  ".sa_badge--collapsed .sa_badgeLabel,.sa_badge--collapsed .sa_badgeCount{display:none}",
24
+ ".sa_badge--collapsed .sa_badgeIcon,.sa_badge--collapsed .sa_badgeIcon svg{width:18px;height:18px}",
25
+ // z-index 30:仅高于侧边栏内容层、低于宿主模态遮罩(如设置面板 overlay),
26
+ // 与"从侧边栏弹出的浮层"层级预期一致;调整前先核对宿主浮层层级表。
14
27
  ".sa_panel{z-index:30;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:440px;max-width:calc(100vw - 24px);max-height:62vh;box-shadow:var(--dsw-shadow-lv2);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:12px;flex-direction:column;display:flex;position:fixed;bottom:128px;left:12px;overflow:hidden}",
28
+ // 入场动画:150ms 淡入 + 轻微上移(退出直接卸载,不做退场动画);
29
+ // 系统开启「减少动态效果」时完全禁用。
30
+ "@media (prefers-reduced-motion:no-preference){.sa_panel{animation:sa-panel-in .15s ease-out}}",
31
+ "@keyframes sa-panel-in{from{opacity:0;transform:translateY(4px)}}",
32
+ ".sa_panel:focus{outline:none}",
15
33
  ".sa_header{box-sizing:border-box;border-bottom:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:8px 12px;display:flex}",
16
34
  ".sa_title{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}",
17
35
  ".sa_iconBtn{font:inherit;cursor:pointer;border:0;border-radius:8px;width:36px;height:36px;color:var(--dsw-alias-label-secondary,#666);background:0 0;display:inline-flex;align-items:center;justify-content:center;font-size:18px}",
@@ -37,10 +55,12 @@ var css = [
37
55
  ".sa_empty{color:var(--dsw-alias-label-tertiary);margin:24px 0;text-align:center;font-size:12px;line-height:18px}",
38
56
  ".sa_error{color:var(--dsw-alias-state-error-primary);margin:8px 0;font-size:12px;line-height:18px}",
39
57
  ".sa_ok{color:var(--dsw-alias-state-success-primary);margin:8px 0;font-size:12px;line-height:18px}",
58
+ // 提示级通知(如「请先勾选会话」)不该与错误同色:用 warn 色区分严重度。
59
+ ".sa_warn{color:var(--dsw-alias-state-warn-primary);margin:8px 0;font-size:12px;line-height:18px}",
40
60
  ".sa_rows{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}",
41
61
  ".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}",
42
62
  ".sa_rowHead{align-items:center;gap:8px;display:flex}",
43
- ".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}",
63
+ ".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}",
44
64
  ".sa_rowTitle:hover{text-decoration:underline}",
45
65
  ".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}",
46
66
  ".sa_rowMeta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;overflow-wrap:anywhere}",
@@ -91,6 +111,7 @@ const zh = {
91
111
  user: "用户",
92
112
  assistant: "助手",
93
113
  messages: "共 {n} 条消息",
114
+ messagesTruncated: "共 {n} 条消息(已截断)",
94
115
  noMessages: "(无文本消息)",
95
116
  sizeBytes: "{n} B",
96
117
  sizeKB: "{n} KB",
@@ -123,6 +144,7 @@ const en = {
123
144
  user: "User",
124
145
  assistant: "Assistant",
125
146
  messages: "{n} messages",
147
+ messagesTruncated: "{n}+ messages",
126
148
  noMessages: "(no text messages)",
127
149
  sizeBytes: "{n} B",
128
150
  sizeKB: "{n} KB",
@@ -132,6 +154,8 @@ const en = {
132
154
 
133
155
  // ── 工具函数 ─────────────────────────────────────────────────────────
134
156
  function formatBytes(bytes: any, t: any) {
157
+ // 0/缺失(文件已不可 stat)显示占位符,避免误导性的 "0 B"。
158
+ if (bytes === void 0 || bytes === null || Number(bytes) === 0) return "—";
135
159
  if (bytes < 1024) return t("sizeBytes").replace("{n}", String(bytes));
136
160
  if (bytes < 1024 * 1024) return t("sizeKB").replace("{n}", (bytes / 1024).toFixed(1));
137
161
  return t("sizeMB").replace("{n}", (bytes / (1024 * 1024)).toFixed(1));
@@ -142,6 +166,18 @@ function formatTime(ms: any) {
142
166
  function shortId(id: any) {
143
167
  return id.length > 12 ? id.slice(0, 12) + "…" : id;
144
168
  }
169
+ // 列表浅比较(sessionId+updatedAt+size+live):数据没变就不 setItems,
170
+ // 静默刷新/重复刷新不再触发整表 reconcile。
171
+ function sameItems(a: any[], b: any[]) {
172
+ if (a.length !== b.length) return false;
173
+ for (let i = 0; i < a.length; i++) {
174
+ const x = a[i], y = b[i];
175
+ if (x === y) continue;
176
+ if (x === void 0 || y === void 0) return false;
177
+ if (x.sessionId !== y.sessionId || x.updatedAt !== y.updatedAt || x.size !== y.size || x.live !== y.live) return false;
178
+ }
179
+ return true;
180
+ }
145
181
 
146
182
  // ── 归档面板 ─────────────────────────────────────────────────────────
147
183
  function ArchivePanel(props: any) {
@@ -181,19 +217,43 @@ function ArchivePanel(props: any) {
181
217
  const [busy, setBusy] = React.useState(false);
182
218
  const [confirmingDelete, setConfirmingDelete] = React.useState(false);
183
219
  const [notice, setNotice] = React.useState<any>(null);
220
+ // 关闭态徽标计数(由 count() 轻端点轮询维护;列表落地时也会同步)。
221
+ const [badgeCount, setBadgeCount] = React.useState(0);
184
222
 
223
+ // 列表落地(加载与静默刷新共用):sameItems 比较避免无变化时整表
224
+ // reconcile;同时剔除已消失 id 的残留勾选——否则"已选 N 项"虚高,
225
+ // 还可能把幽灵 id 发给批量操作(host 有幂等兜底,但不该依赖它)。
226
+ // 顺手用列表长度同步徽标计数:count() 端点不可用(host 旧进程未重启、
227
+ // RPC 失败被吞)时,开/关一次面板徽标也能自我纠正,不会卡在 0。
228
+ const applyItems = React.useCallback((next: any[]) => {
229
+ setItems((current) => (sameItems(current, next) ? current : next));
230
+ setBadgeCount(next.length);
231
+ const nextIds = new Set(next.map((item: any) => item.sessionId));
232
+ setSelected((currentSelected) => {
233
+ const pruned = [...currentSelected].filter((id) => nextIds.has(id));
234
+ return pruned.length === currentSelected.size ? currentSelected : new Set(pruned);
235
+ });
236
+ }, []);
185
237
  const load = React.useCallback(async () => {
186
238
  setLoading(true);
187
239
  setError(null);
188
240
  try {
189
241
  const result = await call("list");
190
- setItems(Array.isArray(result.items) ? result.items : []);
242
+ applyItems(Array.isArray(result.items) ? result.items : []);
191
243
  } catch (loadError: any) {
192
244
  setError(t("loadFailed") + ": " + (loadError && loadError.message || loadError));
193
245
  } finally {
194
246
  setLoading(false);
195
247
  }
196
- }, [call, t]);
248
+ }, [call, applyItems, t]);
249
+ // 打开态的静默刷新:不碰 loading/error,长开面板的列表不再陈旧;
250
+ // sameItems 比较保证数据没变时不触发任何重渲染,不打断勾选。
251
+ const silentList = React.useCallback(async () => {
252
+ try {
253
+ const result = await call("list");
254
+ applyItems(Array.isArray(result.items) ? result.items : []);
255
+ } catch {}
256
+ }, [call, applyItems]);
197
257
 
198
258
  React.useEffect(() => {
199
259
  if (open) { setNotice(null); load(); }
@@ -201,25 +261,79 @@ function ArchivePanel(props: any) {
201
261
 
202
262
  // 后台静默刷新归档计数:侧边栏徽标要在「聊天列表里出现归档」时就同步显示数量,
203
263
  // 而不是等到打开弹窗才更新。面板打开时由上面的 load() 负责,这里只在关闭态轮询,
204
- // 避免刷新打断用户在面板里的勾选/操作;同时监听标签页重新可见。
205
- // 关闭态走 count() 轻端点:list() 要解析每个归档会话的完整事件流,
206
- // 5 秒一次的徽标轮询用它是持续的性能债;count 只读每个文件的首行头。
207
- const [badgeCount, setBadgeCount] = React.useState(0);
264
+ // 避免刷新打断用户在面板里的勾选/操作。关闭态走 count() 轻端点:list() 要解析
265
+ // 每个归档会话的完整事件流,5 秒一次的徽标轮询用它是持续的性能债。
266
+ // 标签页隐藏时暂停 interval(隐藏页的轮询是纯浪费),恢复可见时立即刷一次并重启。
208
267
  const refreshSilently = React.useCallback(async () => {
209
268
  try {
210
269
  const result = await call("count");
211
270
  setBadgeCount(typeof result.count === "number" ? result.count : 0);
212
- } catch {}
213
- }, [call]);
271
+ } catch {
272
+ // count() 不可用(host 进程旧于 lib、端点缺失等):退回一次 list(),
273
+ // applyItems 会同步徽标计数——宁可贵一点也不让徽标卡在过期值。
274
+ try {
275
+ const result = await call("list");
276
+ applyItems(Array.isArray(result.items) ? result.items : []);
277
+ } catch {}
278
+ }
279
+ }, [call, applyItems]);
214
280
  React.useEffect(() => {
215
281
  if (open) return;
216
- refreshSilently();
217
- const id = globalThis.setInterval(refreshSilently, 5000);
218
- const onVis = () => { if (document.visibilityState === "visible") refreshSilently(); };
282
+ let id: any = 0;
283
+ const start = () => { if (id === 0) id = globalThis.setInterval(refreshSilently, 5000); };
284
+ const stop = () => { if (id !== 0) { globalThis.clearInterval(id); id = 0; } };
285
+ const onVis = () => {
286
+ if (document.visibilityState === "visible") { refreshSilently(); start(); }
287
+ else stop();
288
+ };
289
+ if (document.visibilityState === "visible") { refreshSilently(); start(); }
219
290
  document.addEventListener("visibilitychange", onVis);
220
- return () => { clearInterval(id); document.removeEventListener("visibilitychange", onVis); };
291
+ return () => { stop(); document.removeEventListener("visibilitychange", onVis); };
221
292
  }, [open, refreshSilently]);
222
293
 
294
+ // 打开态低频兜底刷新(30s)+ 恢复可见立即刷:面板长开时列表保持新鲜,
295
+ // 且不与关闭态徽标轮询叠加。
296
+ React.useEffect(() => {
297
+ if (!open) return;
298
+ const id = globalThis.setInterval(silentList, 30000);
299
+ const onVis = () => { if (document.visibilityState === "visible") silentList(); };
300
+ document.addEventListener("visibilitychange", onVis);
301
+ return () => { globalThis.clearInterval(id); document.removeEventListener("visibilitychange", onVis); };
302
+ }, [open, silentList]);
303
+
304
+ // 实时同步:订阅宿主 workspaces 服务的归档集合 store。用户在会话列表点
305
+ // 「归档」、其它标签页变更、或宿主推送 host/archived-sessions-changed 时,
306
+ // installArchived 都会触发 store 通知——这里立即重取 count(面板打开时
307
+ // 顺带刷新列表),不必等 5 秒轮询。store 不可用时静默退回纯轮询。
308
+ // 归档集合含 ghost id(已删除仍占位的记录),与 count() 的存在性过滤
309
+ // 口径不同,因此只把集合变化当信号,数目仍以 count() 结果为准。
310
+ const openRef = React.useRef(open);
311
+ React.useEffect(() => { openRef.current = open; }, [open]);
312
+ React.useEffect(() => {
313
+ const subscribeArchived = props.subscribeArchived;
314
+ const archivedCountOf = props.archivedCountOf;
315
+ if (typeof subscribeArchived !== "function" || typeof archivedCountOf !== "function") return;
316
+ let lastCount = archivedCountOf();
317
+ const unsubscribe = subscribeArchived(() => {
318
+ const n = archivedCountOf();
319
+ if (typeof n !== "number" || n < 0 || n === lastCount) return;
320
+ lastCount = n;
321
+ refreshSilently();
322
+ if (openRef.current) silentList();
323
+ });
324
+ return unsubscribe;
325
+ }, [props.subscribeArchived, props.archivedCountOf, refreshSilently, silentList]);
326
+
327
+ // 对话框焦点管理:打开时把焦点移入面板(键盘/读屏用户不必 Tab 瞎找),
328
+ // 关闭时归还给徽标按钮;prevOpen 避免首次挂载(open=false)误触发归还。
329
+ const panelRef = React.useRef<any>(null);
330
+ const prevOpenRef = React.useRef(false);
331
+ React.useEffect(() => {
332
+ if (open && !prevOpenRef.current) panelRef.current?.focus?.();
333
+ else if (!open && prevOpenRef.current) badgeRef.current?.focus?.();
334
+ prevOpenRef.current = open;
335
+ }, [open]);
336
+
223
337
  // 提示(如「已恢复/已删除 N 个会话」)几秒后自动消失,避免残留误导用户,
224
338
  // 也避免删除全部归档后仍挂着上一条提示。
225
339
  React.useEffect(() => {
@@ -239,6 +353,16 @@ function ArchivePanel(props: any) {
239
353
  return () => document.removeEventListener("pointerdown", onPointerDown);
240
354
  }, [open]);
241
355
 
356
+ // Esc 关闭面板(仅 open 时监听):对话框惯例,键盘用户此前只能找 ✕。
357
+ React.useEffect(() => {
358
+ if (!open) return;
359
+ const onKeyDown = (event: any) => {
360
+ if (event.key === "Escape") setOpen(false);
361
+ };
362
+ document.addEventListener("keydown", onKeyDown);
363
+ return () => document.removeEventListener("keydown", onKeyDown);
364
+ }, [open]);
365
+
242
366
  const selectable = items.filter((item) => !item.live);
243
367
  const allSelected = selectable.length > 0 && selectable.every((item) => selected.has(item.sessionId));
244
368
 
@@ -316,12 +440,21 @@ function ArchivePanel(props: any) {
316
440
  if (doneIds.length > 0) {
317
441
  const done = new Set(doneIds);
318
442
  setItems((current) => current.filter((item) => !done.has(item.sessionId)));
443
+ // 已删除会话的详情/展开态一并清掉:Map 残留会让内存缓慢增长,
444
+ // 展开态残留则指向一个已不存在的行。
445
+ setDetails((current: any) => {
446
+ const next = new Map(current);
447
+ for (const id of done) next.delete(id);
448
+ return next.size === current.size ? current : next;
449
+ });
450
+ setExpanded((current: any) => (current !== null && done.has(current) ? null : current));
319
451
  }
320
452
  setSelected(new Set());
321
453
  setConfirmingDelete(false);
322
454
  await load();
323
455
  } catch (actionError: any) {
324
- setNotice({ kind: "error", text: t(failKey).replace("{n}", "?") + ": " + (actionError && actionError.message || actionError) });
456
+ // 异常分支同样带数量:用请求发出时的 ids.length,不用无意义的 "?"
457
+ setNotice({ kind: "error", text: t(failKey).replace("{n}", String(ids.length)) + ": " + (actionError && actionError.message || actionError) });
325
458
  } finally {
326
459
  setBusy(false);
327
460
  }
@@ -337,6 +470,10 @@ function ArchivePanel(props: any) {
337
470
  };
338
471
 
339
472
  const hasSelection = selected.size > 0;
473
+ // 徽标的 accessible name:icon-only(侧边栏收起)时没有可见文本,
474
+ // aria-label 必须自带语义与数量,不能只依赖 title。
475
+ const shownCount = open ? items.length : badgeCount;
476
+ const badgeTitle = t("badge") + (shownCount > 0 ? " (" + String(shownCount) + ")" : "");
340
477
 
341
478
  return React.createElement(
342
479
  "div",
@@ -349,7 +486,8 @@ function ArchivePanel(props: any) {
349
486
  type: "button",
350
487
  onClick: () => setOpen(!open),
351
488
  "aria-expanded": open,
352
- title: t("badge")
489
+ "aria-label": badgeTitle,
490
+ title: badgeTitle
353
491
  },
354
492
  React.createElement("span", { className: "sa_badgeIcon", "aria-hidden": true },
355
493
  React.createElement("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round" },
@@ -363,7 +501,7 @@ function ArchivePanel(props: any) {
363
501
  ),
364
502
  open ? React.createElement(
365
503
  "div",
366
- { className: "sa_panel" },
504
+ { className: "sa_panel", role: "dialog", "aria-label": t("panelTitle"), tabIndex: -1, ref: panelRef },
367
505
  React.createElement(
368
506
  "div",
369
507
  { className: "sa_header" },
@@ -407,7 +545,7 @@ function ArchivePanel(props: any) {
407
545
  React.createElement(
408
546
  "div",
409
547
  { className: "sa_body" },
410
- notice !== null ? React.createElement("p", { className: notice.kind === "ok" ? "sa_ok" : "sa_error", role: "status" }, notice.text) : null,
548
+ notice !== null ? React.createElement("p", { className: notice.kind === "ok" ? "sa_ok" : notice.kind === "warn" ? "sa_warn" : "sa_error", role: "status" }, notice.text) : null,
411
549
  error !== null ? React.createElement("p", { className: "sa_error", role: "alert" }, error) : null,
412
550
  loading && items.length === 0 ? React.createElement("p", { className: "sa_empty" }, "…") : null,
413
551
  !loading && items.length === 0 && error === null ? React.createElement("p", { className: "sa_empty" }, t("empty")) : null,
@@ -434,8 +572,8 @@ function ArchivePanel(props: any) {
434
572
  onChange: (e: any) => toggleOne(item.sessionId, e.target.checked)
435
573
  }),
436
574
  React.createElement(
437
- "span",
438
- { className: "sa_rowTitle", onClick: () => toggleDetail(item), title: t("view") },
575
+ "button",
576
+ { className: "sa_rowTitle", type: "button", onClick: () => toggleDetail(item), title: t("view") },
439
577
  item.title !== null && item.title !== void 0 && item.title !== "" ? item.title : t("noneTitle")
440
578
  ),
441
579
  item.live ? React.createElement("span", { className: "sa_live" }, t("live")) : null
@@ -451,7 +589,9 @@ function ArchivePanel(props: any) {
451
589
  React.createElement("span", { className: "sa_rowMeta" },
452
590
  React.createElement("code", null, shortId(item.sessionId)),
453
591
  detail !== void 0 && !detail.error && detail.messageCount !== void 0
454
- ? " · " + t("messages").replace("{n}", String(detail.messageCount))
592
+ ? " · " + (detail.truncated === true
593
+ ? t("messagesTruncated").replace("{n}", String(detail.totalMessageCount !== void 0 ? detail.totalMessageCount : detail.messageCount))
594
+ : t("messages").replace("{n}", String(detail.messageCount)))
455
595
  : null
456
596
  ),
457
597
  React.createElement(
@@ -471,6 +611,7 @@ function ArchivePanel(props: any) {
471
611
  detailPending ? React.createElement("p", { className: "sa_empty" }, "…") : null,
472
612
  detail === void 0 ? null :
473
613
  detail.error !== void 0 ? React.createElement("p", { className: "sa_error" }, detail.error) :
614
+ !Array.isArray(detail.messages) ? React.createElement("p", { className: "sa_error" }, t("detailLoadFailed")) :
474
615
  detail.messages.length === 0 ? React.createElement("p", { className: "sa_empty" }, t("noMessages")) :
475
616
  detail.messages.map((message: any, index: any) => React.createElement(
476
617
  "div",
@@ -512,12 +653,29 @@ async function apply(ctx: any) {
512
653
  if (!result.ok) throw new Error(method + " failed: " + result.error.code + ": " + result.error.message);
513
654
  return result.value;
514
655
  });
656
+ // 宿主 workspaces 服务的归档集合 store(实时信号的来源):归档/恢复/
657
+ // 宿主推送都会经过 installArchived 触发 store 通知。用 ctx.get 而非
658
+ // inject——服务缺失时插件照常激活,面板退回 5s 轮询,不因等待挂起。
659
+ const workspaces = ctx.get("workspaces");
660
+ const archivedStore = workspaces !== null && typeof workspaces === "object"
661
+ && workspaces.list !== void 0
662
+ && typeof workspaces.list.subscribe === "function"
663
+ && typeof workspaces.list.getSnapshot === "function"
664
+ ? workspaces.list
665
+ : void 0;
515
666
  ctx.slots.inject("sidebar.footer.action", () => ctx.slots.register({
516
667
  name: "sidebar.footer.action",
517
668
  id: "session-archive",
518
669
  order: 20,
519
670
  locale: NS,
520
- inject: () => ({ call })
671
+ inject: () => ({
672
+ call,
673
+ subscribeArchived: archivedStore !== void 0 ? (fn: any) => archivedStore.subscribe(fn) : void 0,
674
+ archivedCountOf: archivedStore !== void 0 ? () => {
675
+ const snapshot = archivedStore.getSnapshot();
676
+ return Array.isArray(snapshot?.archivedSessionIds) ? snapshot.archivedSessionIds.length : -1;
677
+ } : void 0,
678
+ })
521
679
  }, ArchivePanel));
522
680
  }
523
681
 
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" {
@@ -99,6 +100,8 @@ export declare function createArchiveHost(ctx: Context, cfg: Record<string, any>
99
100
  };
100
101
  title: string | null;
101
102
  messageCount: number;
103
+ totalMessageCount: number;
104
+ truncated: boolean;
102
105
  messages: {
103
106
  role: string;
104
107
  text: string;
@@ -113,6 +116,11 @@ export declare function createArchiveHost(ctx: Context, cfg: Record<string, any>
113
116
  * 集合中"作为显示条件)会立刻把仍在内存中的会话重新显示出来,等同
114
117
  * "恢复"。ghost id 由 list() 的存在性过滤隐藏,面板与侧边栏均不再
115
118
  * 显示该会话;`removedFromArchive` 因此恒为 0。
119
+ *
120
+ * 失败语义(failed[].reason):'not-archived' 非归档成员;'live' 内存
121
+ * 未归档会话;'busy' 归档会话 60s 内仍有写入;'unenumerable' 文件存在
122
+ * 但持久化枚举不到(首行损坏的孤儿);'reappeared' 删除后被生成流重建、
123
+ * 二次删除仍压不掉;其余为底层删除错误消息。
116
124
  */
117
125
  deleteArchived(sessionIds: string[]): Promise<{
118
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;IAwGpE;;0BAEsB;IAChB,KAAK;;;IAUX,sCAAsC;IAChC,IAAI;;;IAeV;+CAC2C;IACrC,MAAM,YAAY,MAAM;;;YAqBxB,GAAG;YACH,SAAS;YACT,aAAa;YACb,WAAW;;;;;;;;;;;IASjB;;;;;;;OAOG;IACG,cAAc,aAAa,MAAM,EAAE;;;;;;;;IAyDzC;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;IAsFzC;;;;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
@@ -191,6 +191,36 @@ export function createArchiveHost(ctx, cfg) {
191
191
  return null;
192
192
  }
193
193
  }
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
+ }
194
224
  /** 单个归档会话的展示行。标题读取失败回退 null(面板显示目录名)。
195
225
  * 标题按 mtime 缓存:jsonl 后端没有后缀读取钩子,readFrom(id,0) 会解析
196
226
  * 整条事件流,而面板关闭态的徽标轮询每 5 秒打一次 list——不缓存的话
@@ -265,9 +295,16 @@ export function createArchiveHost(ctx, cfg) {
265
295
  const { meta, events } = await persistence.readFrom(sessionId, 0);
266
296
  const title = foldTitle(events);
267
297
  const messages = [];
298
+ let totalMessageCount = 0;
268
299
  for (const event of events) {
269
300
  if (event.type !== 'user/message' && event.type !== 'assistant/message')
270
301
  continue;
302
+ // 达到上限后只计数、不再提取文本:截断语义要如实上报,尾部消息也不必
303
+ // 做字符串拼接(大日志下这部分是纯浪费)。
304
+ if (messages.length >= cfg.detailMaxMessages) {
305
+ totalMessageCount++;
306
+ continue;
307
+ }
271
308
  const text = messageText(event.data, cfg.messagePreviewChars);
272
309
  if (text.length === 0)
273
310
  continue;
@@ -276,8 +313,7 @@ export function createArchiveHost(ctx, cfg) {
276
313
  text,
277
314
  time: event.time,
278
315
  });
279
- if (messages.length >= cfg.detailMaxMessages)
280
- break;
316
+ totalMessageCount++;
281
317
  }
282
318
  return {
283
319
  sessionId,
@@ -289,6 +325,8 @@ export function createArchiveHost(ctx, cfg) {
289
325
  },
290
326
  title,
291
327
  messageCount: messages.length,
328
+ totalMessageCount,
329
+ truncated: totalMessageCount > messages.length,
292
330
  messages,
293
331
  live: isLive(sessionId),
294
332
  };
@@ -300,6 +338,11 @@ export function createArchiveHost(ctx, cfg) {
300
338
  * 集合中"作为显示条件)会立刻把仍在内存中的会话重新显示出来,等同
301
339
  * "恢复"。ghost id 由 list() 的存在性过滤隐藏,面板与侧边栏均不再
302
340
  * 显示该会话;`removedFromArchive` 因此恒为 0。
341
+ *
342
+ * 失败语义(failed[].reason):'not-archived' 非归档成员;'live' 内存
343
+ * 未归档会话;'busy' 归档会话 60s 内仍有写入;'unenumerable' 文件存在
344
+ * 但持久化枚举不到(首行损坏的孤儿);'reappeared' 删除后被生成流重建、
345
+ * 二次删除仍压不掉;其余为底层删除错误消息。
303
346
  */
304
347
  async deleteArchived(sessionIds) {
305
348
  const unique = [...new Set(sessionIds)];
@@ -322,7 +365,15 @@ export function createArchiveHost(ctx, cfg) {
322
365
  }
323
366
  const header = headersById.get(sessionId);
324
367
  if (header === undefined) {
325
- // 会话文件已不存在:幂等删除(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 保留在归档集合中)。
326
377
  deleted.push(sessionId);
327
378
  continue;
328
379
  }
@@ -347,12 +398,34 @@ export function createArchiveHost(ctx, cfg) {
347
398
  deleted.push(sessionId);
348
399
  continue;
349
400
  }
350
- if (ctx.sessions.get(sessionId) !== undefined && Date.now() - fresh.mtimeMs < 60_000) {
401
+ const inMemory = ctx.sessions.get(sessionId) !== undefined;
402
+ if (inMemory && Date.now() - fresh.mtimeMs < 60_000) {
351
403
  failed.push({ sessionId, reason: 'busy' });
352
404
  continue;
353
405
  }
354
406
  await rm(file.path, { force: true });
355
407
  await rm(dirname(file.path), { recursive: true, force: true });
408
+ // rm 后复验:防宿主 materialize 的 mkdir -p 把路径在删除窗口内重建。
409
+ // 重现只可能来自活跃写入方(内存中的生成流,或刚写完不久、客户端
410
+ // 重连即恢复的 tab)。据此分两档:
411
+ // - 可能活跃(内存存在 或 60s 内有写入):维持原 300ms settle 两段
412
+ // 复验;重现则再删一次,仍未删掉计入 failed('reappeared')。
413
+ // - 冷文件(不在内存且超过 60s 无写入):未来写入需要用户主动继续
414
+ // 对话,不会落在删除窗口内——做零等待的即时复验即可。批量清理
415
+ // 陈旧归档不再为每个文件白付 2×300ms。
416
+ const plausiblyActive = inMemory || Date.now() - fresh.mtimeMs < 60_000;
417
+ const settleMs = plausiblyActive ? 300 : 0;
418
+ if (await filePresentAfterSettle(file.path, settleMs)) {
419
+ try {
420
+ await rm(file.path, { force: true });
421
+ await rm(dirname(file.path), { recursive: true, force: true });
422
+ }
423
+ catch { }
424
+ if (await filePresentAfterSettle(file.path, settleMs)) {
425
+ failed.push({ sessionId, reason: 'reappeared' });
426
+ continue;
427
+ }
428
+ }
356
429
  deleted.push(sessionId);
357
430
  }
358
431
  catch (error) {
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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chaoset/session-archive",
3
- "version": "0.2.3",
3
+ "version": "0.3.0",
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
  }