Repository navigation
Releases
v0.4.1 — 「合并结果为空」的真相
修掉「合并结果为空」
这不是后端报错,而是你勾中的对话本身没有内容。
DSH 里可以存在「建了但一句话没说」的空对话,日志里只有三条初始化事件
(permission/preset、sandbox/mode、approval/policy)。这种对话在选择面板里
和正常对话长得一样,勾进去合并,剥掉噪音之后自然什么都不剩。
改了三处
- 选择面板把空对话灰掉、标「空对话」、点了没反应,悬停会说明原因
- 合并失败时不再只说四个字,而是逐个列出「这个对话读到 N 条,截取最近 K 轮后剩 M 条」,
读到 0 条就直接点名是它没有历史 - 事件层的
tool/call、tool/result也一并丢掉(正文里的工具调用块早就剥了,
事件层还留着宿主会报tool/call call_00_xxx has no advertised tool lifecycle)
排查记录
用 session-aeaa7874 + session-2140c055(各取最近 20 轮)连跑两次都成功:
5330 + 3441 → 5213 条事件,宿主写入并落盘。所以写入链路是通的。
0.4.0 — 合并会话正式可用
合并会话(/weld)正式可用
0.3.1 把它修通了,这一版扶正:按钮上不再标「实验」,文档从头讲清楚它装了什么、剥了什么、
什么情况下内容会显得少。
这一版改了什么
- 视图里的「合并为新会话(实验)」去掉实验标记,提示文案改为「几秒后侧栏会多出未命名,点开就能接着聊」
- README 新增「新对话里到底装了什么」:四类被剥掉的内容(思考过程 / 工具调用与结果 /
图片卸载与上下文压缩 / 重复初始化事件)各自为什么被剥,以及「源对话里 AI 光调工具时
看着内容少」这个代价 - 已知限制重写:补上「逐条写几千条事件要几百毫秒到几十秒,中间没有进度条」和
「同一个对话同时只能有一个写入者(session/writer-held)」 - 技术细节那节重写:
/weld不再是「自己造文件」,改成讲清楚
sessionPersistence.create+ 逐条append+flush三步,以及为什么第一步不能省 - 目录结构更新到当前实际文件
两个功能的分工
| 联合视图 | /weld |
|
|---|---|---|
| 类比 | 把几份文件摊在桌上,自己比对 | 把几份文件装订成一本新的,递给 AI |
| AI 看得见吗 | 看不见 | 看得见 |
| 会多出一个对话吗 | 不会 | 会 |
| 原对话会变吗 | 不会 | 不会 |
0.3.1 — 合并会话可用了
合并会话(/weld)不再是实验功能
之前生成的新对话点开报「加载失败」。根因是我们自己拼日志文件,而宿主对日志的校验很严
(turn 要连续、引用不能悬空、assistant 消息要带 stream……),照报错猜了四轮结构都没过。
现在改成让 dsh 自己写:
sessionPersistence.create()建日志文件与写句柄 —— 不能省,没有写句柄时
flush会静默返回,事件全留在内存里(账本有 id、磁盘没文件)sessions.create()+ 逐条append(),seq 由宿主发,天然连续handle.flush()落盘
顺带修掉三处只有走这条路才会暴露的问题:图片卸载/压缩事件的引用会悬空(直接丢弃)、
data.stream 不能整段删(重建节点时要 for..of,改成留空数组)、header 载荷不能带
type 但必须带 version。
实测:两个会话各取最近 20 轮 → 8207 条事件 → 1.2 MB 日志,新会话正常打开、能接着聊。
其他
- 视图按钮去掉「(实验)」标记
- README 与 CHANGELOG 同步更新(CHANGELOG 之前被 PowerShell 写成 GBK 乱码,已重写)
v0.3.0 — 视图只显示正文
0.3.0
联合视图只显示你和 AI 说的话
以前一屏里混着三种噪音,现在都滤掉了:
- AI 的思考过程:不显示,也不参与合并。以前的判断读的是内容块的
type字段,实际字段叫kind,所以一条都没命中——这是思考过程一直没被剥掉的真因。 - 工具调用与工具结果:
[调用 read_image]这类行不再出现,几十条连着刷屏的情况没了。 - 系统注入:
<AEGIS_DSH_ROUTING_BOOTSTRAP>、Time sampled while preparing turn 12…、Browser time zone for this request…、[Compressed conversation section]、Current working directory…这些宿主塞给 AI 的内容,以前被当成用户说的话搬上了桌,现在按整块/逐行规则过滤。
合并侧同步收紧
/weld 生成新对话时:剥掉思考过程(包括 data.stream 里那份逐 token 回放记录)、剥掉工具内容块与 tool/call、tool/result 事件、剥掉会话开头的重复初始化事件、引用去重。
已知问题:合并出来的新对话可能打不开
dsh 从磁盘读回日志时会校验结构(turn 必须连续、turn/start 必须跟在上一轮收尾之后、sourceEventSeqs 不能重复也不能指向后面的行),跨会话拼接很难同时满足,报 SessionFormatError: turn/start does not open the expected turn。
已试过四种修法都不行:按顺序重编号 turn、末尾轮补齐 turn/end、保留首组初始化事件、引用去重。要做稳得改成走宿主自己的 ctx.sessions.create(),让内核自己写日志,而不是手写文件。
按钮已标注「(实验)」,README 的「已知限制」里写清了。
安装:dsh plugin install dsh-union-view,装完重启 DSH。
0.2.0 — 联合视图里直接生成新对话
0.2.0 — 联合视图里直接生成新对话
在联合视图里直接生成新对话
勾几个对话 → 填「每个取最近 N 轮」→ 点「合并为新会话」。不用再手打 /weld 和对话编号。生成的新对话在侧栏最上面(显示「未命名」),点开能接着聊;原对话不受影响。提交后自动刷一次会话列表,不用手动刷新页面。
思考过程一律不搬
合并时会剥掉 AI 的思考过程,只留用户消息、AI 正文和工具调用记录。联合视图里也不显示思考过程。
具体剥两处:消息内容块里的 reasoning,以及 assistant/message.data.stream 里那份逐 token 的流式回放记录(blockType: reasoning + reasoning-chunks)。只剥前者不够——宿主重建节点时会读 stream,思考过程会从那儿冒回来。
实测焊 588 条事件:新会话里含 reasoning 字样的事件行 0 条、带 stream 的 0 条,文件 331 KB。同一批对话带思考过程时是 5 MB。
其它改动
/weld不带参数时列出最近 12 个对话(编号、时间、第一句话),照着抄就行- README 重写为面向普通用户的说明,技术细节收进折叠区
- 新增 CHANGELOG.md
安装
dsh plugin install dsh-union-view或者从源码:
git clone https://github.com/RyeSama/dsh-union-view.git
cd dsh-union-view
node scripts/build-client.mjs
node scripts/install-local.mjs装完要重启 DSH 整个应用(不是刷新页面),对话标签栏才会多一个「联合视图」。
为什么新对话标题是「未命名」
原对话的标题事件引用了它自己的消息编号,截断之后这些编号对不上,所以合并时直接丢掉标题事件,交给 DSH 显示默认名。改个名字就行。