@chaoset/session-archive 0.3.0 → 0.3.3

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,91 +1,139 @@
1
1
  # Changelog
2
2
 
3
- ## [0.3.0](https://github.com/winliyou/dsh-plugins) (2026-08-25)
3
+ ## 0.3.3 (2026-08-29)
4
4
 
5
5
  ### Features
6
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 命中面积与设置入口完全一致
7
+ * 加载反馈:列表与详情加载中显示 spinner +「加载中…」(respect
8
+ `prefers-reduced-motion`),替代原先孤零零的 "…";手动刷新列表时同样可见
9
+ (静默刷新不打扰)
10
+
11
+ ## 0.3.2 (2026-08-28)
12
+
13
+ ### Bug Fixes
14
+
15
+ * 支持从源码运行的 DSH:typert-protocol 解析链首插安装闭包共享 fallback
16
+ `$DSH_HOME/profiles/node_modules/<pkg>`,以 realpath 导入保证与 harness 同一
17
+ 模块实例;失败回落原有解析链。已对照 dsh 源码 0.1.2-alpha.1 复核
18
+ workspaceRegistry / sessionPersistence 契约与事件形状无变化
19
+
20
+ ## 0.3.1 (2026-08-28)
21
+
22
+ ### Bug Fixes
23
+
24
+ * 适配 DSH 0.1.1-rc.2:`@deepseek-ai/dsh-typert-protocol` 依赖 range 从
25
+ `^0.1.0-rc.8` 升到 `^0.1.1-rc.2`(npm semver 的 prerelease 规则下旧 range
26
+ 无法匹配 `0.1.1-rc.2`,新版宿主下面板远程服务会因官方包解析到旧版本而不可用)
27
+ * 已对照 0.1.1-rc.2 复核 workspaceRegistry / sessionPersistence / sessions
28
+ 契约与 `session/title`、`user/message`、`assistant/message` 事件形状:无变化
29
+
30
+ ## 0.3.0 (2026-08-25)
31
+
32
+ ### Features
33
+
34
+ * **实时徽标与列表**:订阅宿主 workspaces 服务的归档集合 store——会话菜单点
35
+ 「归档」、其它标签页变更、宿主推送 `host/archived-sessions-changed` 都即时
36
+ 反映到侧边栏徽标与打开中的面板,不再等 5s 轮询;集合含 ghost id 与 `count()`
37
+ 口径不同,故仅作触发信号、数目仍以 `count()` 为准;store 不可用时降级为纯轮询
38
+ * `count()` 调用失败自动退回一次 `list()` 取数并同步徽标:任何 host 版本组合下
39
+ 徽标都能自我纠正,不再卡在过期值
40
+ * **徽标 hover 与「设置」入口对齐**:几何与官方侧边栏设置触发按钮逐字一致
41
+ (收起态 36×36 圆形、图标 18px);根因修复:`.sa_root` 作为 flex 项会收缩到
42
+ 内容宽,显式撑满后 hover 命中面积与设置入口完全一致
10
43
 
11
44
  ### Bug Fixes
12
45
 
13
- * `deleteArchived` 冷文件快速路径:不在内存且 60s 内无写入的归档删除跳过固定 2×300ms settle 复验(重现只可能来自内存生成流或刚写过的 tab),批量清理陈旧归档从 ~12s/20 个降到 <1s;可能活跃的会话维持原两段复验与 `reappeared` 语义
14
- * 徽标关闭态轮询在标签页隐藏时暂停 interval,恢复可见立即刷一次并重启(隐藏页轮询是纯浪费);面板打开期间新增 30s 静默刷新(`sameItems` 比较,数据不变不重渲染、不打断勾选)
15
- * 批量删除成功后清理 `details`/`expanded` 缓存:内存不再随操作缓慢增长,展开态不再指向已删除的行
46
+ * `deleteArchived` 冷文件快速路径:不在内存且 60s 内无写入的归档删除跳过固定
47
+ 2×300ms settle 复验,批量清理陈旧归档从 ~12s/20 个降到 <1s;可能活跃的会话
48
+ 维持原两段复验与 `reappeared` 语义
49
+ * 徽标关闭态轮询在标签页隐藏时暂停、恢复可见立即刷一次并重启;面板打开期间
50
+ 新增 30s 静默刷新(数据不变不重渲染、不打断勾选)
51
+ * 批量删除成功后清理 `details`/`expanded` 缓存:内存不再随操作缓慢增长,
52
+ 展开态不再指向已删除的行
16
53
 
