@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 +66 -0
- package/README.md +7 -1
- package/client/client.cjs +154 -22
- package/client/index.tsx +183 -25
- package/lib/index.d.ts +8 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +77 -4
- package/lib/index.js.map +1 -1
- package/lib/remote.d.ts +3 -1
- package/lib/remote.d.ts.map +1 -1
- package/lib/remote.js +6 -1
- package/lib/remote.js.map +1 -1
- package/package.json +4 -1
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
|
-
| `
|
|
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
|
-
|
|
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:
|
|
47
|
-
".sa_badgeIcon svg{width:
|
|
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{
|
|
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
|
-
|
|
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
|
-
|
|
245
|
-
const
|
|
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")
|
|
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
|
-
|
|
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}",
|
|
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
|
-
|
|
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
|
-
"
|
|
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: () => ({
|
|
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
|
-
|
|
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:
|
|
9
|
-
".sa_badgeIcon svg{width:
|
|
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{
|
|
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
|
-
|
|
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
|
-
//
|
|
206
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
217
|
-
const id = globalThis.setInterval(refreshSilently, 5000);
|
|
218
|
-
const
|
|
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 () => {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
-
? " · " +
|
|
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: () => ({
|
|
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[];
|
package/lib/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
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 列出归档会话;
|
|
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;
|
package/lib/remote.d.ts.map
CHANGED
|
@@ -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
|
|
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 列出归档会话;
|
|
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":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,4DAA4D;AAC5D,4DAA4D;AAC5D,0BAA0B;AAC1B,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;IACvG,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC;KACtD,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;YACjF,OAAO,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;AAC3G,CAAC;AAED,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;AAE3D,IAAI,OAAO,GAA+C,EAAE,CAAC;AAE7D,sDAAsD;AACtD,SAAS,gBAAgB,CAAC,KAAa,EAAE,MAAc,EAAE,UAAmB;IAC1E,MAAM,YAAY,GAAsB,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,KAAK;QACb,cAAc,CAAC,EAAc,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KACnD,CAAC;IACT,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,CAAE,KAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,wDAAwD;AACxD,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC;IACtB,OAAO,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,EAAE,YAAY,EAAE,IAAI,KAAK,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,YAAY;YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,4DAA4D;AAC5D,4DAA4D;AAC5D,0BAA0B;AAC1B,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;IACvG,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC;KACtD,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;YACjF,OAAO,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;AAC3G,CAAC;AAED,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;AAE3D,IAAI,OAAO,GAA+C,EAAE,CAAC;AAE7D,sDAAsD;AACtD,SAAS,gBAAgB,CAAC,KAAa,EAAE,MAAc,EAAE,UAAmB;IAC1E,MAAM,YAAY,GAAsB,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,KAAK;QACb,cAAc,CAAC,EAAc,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KACnD,CAAC;IACT,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,CAAE,KAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,wDAAwD;AACxD,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC;IACtB,OAAO,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,EAAE,YAAY,EAAE,IAAI,KAAK,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,YAAY;YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,qBAAsB,SAAQ,mBAAmB;IACpD,IAAI,CAAM;IAClB,YAAY,GAAY,EAAE,MAAyC;QACjE,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9B,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IACD,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IACD,KAAK;QACH,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IACD,MAAM,CAAC,SAAiB;QACtB,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,CAAC,UAAoB;QACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;IACD,SAAS,CAAC,UAAoB;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;CACF;AACD,gBAAgB,CAAC,qBAAqB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAC1D,gBAAgB,CAAC,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAC3D,gBAAgB,CAAC,qBAAqB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC5D,gBAAgB,CAAC,qBAAqB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC5D,gBAAgB,CAAC,qBAAqB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAC/D,iEAAiE;AACjE,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chaoset/session-archive",
|
|
3
|
-
"version": "0.
|
|
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
|
}
|