@mzzsfy/dsh-session-manager 0.8.1 → 0.9.1

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/README.md CHANGED
@@ -1,28 +1,24 @@
1
1
  # @mzzsfy/dsh-session-manager
2
2
 
3
- DeepSeek Harness 会话生命周期管理插件:自动归档 + 归档面板 + 归档删除 + 回收站还原重挂载 + 历史输入浮层 + 插话撤回。
3
+ DeepSeek Harness 会话生命周期管理插件:自动归档 + 归档面板 + 归档删除 + 回收站还原重挂载。
4
+
5
+ 历史输入浮层、插话撤回与对话分叉已迁至独立插件 `dsh-context-manager`(会话上下文管理);工作区文件夹运行标记见 `dsh-turn-notify`。
4
6
 
5
7
  ## 功能
6
8
 
7
- - 历史输入浮层:输入焦点处按 `Alt+↑` 唤起浮层(平时界面零占位),浏览并回填历史输入。client 半区挂官方 `conversation.input.dock` 插槽(渲染为零高度锚点);条目点选或 `↑/↓` 选择(高亮行带左侧色条、自动滚入可视区)、`Enter` 填入、`Esc`/外点关闭(捕获阶段拦截,先于 Lexical 光标移动;IME 组合中跳过);浮层与输入框同宽对齐、不透明实底,选中态高亮强化;回填一律走宿主公共契约 `inputActions.setDraft`(不直改编辑器 DOM)。宿主缺该插槽或 `inputActions` 缺失时本功能整体不注册不渲染,快捷键与浮层均不存在,不影响其余能力。
8
- - **范围导航**:浮层内 `←/→` 切换范围,范围序为 **常用 → 当前会话(默认落点)→ 本工作区 → 全部工作区**,`→` 向更大范围,`←` 返回收藏,边界停住;范围显示为浮层左上角徽标。
9
- - **工作区持久缓存**:每工作区一个 JSON 文件(`~/.dsh/historyPrompt/<工作区>-<路径哈希>.json`,可辨认 + 防同名冲突),内容为该工作区聚合后的输入条目(带 `sid` 来源会话溯源)。浮层请求直接读缓存文件立即返回(毫秒级,响应 `{ inputs, aligned }`);**对齐**在后台进行:解压范围内最近会话产物(经官方 `sessionQuery.readSession`,仅 `source.kind === 'user'` 的人类输入,工具结果回填与插件注入排除)、与缓存合并去重后原子写回(临时文件 + 改名)。对齐时机:插件启动对齐最近会话覆盖的工作区、每次浮层请求触发(同工作区 30 秒节流)、**运行中会话参与对齐(输入实时追加)**。
10
- - **范围语义**:`prompts` 用户显式收藏的常用提示词(全局单文件 `prompts.json`,不按工作区,详见收藏交互);`session` 该会话输入(缓存按 `sid` 过滤);`workspace` 同 cwd 工作区缓存;`global` 全部工作区缓存并集。
11
- - **上限与首次对齐**:全部历史最多保留最新 200 条(`HISTORY_INPUT_LIMIT`)、单条截 2 万字符(`HISTORY_INPUT_MAX_CHARS`),聚合精确文本去重保留最新时间;**每会话首条保护**:超出上限被挤出时,每个来源会话在去重后集合中的最早条目仍保留(会话开场提示词最旧也最有复用价值,时间倒序截断总先挤掉它们;保护在去重后集合上计算,首条文本已被更新的会话复用时不再按旧会话重复追加;无 sid 的收藏条目不触发)。首次(该工作区尚无缓存文件)`aligned=false`,client 显示「首次对齐历史中」提示并每 3 秒(`HISTORY_REPULL_MS`)静默重拉;单会话产物读取失败仅告警跳过;scope 非法或缺省回退 `session`。
12
- - 常用提示词收藏:`prompts` 以外的范围,历史行鼠标悬停时行尾出现收藏星标(已收藏实星、未收藏空心),点击即收藏/取消(经 `POST /api/session-manager/prompts/toggle`),toast 反馈并同步星标;`prompts` 范围右上角「编辑」按钮进入编辑态:行内文本框直接改(Enter/失焦保存,实现为移除旧文本 + 收藏新文本)、行尾 `×` 删除、底部输入框 Enter 新增,「完成」退出;上限 `HISTORY_PROMPTS_MAX` 条,超出裁掉最旧;收藏与自动对齐的历史缓存互不覆写(工作区缓存列举跳过 prompts.json);global 范围读取走 stat 指纹缓存(`listWorkspaceCachesCached`),产物未变的文件不重复读盘;client 与 core 的 `HISTORY_SCOPES` 镜像由 parity 测试锁定。
13
- - 历史浮层启停开关:低频功能,归档面板末行小尺寸开关(规约 switch 形态 `sm-histsw`,状态选择器锚定 `input[type=checkbox]`);值存宿主 settings(`historyEnabled`,默认启用,原生设置页与本面板同存储即时同值),读写经本插件 `GET/POST /api/session-manager/history-enabled`(client 写 settings 不经宿主 remotes,零版本脆弱依赖);浮层挂载拉取一次,停用即锚点/快捷键/浮层整体不渲染、键盘监听放行,变更刷新页面生效。
14
- - 插话撤回:插话发送(steer)后、消息尚未被智能体应用(宿主队列快照中仍存在 `placement=steering` 条目,即 Inbox next-step 等待 step 边界 claim)期间,撤回图标**直接出现在该插话气泡的原生操作图标排**(复制图标旁,与其同排同款):经 MutationObserver 定位官方 pending steering 气泡的语义标记 `data-pending-steering` 及其图标排(CSS module 类名后缀 `_actions`),注入 undo 弯箭头按钮并**克隆官方按钮 className**——尺寸/hover/悬停显隐(reveal)全部原生;气泡被应用后整棵卸载,注入按钮随之消失。dock 插槽本体 `display:none` 零占位,仅承载观察与注入;官方 DOM 结构漂移时注入静默跳过(不报错,干净禁用精神);点击经官方 `ISession.updateQueue(itemId, {kind:'remove'})` 摘除(对 next-step 同样有效,无运行状态限制——智能体停止后残留的未送达插话同样可撤),成功才回填输入框草稿(`inputActions.setDraft` 整体替换,与历史浮层回填同语义,**会覆盖输入框中未发送的既有草稿**)并 toast 提示;回填自身失败(会话切换等竞态)时经 toast 兜底展示原文;消息已被应用(竞态窗口内被 claim,宿主返回 `session/queue-item-not-found`)时专用文案报错且不动草稿。含附件的插话(text 为 null)图标禁用并提示(与官方队列编辑同为纯文本限制,撤回丢附件);subagent 非 continuable 会话不注入(与官方队列面板 queueMutable 同规);RPC 走会话绑定面 `binding.session.updateQueue`(RemoteResult 不抛错,与官方 conversation 服务零耦合),会话绑定缺失或会话面无 `updateQueue`(旧宿主)时返回空 props 整体禁用。归档面板提供启停开关(`steerRecallEnabled`,默认启用,开关行在历史浮层开关之下,复用同款 switch 形态),读写经本插件 `GET/POST /api/session-manager/steer-recall-enabled`,停用即不注入并移除已注入按钮,变更刷新页面生效。
15
9
  - 自动归档:host 半区对超期会话走官方 `workspace.archiveSession` 通道,三个触发源共用同一评估与门闩:新会话创建(`session/created`,按该会话所属工作区限定)、settings 就绪后的启动补扫(全量,清掉停机期间积压)、每日周期轮(全量,经宿主 timer 服务固定短 tick + 到期判断)。幂等:已归档会话不参与评估。阈值 `autoArchiveDays` 默认 7,`0` 关闭;周期间隔 `autoArchiveIntervalHours` 默认 24,`0` 关闭周期轮,变更经周期 tick 对账(关闭即时暂停、重启用最迟下个 tick 生效、缩短经锚定钳制前移,最长等新间隔而非等满旧周期)。评估筛选:createdAt 纯内存预筛 + 已归档跳过 + stat 后活跃度判定,locate 缺失(第三方后端)与产物不可读的会话一律跳过,宁可漏归档不可误归档。经 settings 命名空间 `session-manager` 注册(schema 拒绝负数与非整数)。timer 为软依赖:宿主定时服务不可用时仅周期轮停用,面板顶部提示,插件其余能力不受影响。