17
54
  ### Accessibility / UI
18
55
 
19
- * 面板焦点管理:打开时焦点移入面板、关闭时归还徽标按钮(`prevOpen` 防首次挂载误触发)
20
- * 徽标按钮补回 `aria-label`(icon-only 场景 accessible name 自带语义与数量,不依赖 `title`)
21
- * warn 级通知独立 warn 色(`state-warn-primary`),不再与错误同红
22
- * 面板 150ms 入场动画(淡入 + 轻微上移,respect `prefers-reduced-motion`);z-index 层级来源注释
56
+ * 面板焦点管理:打开时焦点移入面板、关闭时归还徽标按钮
57
+ * 徽标按钮补回 `aria-label`(icon-only 场景 accessible name 自带语义与数量)
58
+ * warn 级通知独立 warn 色,不再与错误同红
59
+ * 面板 150ms 入场动画(淡入 + 轻微上移,respect `prefers-reduced-motion`)
23
60
 
24
- ## [0.2.4](https://github.com/winliyou/dsh-plugins) (2026-08-23)
61
+ ## 0.2.4 (2026-08-23)
25
62
 
26
63
  ### Bug Fixes
27
64
 
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` 渲染前加形状防御。
65
+ * `SessionArchiveGateway` 缺少 0.2.3 引入的 `count()` 方法认领——徽标轮询端点
66
+ 实际返回 404(客户端静默吞错,表现为计数不更新);补齐方法与 marker
67
+ * `detail()` 达到 `detailMaxMessages` 后只递增计数、不再做文本提取;响应新增
68
+ `totalMessageCount` `truncated`,客户端如实显示「共 N 条消息(已截断)」
69
+ * `deleteArchived` 对 ghost id 先经 `locate()` 探测孤儿文件:首行损坏、被
70
+ `persistence.list()` 静默跳过的日志计入 `failed('unenumerable')`,不再谎报
71
+ 成功并把文件留在磁盘上
72
+ * rm 后约 300ms 复验:文件被进行中的生成流重建则再删一次,仍压不掉计入
73
+ `failed('reappeared')`
74
+ * 客户端:列表浅比较未变化跳过重渲染;选择集自动剔除已消失项;批量异常提示带
75
+ 请求数量;零体积显示 "—";`detail.messages` 渲染前加形状防御
33
76
 
34
77
  ### Accessibility
35
78
 
36
- * 行标题由 span 改为真 button(键盘可达);面板补 `role="dialog"` 与 aria-label;Escape 关闭面板。
79
+ * 行标题由 span 改为真 button(键盘可达);面板补 `role="dialog"` 与
80
+ aria-label;Escape 关闭面板
37
81
 
38
- ## [0.2.3](https://github.com/winliyou/dsh-plugins) (2026-08-22)
82
+ ## 0.2.3 (2026-08-22)
39
83
 
40
84
  ### Features
41
85
 
42
- * `count()` 轻端点 + 按 mtime 的标题缓存:面板关闭态的徽标轮询不再每 5 秒全量解析归档事件流。
43
- * 删除失败原因端到端透出(`not-archived` / `busy` 等)。
44
- * 客户端:成功通知独立样式;删除确认锁定选择集并显示数量;批量失败原因逐条展示;detail 加载失败可重试;复选框 aria-label。
86
+ * `count()` 轻端点 + 按 mtime 的标题缓存:面板关闭态的徽标轮询不再每 5
87
+ 全量解析归档事件流
88
+ * 删除失败原因端到端透出(`not-archived` / `busy` 等)
89
+ * 客户端:成功通知独立样式;删除确认锁定选择集并显示数量;批量失败原因逐条
90
+ 展示;detail 加载失败可重试;复选框 aria-label
45
91
 
46
92
  ### Bug Fixes
47
93
 
48
- * `deleteArchived`/`detail` 前置校验归档成员资格:未归档的持久化会话不再可能经远程端点被不可逆删除/读取。
49
- * busy 判定 TOCTOU:rm 前重取 mtime 复核;unarchive 的存在性确认移入 registry 写锁临界区,并发删除不再能把已删会话"复活"回侧边栏。
94
+ * `deleteArchived`/`detail` 前置校验归档成员资格:未归档的持久化会话不再可能
95
+ 经远程端点被不可逆删除/读取
96
+ * busy 判定 TOCTOU:rm 前重取 mtime 复核;unarchive 的存在性确认移入 registry
97
+ 写锁临界区,并发删除不再能把已删会话「复活」回侧边栏
50
98
 
51
- ## [0.2.2](https://github.com/winliyou/dsh-plugins) (2026-08-22)
99
+ ## 0.2.2 (2026-08-22)
52
100
 
53
101
  ### Dependencies
54
102
 
55
- * update @deepseek-ai/* to 0.1.0-rc.8
103
+ * `@deepseek-ai/*` 更新到 0.1.0-rc.8
56
104
 
57
- ## [0.2.1](https://github.com/winliyou/dsh-plugins) (2026-08-22)
105
+ ## 0.2.1 (2026-08-22)
58
106
 
59
107
  ### Refactor
60
108
 
61
- * republish TypeScript-refactor build output (tsc + esbuild pipeline)
109
+ * 重新发布 TypeScript 重构后的构建产物(tsc + esbuild 流水线)
62
110
 
63
- ## [0.2.0](https://github.com/winliyou/dsh-plugins) (2026-08-21)
111
+ ## 0.2.0 (2026-08-21)
64
112
 
65
113
  ### Bug Fixes
66
114
 
67
- * expanded badge keeps text/icon state aligned with the sidebar wide prop
115
+ * 展开态徽标的文字/图标状态跟随侧边栏 wide 属性
68
116
 
69
- ## [0.1.3](https://github.com/winliyou/dsh-plugins) (2026-08-18)
117
+ ## 0.1.3 (2026-08-18)
70
118
 
71
119
  ### Bug Fixes
72
120
 
73
- * confirm-delete button hover: red text on red background was unreadable; changed to red background with white text
121
+ * 确认删除按钮 hover 红字红底不可读,改为红底白字
74
122
 
75
- ## [0.1.2](https://github.com/winliyou/dsh-plugins) (2026-08-18)
123
+ ## 0.1.2 (2026-08-18)
76
124
 
77
125
  ### Bug Fixes
78
126
 
79
- * keep ghost archived id after deleting archived sessions so in-memory sessions don't reappear in the sidebar
127
+ * 删除归档会话后保留归档集合占位 id,内存中的会话不再重新出现在侧边栏
80
128
 
81
- ## [0.1.1](https://github.com/winliyou/dsh-plugins) (2026-08-17)
129
+ ## 0.1.1 (2026-08-17)
82
130
 
83
131
  ### Bug Fixes
84
132
 
85
- * archived sessions no longer mislabeled as running; restored selectable deletion
133
+ * 归档会话不再被误标为运行中;恢复可勾选删除
86
134
 
87
- ## [0.1.0](https://github.com/winliyou/dsh-plugins) (2026-08-17)
135
+ ## 0.1.0 (2026-08-17)
88
136
 
89
137
  ### Features
90
138
 
91
- * initial session archive plugin: archived session list, read-only detail, batch restore and permanent delete
139
+ * 首个归档会话插件:归档列表、只读详情、批量恢复与彻底删除
package/README.md CHANGED
@@ -1,50 +1,38 @@
1
- # @chaoset/session-archive
1
+ # @chaoset/session-archive — DSH 归档会话管理
2
2
 
3
- DSH 插件:归档会话管理 —— 补上 DSH 缺失的"归档后半程"。
3
+ 补上 DSH 缺失的「归档后半程」:web 侧边栏底部新增**归档**面板。
4
4
 
5
- web 侧边栏底部新增 **归档** 面板(🗂):
6
-
7
- - **查看归档**:列出全部归档会话(标题、目录、创建/最后修改时间、体积、
8
- 运行状态),点击任意会话可展开**只读浏览**其完整聊天内容(用户/助手文本
9
- 消息)。
10
- - **一次多选批量操作**:
11
- - **恢复归档**(unarchive):把勾选的会话移回会话树,恢复其在原工作区的
12
- 位置(归档时保留的 slot 会计不被破坏)。
13
- - **彻底删除**(delete):删除勾选会话的持久化文件与会话目录。删除为
14
- 两段式确认(第一次点击进入确认态,4 秒内再次点击执行),避免误删。
15
- 删除后该会话在侧边栏对话列表与归档面板中都不会再出现。
16
- - 工具条提供**全选**、已选计数;**运行中**(live)的会话显示黄色徽标且
17
- 禁止勾选删除(请先停止会话);列表随会话树变化自动可刷新(⟳)。
5
+ - **查看归档**:列出全部归档会话(标题、目录、时间、体积、运行状态);点击
6
+ 会话可展开**只读浏览**其聊天内容(用户/助手文本消息)。
7
+ - **批量恢复**:勾选多个会话一键移回会话树,恢复其在原工作区的位置。
8
+ - **彻底删除**:删除勾选会话的持久化文件与会话目录;两段式确认(第一次点击
9
+ 进入确认态,4 秒内再次点击执行)避免误删。运行中(live)的会话禁止删除,
10
+ 需先停止。
11
+ - 工具条提供全选与已选计数;侧边栏徽标实时显示归档数量(订阅宿主归档集合,
12
+ 轻量轮询兜底)。
18
13
 
19
14
  ## 安装
20
15
 
21
16
  ```bash
22
17
  dsh plugin --profile web add @chaoset/session-archive
18
+ dsh plugin --profile web remove @chaoset/session-archive
23
19
  ```
24
20
 
25
- 重启 web profile 后,侧边栏底部出现"归档"按钮。插件由两部分组成:host
26
- 插件(归档读写/删除逻辑)与 web 客户端(面板 UI),随 `dsh.bundle.patch`
27
- 自动激活。
21
+ 重启 web profile 后,侧边栏底部出现「归档」入口。其他安装来源见仓库根
22
+ `README.md` 的「安装」。
28
23
 
29
24
  ## 工作原理
30
25
 
31
- - **列表**:`workspaceRegistry.archivedSessionIds``sessionPersistence.list()`,
32
- 标题从会话事件流折叠(最后一个 `session/title` 事件,与 dsh-session-title
33
- 同规则);文件信息来自 `sessionPersistence.locate()` + `stat`。
34
- - **查看**:`sessionPersistence.readFrom(id, 0)` 只读解析会话事件,提取
35
- 文本消息(`user/message` / `assistant/message` 的 text 块),不做任何
36
- 写入/修复。
37
- - **删除**:live 会话拒绝;每个会话删除持久化文件与会话目录(`locate()`
38
- 定位)。删除后**保留**该会话在归档集合中的 ghost id:宿主的
39
- `archiveSession` 不停止内存会话,若把 id 移出归档集合,仍挂在内存中的
40
- 会话会因"不再归档"而立刻重新出现在侧边栏对话列表(效果等同"恢复");
41
- 保留 ghost id 后由 `list()` 的存在性过滤隐藏,面板与侧边栏都不再显示。
42
- 归档集合没有官方写入 API,插件复用 registry 自身的串行化写入通道
43
- (`enqueueOperation → requireState → setState`,与 `archiveSession` 同一
44
- 路径);若内部形状变化会自动降级为"仅删文件",归档列表按文件存在性
45
- 过滤,功能不受影响。
46
- - **恢复**:仅从归档集合移除**仍存在持久化文件**的会话 id,会话数据不动,
47
- 恢复后回到原工作区位置;文件已删的已删除会话拒绝恢复(防"复活")。
26
+ - **列表**:宿主归档集合持久化会话列表;标题折叠自会话事件流的最后一个
27
+ `session/title` 事件,体积来自文件 stat。
28
+ - **查看**:只读解析会话事件流,提取用户/助手文本消息;超过 `detailMaxMessages`
29
+ 条时截断并如实标注。
30
+ - **恢复**:仅从归档集合移除仍存在持久化文件的会话 id,会话数据不动;文件已删
31
+ 的会话拒绝恢复。
32
+ - **删除**:live 会话拒绝;每个会话删除持久化文件与会话目录。删除后**保留**
33
+ 该会话在归档集合中的占位 id——否则仍挂在内存中的会话会因「不再归档」立刻
34
+ 重新出现在侧边栏(效果等同恢复);列表按文件存在性过滤,面板与侧边栏都不再
35
+ 显示该会话。宿主内部形状变化时自动降级为「仅删文件」,功能不受影响。
48
36
 
49
37
  ## Remote API(`ctx.remote.sessionArchive`)
50
38
 
@@ -56,14 +44,12 @@ dsh plugin --profile web add @chaoset/session-archive
56
44
  | `delete(sessionIds[])` | id 数组 | `{ deleted, failed, removedFromArchive }` |
57
45
  | `unarchive(sessionIds[])` | id 数组 | `{ restored, removedFromArchive }` |
58
46
 
59
- > `delete` 的 `failed[].reason`:`not-archived`(非归档成员)、`live`(内存
60
- > 中未归档会话)、`busy`(归档会话 60s 内仍有写入)、`unenumerable`(文件
61
- > 存在但持久化枚举不到,如首行损坏的孤儿日志)、`reappeared`(删除后被
62
- > 生成流重建、二次删除仍压不掉);其余为底层删除错误消息。
47
+ > `delete` 的 `failed[].reason`:`not-archived`(非归档成员)、`live`(内存中
48
+ > 未归档会话)、`busy`(归档会话 60s 内仍有写入)、`unenumerable`(文件存在但
49
+ > 持久化枚举不到)、`reappeared`(删除后被生成流重建);其余为底层删除错误消息。
63
50
 
64
- > `delete` 的 `removedFromArchive` 恒为 0:删除保留归档 ghost id(见上),
65
- > 侧边栏不会重新显示已删除的会话;`unarchive` `removedFromArchive`
66
- > 实际从归档集合移除的 id 数。
51
+ > `delete` 的 `removedFromArchive` 恒为 0(删除保留归档占位 id,见上);
52
+ > `unarchive` 的为实际从归档集合移除的 id 数。
67
53
 
68
54
  `ArchiveRow`:`{ sessionId, title, cwd, createdAt, updatedAt, size, live }`。
69
55
 
@@ -77,6 +63,6 @@ config 字段(`cordis.patch.yml` 或 `~/.dsh/plugins/session-archive/config.js
77
63
 
78
64
  ## 限制
79
65
 
80
- - 运行中(live)的会话无法删除 —— 先停止会话再删除。
81
- - 无官方 unarchive API,恢复归档通过 registry 写入通道实现;若未来 DSH
82
- 提供官方 API,插件会切换过去(行为不变)。
66
+ - 运行中(live)的会话无法删除——先停止会话再删除。
67
+ - 无官方 unarchive API,恢复归档通过 registry 写入通道实现;若未来 DSH 提供
68
+ 官方 API,插件会切换过去(行为不变)。
package/client/client.cjs CHANGED
@@ -110,7 +110,13 @@ window.__ModuleLoader__.load({
110
110
  ".sa_msgRole{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:14px;text-transform:uppercase;letter-spacing:.04em}",
111
111
  ".sa_msgText{color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;font-size:12px;line-height:18px}",
112
112
  ".sa_msgTextUser{color:var(--dsw-alias-label-secondary)}",
113
- ".sa_busy{opacity:.55;pointer-events:none}"
113
+ ".sa_busy{opacity:.55;pointer-events:none}",
114
+ // 加载中:spinner + 文案(列表与详情共用)。系统开启「减少动态效果」时
115
+ // spinner 停止旋转(保持静态圆环,提示语义仍在)。
116
+ ".sa_loading{color:var(--dsw-alias-label-tertiary);margin:8px 0;font-size:12px;line-height:18px;display:flex;align-items:center;gap:6px}",
117
+ ".sa_spin{flex:none;width:12px;height:12px;border:2px solid var(--dsw-alias-border-l2);border-top-color:var(--dsw-alias-label-secondary);border-radius:50%;animation:sa-spin .8s linear infinite}",
118
+ "@keyframes sa-spin{to{transform:rotate(360deg)}}",
119
+ "@media (prefers-reduced-motion:reduce){.sa_spin{animation:none}}"
114
120
  ].join("");
115
121
  var tagId = "@chaoset/session-archive/client.css";
116
122
  if (typeof document !== "undefined" && document.querySelector('style[data-plugin-css="' + tagId + '"]') === null) {
@@ -129,6 +135,7 @@ window.__ModuleLoader__.load({
129
135
  close: "\u5173\u95ED",
130
136
  empty: "\u6682\u65E0\u5F52\u6863\u4F1A\u8BDD\u3002\u5728\u4F1A\u8BDD\u5217\u8868\u7684\u66F4\u591A\u83DC\u5355\u4E2D\u5F52\u6863\u4F1A\u8BDD\u540E\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002",
131
137
  loadFailed: "\u52A0\u8F7D\u5F52\u6863\u5217\u8868\u5931\u8D25",
138
+ loading: "\u52A0\u8F7D\u4E2D\u2026",
132
139
  selectAll: "\u5168\u9009",
133
140
  selected: "\u5DF2\u9009 {n} \u9879",
134
141
  restore: "\u6062\u590D\u6240\u9009",
@@ -162,6 +169,7 @@ window.__ModuleLoader__.load({
162
169
  close: "Close",
163
170
  empty: "No archived sessions. Archive a session from its menu in the session list and it will show up here.",
164
171
  loadFailed: "Failed to load archive list",
172
+ loading: "Loading\u2026",
165
173
  selectAll: "Select all",
166
174
  selected: "{n} selected",
167
175
  restore: "Restore",
@@ -551,7 +559,14 @@ window.__ModuleLoader__.load({
551
559
  { className: "sa_body" },
552
560
  notice !== null ? React.createElement("p", { className: notice.kind === "ok" ? "sa_ok" : notice.kind === "warn" ? "sa_warn" : "sa_error", role: "status" }, notice.text) : null,
553
561
  error !== null ? React.createElement("p", { className: "sa_error", role: "alert" }, error) : null,
554
- loading && items.length === 0 ? React.createElement("p", { className: "sa_empty" }, "\u2026") : null,
562
+ // 加载中明确提示(loading 只由打开面板/手动刷新置位,静默刷新不打扰):
563
+ // 此前列表已有内容时手动刷新零反馈,首次加载只有一个孤零零的 "…"。
564
+ loading ? React.createElement(
565
+ "p",
566
+ { className: "sa_loading", role: "status" },
567
+ React.createElement("span", { className: "sa_spin", "aria-hidden": true }),
568
+ t("loading")
569
+ ) : null,
555
570
  !loading && items.length === 0 && error === null ? React.createElement("p", { className: "sa_empty" }, t("empty")) : null,
556
571
  items.length > 0 ? React.createElement(
557
572
  "ul",
@@ -612,7 +627,12 @@ window.__ModuleLoader__.load({
612
627
  isExpanded ? React.createElement(
613
628
  "div",
614
629
  { className: "sa_detail" },
615
- detailPending ? React.createElement("p", { className: "sa_empty" }, "\u2026") : null,
630
+ detailPending ? React.createElement(
631
+ "p",
632
+ { className: "sa_loading" },
633
+ React.createElement("span", { className: "sa_spin", "aria-hidden": true }),
634
+ t("loading")
635
+ ) : null,
616
636
  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(
617
637
  "div",
618
638
  { className: "sa_msg", key: index },
package/client/index.tsx CHANGED
@@ -72,7 +72,13 @@ var css = [
72
72
  ".sa_msgRole{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:14px;text-transform:uppercase;letter-spacing:.04em}",
73
73
  ".sa_msgText{color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;font-size:12px;line-height:18px}",
74
74
  ".sa_msgTextUser{color:var(--dsw-alias-label-secondary)}",
75
- ".sa_busy{opacity:.55;pointer-events:none}"
75
+ ".sa_busy{opacity:.55;pointer-events:none}",
76
+ // 加载中:spinner + 文案(列表与详情共用)。系统开启「减少动态效果」时
77
+ // spinner 停止旋转(保持静态圆环,提示语义仍在)。
78
+ ".sa_loading{color:var(--dsw-alias-label-tertiary);margin:8px 0;font-size:12px;line-height:18px;display:flex;align-items:center;gap:6px}",
79
+ ".sa_spin{flex:none;width:12px;height:12px;border:2px solid var(--dsw-alias-border-l2);border-top-color:var(--dsw-alias-label-secondary);border-radius:50%;animation:sa-spin .8s linear infinite}",
80
+ "@keyframes sa-spin{to{transform:rotate(360deg)}}",
81
+ "@media (prefers-reduced-motion:reduce){.sa_spin{animation:none}}"
76
82
  ].join("");
77
83
  var tagId = "@chaoset/session-archive/client.css";
78
84
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"" + tagId + "\"]") === null) {
@@ -92,6 +98,7 @@ const zh = {
92
98
  close: "关闭",
93
99
  empty: "暂无归档会话。在会话列表的更多菜单中归档会话后会出现在这里。",
94
100
  loadFailed: "加载归档列表失败",
101
+ loading: "加载中…",
95
102
  selectAll: "全选",
96
103
  selected: "已选 {n} 项",
97
104
  restore: "恢复所选",
@@ -125,6 +132,7 @@ const en = {
125
132
  close: "Close",
126
133
  empty: "No archived sessions. Archive a session from its menu in the session list and it will show up here.",
127
134
  loadFailed: "Failed to load archive list",
135
+ loading: "Loading…",
128
136
  selectAll: "Select all",
129
137
  selected: "{n} selected",
130
138
  restore: "Restore",
@@ -547,7 +555,11 @@ function ArchivePanel(props: any) {
547
555
  { className: "sa_body" },
548
556
  notice !== null ? React.createElement("p", { className: notice.kind === "ok" ? "sa_ok" : notice.kind === "warn" ? "sa_warn" : "sa_error", role: "status" }, notice.text) : null,
549
557
  error !== null ? React.createElement("p", { className: "sa_error", role: "alert" }, error) : null,
550
- loading && items.length === 0 ? React.createElement("p", { className: "sa_empty" }, "…") : null,
558
+ // 加载中明确提示(loading 只由打开面板/手动刷新置位,静默刷新不打扰):
559
+ // 此前列表已有内容时手动刷新零反馈,首次加载只有一个孤零零的 "…"。
560
+ loading ? React.createElement("p", { className: "sa_loading", role: "status" },
561
+ React.createElement("span", { className: "sa_spin", "aria-hidden": true }),
562
+ t("loading")) : null,
551
563
  !loading && items.length === 0 && error === null ? React.createElement("p", { className: "sa_empty" }, t("empty")) : null,
552
564
  items.length > 0 ? React.createElement(
553
565
  "ul",
@@ -608,7 +620,9 @@ function ArchivePanel(props: any) {
608
620
  isExpanded ? React.createElement(
609
621
  "div",
610
622
  { className: "sa_detail" },
611
- detailPending ? React.createElement("p", { className: "sa_empty" }, "…") : null,
623
+ detailPending ? React.createElement("p", { className: "sa_loading" },
624
+ React.createElement("span", { className: "sa_spin", "aria-hidden": true }),
625
+ t("loading")) : null,
612
626
  detail === void 0 ? null :
613
627
  detail.error !== void 0 ? React.createElement("p", { className: "sa_error" }, detail.error) :
614
628
  !Array.isArray(detail.messages) ? React.createElement("p", { className: "sa_error" }, t("detailLoadFailed")) :
@@ -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;;;;;;;;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"}
1
+ {"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AA4CnD,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
@@ -12,13 +12,34 @@
12
12
  * 仅侧边栏面板的远程读写不可用。
13
13
  */
