Repository navigation
0.2.0-rc.1 升级后部分会话被静默移出工作区(显示未分组) #8237
fanshuishui8
started this conversation in
General
Replies: 1 comment
|
补充更正:我最初把触发条件归给了「升级时 V3→V4 日志迁移导致启动期索引不完整」,这个归因不准确,特此更正。 真正的原因与上游 #1485 同类:并发实例共享 DSH_HOME。本机现场证据:
给维护者的两点补充:
本地临时修法已验证:停写者 → 备份 workspace.json → 按 header.cwd 把 id 插回 sessionIds → 重启 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
环境
@deepseek-ai/dsh0.1.7-rc.2 → 0.2.0-rc.1(npm 全局安装),dsh webprofilenpm i -g @deepseek-ai/dsh@0.2.0-rc.1(升级时旧进程仍在跑),随后重启dsh web<session>/session.v4.jsonl.zstd现象
header.cwd与某个工作区的path完全一致(realpath 相等),不存在目录搬家~/.dsh/storages/workspace.json→tables.workspaces.<workspaceId>.sessionIds里已经没有它们证据链
~/.dsh/sessions/--Users-wangyun-work-Python--/<id>/session.v4.jsonl.zstd的首行得到 header:{"id":"session-…","version":4,"cwd":"/Users/wangyun/work/Python","agentPreset":"standard",…}与工作区
path=/Users/wangyun/work/Pythonrealpath 相等;对照组(仍留在该工作区里的会话)cwd 一字不差。workspaceRegistry.list()打印过该工作区的sessionIds,该会话当时是数组第一项(它是当时最新的会话)。/Users/wangyun/work/Python/dsh)14 项里没有另外 10 个。其余 59 个会话的成员关系完好。archivedSessionIds里没有它们)、不是 subagent(origin为空)、重启不恢复。源码级定位(0.2.0-rc.1)
packages/…/dsh-workspace/lib/index.js:102:178(mutate的裁剪分支)——任何一次写入都会按「当时那一刻的索引」裁剪并落盘::387/:389启动时replaceHeaderIndex(await this.listStoredHeaders()),listStoredHeaders()=sessionPersistence.list()的 header(:892);indexHeader()(:880起)在 header 读不到或realpath失败时只写invalidSessionPaths,不保留上一次的已知路径。reportFilteredCandidates()(:900)本应为每个被裁掉的 id 打一条 warn:workspace '<ws>' filtered session '<id>' from membership: <reason>(reason 含session header is missing)。它就是这条路径的「证人」,可惜
dsh web的 stdout 没有落盘,这次没能留下。attachSession的调用点只有dsh-api-session-controller/lib/index.js:702(新建会话带workspaceId)与:830(fork 的子会话);forkWorkspace()(:1037)在源会话不属于任何工作区时返回undefined,所以 fork 一个「未分组」会话,子会话同样不会归组。
期望行为
cwd命中某工作区而成员表里没有它,应幂等补挂。修复建议(任选其一即可)
readSessionHeader()确认一次,区分「确实读不到」与「索引尚未建好」;reportFilteredCandidates()之后,按 header.cwd 做一次幂等 re-attach。相关但不同根因
影响
会话内容没有丢(日志完整);丢的是工作区归属,而这是用户组织长会话的主要手段,且用户侧无法自行恢复(UI 无入口、重启不自愈)。
临时修法(本地已验证可行)
停掉
dsh web后,按每个会话 header 的cwd找到对应工作区,把 id 插回~/.dsh/storages/workspace.json里该工作区的sessionIds头部,再启动即可(启动时索引会按 header 重建,所以补回去能留住)。注意必须在停止状态下改 —— 运行中的进程持有内存记录,会在下次写入时覆盖文件。All reactions