16
- - 自动归档配置:归档面板「已删除」区下方的配置行,阈值天数与检查周期小时数两个数字输入,失焦或 Enter 单字段即时提交,非法输入前端拦截不发请求,服务端失败回读生效值回滚;读写经本插件 `GET/POST /api/session-manager/auto-archive`(POST 部分更新,仅接受出现且为非负整数的字段,空字段拒绝),值存宿主 settings 与评估逻辑同源,`0` = 关闭,GET 返回含默认回退的当前生效值。
10
+ - 自动归档配置:归档面板「已删除」区下方的配置行,阈值天数与检查周期小时数两个数字输入,失焦或 Enter 单字段即时提交,非法输入前端拦截不发请求,服务端失败回读生效值回滚;读写经本插件 `GET/POST /api/session-manager/auto-archive`(POST 部分更新,仅接受出现且为非负整数的字段,空字段拒绝),值存宿主 settings 与评估逻辑同源,`0` = 关闭,GET 返回含默认回退的当前生效值。配置行的行为说明经原生 `title` 悬停展示(设置侧栏为滚动容器,CSS 气泡会被 overflow 裁剪,故不做自绘气泡),文案由源码契约测试锁定。
17
11
  - 归档面板:设置页「会话归档」分区,数据为 client 侧 `session.list` 行 ∩ `workspaces.follow` 归档快照的交集,按更新时间倒序;主列表只展开最近 `ARCHIVE_PAGE_SIZE`(100)条,列表尾部「按工作区浏览」按钮直接进入二级视图查看全部(主列表不翻页,防归档集合无限增长拖垮渲染)。二级视图:无搜索词时按工作区分组(组间按组内最新活跃倒序,分组默认收起,展开即见组内首页并可继续翻页,`workspace` 假值并入「未分组」组);输入搜索词后平铺展示标题命中(不区分大小写子串,标题缺失回退会话 id 天然可搜)的全部归档会话并显示匹配计数,同样分页。行内标题前显示所属工作区徽标——映射优先走 workspace 账本(`sessionIds`,与官方 dsh-client-ui-workspace 的 workspaceBySession 同构),cwd 命中某登记工作区路径时回退该工作区标题(较官方「cwd basename 直接回退」收紧,防未登记目录名冒充工作区),均未命中显示「未分组」;工作区 title 缺失回退路径末段。镜像函数 client 与 core 双实现由 parity 测试锁定。行内支持取消归档与删除。