14
14
  import { createRequire } from "node:module";
15
+ import { realpathSync } from "node:fs";
15
16
  import { homedir } from "node:os";
16
17
  import { join, resolve } from "node:path";
17
18
  import { pathToFileURL } from "node:url";
19
+ // 安装闭包共享 fallback:$DSH_HOME/profiles/node_modules 由 harness 启动时
20
+ // heal 出来(symlink 镜像 harness 实际使用的依赖闭包,npm 安装与源码运行
21
+ // 都会建立)。优先从这里解析,保证插件与 harness 用同一模块实例;Node ESM
22
+ // 不支持目录导入,用包目录的 package.json 作 require 锚解析入口文件
23
+ // (require.resolve 默认 realpath 化,得到 harness 同源实体路径)。
24
+ // 失败返回 null,由调用方 fall through 原有解析链。
25
+ function loadInstallFallback(specifier) {
26
+ try {
27
+ const dshHome = process.env.DSH_HOME?.trim() ? resolve(process.env.DSH_HOME) : join(homedir(), ".dsh");
28
+ const anchor = join(dshHome, "profiles", "node_modules", specifier, "package.json");
29
+ const real = realpathSync(createRequire(anchor).resolve(specifier));
30
+ return import(pathToFileURL(real).href);
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
18
36
  // @deepseek-ai/dsh-typert-protocol 是 ESM 包。Node 20 早期版本尚不支持
19
37
  // require(ESM),因此统一用 import() 加载;fallback 时先用 createRequire
20
38
  // 解析出实际文件,再以 file URL 导入。
21
39
  async function loadTypert() {
40
+ const fromFallback = loadInstallFallback("@deepseek-ai/dsh-typert-protocol");
41
+ if (fromFallback !== null)
42
+ return fromFallback;
22
43
  try {
23
44
  return await import("@deepseek-ai/dsh-typert-protocol");
24
45
  }
package/lib/remote.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chaoset/session-archive",
3
- "version": "0.3.0",
3
+ "version": "0.3.3",
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",
@@ -33,13 +33,7 @@
33
33
  }
34
34
  },
35
35
  "optionalDependencies": {
36
- "@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.8"
37
- },
38
- "scripts": {
39
- "build": "bun ../../scripts/build.mjs",
40
- "typecheck": "tsc -p tsconfig.json --noEmit",
41
- "test": "bun ../../scripts/build.mjs && vitest run",
42
- "prepublishOnly": "bun run test"
36
+ "@deepseek-ai/dsh-typert-protocol": "^0.1.1-rc.2"
43
37
  },
44
38
  "repository": {
45
39
  "type": "git",
@@ -51,5 +45,10 @@
51
45
  },
52
46
  "engines": {
53
47
  "node": ">=22.19.0"
48
+ },
49
+ "scripts": {
50
+ "build": "node ../../scripts/build.mjs",
51
+ "typecheck": "tsc -p tsconfig.json --noEmit",
52
+ "test": "node ../../scripts/build.mjs && vitest run"
54
53
  }
55
- }
54
+ }