@chaoset/session-archive 0.3.11 → 0.3.13

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,67 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.13 (2026-09-14)
4
+
5
+ ### Fixes
6
+
7
+ * 面板性能:`list`/`count`/`delete`/`unarchive` 四端点不再全量枚举实例上
8
+ 的所有持久化会话,改走官方契约的逐 id `stat(id)`(只读目标会话的元数据
9
+ 头,宿主缺 `stat` 时回退全量 `list`)。`count` 是每 5 秒每标签页的徽标
10
+ 轮询端点,实例积累数千历史会话时此前等于持续全树扫
11
+ * 标题与详情读取分块化(`read(offset, length)` 官方契约,块长 200 事件):
12
+ 此前 `read(0)` 一次性物化整条事件流,大日志下峰值内存 O(整条日志) 且同步
13
+ JSON.parse 集中在宿主事件循环上;分块后峰值 O(块),语义不变(标题仍取
14
+ 最后一个 `session/title` 事件,经官方 `foldSessionTitle` 折叠)
15
+ * 恢复(unarchive)补齐与删除对称的 `failed` 语义:ghost(文件已删/枚举
16
+ 不到)、非归档成员、confirm 复核淘汰(`not-restorable`)的 id 不再静默
17
+ 丢弃——客户端此前把「已恢复 0 个」当成功样式展示,选 5 个只恢复 3 个
18
+ 也没有任何失败说明
19
+ * 删除的 absent 快速路径纳入 exclusive 临界区:宿主「写临时文件 + rename」
20
+ 格式迁移的瞬间目录扫描可能扫空,此前直接报幂等删除成功而文件实际可能
21
+ 随迁移回来;现在锁内重扫,发现文件在则转常规删除流
22
+ * 删除复验的第二次 rm 失败不再吞异常误标为 `reappeared`(EPERM/EBUSY 的
23
+ 真实原因现在原样上报);`settleStat`/复验只把 ENOENT 视为「文件已消失」,
24
+ EACCES 等错误按仍在处理并以真实错误计入 failed,不再谎报 deleted
25
+ * `detail` 的 `totalMessageCount` 计数口径在截断线两侧统一:空文本消息
26
+ (纯工具调用)此前在截断线前不计、超线后计入
27
+ * 客户端失败原因本地化:`unenumerable`/`unlocatable`/`reappeared`/
28
+ `not-archived`/`not-restorable` 此前以英文原样上屏;部分成功时同时如实
29
+ 显示成功计数(warn 样式),整单失败才用 error 样式;busy 提示从「请先
30
+ 停止会话」(归档会话无流可停)改为「仍在生成落盘,请稍后重试」
31
+ * README 三处与实现对齐:列表不再声称恒为 false 的「运行状态」;`busy`
32
+ 语义更新为「内存存在且沉降观察窗内体积仍在增长」;限制一节补充首行损坏
33
+ 孤儿日志面板不可见也不可删的说明
34
+
35
+ ### Tests
36
+
37
+ * 新增 3 用例(分块读取跨块完整性、unarchive failed 覆盖全部未恢复 id、
38
+ count/list 走逐 id stat 不打全量 list);夹具 `read` 按官方契约支持
39
+ `offset/length`、补 `stat`
40
+ * build + typecheck + 全量测试通过,并在隔离测试实例真实验证
41
+
42
+ ## 0.3.12 (2026-09-12)
43
+
44
+ ### Fixes
45
+
46
+ * 修复删除谎报成功的又一同源变体:`fileInfo` 外层兜底把 locate 抛错(后端
47
+ 异常/契约漂移)误判为「文件不存在」(absent),删除路径随后把它记成幂等
48
+ 删除成功——文件实际可能还在。现按语义表返回 `unknown`,对应删除路径的
49
+ `unlocatable` 拒绝;恢复路径同样谨慎拒绝
50
+ * 收窄删除与恢复的并发竞态:`deleteArchived` 与 `unarchive` 的「检查 → 生效」
51
+ 窗口经插件闭包内的 promise 链互斥。registry 写锁只串行化归档集合写入而
52
+ 挡不住删除,此前并发时可能出现「文件被删、归档标记也被移出」——内存会话
53
+ 重回侧边栏,等同误恢复;反向则可能删掉刚恢复的会话文件。删除临界区内
54
+ 同时复验归档成员资格
55
+ * `detail` 对畸形 assistant 事件(缺 `data.message`)容错:一条损坏/异构
56
+ 日志不再让整个详情请求 TypeError
57
+ * 标题缓存加 500 条 FIFO 上限(已删会话的条目不再被 mtime 命中更新,长驻
58
+ 宿主进程下无界累积);并发限制器宽度下限 1,直调传入 0/负数不再静默
59
+ 返回全 undefined 的列表
60
+ * 测试夹具的 `archivedSessionIds` 改为 getter(官方契约形态):静态属性会在
61
+ `setState` 后与内部 state 脱钩,host 侧集合快照永远读到旧值
62
+ * 新增 3 用例(locate 抛错拒绝删除、删除↔恢复互斥两变体、畸形事件容错);
63
+ build + typecheck + 全量测试通过,并在隔离测试实例真实验证
64
+
3
65
  ## 0.3.11 (2026-09-12)
4
66
 
5
67
  ### Fixes
package/README.md CHANGED
@@ -2,12 +2,13 @@
2
2
 
3
3
  补上 DSH 缺失的「归档后半程」:web 侧边栏底部新增**归档**面板。
4
4
 
5
- - **查看归档**:列出全部归档会话(标题、目录、时间、体积、运行状态);点击
5
+ - **查看归档**:列出全部归档会话(标题、目录、时间、体积);点击
6
6
  会话可展开**只读浏览**其聊天内容(用户/助手文本消息)。
7
- - **批量恢复**:勾选多个会话一键移回会话树,恢复其在原工作区的位置。
7
+ - **批量恢复**:勾选多个会话一键移回会话树,恢复其在原工作区的位置;无法
8
+ 恢复的会话(文件已删等)逐条给出原因。
8
9
  - **彻底删除**:删除勾选会话的持久化文件与会话目录;两段式确认(第一次点击
9
- 进入确认态,4 秒内再次点击执行)避免误删。有近期写入的会话(生成流可能
10
- 还在落盘)拒绝删除;若宿主允许归档运行中会话,插件同样拒绝。
10
+ 进入确认态,4 秒内再次点击执行)避免误删。正在生成落盘的会话(沉降观察窗
11
+ 内体积仍在增长)拒绝删除;若宿主允许归档运行中会话,插件同样拒绝。
11
12
  - 工具条提供全选与已选计数;侧边栏徽标实时显示归档数量(订阅宿主归档集合,
12
13
  轻量轮询兜底)。
13
14
 
@@ -27,12 +28,13 @@ dsh plugin --profile web remove @chaoset/session-archive
27
28
 
28
29
  ## 工作原理
29
30
 
30
- - **列表**:宿主归档集合 ∩ 持久化会话列表;标题折叠自会话事件流的最后一个
31
- `session/title` 事件,体积来自文件 stat。
31
+ - **列表**:宿主归档集合 ∩ 逐 id 持久化快照(官方 `stat(id)`,不枚举实例上
32
+ 的全部历史会话);标题折叠自会话事件流的最后一个 `session/title` 事件
33
+ (事件流分块读取,峰值内存有界),体积来自文件 stat。
32
34
  - **查看**:只读解析会话事件流,提取用户/助手文本消息;超过 `detailMaxMessages`
33
35
  条时截断并如实标注。
34
36
  - **恢复**:仅从归档集合移除仍存在持久化文件的会话 id,会话数据不动;文件已删
35
- 的会话拒绝恢复。
37
+ 的会话拒绝恢复,并在 `failed` 里逐条给出原因。
36
38
  - **删除**:live 会话拒绝;每个会话删除持久化文件与会话目录。删除后**保留**
37
39
  该会话在归档集合中的占位 id——否则仍挂在内存中的会话会因「不再归档」立刻
38
40
  重新出现在侧边栏(效果等同恢复);列表按文件存在性过滤,面板与侧边栏都不再
@@ -46,14 +48,18 @@ dsh plugin --profile web remove @chaoset/session-archive
46
48
  | `count()` | — | `{ count }`(存在性过滤后的归档数量,徽标轮询轻端点) |
47
49
  | `detail(sessionId)` | 会话 id | `{ sessionId, header, title, messageCount, totalMessageCount, truncated, messages, live }` |
48
50
  | `delete(sessionIds[])` | id 数组 | `{ deleted, failed, removedFromArchive }` |
49
- | `unarchive(sessionIds[])` | id 数组 | `{ restored, removedFromArchive }` |
51
+ | `unarchive(sessionIds[])` | id 数组 | `{ restored, failed, removedFromArchive }` |
50
52
 
51
- > `delete` 的 `failed[].reason`:`not-archived`(非归档成员)、`live`(内存中
52
- > 未归档会话)、`busy`(归档会话 60s 内仍有写入)、`unenumerable`(文件存在但
53
- > 持久化枚举不到)、`reappeared`(删除后被生成流重建);其余为底层删除错误消息。
53
+ > `delete` 与 `unarchive` 共用 `failed[].reason` 词表:`not-archived`(非归档
54
+ > 成员)、`live`(内存中未归档会话)、`busy`(内存存在且沉降观察窗内体积仍在
55
+ > 增长——活跃生成流)、`unenumerable`(文件存在但持久化枚举不到,或文件已删)、
56
+ > `unlocatable`(枚举得到但无法定位路径)、`reappeared`(删除后被生成流重建,
57
+ > 二次删除仍压不掉)、`not-restorable`(仅 unarchive:confirm 复核时文件已不在);
58
+ > 其余为底层删除错误消息。
54
59
 
55
60
  > `delete` 的 `removedFromArchive` 恒为 0(删除保留归档占位 id,见上);
56
- > `unarchive` 的为实际从归档集合移除的 id 数。
61
+ > `unarchive` 的为实际从归档集合移除的 id 数。`restored` 之外的每个请求 id
62
+ > 都会在 `failed` 里给出原因。
57
63
 
58
64
  `ArchiveRow`:`{ sessionId, title, cwd, createdAt, updatedAt, size, live }`。
59
65
 