18
12
  - 归档与操作通知:host 归档动作经 `workspace.follow` 的 `archived` 增量帧到达 client,集合差分得到新增会话,经公共通知依赖 `@mzzsfy/dsh-toast` 顶部居中显示带会话标题的文案:单个显示如「会话「修复登录页」已归档」,多个显示「有 N 个会话已归档:标题1、标题2」(N 恒为真实总数),标题数超过 `TOAST_MAX_TITLES` 只列前 `TOAST_MAX_TITLES` 个并以「 等」收尾,标题缺失、空白或行不存在回退会话 id;host 侧逐会话归档成功时写一条 info 日志(含会话 id)。面板操作(恢复 / 删除 / 重新挂载等)的成功与失败反馈同样经该依赖展示,失败提示常驻待确认。dsh-toast 为普通 npm 依赖由本插件 dependencies 声明随装(表层 manifest 不再单列,装载经 dsh fallback 沿 bundles 依赖闭包补链),其宿主占位条目由本插件 cordis.patch.yml 代挂。
19
- - 删除:仅对已归档会话生效(运行中守卫先于执行,执行前 TOCTOU 复检,运行中的会话不可删除;OS 回收存在数百 ms 异步窗口,复检通过后仍可能恢复运行——此时回收已完成,响应附警告并落服务端日志),两段式确认(展示标题 / 日志体积,产物已缺失时以「产物已丢失」替代体积)后按 locate → trash → 台账 → detach → 归档清理单序执行;同 id 并发删除仅首个生效,其余以「正在删除中」拒绝。会话产物目录整体移入系统回收站(Windows PowerShell VisualBasic / macOS Finder / Linux gio;Windows 路径经环境变量传入 PowerShell,含空格或特殊字符的路径安全),可还原,不做直接删除降级。trash 成功即写入已删除台账(独立 storage domain `session_manager`,读改写经进程内互斥链串行化且单次操作带超时兜底,条目上限 200 裁最旧),记录会话 id 与产物原位置。产物**目录**已缺失的会话,仅当已归档或台账有记录(同 id 重删的残留收尾)时跳过回收与台账、仅解除列表关联,提示「产物已不存在,已完成列表清理」;两者皆无的缺失可能是新建会话尚未落盘,直接拒绝以防剥离活会话。
20
- - 已删除分区与重挂载:面板「已删除」区列出台账条目(标题 / 原位置 / 删除时间)。用户在系统回收站将会话文件夹还原到原位置后点「重新挂载」,经官方 `workspace.attachSession` 挂回工作区列表并清除台账;「移除记录」幂等清除单条。还原动作本身始终由用户在系统回收站完成,插件不驱动系统回收站。
13
+ - 删除:仅对已归档会话生效(运行中守卫先于执行,执行前 TOCTOU 复检,运行中的会话不可删除;OS 回收存在数百 ms 异步窗口,复检通过后仍可能恢复运行——此时回收已完成,响应附警告并落服务端日志)。**三次确认**:击「删除」展示标题 / 日志体积(产物已缺失时以「产物已丢失」替代体积)→ 行内「移入回收站」确认 → **弹窗强提示**(说明删除会影响其他插件的工作、若无特殊需求请不要删除,携会话标题,确认后才发请求)。确认后按 locate → 处置 → 台账 → detach → 归档清理单序执行;同 id 并发删除仅首个生效,其余以「正在删除中」拒绝。处置两级:优先移入系统回收站(Windows PowerShell VisualBasic / macOS Finder / Linux gio;Windows 路径经环境变量传入 PowerShell,含空格或特殊字符的路径安全);**系统回收站不可用的环境(Docker 容器无 gio / dbus 等)自动降级为插件回收区**(`~/.dsh/trash/session-manager`,rename 搬移,跨设备 EXDEV 回退复制),仍可经重挂载移回,不做无暂存的永久删除;双失败才会话保留并拒绝。处置成功即写入已删除台账(独立 storage domain `session_manager`,读改写经进程内互斥链串行化且单次操作带超时兜底,条目上限 200 裁最旧),记录会话 id、产物原位置与回收区条目的暂存路径;响应附处置模式(`os` / `quarantine`),面板成功文案随之区分。产物**目录**已缺失的会话,仅当已归档或台账有记录(同 id 重删的残留收尾)时跳过处置与台账、仅解除列表关联,提示「产物已不存在,已完成列表清理」;两者皆无的缺失可能是新建会话尚未落盘,直接拒绝以防剥离活会话。
14
+ - 已删除分区与重挂载:面板「已删除」区列出台账条目(标题 / 原位置 / 删除时间)。OS 回收站条目:用户在系统回收站将会话文件夹还原到原位置后点「重新挂载」;**回收区暂存条目(heldPath)重挂载自动把产物从回收区移回原位置再挂载**,无需手工搬移。挂载经官方 `workspace.attachSession` 并清除台账;「移除记录」幂等清除单条。系统回收站的还原动作始终由用户在回收站完成,插件不驱动系统回收站。
21
15
 
