Repository navigation
Releases: fujunchao/dsh-session-vault
Release list
v0.1.9
Adapt to DSH 0.2.1-rc.2: remove discontinued @deepseek-ai/dsh-client-runtime and dsh-client-ui-slots from client inject (and slots from deps); LocaleNamespaceMap augmentation now targets @deepseek-ai/dsh-client-locale/client. No runtime changes.
v0.1.8
修复:Windows 桌面版清除回收站会话后以「未分组」形式复活
根因
DSH 桌面版 0.2.0-rc.2 的 jsonl 会话写入器按 header(cwd+id)推导落盘路径:
materialized=false的打开写句柄在之后任意一次 flush(idle checkpoint、teardown drain)都会mkdir + persistHeader把已被清除的目录在原位重建,时机没有时限;session/disposed触发的writer.close()补落盘是异步且不被任何调用方等待的 drain+flush。
v0.1.7 的限时轮询守卫(约 0.7–2.5s)覆盖不到窗口之外的写回;一旦永久清除解除了归档遮蔽,这份迟到副本就会被宿主会话列表(磁盘扫描 ∪ 内存 live 会话)重新收进侧边栏,且无工作区归属——正是「未分组幽灵会话」。
修复
- 确定性冲刷:移入回收站 / 永久清除前调用
sessionPersistence.flushAll()(特性检测,失败降级为守卫+墓碑兜底)。在途事件与未落盘句柄当场冲到原位并置materialized=true,随后的 rename/删除把落盘结果一并带走,之后所有 flush 直接短路——写回源头被确定性消除,而不是赌时间窗。 - 清除墓碑巡检:清除提交时与回收站条目删除原子地登记墓碑(domain global 新增可选
purged字段,版本不变、兼容旧状态)。启动时与每次快照读取时巡检:原位再出现的副本被物理删除、重新加上归档遮蔽并刷新观察期;连续 7 天无复活的墓碑才退役。恢复 / 重新移入回收站时同名墓碑随之退役,绝不误删恢复数据。
其他
- 跨平台修复
sessionDirectoryFromArtifact测试的 POSIX 字面量断言(Windows 开发环境可跑全套测试)。 - 测试 22 项全绿;冒烟与宿主集成测试(9 项)通过。
升级:GitHub 安装用户更新到 tag v0.1.8 后重启 DSH 即可;已内置构建产物。
v0.1.7
v0.1.6 · 清除会话后不再出现未分组幽灵会话
修复
清除回收站会话后侧边栏出现「未分组」幽灵会话
根因:DSH 0.1.5 的会话列表由磁盘记录与宿主进程内存中的 live 会话合并而来(live 优先)。永久清除只删除了磁盘记录并解除工作区关联,宿主内存中的会话实例仍然存活——此时它既无归档遮蔽、也无工作区归属,恰好命中「未分组」分组的全部特征,于是刚清除的会话全部回到侧边栏。
修复:
- 清除时驱逐宿主内存中的存活会话:显式注入
sessions服务,经get→liveEntryFor→entry.detach()走公开路径移除 store 记录;对正在发布事件的会话置detachRequested延迟落钩 - 驱逐发生在解除归档遮蔽之前,避免列表轮询在间隙中闪现幽灵会话
- 内存清理失败时保留归档隐藏与待重试目录,返回
purge-pending(503)而不是误报成功,下次启动自动续清 - 启动/刷新对账把内存存活会话纳入保留范围,不因磁盘上暂无记录而误清归档标记与投影缓存
兼容 DSH 0.1.5 持久化快照结构
sessionPersistence.list()自 0.1.5 起返回{header, revision, sizeBytes?}[]快照而非SessionHeader[],本版双向兼容(persistenceHeaders),修复快照接口 500
测试
- 新增 host 集成回归测试(真实 Cordis 插件注入 + SessionStore + HTTP 流程,9 项),含「永久清除已加载会话并刷新后不得出现未分组幽灵会话」的端到端断言;指定
DSH_TEST_HOST_ROOT可额外验证真实宿主的会话查询合并逻辑
升级
dsh plugin --profile web remove dsh-session-vault
dsh plugin --profile web add github:fujunchao/dsh-session-vault#v0.1.6更新后重启 DSH 使新入口元数据生效并释放旧进程中的残留会话(仅刷新页面或只改 TypeScript 源码不足以更新宿主插件)。
Full Changelog: v0.1.5...v0.1.6
v0.1.5 · 修复回收站会话被误清与清除后复活
DSH Session Vault v0.1.5
修复两个会话在侧边栏"复活"的缺陷。
一、移入回收站后会话重新出现在侧边栏
moveToTrash 会把会话标记为归档,用于在记录移出 sessions 目录后遮蔽它。但回收站中的会话不在 sessionPersistence.list() 的结果内,v0.1.4 引入的快照期对账因而把它判为孤儿、清掉了这个归档标记——遮蔽随即失效,会话重新出现在侧边栏。
现在把回收站条目并入保留集合:新增 core.retainedSessionIds,由 reconcileOrphanedState 在内部合并,调用方无需(也无法)遗漏这层保护。
二、永久清除后会话被并入未分组
finalizeCommittedPurge 原先的顺序是:先 detachSession、再解除归档标记、最后才物理删除。中间存在一个窗口——记录仍在磁盘上,却已被移出工作区且不再带归档标记,恰好符合未分组普通会话的全部特征。
现调整为先物理删除,再清理状态与索引。若状态清理在删除后中断,最坏只剩下指向已删除会话的孤儿标记,而那正是对账每次读取快照时会自动收拾的东西;反向的失败模式(文件仍在但遮蔽已解除)则会让会话复活,明显更糟。
验证
pnpm check全绿:14 项测试(新增 3 项锁定回收站豁免语义,防止再次回归)- 真实环境完整走查:
- 归档 → 移入回收站 → 读取快照 → 归档遮蔽保持完好
- 随后永久清除 → 归档标记、回收站文件、
purging目录全部干净,sessions目录未复活任何记录
升级
以 link: 方式安装的重新构建并重启 DSH Web 服务即可。从 GitHub 安装的:
dsh plugin --profile web add github:fujunchao/dsh-session-vault#v0.1.5v0.1.4 · 修复归档会话在保险库中消失
DSH Session Vault v0.1.4
修复归档过的会话在保险库中消失、且无法管理的问题。
问题
对账原先只在插件启动时执行一次。因此在 DSH 运行期间被外部删除的会话(手动删除记录目录、其它工具清理等),留下的归档标记会一直残留到下次重启。
症状是「归档」计数显示为 0、归档标记却还剩一堆,归档过的会话在保险库里怎么也找不到,自然也无法对它们执行任何操作。未分组(Ungrouped)的会话由于不隶属任何工作区,更容易碰上这种情况。
修复
listSnapshot 现在复用刚刚成功取得的会话列举结果顺带对账——打开一次保险库页面即可自愈,无需重启服务。对账失败只记录告警,不影响快照本身返回。
同时把 reconcileOrphanedState 的入参由 ctx 改为调用方提供的 known 集合:安全约束(该集合必须来自一次成功的列举)因此显式落在函数签名上,启动路径与快照路径共用同一份判定,也避免了重复列举。
失败处理不变:列举失败时对账整体跳过并留到下次重试,绝不退化成「读不到就删」,以免一次存储故障被放大成归档状态被清空。
验证
pnpm check全绿:11 项单元测试、类型检查、构建、bundle smoke- 真实环境:创建会话 → 归档 → 从外部删除其目录 → 仅读取一次快照,归档标记即自动归零,全程未重启 DSH
升级
以 link: 方式安装的重新构建并重启 DSH Web 服务即可。从 GitHub 安装的:
dsh plugin --profile web add github:fujunchao/dsh-session-vault#v0.1.4v0.1.3 · 操作栏固定在列表底部
DSH Session Vault v0.1.3
操作栏不再需要滚动到底才能使用。
操作栏固定在列表底部
此前「全选当前结果」和归档、移入回收站、恢复、永久清除等按钮位于文档流末尾。会话较多时,勾选完还要一路滚到底部才能点按钮。
现在 .dsv-footer 改为 position: sticky; bottom: 0,并补上不透明背景、边框、毛玻璃与投影,确保列表内容不会从下方透出。
DSH 设置面板的滚动容器 overflow-y 为 auto,sticky 相对它生效。已在浏览器中实测:撑高列表制造滚动后,操作栏稳定停靠在容器底部,且完全遮挡下层内容。
其他
- 修正标题上方已过时的
DSH rc.7字样,改为不带版本号的表述,避免每次升级都要同步改动。 - README 中英文补充说明操作栏常驻行为。
升级
以 link: 方式安装的重新构建并重启 DSH Web 服务即可。从 GitHub 安装的:
dsh plugin --profile web add github:fujunchao/dsh-session-vault#v0.1.3浏览器需要硬刷新设置页,以加载新的客户端 bundle。
v0.1.2 · 修复空闲会话无法删除,新增启动对账
DSH Session Vault v0.1.2
修复了会话在正常使用下几乎无法删除的问题,并新增启动时的孤儿状态对账。
空闲会话不再被拒绝删除
此前只要 ctx.agents.get() 返回实例就拒绝移入回收站。但 Web UI 一旦打开过某个会话,进程内就会留下一个空闲 agent 实例,而 DSH 并未提供单独关闭它的接口——结果是除了从未在界面中打开过的会话,其余几乎都删不掉。原先的错误提示「请重启服务后再删除」也并不成立:浏览器重连后实例会立刻重建。
现在只拦截 status === 'running' 的会话,空闲实例记录日志后放行。运行中的会话、以及无法安全定位独立持久化目录的会话,仍然受到保护。
启动时对账孤儿状态
归档标记与会话投影缓存都以 sessionId 为键长期保存,而列表逻辑只正向遍历现存会话。因此会话若不经由本插件删除(例如手动删除记录目录),这些键会静默堆积,并且在界面上完全不可见。
新增 reconcileOrphanedState,在插件启动时清理掉指向已不存在会话的残留键。
安全约束:只信任一次成功的 sessionPersistence.list()。列举失败时对账整体跳过并留到下次启动,绝不退化成「读不到就删」——否则一次存储故障就会被放大成归档状态被清空。该边界语义已提取为 core.selectOrphanedIds,并用单元测试固定下来。
验证
pnpm check全绿:11 项单元测试、类型检查、构建、bundle smoke- 真实环境:注入孤儿标记后重启,确认被自动清除;空闲会话的「移入回收站 → 恢复」往返正常,数据无损
升级
以 link: 方式安装的无需改动,重新构建并重启 DSH Web 服务即可生效。从 GitHub 安装的:
dsh plugin --profile web add github:fujunchao/dsh-session-vault#v0.1.2v0.1.1 · 适配 DSH 0.1.1-rc.2
DSH Session Vault v0.1.1
围绕 DSH 0.1.1-rc.2 的兼容性维护版本,插件代码与对外接口未变更。
peerDependencies范围由^0.1.0-rc.7提升至^0.1.1-rc.2。旧范围按 semver 规则并不匹配0.1.1-rc.2,继续沿用会在重装依赖时解析到旧版本或触发 peer 冲突。- README 中英文版的版本声明改为标注最低要求
0.1.0-rc.7,并注明已在0.1.1-rc.2上验证。 - 补交
pnpm-workspace.yaml的minimumReleaseAgeExclude清单,修复 CI 因供应链策略拒绝新发布依赖而安装失败的问题。
已在 DSH 0.1.1-rc.2 上通过类型检查、单元测试、构建、bundle smoke 以及 /api/snapshot 端到端验证。