Skip to content

Releases: fujunchao/dsh-session-vault

v0.1.9

Choose a tag to compare

@fujunchao fujunchao released this 17 Oct 14:56

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

Choose a tag to compare

@fujunchao fujunchao released this 09 Oct 02:45

修复: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 会话)重新收进侧边栏,且无工作区归属——正是「未分组幽灵会话」。

修复

  1. 确定性冲刷:移入回收站 / 永久清除前调用 sessionPersistence.flushAll()(特性检测,失败降级为守卫+墓碑兜底)。在途事件与未落盘句柄当场冲到原位并置 materialized=true,随后的 rename/删除把落盘结果一并带走,之后所有 flush 直接短路——写回源头被确定性消除,而不是赌时间窗。
  2. 清除墓碑巡检:清除提交时与回收站条目删除原子地登记墓碑(domain global 新增可选 purged 字段,版本不变、兼容旧状态)。启动时与每次快照读取时巡检:原位再出现的副本被物理删除、重新加上归档遮蔽并刷新观察期;连续 7 天无复活的墓碑才退役。恢复 / 重新移入回收站时同名墓碑随之退役,绝不误删恢复数据。

其他

  • 跨平台修复 sessionDirectoryFromArtifact 测试的 POSIX 字面量断言(Windows 开发环境可跑全套测试)。
  • 测试 22 项全绿;冒烟与宿主集成测试(9 项)通过。

升级:GitHub 安装用户更新到 tag v0.1.8 后重启 DSH 即可;已内置构建产物。

v0.1.7

Choose a tag to compare

@fujunchao fujunchao released this 28 Sep 09:19

DSH 0.1.7-rc.2 adaptation: volatile Config + plugins.item card, purge resurrection guard (ensureDirectoryAbsent hard guard against in-flight writer resurrect), icon/closeLabel migration, session artifact locate-by-scan. 18 tests green.

v0.1.6 · 清除会话后不再出现未分组幽灵会话

Choose a tag to compare

@fujunchao fujunchao released this 12 Sep 03:31

修复

清除回收站会话后侧边栏出现「未分组」幽灵会话

根因: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 · 修复回收站会话被误清与清除后复活

Choose a tag to compare

@fujunchao fujunchao released this 31 Aug 02:32

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.5

v0.1.4 · 修复归档会话在保险库中消失

Choose a tag to compare

@fujunchao fujunchao released this 31 Aug 01:24

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.4

v0.1.3 · 操作栏固定在列表底部

Choose a tag to compare

@fujunchao fujunchao released this 23 Aug 08:10

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 · 修复空闲会话无法删除,新增启动对账

Choose a tag to compare

@fujunchao fujunchao released this 23 Aug 07:04

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.2

v0.1.1 · 适配 DSH 0.1.1-rc.2

Choose a tag to compare

@fujunchao fujunchao released this 22 Aug 07:16

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 端到端验证。

v0.1.0 · 首个公开版本

Choose a tag to compare

@fujunchao fujunchao released this 20 Aug 04:59

DSH Session Vault v0.1.0