@@ -67,6 +73,9 @@ config 字段(`cordis.patch.yml` 或 `~/.dsh/plugins/session-archive/config.js
67
73
 
68
74
  ## 限制
69
75
 
70
- - 有近期写入或运行中的会话拒绝删除——先停止会话、等写入完成再删除。
76
+ - 正在生成落盘的会话拒绝删除——归档会话不在会话列表、无流可停,请稍后重试
77
+ (沉降观察窗内体积不再增长即可删)。
78
+ - 首行损坏的孤儿日志被宿主枚举静默跳过:面板既看不到也无法经面板删除(删除
79
+ 会因 `unenumerable` 被拒绝),只能手动清理文件。
71
80
  - 无官方 unarchive API,恢复归档通过 registry 写入通道实现;若未来 DSH 提供
72
81
  官方 API,插件会切换过去(行为不变)。
package/client/client.cjs CHANGED
@@ -140,11 +140,11 @@ window.__ModuleLoader__.load({
140
140
  selected: "\u5DF2\u9009 {n} \u9879",
141
141
  restore: "\u6062\u590D\u6240\u9009",
142
142
  restoreDone: "\u5DF2\u6062\u590D {n} \u4E2A\u5F52\u6863\u4F1A\u8BDD",
143
- restoreFailed: "\u6062\u590D\u5931\u8D25",
143
+ restoreFailed: "\u6062\u590D\u5931\u8D25\uFF1A{n} \u4E2A",
144
144
  delete: "\u5220\u9664\u6240\u9009",
145
145
  deleteConfirm: "\u518D\u6B21\u70B9\u51FB\u786E\u8BA4\u5220\u9664",
146
146
  deleteDone: "\u5DF2\u5220\u9664 {n} \u4E2A\u5F52\u6863\u4F1A\u8BDD",
147
- deleteFailed: "\u90E8\u5206\u5220\u9664\u5931\u8D25\uFF1A{n} \u4E2A",
147
+ deleteFailed: "\u5220\u9664\u5931\u8D25\uFF1A{n} \u4E2A",
148
148
  confirmAll: "\u786E\u8BA4\u5220\u9664\u5168\u90E8 {n} \u4E2A\uFF1F",
149
149
  noSelection: "\u8BF7\u5148\u52FE\u9009\u4F1A\u8BDD",
150
150
  view: "\u67E5\u770B",
@@ -160,7 +160,13 @@ window.__ModuleLoader__.load({
160
160
  sizeBytes: "{n} B",
161
161
  sizeKB: "{n} KB",
162
162
  sizeMB: "{n} MB",
163
- runningHint: "\u8FD0\u884C\u4E2D\u7684\u4F1A\u8BDD\u4E0D\u80FD\u5220\u9664\uFF0C\u8BF7\u5148\u505C\u6B62"
163
+ runningHint: "\u8BE5\u4F1A\u8BDD\u4ECD\u5728\u751F\u6210\u843D\u76D8\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",
164
+ batchError: "\u6279\u91CF\u64CD\u4F5C\u5931\u8D25\uFF08{n} \u9879\uFF09",
165
+ reasonUnenumerable: "\u4F1A\u8BDD\u6587\u4EF6\u679A\u4E3E\u4E0D\u5230",
166
+ reasonUnlocatable: "\u65E0\u6CD5\u5B9A\u4F4D\u4F1A\u8BDD\u6587\u4EF6",
167
+ reasonReappeared: "\u5220\u9664\u540E\u88AB\u91CD\u5EFA",
168
+ reasonNotArchived: "\u4E0D\u662F\u5F52\u6863\u4F1A\u8BDD",
169
+ reasonNotRestorable: "\u6587\u4EF6\u5DF2\u4E0D\u5728\uFF0C\u65E0\u6CD5\u6062\u590D"
164
170
  };
165
171
  var en = {
166
172
  badge: "Archive",
@@ -174,11 +180,11 @@ window.__ModuleLoader__.load({
174
180
  selected: "{n} selected",
175
181
  restore: "Restore",
176
182
  restoreDone: "Restored {n} archived sessions",
177
- restoreFailed: "Restore failed",
183
+ restoreFailed: "Restore failed: {n}",
178
184
  delete: "Delete",
179
185
  deleteConfirm: "Click again to confirm delete",
180
186
  deleteDone: "Deleted {n} archived sessions",
181
- deleteFailed: "Some deletions failed: {n}",
187
+ deleteFailed: "Deletion failed: {n}",
182
188
  confirmAll: "Delete all {n}?",
183
189
  noSelection: "Select sessions first",
184
190
  view: "View",
@@ -194,7 +200,13 @@ window.__ModuleLoader__.load({
194
200
  sizeBytes: "{n} B",
195
201
  sizeKB: "{n} KB",
196
202
  sizeMB: "{n} MB",
197
- runningHint: "Running sessions cannot be deleted; stop them first"
203
+ runningHint: "Session still writing; retry shortly",
204
+ batchError: "Batch operation failed ({n})",
205
+ reasonUnenumerable: "session log not enumerable",
206
+ reasonUnlocatable: "session file cannot be located",
207
+ reasonReappeared: "recreated after delete",
208
+ reasonNotArchived: "not an archived session",
209
+ reasonNotRestorable: "file no longer present"
198
210
  };
199
211
  function formatBytes(bytes, t) {
200
212
  if (bytes === void 0 || bytes === null || Number(bytes) === 0) return "\u2014";
@@ -444,13 +456,27 @@ window.__ModuleLoader__.load({
444
456
  const result = await call(action, ids);
445
457
  const doneIds = result.deleted || result.restored || [];
446
458
  const n = doneIds.length;
447
- if (result.failed && result.failed.length > 0) {
448
- const reasonText = (reason) => reason === "live" ? t("live") : reason === "busy" ? t("runningHint") : String(reason ?? "error");
459
+ const doneText = t(doneKey).replace("{n}", String(n));
460
+ if (Array.isArray(result.failed) && result.failed.length > 0) {
461
+ const reasonText = (reason) => {
462
+ const map = {
463
+ live: t("live"),
464
+ busy: t("runningHint"),
465
+ unenumerable: t("reasonUnenumerable"),
466
+ unlocatable: t("reasonUnlocatable"),
467
+ reappeared: t("reasonReappeared"),
468
+ "not-archived": t("reasonNotArchived"),
469
+ "not-restorable": t("reasonNotRestorable")
470
+ };
471
+ return map[String(reason)] ?? String(reason ?? "error");
472
+ };
449
473
  const detail = result.failed.slice(0, 3).map((item) => shortId(item.sessionId) + ": " + reasonText(item.reason)).join("; ");
450
474
  const more = result.failed.length > 3 ? " (+" + (result.failed.length - 3) + ")" : "";
451
- setNotice({ kind: "error", text: t(failKey).replace("{n}", String(result.failed.length)) + " \u2014 " + detail + more });
475
+ const failText = t(failKey).replace("{n}", String(result.failed.length)) + " \u2014 " + detail + more;
476
+ if (n > 0) setNotice({ kind: "warn", text: doneText + "\uFF1B" + failText });
477
+ else setNotice({ kind: "error", text: failText });
452
478
  } else {
453
- setNotice({ kind: "ok", text: t(doneKey).replace("{n}", String(n)) });
479
+ setNotice({ kind: "ok", text: doneText });
454
480
  }
455
481
  if (doneIds.length > 0) {
456
482
  const done = new Set(doneIds);
@@ -466,7 +492,7 @@ window.__ModuleLoader__.load({
466
492
  setConfirmingDelete(false);
467
493
  await load();
468
494
  } catch (actionError) {
469
- setNotice({ kind: "error", text: t(failKey).replace("{n}", String(ids.length)) + ": " + (actionError && actionError.message || actionError) });
495
+ setNotice({ kind: "error", text: t("batchError").replace("{n}", String(ids.length)) + ": " + (actionError && actionError.message || actionError) });
470
496
  } finally {
471
497
  setBusy(false);
472
498
  }
package/client/index.tsx CHANGED
@@ -103,11 +103,11 @@ const zh = {
103
103
  selected: "已选 {n} 项",
104
104
  restore: "恢复所选",
105
105
  restoreDone: "已恢复 {n} 个归档会话",
106
- restoreFailed: "恢复失败",
106
+ restoreFailed: "恢复失败:{n} 个",
107
107
  delete: "删除所选",
108
108
  deleteConfirm: "再次点击确认删除",
109
109
  deleteDone: "已删除 {n} 个归档会话",
110
- deleteFailed: "部分删除失败:{n} 个",
110
+ deleteFailed: "删除失败:{n} 个",
111
111
  confirmAll: "确认删除全部 {n} 个?",
112
112
  noSelection: "请先勾选会话",
113
113
  view: "查看",
@@ -123,7 +123,13 @@ const zh = {
123
123
  sizeBytes: "{n} B",
124
124
  sizeKB: "{n} KB",
125
125
  sizeMB: "{n} MB",
126
- runningHint: "运行中的会话不能删除,请先停止"
126
+ runningHint: "该会话仍在生成落盘,请稍后重试",
127
+ batchError: "批量操作失败({n} 项)",
128
+ reasonUnenumerable: "会话文件枚举不到",
129
+ reasonUnlocatable: "无法定位会话文件",
130
+ reasonReappeared: "删除后被重建",
131
+ reasonNotArchived: "不是归档会话",
132
+ reasonNotRestorable: "文件已不在,无法恢复"
127
133
  };
128
134
  const en = {
129
135
  badge: "Archive",
@@ -137,11 +143,11 @@ const en = {
137
143
  selected: "{n} selected",
138
144
  restore: "Restore",
139
145
  restoreDone: "Restored {n} archived sessions",
140
- restoreFailed: "Restore failed",
146
+ restoreFailed: "Restore failed: {n}",
141
147
  delete: "Delete",
142
148
  deleteConfirm: "Click again to confirm delete",
143
149
  deleteDone: "Deleted {n} archived sessions",
144
- deleteFailed: "Some deletions failed: {n}",
150
+ deleteFailed: "Deletion failed: {n}",
145
151
  confirmAll: "Delete all {n}?",
146
152
  noSelection: "Select sessions first",
147
153
  view: "View",
@@ -157,7 +163,13 @@ const en = {
157
163
  sizeBytes: "{n} B",
158
164
  sizeKB: "{n} KB",
159
165
  sizeMB: "{n} MB",
160
- runningHint: "Running sessions cannot be deleted; stop them first"
166
+ runningHint: "Session still writing; retry shortly",
167
+ batchError: "Batch operation failed ({n})",
168
+ reasonUnenumerable: "session log not enumerable",
169
+ reasonUnlocatable: "session file cannot be located",
170
+ reasonReappeared: "recreated after delete",
171
+ reasonNotArchived: "not an archived session",
172
+ reasonNotRestorable: "file no longer present"
161
173
  };
162
174
 
163
175
  // ── 工具函数 ─────────────────────────────────────────────────────────
@@ -432,18 +444,34 @@ function ArchivePanel(props: any) {
432
444
  const result = await call(action, ids);
433
445
  const doneIds = result.deleted || result.restored || [];
434
446
  const n = doneIds.length;
435
- if (result.failed && result.failed.length > 0) {
436
- // host 对每个失败项都给了 reason(live/busy/not-archived/具体错误),
437
- // 只报数量会让用户不知道为什么失败、该等多久重试。
438
- const reasonText = (reason: any) =>
439
- reason === "live" ? t("live") : reason === "busy" ? t("runningHint") : String(reason ?? "error");
447
+ const doneText = t(doneKey).replace("{n}", String(n));
448
+ if (Array.isArray(result.failed) && result.failed.length > 0) {
449
+ // host 对每个失败项都给了 reason( live/busy/unenumerable/not-archived
450
+ // /not-restorable/具体错误),只报数量会让用户不知道为什么失败、该等
451
+ // 多久重试。全部本地化,未知 reason 原样透出兜底。
452
+ const reasonText = (reason: any) => {
453
+ const map: Record<string, any> = {
454
+ live: t("live"),
455
+ busy: t("runningHint"),
456
+ unenumerable: t("reasonUnenumerable"),
457
+ unlocatable: t("reasonUnlocatable"),
458
+ reappeared: t("reasonReappeared"),
459
+ "not-archived": t("reasonNotArchived"),
460
+ "not-restorable": t("reasonNotRestorable"),
461
+ };
462
+ return map[String(reason)] ?? String(reason ?? "error");
463
+ };
440
464
  const detail = result.failed.slice(0, 3)
441
465
  .map((item: any) => shortId(item.sessionId) + ": " + reasonText(item.reason))
442
466
  .join("; ");
443
467
  const more = result.failed.length > 3 ? " (+" + (result.failed.length - 3) + ")" : "";
444
- setNotice({ kind: "error", text: t(failKey).replace("{n}", String(result.failed.length)) + " — " + detail + more });
468
+ const failText = t(failKey).replace("{n}", String(result.failed.length)) + " — " + detail + more;
469
+ // 全失败才用 error 样式;部分成功是 warn,成功计数也要如实带上,
470
+ // 不能只报失败让用户以为一个都没成。
471
+ if (n > 0) setNotice({ kind: "warn", text: doneText + ";" + failText });
472
+ else setNotice({ kind: "error", text: failText });
445
473
  } else {
446
- setNotice({ kind: "ok", text: t(doneKey).replace("{n}", String(n)) });
474
+ setNotice({ kind: "ok", text: doneText });
447
475
  }
448
476
  if (doneIds.length > 0) {
449
477
  const done = new Set(doneIds);
@@ -461,8 +489,8 @@ function ArchivePanel(props: any) {
461
489
  setConfirmingDelete(false);
462
490
  await load();
463
491
  } catch (actionError: any) {
464
- // 异常分支同样带数量:用请求发出时的 ids.length,不用无意义的 "?"。
465
- setNotice({ kind: "error", text: t(failKey).replace("{n}", String(ids.length)) + ": " + (actionError && actionError.message || actionError) });
492
+ // 异常分支(整单失败,不是部分失败):带请求发出时的数量,与部分失败分支措辞区分。
493
+ setNotice({ kind: "error", text: t("batchError").replace("{n}", String(ids.length)) + ": " + (actionError && actionError.message || actionError) });
466
494
  } finally {
467
495
  setBusy(false);
468
496
  }
package/lib/index.d.ts CHANGED
@@ -49,10 +49,11 @@ export interface LocatableSessionPersistence {
49
49
  * host 端全部逻辑基于官方 service 契约类型(@deepseek-ai/dsh-workspace /
50
50
  * dsh-session / dsh-session-persistence / dsh-session-title 的官方 d.ts),
51
51
  * 面向 DSH 0.1.5-alpha 宿主线,不保留旧宿主版本兼容:
52
- * 1. list() — archivedSessionIds ∩ sessionPersistence.list(),
53
- * 每条附带标题(官方 foldSessionTitle 折叠)、目录、
54
- * 创建时间、最后修改时间(文件 mtime)、体积与
55
- * live 状态(会话仍在内存中运行时禁止删除)。
52
+ * 1. list() — archivedSessionIds ∩ 逐 id persistence.stat(),
53
+ * 每条附带标题(官方 foldSessionTitle 折叠,事件流
54
+ * 分块读取)、目录、创建时间、最后修改时间(文件
55
+ * mtime)、体积与 live 状态(会话仍在内存中运行时
56
+ * 禁止删除)。
56
57
  * 2. detail(id) — open(id,'read') 句柄只读会话事件流(标题 + 文本
57
58
  * 消息 user/assistant),供面板"查看"展开。
58
59
  * 3. delete(ids) — 批量彻底删除:live 会话拒绝;逐个删除持久化文件
@@ -98,8 +99,7 @@ export declare const config: {
98
99
  */
99
100
  export declare function createArchiveHost(ctx: Context, cfg: Record<string, any>): {
100
101
  /** 归档会话计数(存在性过滤后的真实数量)。侧边栏徽标的关闭态轮询
101
- * 只调这里:persistence.list() 只读每个文件的首行头,比 list() 的
102
- * 全事件流解析便宜一个数量级以上。 */
102
+ * 只调这里:逐 id stat 只读元数据头,不枚举全部历史会话。 */
103
103
  count(): Promise<{
104
104
  count: number;
105
105
  }>;
@@ -122,9 +122,9 @@ export declare function createArchiveHost(ctx: Context, cfg: Record<string, any>
122
122
  totalMessageCount: number;
123
123
  truncated: boolean;
124
124
  messages: {
125
- role: string;
125
+ role: 'user' | 'assistant';
126
126
  text: string;
127
- time: number;
127
+ time: unknown;
128
128
  }[];
129
129
  live: boolean;
130
130
  }>;
@@ -154,9 +154,19 @@ export declare function createArchiveHost(ctx: Context, cfg: Record<string, any>
154
154
  * 批量恢复归档会话(仅从归档集合移除,会话数据不动)。只恢复仍存在
155
155
  * 持久化文件的会话:文件已删的 ghost id(已彻底删除的会话)拒绝恢复,
156
156
  * 避免删除后的会话再次出现在侧边栏对话列表。
157
+ *
158
+ * 与 delete 对称的失败语义(failed[].reason):'not-archived' 非归档
159
+ * 成员;'unenumerable' 持久化枚举不到(文件已删/首行损坏);其余为
160
+ * confirm 复核淘汰('not-restorable')或底层错误消息。restored 之外的
161
+ * 每个请求 id 都必须在 failed 里有下落——客户端据此把「已恢复 0 个」
162
+ * 渲染为失败而非成功。
157
163
  */
158
164
  unarchive(sessionIds: string[]): Promise<{
159
165
  restored: string[];
166
+ failed: {
167
+ sessionId: string;
168
+ reason: string;
169
+ }[];
160
170
  removedFromArchive: number;
161
171
  }>;
162
172
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAGV,SAAS,EACV,MAAM,0BAA0B,CAAC;AAgBlC,eAAO,MAAM,IAAI,oBAAoB,CAAC;AAEtC,oDAAoD;AACpD,eAAO,MAAM,MAAM,UAA0D,CAAC;AA4D9E,eAAO,MAAM,MAAM;IARjB,iCAAiC;;IAEjC,8BAA8B;;IAE9B,4BAA4B;;CAIa,CAAC;AAyE5C;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IA+LpE;;0BAEsB;IAChB,KAAK;;;IAUX,sCAAsC;IAChC,IAAI;;;IAeV;+CAC2C;IACrC,MAAM,YAAY,MAAM;;;YAkCxB,GAAG;YACH,SAAS;YACT,aAAa;YACb,WAAW;;;;;;;;;;;;;IAWjB;;;;;;;;;;;;;OAaG;IACG,cAAc,aAAa,MAAM,EAAE;;;;;;;;IA+FzC;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAGV,SAAS,EACV,MAAM,0BAA0B,CAAC;AAgBlC,eAAO,MAAM,IAAI,oBAAoB,CAAC;AAEtC,oDAAoD;AACpD,eAAO,MAAM,MAAM,UAA0D,CAAC;AA4D9E,eAAO,MAAM,MAAM;IARjB,iCAAiC;;IAEjC,8BAA8B;;IAE9B,4BAA4B;;CAIa,CAAC;AAsG5C;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAuQpE;0CACsC;IAChC,KAAK;;;IAOX,sCAAsC;IAChC,IAAI;;;IAcV;+CAC2C;IACrC,MAAM,YAAY,MAAM;;;YA8CxB,GAAG;YACH,SAAS;YACT,aAAa;YACb,WAAW;;;;;;;kBAxCe,MAAM,GAAG,WAAW;kBAAQ,MAAM;kBAAQ,OAAO;;;;IAmDjF;;;;;;;;;;;;;OAaG;IACG,cAAc,aAAa,MAAM,EAAE;;;uBAGN,MAAM;oBAAU,MAAM;;;;IA4IzD;;;;;;;;;;OAUG;IACG,SAAS,aAAa,MAAM,EAAE;;;uBAID,MAAM;oBAAU,MAAM;;;;EA8B5D;AAED,iCAAiC;AACjC,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,GAAG,CAmBrD"}
package/lib/index.js CHANGED
@@ -8,10 +8,11 @@
8
8
  * host 端全部逻辑基于官方 service 契约类型(@deepseek-ai/dsh-workspace /
9
9
  * dsh-session / dsh-session-persistence / dsh-session-title 的官方 d.ts),
10
10
  * 面向 DSH 0.1.5-alpha 宿主线,不保留旧宿主版本兼容:
11
- * 1. list() — archivedSessionIds ∩ sessionPersistence.list(),
12
- * 每条附带标题(官方 foldSessionTitle 折叠)、目录、
13
- * 创建时间、最后修改时间(文件 mtime)、体积与
14
- * live 状态(会话仍在内存中运行时禁止删除)。
11
+ * 1. list() — archivedSessionIds ∩ 逐 id persistence.stat(),
12
+ * 每条附带标题(官方 foldSessionTitle 折叠,事件流
13
+ * 分块读取)、目录、创建时间、最后修改时间(文件
14
+ * mtime)、体积与 live 状态(会话仍在内存中运行时
15
+ * 禁止删除)。
15
16
  * 2. detail(id) — open(id,'read') 句柄只读会话事件流(标题 + 文本
16
17
  * 消息 user/assistant),供面板"查看"展开。
17
18
  * 3. delete(ids) — 批量彻底删除:live 会话拒绝;逐个删除持久化文件
@@ -136,29 +137,59 @@ function normalizeConfig(source, defaults = DEFAULT_CONFIG) {
136
137
  titleReadConcurrency: positiveInt(merged.titleReadConcurrency, defaults.titleReadConcurrency),
137
138
  };
138
139
  }
140
+ /** 标题/详情分块读取的块长(事件数,官方契约 read(offset,length) 的上界,
141
+ * 超界返回空数组)。此前 read(0) 一次性物化全部事件:大日志下峰值内存
142
+ * O(整条日志)、同步 JSON.parse 集中在宿主事件循环上,面板打开(并发 4 路
143
+ * 标题读)拖慢的是整个宿主而不只是面板;分块后峰值 O(块)。 */
144
+ const READ_CHUNK_EVENTS = 200;
139
145
  /**
140
- * 读取一个会话的完整事件流与头(官方契约路径:open 一个 read 句柄再
141
- * read(0),用完 close——不 close 会漏句柄;头从句柄上取)。
146
+ * 分块遍历一条会话的事件流(升序、全量),每块交给 onChunk 消费后即可弃,
147
+ * 返回句柄上的会话头。用完 close——不 close 会漏句柄。
142
148
  */
143
- async function readSession(persistence, sessionId) {
149
+ async function scanSession(persistence, sessionId, onChunk) {
144
150
  const handle = await persistence.open(sessionId, 'read');
145
151
  try {
146
- const { events } = await handle.read(0);
147
- return { header: handle.header, events: [...events] };
152
+ for (let offset = 0;; offset += READ_CHUNK_EVENTS) {
153
+ const { events } = await handle.read(offset, READ_CHUNK_EVENTS);
154
+ if (events.length === 0)
155
+ break;
156
+ onChunk(events);
157
+ if (events.length < READ_CHUNK_EVENTS)
158
+ break;
159
+ }
160
+ return handle.header;
148
161
  }
149
162
  finally {
150
163
  await handle.close();
151
164
  }
152
165
  }
166
+ /**
167
+ * 读取会话标题(官方 foldSessionTitle 折叠)。fold 只消费最后一个
168
+ * session/title 事件——只收集 title 事件再折叠,与全量折叠语义一致
169
+ * (latest-wins),内存 O(title 事件数)(正常日志恒为 1)。
170
+ */
171
+ async function readTitle(persistence, sessionId) {
172
+ const titleEvents = [];
173
+ await scanSession(persistence, sessionId, (events) => {
174
+ for (const event of events) {
175
+ if (event.type === 'session/title')
176
+ titleEvents.push(event);
177
+ }
178
+ });
179
+ return foldSessionTitle(titleEvents)?.title ?? null;
180
+ }
153
181
  /** 等待 ms 毫秒(沉降观察、删除窗口用)。 */
154
182
  function delay(ms) {
155
183
  return new Promise((resolve) => setTimeout(resolve, ms));
156
184
  }
157
- /** 并发限制器:最多 N 个任务并行,其余排队。 */
185
+ /** 并发限制器:最多 N 个任务并行,其余排队。宽度下限 1——直调
186
+ * createArchiveHost 传 0/负数时若产出 0 个 worker,会静默返回全 undefined
187
+ * 的数组而非报错。 */
158
188
  function limitedConcurrency(limit, tasks) {
159
189
  const results = new Array(tasks.length);
160
190
  let cursor = 0;
161
- const workers = Array.from({ length: Math.min(limit, tasks.length) }, async () => {
191
+ const width = Math.max(1, Math.min(limit, tasks.length));
192
+ const workers = Array.from({ length: width }, async () => {
162
193
  while (cursor < tasks.length) {
163
194
  const at = cursor++;
164
195
  const task = tasks[at];
@@ -199,6 +230,41 @@ export function createArchiveHost(ctx, cfg) {
199
230
  * 因此 live 仅对"内存存在且**未归档**"的会话为真(防将来误用),
200
231
  * 归档面板中恒为 false。 */
201
232
  const isLive = (sessionId) => ctx.sessions.get(sessionId) !== undefined && !archivedSet().has(sessionId);
233
+ /**
234
+ * 批量查一组 id 的持久化快照,返回 Map(只含枚举得到的 id)。
235
+ *
236
+ * 优先逐 id 走官方契约 stat(id)——只读该会话的元数据头,成本 O(项目目录数)/id;
237
+ * 此前四个端点(count/list/delete/unarchive)都用全量 persistence.list():
238
+ * 枚举实例上**所有**会话(每文件读头)只为挑出几个归档 id,而 count 是
239
+ * 每 5 秒每标签页的徽标轮询端点,实例积累数千历史会话后是持续的全树扫。
240
+ * 枚举不到(stat 返回 undefined 或抛错——jsonl 后端对重复 id 会抛异常)
241
+ * 的 id 不出现在 Map 里,与 list() 时代「不在快照表里」的幽灵语义对齐:
242
+ * list() 同样静默跳过首行损坏的日志;stat 抛错按枚举不到处理方向更保守
243
+ * (删除/恢复一律拒绝)。stat 不在契约上的宿主回退一次全量 list()。
244
+ */
245
+ async function snapshotsByIds(ids) {
246
+ const result = new Map();
247
+ if (ids.length === 0)
248
+ return result;
249
+ if (typeof persistence.stat !== 'function') {
250
+ const wanted = new Set(ids);
251
+ for (const snapshot of await persistence.list()) {
252
+ if (wanted.has(snapshot.header.id) && !result.has(snapshot.header.id)) {
253
+ result.set(snapshot.header.id, snapshot);
254
+ }
255
+ }
256
+ return result;
257
+ }
258
+ await limitedConcurrency(8, ids.map((id) => async () => {
259
+ try {
260
+ const snapshot = await persistence.stat(id);
261
+ if (snapshot !== undefined)
262
+ result.set(id, snapshot);
263
+ }
264
+ catch { }
265
+ }));
266
+ return result;
267
+ }
202
268
  /**
203
269
  * 沉降观察:等一个写入沉降窗口后重取文件 stat(null = 文件已消失)。
204
270
  * 归档瞬间的生成流兜底用:归档会话会因 web 客户端重连恢复 tab 而长期
@@ -209,7 +275,28 @@ export function createArchiveHost(ctx, cfg) {
209
275
  * 沉降窗口内体积必然增长;一次性落盘不会。增长与否由调用点对比前后
210
276
  * 两次 stat 的 size 判定。
211
277
  */
212
- const settleStat = (path) => delay(REAPPEAR_SETTLE_MS).then(() => stat(path).catch(() => null));
278
+ const settleStat = (path) => delay(REAPPEAR_SETTLE_MS).then(() => stat(path).then((info) => ({ size: info.size, mtimeMs: info.mtimeMs }),
279
+ // 只有 ENOENT 才是「文件已消失」:EACCES 等错误下把 null 当已消失会
280
+ // 谎报 deleted;上抛交给删除临界区的 catch 以真实原因计入 failed。
281
+ (error) => { if (error?.code === 'ENOENT')
282
+ return null; throw error; }));
283
+ /**
284
+ * delete ↔ unarchive 临界区的互斥串行化(插件闭包内的 promise 链)。
285
+ * 两者的「检查 → 生效」窗口必须互斥,否则并发时会出现两种错位:
286
+ * - unarchive 的 confirm 看到 located → deleteArchived 随后 rm →
287
+ * setState 仍把 id 移出归档集合:文件没了、归档标记也没了,内存
288
+ * 会话重回侧边栏(等同误恢复);
289
+ * - 反向:恢复刚落地,先行发起的删除把新恢复会话的文件清掉。
290
+ * registry 的 enqueueOperation 只串行化归档集合写入,deleteArchived
291
+ * 不经过它,因此这里自行串行化。delete 的临界区不获取 registry 锁、
292
+ * 本临界区只在已持有 registry 写锁时进入,无循环等待。
293
+ */
294
+ let exclusiveTail = Promise.resolve();
295
+ function exclusive(section) {
296
+ const run = exclusiveTail.then(section, section);
297
+ exclusiveTail = run.then(() => { }, () => { });
298
+ return run;
299
+ }
213
300
  /**
214
301
  * 从归档集合移除若干 id(恢复用;删除不调用——见 deleteArchived),返回实际移除的 id。
215
302
  *
@@ -219,9 +306,9 @@ export function createArchiveHost(ctx, cfg) {
219
306
  * ——宿主内部形状,这里以显式断言收窄并在运行时探测可用性:形状一旦
220
307
  * 变化自动降级为"仅删文件",归档列表按存在性过滤幽灵 id,功能仍正确。
221
308
  *
222
- * confirm 在 registry 写锁临界区内逐个复核 id 是否仍可恢复(文件仍存在):
223
- * 存在性检查放在锁外的话,并发 deleteArchived 可在检查与移除之间删掉文件,
224
- * 结果"文件没了、归档标记也没了",内存中的会话立刻重回侧边栏。
309
+ * confirm 在 registry 写锁临界区内逐个复核 id 是否仍可恢复(文件仍存在);
310
+ * confirm → setState 段再与 deleteArchived 的删除临界区经 exclusive 互斥
311
+ * ——registry 写锁只挡住其他归档集合写入者,挡不住不经过它的删除。
225
312
  */
226
313
  async function removeFromArchiveSet(ids, confirm) {
227
314
  const set = new Set(ids);
@@ -238,24 +325,27 @@ export function createArchiveHost(ctx, cfg) {
238
325
  const state = writable.requireState();
239
326
  const current = [...state.archivedSessionIds];
240
327
  let eligible = current.filter((id) => set.has(id));
241
- if (confirm !== undefined) {
242
- const confirmed = [];
243
- for (const id of eligible) {
244
- try {
245
- if (await confirm(id))
246
- confirmed.push(id);
328
+ // confirm → setState 与 deleteArchived 的删除临界区互斥(见 exclusive)。
329
+ await exclusive(async () => {
330
+ if (confirm !== undefined) {
331
+ const confirmed = [];
332
+ for (const id of eligible) {
333
+ try {
334
+ if (await confirm(id))
335
+ confirmed.push(id);
336
+ }
337
+ catch { }
247
338
  }
248
- catch { }
339
+ eligible = confirmed;
249
340
  }
250
- eligible = confirmed;
251
- }
252
- removedIds = eligible;
253
- // 只有真正移除的 id 才离开归档集合;未通过复核的保持原状(仍是 ghost
254
- // 或正常归档),不能因为请求过就一并抹掉。
255
- const removedSet = new Set(removedIds);
256
- const remaining = current.filter((id) => !removedSet.has(id));
257
- if (removedIds.length > 0)
258
- await writable.setState({ ...state, archivedSessionIds: remaining });
341
+ removedIds = eligible;
342
+ // 只有真正移除的 id 才离开归档集合;未通过复核的保持原状(仍是 ghost
343
+ // 或正常归档),不能因为请求过就一并抹掉。
344
+ const removedSet = new Set(removedIds);
345
+ const remaining = current.filter((id) => !removedSet.has(id));
346
+ if (removedIds.length > 0)
347
+ await writable.setState({ ...state, archivedSessionIds: remaining });
348
+ });
259
349
  });
260
350
  return removedIds;
261
351
  }
@@ -313,12 +403,17 @@ export function createArchiveHost(ctx, cfg) {
313
403
  return { state: 'absent' };
314
404
  }
315
405
  catch {
316
- return { state: 'absent' };
406
+ // 内层每个 stat 都各自兜底,这里只会接到 locate 抛错(后端异常/契约
407
+ // 漂移)——既不能确认存在也不能确认缺失,必须按 unknown 处理。返回
408
+ // absent 会让 deleteArchived 把它记成"幂等删除成功"(0.3.9 谎报成功
409
+ // 的同源变体);unknown 对应删除路径的 unlocatable 拒绝。
410
+ return { state: 'unknown' };
317
411
  }
318
412
  }
319
413
  /** 删除后的复验:先等 settleMs 给进行中的写入留出落盘时间,再确认文件没有
320
- * 被宿主 materialize 的 mkdir -p 整体重建(stat 任意失败——含 ENOENT——都
321
- * 视为已消失)。返回 true 表示文件仍在(重现)。 */
414
+ * 被宿主 materialize 的 mkdir -p 整体重建。返回 true 表示文件仍在(重现)。
415
+ * 只有 ENOENT 视为已消失;EACCES 等 stat 错误按「仍在」处理,让上层走
416
+ * 二次删除并以真实错误上报,不谎报 deleted。 */
322
417
  async function filePresentAfterSettle(path, settleMs) {
323
418
  if (settleMs > 0)
324
419
  await delay(settleMs);
@@ -326,15 +421,20 @@ export function createArchiveHost(ctx, cfg) {
326
421
  await stat(path);
327
422
  return true;
328
423
  }
329
- catch {
330
- return false;
424
+ catch (error) {
425
+ if (error?.code === 'ENOENT')
426
+ return false;
427
+ return true;
331
428
  }
332
429
  }
333
430
  /** 单个归档会话的展示行。标题读取失败回退 null(面板显示目录名)。
334
431
  * 标题按 mtime 缓存:readSession 会解析整条事件流,而面板关闭态的徽标
335
432
  * 轮询每 5 秒打一次 list——不缓存的话就是"读整本会话只为取一行标题"的
336
433
  * 持续开销。mtime 不变即命中缓存;文件不可定位(无 locate 的宿主后端)
337
- * 时跳过缓存直接读,标题仍然可得。折叠用官方 foldSessionTitle。 */
434
+ * 时跳过缓存直接读,标题仍然可得。折叠用官方 foldSessionTitle。
435
+ * 缓存有上限(FIFO 淘汰最旧条目):已删除会话的条目不再被 mtime 命中
436
+ * 更新,长驻 host 进程下无界累积。 */
437
+ const TITLE_CACHE_LIMIT = 500;
338
438
  const titleCache = new Map();
339
439
  async function rowFor(sessionId, header) {
340
440
  const file = await fileInfo(header);
@@ -347,15 +447,20 @@ export function createArchiveHost(ctx, cfg) {
347
447
  }
348
448
  else {
349
449
  try {
350
- title = foldSessionTitle((await readSession(persistence, sessionId)).events)?.title ?? null;
450
+ title = await readTitle(persistence, sessionId);
351
451
  }
352
452
  catch { }
453
+ if (titleCache.size >= TITLE_CACHE_LIMIT) {
454
+ const oldest = titleCache.keys().next().value;
455
+ if (oldest !== undefined)
456
+ titleCache.delete(oldest);
457
+ }
353
458
  titleCache.set(sessionId, { mtimeMs: located.mtimeMs, title });
354
459
  }
355
460
  }
356
461
  else {
357
462
  try {
358
- title = foldSessionTitle((await readSession(persistence, sessionId)).events)?.title ?? null;
463
+ title = await readTitle(persistence, sessionId);
359
464
  }
360
465
  catch { }
361
466
  }
@@ -371,33 +476,26 @@ export function createArchiveHost(ctx, cfg) {
371
476
  }
372
477
  return {
373
478
  /** 归档会话计数(存在性过滤后的真实数量)。侧边栏徽标的关闭态轮询
374
- * 只调这里:persistence.list() 只读每个文件的首行头,比 list() 的
375
- * 全事件流解析便宜一个数量级以上。 */
479
+ * 只调这里:逐 id stat 只读元数据头,不枚举全部历史会话。 */
376
480
  async count() {
377
481
  const archived = [...archivedSet()];
378
482
  if (archived.length === 0)
379
483
  return { count: 0 };
380
- const snapshots = await persistence.list();
381
- const persisted = new Set(snapshots.map((snapshot) => snapshot.header.id));
382
- let count = 0;
383
- for (const sessionId of archived)
384
- if (persisted.has(sessionId))
385
- count++;
386
- return { count };
484
+ const snapshots = await snapshotsByIds(archived);
485
+ return { count: snapshots.size };
387
486
  },
388
487
  /** 列出全部归档会话(存在性过滤:文件已删的幽灵归档记录不显示)。 */
389
488
  async list() {
390
489
  const archived = [...archivedSet()];
391
490
  if (archived.length === 0)
392
491
  return { items: [] };
393
- const snapshots = await persistence.list();
394
- const byId = new Map(snapshots.map((snapshot) => [snapshot.header.id, snapshot.header]));
492
+ const snapshots = await snapshotsByIds(archived);
395
493
  const rows = [];
396
494
  for (const sessionId of archived) {
397
- const header = byId.get(sessionId);
398
- if (header === undefined)
495
+ const snapshot = snapshots.get(sessionId);
496
+ if (snapshot === undefined)
399
497
  continue; // 幽灵 id:会话文件已不存在
400
- rows.push({ sessionId, header });
498
+ rows.push({ sessionId, header: snapshot.header });
401
499
  }
402
500
  const items = await limitedConcurrency(cfg.titleReadConcurrency, rows.map(({ sessionId, header }) => () => rowFor(sessionId, header)));
403
501
  return { items };
@@ -409,31 +507,43 @@ export function createArchiveHost(ctx, cfg) {
409
507
  throw Object.assign(new Error('session not archived: ' + sessionId), { code: 'NOT_ARCHIVED' });
410
508
  }
411
509
  const id = sessionId;
412
- const { header: meta, events } = await readSession(persistence, id);
413
- const title = foldSessionTitle(events)?.title ?? null;
510
+ // 事件流分块消费(readSession 时代 read(0) 一次性物化全部事件):
511
+ // 头从句柄上取,消息逐块提取,达到上限后只计数不再拼接文本;
512
+ // title 事件同趟收集(fold 只消费最后一个,全量物化没有必要)。
513
+ const titleEvents = [];
414
514
  const messages = [];
415
515
  let totalMessageCount = 0;
416
- for (const event of events) {
417
- if (event.type !== 'user/message' && event.type !== 'assistant/message')
418
- continue;
419
- // 达到上限后只计数、不再提取文本:截断语义要如实上报,尾部消息也不必
420
- // 做字符串拼接(大日志下这部分是纯浪费)。
421
- if (messages.length >= cfg.detailMaxMessages) {
516
+ const meta = await scanSession(persistence, id, (events) => {
517
+ for (const event of events) {
518
+ if (event.type === 'session/title') {
519
+ titleEvents.push(event);
520
+ continue;
521
+ }
522
+ if (event.type !== 'user/message' && event.type !== 'assistant/message')
523
+ continue;
524
+ // 官方事件 data:user/message 是 UserMessage 本体(content 在自身),
525
+ // assistant/message 是包装对象(content 在 .message.content)。
526
+ // message 可缺(损坏/异构日志)——detail 是整会话只读端点,一条
527
+ // 畸形事件不应让整个请求 TypeError。
528
+ const text = messageText(event.type === 'user/message' ? event.data.content : event.data.message?.content, cfg.messagePreviewChars);
529
+ // 空文本消息(纯工具调用等)在任何位置都不计入总数——截断线两侧
530
+ // 口径一致。放在上限判定之前:不提取文本就无法区分空与非空,
531
+ // 提取成本受 messagePreviewChars 上界约束。
532
+ if (text.length === 0)
533
+ continue;
534
+ if (messages.length >= cfg.detailMaxMessages) {
535
+ totalMessageCount++;
536
+ continue;
537
+ }
538
+ messages.push({
539
+ role: event.type === 'user/message' ? 'user' : 'assistant',
540
+ text,
541
+ time: event.time,
542
+ });
422
543
  totalMessageCount++;
423
- continue;
424
544
  }
425
- // 官方事件 data:user/message 是 UserMessage 本体(content 在自身),
426
- // assistant/message 是包装对象(content 在 .message.content)。
427
- const text = messageText(event.type === 'user/message' ? event.data.content : event.data.message.content, cfg.messagePreviewChars);
428
- if (text.length === 0)
429
- continue;
430
- messages.push({
431
- role: event.type === 'user/message' ? 'user' : 'assistant',
432
- text,
433
- time: event.time,
434
- });
435
- totalMessageCount++;
436
- }
545
+ });
546
+ const title = foldSessionTitle(titleEvents)?.title ?? null;
437
547
  return {
438
548
  sessionId,
439
549
  header: {
@@ -468,69 +578,43 @@ export function createArchiveHost(ctx, cfg) {
468
578
  const unique = [...new Set(sessionIds)];
469
579
  const deleted = [];
470
580
  const failed = [];
471
- // 归档成员前置校验:persistence.list() 含所有持久化会话而非仅归档
472
- // 会话,不校验的话任何"未归档、不在内存"的会话 id 都会绕过 live/busy
473
- // 两道保护被不可逆物理删除。
581
+ // 归档成员前置校验:persistence 覆盖所有持久化会话而非仅归档会话,
582
+ // 不校验的话任何"未归档、不在内存"的会话 id 都会绕过 live/busy
583
+ // 两道保护被不可逆物理删除。快照只 stat 归档成员:非成员在循环里
584
+ // 前置拒绝,不必查持久层。
474
585
  const archived = archivedSet();
475
- const snapshots = await persistence.list();
476
- const headersById = new Map(snapshots.map((snapshot) => [snapshot.header.id, snapshot.header]));
477
- for (const sessionId of unique) {
478
- const id = sessionId;
479
- if (!archived.has(sessionId)) {
480
- failed.push({ sessionId, reason: 'not-archived' });
481
- continue;
482
- }
483
- if (isLive(id)) {
484
- failed.push({ sessionId, reason: 'live' });
485
- continue;
486
- }
487
- if (headersById.get(sessionId) === undefined) {
488
- // ghost id(枚举不到)。"枚举不到 ≠ 文件不存在":首行损坏的日志会被
489
- // persistence.list() 静默跳过;而 jsonl 后端按 cwd 分目录,ghost
490
- // 探测没有 header、拿不到 cwd,locate 只能探缺省目录(_no-cwd 一类)
491
- // ——既探不到真实文件,也确认不了缺失。因此 ghost 一律不能当
492
- // "已删"报成功(0.3.9 谎报成功的同源变体),计入 failed;ghost id
493
- // 留在归档集合,由 list() 的存在性过滤隐藏,面板与侧边栏均不可见。
494
- failed.push({ sessionId, reason: 'unenumerable' });
495
- continue;
496
- }
497
- const header = headersById.get(sessionId);
498
- const file = await fileInfo(header);
499
- if (file.state === 'unknown') {
500
- // 文件存在(枚举得到)但无法定位路径:删不得也不该谎报成功。
501
- failed.push({ sessionId, reason: 'unlocatable' });
502
- continue;
503
- }
504
- if (file.state === 'absent') {
505
- deleted.push(sessionId);
506
- continue;
507
- }
586
+ const snapshots = await snapshotsByIds(unique.filter((id) => archived.has(id)));
587
+ /** 常规删除流(located 路径),必须在 exclusive 临界区内调用:
588
+ * TOCTOU 复核 → busy 沉降观察 → rm → 重现复验。 */
589
+ const deleteLocatedFile = async (sessionId, path) => {
508
590
  try {
509
591
  // TOCTOU 复核:fileInfo 的 stat 是快照,检查与 rm 之间文件可能
510
- // 恰好变化;rm 前重取一次。
511
- let fresh = await stat(file.path).catch(() => null);
592
+ // 恰好变化;rm 前重取一次。只有 ENOENT 才是「已消失」,其余错误
593
+ // 上抛以真实原因计入 failed。
594
+ let fresh = await stat(path).then((info) => ({ size: info.size, mtimeMs: info.mtimeMs }), (error) => { if (error?.code === 'ENOENT')
595
+ return null; throw error; });
512
596
  if (fresh === null) {
513
597
  deleted.push(sessionId);
514
- continue;
598
+ return;
515
599
  }
516
600
  // 生成流兜底:内存中的会话且 mtime 在窗口内,沉降观察一次,文件
517
601
  // 仍在增长说明活跃写入方在 append(删除后会把半截日志写回来),
518
602
  // 拒绝;体积静止则只是一次性落盘/迁移/flush 刷新过 mtime,照删。
519
603
  const inMemory = ctx.sessions.get(sessionId) !== undefined;
520
604
  if (inMemory && Date.now() - fresh.mtimeMs < BUSY_WRITE_WINDOW_MS) {
521
- const second = await settleStat(file.path);
605
+ const second = await settleStat(path);
522
606
  if (second === null) {
523
607
  deleted.push(sessionId);
524
- continue;
608
+ return;
525
609
  }
526
610
  if (second.size > fresh.size) {
527
611
  failed.push({ sessionId, reason: 'busy' });
528
- continue;
612
+ return;
529
613
  }
530
614
  fresh = second;
531
615
  }
532
- await rm(file.path, { force: true });
533
- await removeSessionDirIfOwned(sessionId, file.path, (message) => ctx.logger?.warn?.(message));
616
+ await rm(path, { force: true });
617
+ await removeSessionDirIfOwned(sessionId, path, (message) => ctx.logger?.warn?.(message));
534
618
  // rm 后复验:防宿主 materialize 的 mkdir -p 把路径在删除窗口内重建。
535
619
  // 重现只可能来自活跃写入方(内存中的生成流,或刚写完不久、客户端
536
620
  // 重连即恢复的 tab)。据此分两档:
@@ -541,15 +625,21 @@ export function createArchiveHost(ctx, cfg) {
541
625
  // 陈旧归档不再为每个文件白付 2×300ms。
542
626
  const plausiblyActive = inMemory || Date.now() - fresh.mtimeMs < BUSY_WRITE_WINDOW_MS;
543
627
  const settleMs = plausiblyActive ? REAPPEAR_SETTLE_MS : 0;
544
- if (await filePresentAfterSettle(file.path, settleMs)) {
628
+ if (await filePresentAfterSettle(path, settleMs)) {
545
629
  try {
546
- await rm(file.path, { force: true });
547
- await removeSessionDirIfOwned(sessionId, file.path, (message) => ctx.logger?.warn?.(message));
630
+ await rm(path, { force: true });
631
+ await removeSessionDirIfOwned(sessionId, path, (message) => ctx.logger?.warn?.(message));
548
632
  }
549
- catch { }
550
- if (await filePresentAfterSettle(file.path, settleMs)) {
633
+ catch (error) {
634
+ // 二次删除失败必须以真实原因上报:吞掉会让 EPERM/EBUSY 被
635
+ // 误标为 reappeared,把排障方向带偏。
636
+ ctx.logger?.warn?.(`session-archive: second delete failed for ${sessionId}: ${String(error)}`);
637
+ failed.push({ sessionId, reason: error?.message ?? 'delete-failed' });
638
+ return;
639
+ }
640
+ if (await filePresentAfterSettle(path, settleMs)) {
551
641
  failed.push({ sessionId, reason: 'reappeared' });
552
- continue;
642
+ return;
553
643
  }
554
644
  }
555
645
  deleted.push(sessionId);
@@ -557,6 +647,70 @@ export function createArchiveHost(ctx, cfg) {
557
647
  catch (error) {
558
648
  failed.push({ sessionId, reason: error?.message ?? 'delete-failed' });
559
649
  }
650
+ };
651
+ for (const sessionId of unique) {
652
+ const id = sessionId;
653
+ if (!archived.has(sessionId)) {
654
+ failed.push({ sessionId, reason: 'not-archived' });
655
+ continue;
656
+ }
657
+ if (isLive(id)) {
658
+ failed.push({ sessionId, reason: 'live' });
659
+ continue;
660
+ }
661
+ if (snapshots.get(sessionId) === undefined) {
662
+ // ghost id(枚举不到)。"枚举不到 ≠ 文件不存在":首行损坏的日志会被
663
+ // persistence 静默跳过;而 jsonl 后端按 cwd 分目录,ghost 探测没有
664
+ // header、拿不到 cwd,locate 只能探缺省目录(_no-cwd 一类)——既探
665
+ // 不到真实文件,也确认不了缺失。因此 ghost 一律不能当"已删"报成功
666
+ // (0.3.9 谎报成功的同源变体),计入 failed;ghost id 留在归档集合,
667
+ // 由 list() 的存在性过滤隐藏,面板与侧边栏均不可见。
668
+ failed.push({ sessionId, reason: 'unenumerable' });
669
+ continue;
670
+ }
671
+ const header = snapshots.get(sessionId).header;
672
+ const file = await fileInfo(header);
673
+ if (file.state === 'unknown') {
674
+ // 文件存在(枚举得到)但无法定位路径:删不得也不该谎报成功。
675
+ failed.push({ sessionId, reason: 'unlocatable' });
676
+ continue;
677
+ }
678
+ // ── 与 unarchive 的 confirm → setState 互斥的删除临界区(exclusive)。
679
+ // rm 及其全部前置判定(含 absent 复核)都在窗口内:unarchive 要么
680
+ // 整体先落地(此处复验归档成员资格失败、拒绝删除),要么整体等删除
681
+ // 完成(confirm 探到 absent、拒绝恢复)——"文件被删的同时归档标记
682
+ // 被移除"的错位不存在。
683
+ if (file.state === 'absent') {
684
+ // absent 不是无脑幂等成功:fileInfo 的目录扫描是快照,宿主格式
685
+ // 迁移(写临时文件+rename)的瞬间目录可能扫空,报已删前锁内重扫
686
+ // 一次;重扫发现文件在,转常规删除流。
687
+ await exclusive(async () => {
688
+ if (!archivedSet().has(sessionId)) {
689
+ failed.push({ sessionId, reason: 'not-archived' });
690
+ return;
691
+ }
692
+ const fresh = await fileInfo(header);
693
+ if (fresh.state === 'unknown') {
694
+ failed.push({ sessionId, reason: 'unlocatable' });
695
+ return;
696
+ }
697
+ if (fresh.state === 'absent') {
698
+ deleted.push(sessionId);
699
+ return;
700
+ }
701
+ await deleteLocatedFile(sessionId, fresh.path);
702
+ });
703
+ continue;
704
+ }
705
+ await exclusive(async () => {
706
+ // 归档成员锁内复验:快照之后、删除之前,unarchive 可能已把 id 移出
707
+ // 集合——删除先行发起也不能清掉刚恢复的会话文件。
708
+ if (!archivedSet().has(sessionId)) {
709
+ failed.push({ sessionId, reason: 'not-archived' });
710
+ return;
711
+ }
712
+ await deleteLocatedFile(sessionId, file.path);
713
+ });
560
714
  }
561
715
  return { deleted, failed, removedFromArchive: 0 };
562
716
  },
@@ -564,28 +718,46 @@ export function createArchiveHost(ctx, cfg) {
564
718
  * 批量恢复归档会话(仅从归档集合移除,会话数据不动)。只恢复仍存在
565
719
  * 持久化文件的会话:文件已删的 ghost id(已彻底删除的会话)拒绝恢复,
566
720
  * 避免删除后的会话再次出现在侧边栏对话列表。
721
+ *
722
+ * 与 delete 对称的失败语义(failed[].reason):'not-archived' 非归档
723
+ * 成员;'unenumerable' 持久化枚举不到(文件已删/首行损坏);其余为
724
+ * confirm 复核淘汰('not-restorable')或底层错误消息。restored 之外的
725
+ * 每个请求 id 都必须在 failed 里有下落——客户端据此把「已恢复 0 个」
726
+ * 渲染为失败而非成功。
567
727
  */
568
728
  async unarchive(sessionIds) {
569
729
  const unique = [...new Set(sessionIds)];
570
- const snapshots = await persistence.list();
571
- const headersById = new Map(snapshots.map((snapshot) => [snapshot.header.id, snapshot.header]));
730
+ const archived = archivedSet();
731
+ const snapshots = await snapshotsByIds(unique.filter((id) => archived.has(id)));
732
+ const failed = [];
572
733
  // 锁外先做一遍廉价过滤(明显不可恢复的直接淘汰),锁内由 confirm 复核,
573
734
  // 消除与并发 deleteArchived 的检查-移除窗口。
574
735
  const candidates = [];
575
736
  for (const sessionId of unique) {
576
- const header = headersById.get(sessionId);
577
- if (header === undefined)
578
- continue; // 持久化记录已删:拒绝恢复
579
- candidates.push({ sessionId, header });
737
+ if (!archived.has(sessionId)) {
738
+ failed.push({ sessionId, reason: 'not-archived' });
739
+ continue;
740
+ }
741
+ if (snapshots.get(sessionId) === undefined) {
742
+ failed.push({ sessionId, reason: 'unenumerable' }); // 持久化记录已删:拒绝恢复
743
+ continue;
744
+ }
745
+ candidates.push(sessionId);
580
746
  }
581
- const restored = await removeFromArchiveSet(candidates.map(({ sessionId }) => sessionId), async (sessionId) => {
582
- const header = headersById.get(sessionId);
583
- if (header === undefined)
747
+ const restored = await removeFromArchiveSet(candidates, async (sessionId) => {
748
+ const snapshot = snapshots.get(sessionId);
749
+ if (snapshot === undefined)
584
750
  return false;
585
- const file = await fileInfo(header);
586
- return file.state === 'located'; // located 才确认文件在:absent 拒绝,unknown 谨慎拒绝
751
+ const file = await fileInfo(snapshot.header);
752
+ if (file.state !== 'located') {
753
+ // located 才确认文件在:absent(快照后文件消失)/unknown(无法确认)
754
+ // 谨慎拒绝,并如实计入 failed。
755
+ failed.push({ sessionId, reason: 'not-restorable' });
756
+ return false;
757
+ }
758
+ return true;
587
759
  });
588
- return { restored, removedFromArchive: restored.length };
760
+ return { restored, failed, removedFromArchive: restored.length };
589
761
  },
590
762
  };
591
763
  }
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,iDAAiD;AACjD,0CAA0C;AAC1C,IAAI,qBAAqB,GAAQ,IAAI,CAAC;AACtC,IAAI,CAAC;IACH,CAAC,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;AAC5D,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,IAAI,CAAC,+CAA+C,GAAG,CAAE,KAAe,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC/G,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,iBAAiB,CAAC;AAEtC,oDAAoD;AACpD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,mBAAmB,EAAE,oBAAoB,EAAE,UAAU,CAAC,CAAC;AAE9E;;oCAEoC;AACpC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AACpC,+BAA+B;AAC/B,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,uBAAuB,CAAC,SAAiB,EAAE,QAAgB,EAAE,IAA+B;IACzG,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO;IACrD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,uCAAuC,IAAI,gCAAgC,SAAS,yCAAyC,CAAC,CAAC;QACpI,OAAO;IACT,CAAC;IACD,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,iBAAiB;IAC3B,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,KAAK,OAAO;YAAE,SAAS;QAChC,wDAAwD;QACxD,4CAA4C;QAC5C,oBAAoB;QACpB,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAAE,SAAS;QAC1G,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,uCAAuC,IAAI,wCAAwC,CAAC,CAAC;YAC1F,OAAO;QACT,CAAC;IACH,CAAC;IACD,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,gEAAgE;AAChE,MAAM,cAAc,GAAG;IACrB,iCAAiC;IACjC,iBAAiB,EAAE,GAAG;IACtB,8BAA8B;IAC9B,mBAAmB,EAAE,IAAI;IACzB,4BAA4B;IAC5B,oBAAoB,EAAE,CAAC;CACxB,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,CAAC;AAE5C,sCAAsC;AACtC,SAAS,cAAc,CAAC,OAAY;IAClC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9E,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,CAAC,mBAAmB,EAAE,qBAAqB,EAAE,sBAAsB,CAAC,EAAE,CAAC;QACvF,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACzF,MAAM,IAAI,SAAS,CAAC,iCAAiC,GAAG,8BAA8B,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;AACH,CAAC;AAED,2CAA2C;AAC3C,SAAS,eAAe,CAAC,MAAW,EAAE,QAAQ,GAAQ,cAAc;IAClE,MAAM,GAAG,GAAG,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAClG,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,GAAG,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,CAAC,KAAU,EAAE,QAAa,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC3G,OAAO;QACL,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC;QACpF,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAAC,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB,CAAC;QAC1F,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAAC,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB,CAAC;KAC9F,CAAC;AACJ,CAAC;AAED;;;oCAGoC;AACpC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B;;;GAGG;AACH,KAAK,UAAU,WAAW,CAAC,WAA+B,EAAE,SAAoB,EAAE,OAAkD;IAClI,MAAM,MAAM,GAAkB,MAAM,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxE,IAAI,CAAC;QACH,KAAK,IAAI,MAAM,GAAG,CAAC,GAAI,MAAM,IAAI,iBAAiB,EAAE,CAAC;YACnD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YAChE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM;YAC/B,OAAO,CAAC,MAAM,CAAC,CAAC;YAChB,IAAI,MAAM,CAAC,MAAM,GAAG,iBAAiB;gBAAE,MAAM;QAC/C,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,SAAS,CAAC,WAA+B,EAAE,SAAoB;IAC5E,MAAM,WAAW,GAAmB,EAAE,CAAC;IACvC,MAAM,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;QACnD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe;gBAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,gBAAgB,CAAC,WAAW,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;AACtD,CAAC;AAED,4BAA4B;AAC5B,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;cAEc;AACd,SAAS,kBAAkB,CAAC,KAAa,EAAE,KAAgC;IACzE,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,EAAE;QACvD,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAE,CAAC;YACxB,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,IAAI,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC;AAED;8DAC8D;AAC9D,SAAS,WAAW,CAAC,OAAgB,EAAE,QAAgB;IACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAAa,CAAC,IAAI,KAAK,MAAM,IAAI,OAAQ,KAAa,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpH,IAAI,IAAK,KAAa,CAAC,IAAI,CAAC;YAC5B,IAAI,IAAI,CAAC,MAAM,GAAG,QAAQ;gBAAE,MAAM;QACpC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY,EAAE,GAAwB;IACtE,MAAM,QAAQ,GAAsB,GAAG,CAAC,iBAAiB,CAAC;IAC1D,MAAM,WAAW,GAAqD,GAAG,CAAC,kBAAkB,CAAC;IAE7F,+CAA+C;IAC/C,MAAM,WAAW,GAAG,GAAgB,EAAE,CAAC,IAAI,GAAG,CAAS,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAEpF;;;;;;wBAMoB;IACpB,MAAM,MAAM,GAAG,CAAC,SAAoB,EAAE,EAAE,CACtC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAE7E;;;;;;;;;;;OAWG;IACH,KAAK,UAAU,cAAc,CAAC,GAAsB;QAClD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsC,CAAC;QAC7D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QACpC,IAAI,OAAQ,WAA2C,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC5E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,KAAK,MAAM,QAAQ,IAAI,MAAM,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChD,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;oBACtE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,kBAAkB,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE;YACrD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAe,CAAC,CAAC;gBACzD,IAAI,QAAQ,KAAK,SAAS;oBAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC,CAAC,CAAC,CAAC;QACJ,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;;;;OASG;IACH,MAAM,UAAU,GAAG,CAAC,IAAY,EAAqD,EAAE,CACrF,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAClD,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACtD,8CAA8C;IAC9C,8CAA8C;IAC9C,CAAC,KAAK,EAAE,EAAE,GAAG,IAAK,KAA+B,EAAE,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAClG,CAAC,CAAC;IAEL;;;;;;;;;;OAUG;IACH,IAAI,aAAa,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IACrD,SAAS,SAAS,CAAI,OAAyB;QAC7C,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,aAAa,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC7C,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,UAAU,oBAAoB,CAAC,GAAa,EAAE,OAAiD;QAClG,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,uCAAuC;QACvC,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,QAIhB,CAAC;QACF,MAAM,QAAQ,GACZ,OAAO,QAAQ,CAAC,gBAAgB,KAAK,UAAU;YAC/C,OAAO,QAAQ,CAAC,YAAY,KAAK,UAAU;YAC3C,OAAO,QAAQ,CAAC,QAAQ,KAAK,UAAU,CAAC;QAC1C,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC,CAAC,wBAAwB;QAClD,IAAI,UAAU,GAAa,EAAE,CAAC;QAC9B,MAAM,QAAQ,CAAC,gBAAiB,CAAC,KAAK,IAAI,EAAE;YAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAa,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,kBAAkB,CAAa,CAAC;YAC1D,IAAI,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACnD,6DAA6D;YAC7D,MAAM,SAAS,CAAC,KAAK,IAAI,EAAE;gBACzB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,MAAM,SAAS,GAAa,EAAE,CAAC;oBAC/B,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;wBAC1B,IAAI,CAAC;4BAAC,IAAI,MAAM,OAAO,CAAC,EAAE,CAAC;gCAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAAC,CAAC;wBAAC,MAAM,CAAC,CAAA,CAAC;oBAC7D,CAAC;oBACD,QAAQ,GAAG,SAAS,CAAC;gBACvB,CAAC;gBACD,UAAU,GAAG,QAAQ,CAAC;gBACtB,yCAAyC;gBACzC,uBAAuB;gBACvB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;gBACvC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;oBAAE,MAAM,QAAQ,CAAC,QAAS,CAAC,EAAE,GAAG,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAC,CAAC;YACnG,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC;IACpB,CAAC;IAaD;;;;;;;;OAQG;IACH,KAAK,UAAU,qBAAqB,CAAC,GAAW;QAC9C,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,CAAC,gBAAgB;QAC/B,CAAC;QACD,IAAI,MAAM,GAA6C,IAAI,CAAC;QAC5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;gBAAE,SAAS;YAC5G,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;gBACnC,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;oBAAE,MAAM,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5G,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC,CAAC,YAAY;QACzB,CAAC;QACD,OAAO,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC;IAC9B,CAAC;IAED,KAAK,UAAU,QAAQ,CAAC,MAAqB;QAC3C,IAAI,CAAC;YACH,IAAI,OAAO,WAAW,CAAC,MAAM,KAAK,UAAU;gBAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAC1E,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9F,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAC9B,CAAC;YACD,sCAAsC;YACtC,MAAM,cAAc,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YACvE,IAAI,UAAU,KAAK,IAAI;gBAAE,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC5D,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;gBACvC,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;oBACnC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACvF,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC,CAAC,oBAAoB;YACjC,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;YAC3C,wCAAwC;YACxC,mDAAmD;YACnD,yCAAyC;YACzC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;;mCAG+B;IAC/B,KAAK,UAAU,sBAAsB,CAAC,IAAY,EAAE,QAAgB;QAClE,IAAI,QAAQ,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,EAAE,IAAI,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YACtE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;6BAMyB;IACzB,MAAM,iBAAiB,GAAG,GAAG,CAAC;IAC9B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAqD,CAAC;IAChF,KAAK,UAAU,MAAM,CAAC,SAAoB,EAAE,MAAqB;QAC/D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACvD,IAAI,KAAK,GAAkB,IAAI,CAAC;QAChC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC/D,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC;oBACH,KAAK,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;gBAClD,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;gBACV,IAAI,UAAU,CAAC,IAAI,IAAI,iBAAiB,EAAE,CAAC;oBACzC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;oBAC9C,IAAI,MAAM,KAAK,SAAS;wBAAE,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACtD,CAAC;gBACD,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,KAAK,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QACD,OAAO;YACL,SAAS;YACT,KAAK;YACL,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,IAAI;YACvB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS;YAChE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,OAAO;QACL;8CACsC;QACtC,KAAK,CAAC,KAAK;YACT,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC;YACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YACjD,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;QAED,sCAAsC;QACtC,KAAK,CAAC,IAAI;YACR,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC;YACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YACjD,MAAM,IAAI,GAAwD,EAAE,CAAC;YACrE,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;gBACjC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC1C,IAAI,QAAQ,KAAK,SAAS;oBAAE,SAAS,CAAC,iBAAiB;gBACvD,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAsB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YACpJ,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,CAAC;QAED;mDAC2C;QAC3C,KAAK,CAAC,MAAM,CAAC,SAAiB;YAC5B,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,GAAG,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;YACjG,CAAC;YACD,MAAM,EAAE,GAAG,SAAsB,CAAC;YAClC,6CAA6C;YAC7C,gCAAgC;YAChC,uCAAuC;YACvC,MAAM,WAAW,GAAmB,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAuE,EAAE,CAAC;YACxF,IAAI,iBAAiB,GAAG,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;gBACzD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;wBACnC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBACxB,SAAS;oBACX,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB;wBAAE,SAAS;oBAClF,wDAAwD;oBACxD,uDAAuD;oBACvD,0CAA0C;oBAC1C,yBAAyB;oBACzB,MAAM,IAAI,GAAG,WAAW,CACtB,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAChF,GAAG,CAAC,mBAAmB,CACxB,CAAC;oBACF,kCAAkC;oBAClC,gCAAgC;oBAChC,kCAAkC;oBAClC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;wBAAE,SAAS;oBAChC,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC;wBAC7C,iBAAiB,EAAE,CAAC;wBACpB,SAAS;oBACX,CAAC;oBACD,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW;wBAC1D,IAAI;wBACJ,IAAI,EAAE,KAAK,CAAC,IAAI;qBACjB,CAAC,CAAC;oBACH,iBAAiB,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,gBAAgB,CAAC,WAAW,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;YAC3D,OAAO;gBACL,SAAS;gBACT,MAAM,EAAE;oBACN,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI;oBACrB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI;oBACzC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;iBACtC;gBACD,KAAK;gBACL,YAAY,EAAE,QAAQ,CAAC,MAAM;gBAC7B,iBAAiB;gBACjB,SAAS,EAAE,iBAAiB,GAAG,QAAQ,CAAC,MAAM;gBAC9C,QAAQ;gBACR,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;aACjB,CAAC;QACJ,CAAC;QAED;;;;;;;;;;;;;WAaG;QACH,KAAK,CAAC,cAAc,CAAC,UAAoB;YACvC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YACxC,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAiD,EAAE,CAAC;YAChE,yCAAyC;YACzC,yCAAyC;YACzC,qCAAqC;YACrC,eAAe;YACf,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAEhF;oDACwC;YACxC,MAAM,iBAAiB,GAAG,KAAK,EAAE,SAAiB,EAAE,IAAY,EAAiB,EAAE;gBACjF,IAAI,CAAC;oBACH,8CAA8C;oBAC9C,uCAAuC;oBACvC,oBAAoB;oBACpB,IAAI,KAAK,GAA6C,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CACzE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EACtD,CAAC,KAA4B,EAAE,EAAE,GAAG,IAAI,KAAK,EAAE,IAAI,KAAK,QAAQ;wBAAE,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAC9F,CAAC;oBACF,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;wBACnB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBACxB,OAAO;oBACT,CAAC;oBACD,qCAAqC;oBACrC,qCAAqC;oBACrC,yCAAyC;oBACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAsB,CAAC,KAAK,SAAS,CAAC;oBACxE,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,oBAAoB,EAAE,CAAC;wBAClE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;wBACtC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;4BACpB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;4BACxB,OAAO;wBACT,CAAC;wBACD,IAAI,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;4BAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;4BAC3C,OAAO;wBACT,CAAC;wBACD,KAAK,GAAG,MAAM,CAAC;oBACjB,CAAC;oBACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBAChC,MAAM,uBAAuB,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;oBACzF,iDAAiD;oBACjD,kCAAkC;oBAClC,qBAAqB;oBACrB,gDAAgD;oBAChD,8CAA8C;oBAC9C,wCAAwC;oBACxC,qCAAqC;oBACrC,6BAA6B;oBAC7B,MAAM,eAAe,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,oBAAoB,CAAC;oBACtF,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1D,IAAI,MAAM,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;wBACjD,IAAI,CAAC;4BACH,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;4BAChC,MAAM,uBAAuB,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;wBAC3F,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,qCAAqC;4BACrC,0BAA0B;4BAC1B,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,6CAA6C,SAAS,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;4BAC/F,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAG,KAAe,EAAE,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC;4BACjF,OAAO;wBACT,CAAC;wBACD,IAAI,MAAM,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;4BACjD,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;4BACjD,OAAO;wBACT,CAAC;oBACH,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC1B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAG,KAAe,EAAE,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC;gBACnF,CAAC;YACH,CAAC,CAAC;YAEF,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;gBAC/B,MAAM,EAAE,GAAG,SAAsB,CAAC;gBAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;oBACnD,SAAS;gBACX,CAAC;gBACD,IAAI,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC3C,SAAS;gBACX,CAAC;gBACD,IAAI,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;oBAC3C,0CAA0C;oBAC1C,kDAAkD;oBAClD,gDAAgD;oBAChD,uCAAuC;oBACvC,+CAA+C;oBAC/C,gCAAgC;oBAChC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;oBACnD,SAAS;gBACX,CAAC;gBACD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,MAAM,CAAC;gBAChD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACpC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC7B,gCAAgC;oBAChC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;oBAClD,SAAS;gBACX,CAAC;gBACD,2DAA2D;gBAC3D,6CAA6C;gBAC7C,mCAAmC;gBACnC,2CAA2C;gBAC3C,cAAc;gBACd,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC5B,yCAAyC;oBACzC,qCAAqC;oBACrC,qBAAqB;oBACrB,MAAM,SAAS,CAAC,KAAK,IAAI,EAAE;wBACzB,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;4BAClC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;4BACnD,OAAO;wBACT,CAAC;wBACD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;wBACrC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;4BAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;4BAClD,OAAO;wBACT,CAAC;wBACD,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;4BAC7B,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;4BACxB,OAAO;wBACT,CAAC;wBACD,MAAM,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;oBACjD,CAAC,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBACD,MAAM,SAAS,CAAC,KAAK,IAAI,EAAE;oBACzB,0CAA0C;oBAC1C,2BAA2B;oBAC3B,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;wBAClC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;wBACnD,OAAO;oBACT,CAAC;oBACD,MAAM,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChD,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC;QACpD,CAAC;QAED;;;;;;;;;;WAUG;QACH,KAAK,CAAC,SAAS,CAAC,UAAoB;YAClC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAChF,MAAM,MAAM,GAAiD,EAAE,CAAC;YAChE,0CAA0C;YAC1C,iCAAiC;YACjC,MAAM,UAAU,GAAa,EAAE,CAAC;YAChC,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;oBACnD,SAAS;gBACX,CAAC;gBACD,IAAI,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;oBAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,eAAe;oBACnE,SAAS;gBACX,CAAC;gBACD,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;gBAC1E,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC1C,IAAI,QAAQ,KAAK,SAAS;oBAAE,OAAO,KAAK,CAAC;gBACzC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC7C,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC7B,+CAA+C;oBAC/C,qBAAqB;oBACrB,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;oBACrD,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QACnE,CAAC;KACF,CAAC;AACJ,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,MAAY;IAC9C,MAAM,WAAW,GAAG,MAAM,IAAI,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,eAAe,CAAC,EAAE,GAAG,cAAc,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,iBAAiB,CAAC;QAC9B,IAAI;QACJ,QAAQ,EAAE,cAAc;QACxB,WAAW;QACX,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YACnB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,GAAG,cAAc,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;QACxF,CAAC;KACF,CAAC,CAAC;IACH,sCAAsC;IACtC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAEvD,IAAI,qBAAqB,KAAK,IAAI,EAAE,CAAC;QACnC,GAAG,CAAC,MAAM,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chaoset/session-archive",
3
- "version": "0.3.11",
3
+ "version": "0.3.13",
4
4
  "description": "DSH plugin: browse archived sessions, inspect their content, batch-restore or permanently delete them with multi-select",
5
5
  "engines": {
6
6
  "node": ">=22.19.0"