22
16
  ## 回收站还原与重新挂载
23
17
 
24
18
  删除移入系统回收站的是**会话产物目录**,「原位置」形如 `C:\Users\<你>\.dsh\sessions\--<工作区路径编码>--\<会话id>\`(工作区目录名由宿主对 cwd 做编码,非裸路径;目录内是 `session.jsonl.zstd` 日志)。辨认以面板「已删除」区记录的原位置为准,无需理解编码规则。
25
19
 
20
+ **插件回收区条目**(环境无系统回收站时降级产生):产物暂存于 `~/.dsh/trash/session-manager`,无需手工搬移——直接点「重新挂载」,插件自动把产物移回原位置后挂载。
21
+
26
22
  > 0.1.3 版本删除的条目回收的是日志**文件** `session.jsonl.zstd` 而非目录:还原该文件即可(目录本身未被移除),还原后同样走「重新挂载」。
27
23
 
28
24
  还原步骤(系统回收站操作):
@@ -45,11 +41,14 @@ DeepSeek Harness 会话生命周期管理插件:自动归档 + 归档面板 +
45
41
  | locate 返回 undefined(SQLite 等后端) | 拒绝执行,提示后端不支持,无副作用 |
46
42
  | 产物目录已缺失(且已归档或台账有记录) | 跳过归档资格 / 回收 / 台账,仅 detach 与归档清理,提示「产物已不存在,已完成列表清理」;清理半失败转 partial 并聚合失败点,重试即补全 |
47
43
  | 产物目录已缺失(未归档且无台账记录) | 拒绝执行(可能是新建会话尚未落盘,剥离活会话属破坏性误删),无副作用 |
48
- | trash 失败 | 整体中止,提示失败,目录与台账未动,可重试 |
44
+ | trash 失败、回收区搬移成功 | 降级为插件回收区暂存(容器无 gio / dbus 等场景),台账记录暂存路径,响应 `mode=quarantine`;原始回收站错误落服务端日志;重挂载时自动移回原位置 |
45
+ | trash 失败、回收区搬移也失败 | 整体中止,提示系统回收站与插件回收区均不可用(携回收区错误),目录与台账未动,可重试 |
49
46
  | trash 成功、detach 失败 | 视为已删除,提示「已移入回收站,但移除列表记录失败」;还原前重试将走产物缺失路径完成列表清理(台账保留),或还原后走「已删除」区重挂载 |
50
47
  | trash 成功、归档清理失败 | 已删除但归档集合残留,提示「已移入回收站,但移除归档记录失败」;经取消归档重试清理(幂等) |
51
48
  | trash 成功、台账写入失败 | 已删除,提示「已移入回收站,但重挂载记录失败」,其余步骤照常完成 |
52
- | 重挂载、产物未还原 | 拒绝,提示先到系统回收站还原,无副作用 |
49
+ | 重挂载、产物未还原(OS 回收站条目) | 拒绝,提示先到系统回收站还原,无副作用 |
50
+ | 重挂载、回收区暂存已缺失(原位置亦无产物) | 拒绝,提示暂存缺失无法找回,无副作用 |
51
+ | 重挂载、台账域打开失败 | 入口即拒绝(移回依据不可得,不做静默跳过),无副作用 |
53
52
  | 重挂载、无匹配工作区 | 拒绝,提示未找到会话所属工作区,无副作用 |
54
53
  | 重挂载、attachSession 失败 | 拒绝并透出原始错误,台账保留供重试 |
55
54
  | 重挂载、挂载后台账清除失败 | 挂载已生效,提示 partial「已重新挂载,但清除台账记录失败」,经「移除记录」收尾 |
@@ -65,23 +64,12 @@ DeepSeek Harness 会话生命周期管理插件:自动归档 + 归档面板 +
65
64
  - 已删除台账:独立 storage domain `session_manager`(global 单列表),非 workspace 域、非审计层——存在意义仅为重挂载定位产物原位置。trash 成功即记录(位于 detach 前),台账失败仅降级重挂载便利,不回滚删除;同 id 再次删除替换旧条目。台账读改写经进程内互斥链串行化(并发删除不再有丢更新窗口),条目上限 200、超出裁最旧,防无界增长写放大。台账不随产物还原自动清除,以「重新挂载」或「移除记录」收尾;清空回收站后的残留条目无恢复价值,应手动移除。
66
65
  - 评估的活跃时间:JSONL 后端以产物 mtime 作为最近活跃代理,updatedAt = max(createdAt, mtime);非 JSONL 后端退化为 createdAt。评估两级筛选:先用 createdAt 纯内存预筛(mtime 只会增大 updatedAt,createdAt 未超期必不超期),仅对预筛存活者做产物 stat / blank 探测,活跃会话零 IO。空白判定:live 会话 seq=0,冷会话以 JSONL 产物「仅 header 一行」判定,locate 不可用的后端按非空白处理。评估整体带超时兜底(宿主服务挂起时门闩必然复位,不会永久停摆);单会话归档失败仅告警不中断整轮。
67
66
  - 无批量操作、无正文内容搜索(归档库仅标题子串检索)、无会话详情预览。
68
- - 归档库的组织与检索:分组键为行投影的工作区标题,同名标题的不同工作区在库视图合并为一组(行投影不含工作区 id,不为分组扩展投影公共形态);搜索仅匹配标题,不做正文全文检索(复用 history-cache 解压基建的正文搜索属后续独立任务);分页粒度 100 为统一常量(`ARCHIVE_PAGE_SIZE`),搜索命中与组内展开共用同一分页机制,主列表固定首页不翻页;视图切换、展开与搜索状态均为面板内存态,离开设置页即复位,不做持久化。
67
+ - 归档库的组织与检索:分组键为行投影的工作区标题,同名标题的不同工作区在库视图合并为一组(行投影不含工作区 id,不为分组扩展投影公共形态);搜索仅匹配标题,不做正文全文检索(正文搜索属后续独立任务);分页粒度 100 为统一常量(`ARCHIVE_PAGE_SIZE`),搜索命中与组内展开共用同一分页机制,主列表固定首页不翻页;视图切换、展开与搜索状态均为面板内存态,离开设置页即复位,不做持久化。
69
68
  - 自动归档评估门闩:评估进行中其他触发源(含周期轮与 session/created)的新触发直接丢弃,不做排队;漏掉的会话由下一次触发兜底,启动补扫与每日周期轮保证了积压会话最迟一个周期内归档。产物不可读(mtime 探测失败)的会话视为已删除,不参与归档,防止删除后的会话被重新归档复活。subagent 内部会话(`origin: 'subagent'`)永不参与归档:官方主列表即以 origin 排除 subagent(归档集合仅服务用户会话),误归档只产出无 title 回退 cwd 名的不可辨认面板行与无意义通知。timer 软依赖:宿主定时服务缺失或调用失败时周期轮停用,设置页显示降级提示(session/created 触发与启动补扫不受影响);timer 服务晚于插件激活时周期轮自动补武装。
70
- - 归档提示以「连续两个 ready 快照」为差分启用条件:基线首装(启动与重连)不提示存量,重连基线携带的离期新增仍会提示。通知展示经公共依赖 `@mzzsfy/dsh-toast`(external require),本包不再自带通知 UI。client.js 为单文件自包含格式,守卫逻辑与 core.mjs 各存一份镜像,修改需两处同步(projectRows / archiveToastStep / projectDeletedRows / pageArchiveRows / groupArchiveRowsByWorkspace / filterArchiveRows 同规);test/parity.test.mjs 对各组镜像做行为级对照并锁定 client 侧确认态文案与 host MESSAGES 同值。client 已删除列表加载失败时保留旧数据并 console.warn,不渲染成「无记录」。路由错误响应:业务错误原样透传中文文案,系统级错误(带 fs 错误码,message 内嵌绝对路径)收敛为固定文案并落服务端日志。
71
- - 历史输入的已知取舍:
72
- - 对齐扫描各工作区最近 20 个会话(`HISTORY_SESSION_SCAN_LIMIT`,更早会话的输入不入缓存),解压发生在后台、永不阻塞浮层响应,代价是首次对齐期间列表为空、需等静默重拉。
73
- - **解压不重复执行**:每会话提取结果持久化在工作区缓存 `extracts` 段并附产物 stat 指纹(mtimeMs+size),对齐时先 stat 比对、产物未变零解压,判断完全基于磁盘、跨重启生效;运行中会话(当前会话)提取结果只保留内存不落盘——产物持续变化,落盘指纹立即失效。
74
- - 启动零解压(历史直接读磁盘缓存,重启前的输入本就在 entries 里),全量对齐延迟 30 秒(`HISTORY_STARTUP_DELAY_MS`)再跑且只回溯最近 100 个会话(`HISTORY_STARTUP_SCAN_LIMIT`)覆盖的工作区。
75
- - 对齐中连续解压占用超 200ms(`HISTORY_ALIGN_SLICE_MS`)即让出 100ms(`HISTORY_ALIGN_YIELD_MS`,解压为 CPU 操作,不设让出会长时间霸占主循环);巨产物跳过自动对齐,跳过线按宿主版本黑名单取值:0.1.1/0.1.2 系列(解压实现无周期让出)8MiB,其余(0.1.5 实测 `readZstdPrefix` 逐帧解压 + 周期让出,不阻塞主循环)16MiB(`HISTORY_ALIGN_LEGACY/MODERN_MAX_ARTIFACT_BYTES`,压缩字节数)——上限防的是解压耗时与事件对象内存峰值失控(压缩比约 1:3.4,超线产物解压后可达数百 MB);版本探测经 require 链解析宿主清单,失败保守按旧线。
76
- - header 查找走 ctx 级 TTL 缓存(inputs 路由不每次全量扫描 listSessions)。
77
- - 对齐为双车道:批量车道(窗口对齐)与焦点车道(单会话实时追加)各自串行互不等待,会话范围请求检测到产物指纹失配即触发焦点对齐并返回 aligned=false。
78
- - 浮层打开期间固定节奏轮询当前范围(数据可能晚于首次响应到达,一次性重拉预算会让迟到数据永不出现);单会话首条数据可见预算 3s:会话范围路由触发焦点对齐后就地等待 2s(`HISTORY_FOCUS_WAIT_MS`),正常会话单次请求内拿到新数据,超时(巨产物)走轮询流式补齐。
79
- - 不解压搬进 worker:产物为多帧 zstd + 帧扫描 + 记录解码 + 版本协商,`readSession` 深度耦合宿主持持层,worker 内复刻等于维护第二份产物解析实现,宿主升级即漂移。
80
- - 缓存上限 200 条(`HISTORY_INPUT_LIMIT`),超出裁掉最旧,每会话最早条目例外保留(首条保护,见「上限与首次对齐」);巨产物(超线跳过对齐,见对齐参数)会话的条目只能来自既有缓存,首条从未入库则无法恢复;新输入从发送到浮层可见有秒级延迟(宿主批量刷盘 200ms + 焦点对齐 + 轮询节奏),非严格实时。
81
- - 缓存文件为明文 JSON(输入内容落盘 `~/.dsh/historyPrompt`,与产物本身同级敏感);单条超长文本(大段粘贴)在 host 侧截断,回填与展示均用截断后文本。
82
- - 交互收敛为快捷键唤起浮层(`Alt+↑`,无 mac 系统占用,与编辑器光标移动无冲突),无常驻界面元素。
69
+ - 归档提示以「连续两个 ready 快照」为差分启用条件:基线首装(启动与重连)不提示存量,重连基线携带的离期新增仍会提示。通知展示经公共依赖 `@mzzsfy/dsh-toast`(external require),本包不再自带通知 UI。client.js 为单文件自包含格式,守卫逻辑与 core.mjs 各存一份镜像,修改需两处同步(projectRows / archiveToastStep / projectDeletedRows / pageArchiveRows / groupArchiveRowsByWorkspace / filterArchiveRows 同规);test/parity.test.mjs 对各组镜像做行为级对照并锁定 client 侧确认态文案与 host MESSAGES 同值。client 已删除列表加载失败时保留旧数据并 console.warn,不渲染成「无记录」。路由错误响应:业务错误原样透传中文文案,系统级错误(带 fs 错误码,message 内嵌绝对路径)收敛为固定文案并落服务端日志。header 查找走 ctx 级 TTL 缓存(归档/删除/重挂载路由不每次全量扫描 listSessions)。
83
70
  - 重挂载的并发窗口:attachSession 后、台账清除前进程中断,残留条目重挂载时因官方 attachSession 幂等(已在 sessionIds 中则跳过校验直写)无副作用,再次点按或「移除记录」即可收尾。台账域打开失败时已删除 / 重挂载 / forget 以 400 拒绝;删除路由走 partial 降级(其余步骤照常,提示「已移入回收站,但重挂载记录失败」),不做无台账中断——产物进回收站后中断删除只会造成状态不一致。
84
- - 测试基建:trash 为进程级唯一 OS 副作用出口,经 `executor.trashPath` 注册表注入,删除全流程(trash 成败 / 台账成败 / 归档清理)已有路由层覆盖。
71
+ - 测试基建:trash 与回收区搬移/移回为进程级 OS 副作用出口,经 `executor`(trashPath / moveToQuarantine / restoreFromQuarantine)注册表注入,删除全流程(OS 回收站成败 / 回收区降级 / 台账成败 / 归档清理 / 重挂载移回)有路由层覆盖。EXDEV 分支经 fs 注入桩测试(真实跨设备场景难以在测试中稳定构造)。
72
+ - 删除降级的已知取舍:系统回收站**任意**失败(不限命令缺失,含 dbus 不可用、权限拒绝)都触发回收区降级——按错误类别区分收益低、降级后仍可还原;回收区目录 `~/.dsh/trash/session-manager` 不自动清理(与系统回收站同责,由用户清空),重挂载移回成功后暂存条目随台账清除,但已移回前的重复暂存或用户手工干预可能留下孤儿目录,空间占用以回收区目录大小为准;跨设备搬移回退 `cp + rm`,中断窗口内两侧各有部分数据时以重试补齐(cp 幂等覆盖、rm force)。
85
73
 
86
74
  ## 验证
87
75
 
@@ -98,3 +86,7 @@ node scripts/dev-link.mjs dsh-session-manager # 仓库根执行:归一 profile
98
86
  ```
99
87
 
100
88
  工作副本以 junction 挂进 profile,改代码保存即热重载(host 半区)或刷新页面生效(client 半区),无需发版;规约与全仓归一见仓库根 `node scripts/dev-link.mjs all`。
89
+
90
+ ## dsh 版本兼容
91
+
92
+ 三版本全部通过:会话树渲染、归档入口、激活 live、diagnostics 0 findings。
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mzzsfy/dsh-session-manager",
3
3
  "description": "会话自动归档与管理:超期自动归档、归档面板、删除进系统回收站、还原后一键重挂载",
4
- "version": "0.8.1",
4
+ "version": "0.9.1",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
7
7
  "exports": {