Repository navigation
Releases
v0.2.6 — 补 engines 兼容声明与权限边界
改什么
响应 DSH STORE 的自动检查(issue #1269)。不是修 bug,是补清单声明。
package.json增加engines:node >= 20、dsh >= 0.2.0-0 < 0.3.0- README 增加「权限与边界」:逐条对齐扫描器的 files / network / credentials 三条信号
三条信号的实际行为
| 信号 | 实际 |
|---|---|
| files | 只写不读。每次交接写一份 .dsh/handoff/*.md,客户端写一份回报文件。磁盘上的会话文件不读 |
| network | 只挂三个本地接口(/api/handoff/{run,status,client}),不发外部请求 |
| credentials | 不涉及。源码里的 token 是文本分词(tokenize),不碰任何 token 或凭据 |
运行期依赖只有宿主注入的 peer,没有第三方包。
v0.2.5 — 交接时不再吞掉刚发出的消息
修什么
交接后停老会话那一轮时,不再连带停掉「刚起的一轮」。
原先的逻辑是无条件停:老会话正在跑的那一轮会被打断。如果人刚发出消息、交接恰好在同一秒触发,那一轮会在发出后几毫秒内被停掉 —— 消息留在日志里,但没人回答。2026-10-17 真实发生过一次:消息入队 0.2 秒后触发交接,1 毫秒后这一轮被停。
现在的行为
- 新增
liveGraceMs(默认60000):老会话当前这一轮起不到这么久就跳过停止,让这一轮答完 - 拖久了的轮次照停 —— 防「两个会话同时改同一批文件」的初衷不变
- 交接结果里多了
stopSkipped(live-turn/disabled)和turnAgeMs,事后能看出为什么没停
自检加了两例:刚起的一轮不停(stops 为空)、拖久了的一轮照停。
v0.2.4 — 标题(接 N)递增编号 + 交接后停掉老会话那一轮
三处改动
- 新会话标题改为递增编号:
原标题(接 N)。N 从旧标题里最高的那个编号 +1,一个都没有就从 1 开始。历史遗留的(接 02-15)(时间戳式)会被换成编号,永远不会出现()套()。 - 交接完成后停掉老会话正在跑的那一轮(新配置
stopOldSession,默认开)。走 harness 的workspace/session-stop—— 和界面上的「停止」同一条路径(agent.cancel({kind:'user'})),不归档、不删会话。不这么做的话,老会话继续干、新会话拿着同一份交接包也干,两边会同时改同一批文件。 - 标题被运行环境自动起名覆盖后写回一次。实测:新会话的标题会被按内容重新概括(两份内容一样的副本会得到同一个名字),插件在新会话第一轮结束前写回自己的标题,之后不再碰它 —— 你自己改名不会被抢回去。
其它:自检新增 3 组用例(编号 4 种旧标题 / 停老会话那一轮 / 标题写回一次后不再抢);README 中英同步「交接真正发生时的三件事」。
npm 上的 0.2.3 未发布(发布凭证过期),直接以 0.2.4 为准;npm 上仍然只有 0.2.2。
v0.2.3 — 修复:自动交接每个会话只做一次
Bug 修复(行为变更)
自动交接此前只靠 cooldownMs 拦重复,而交接不会清空老会话的上下文 —— 条件一旦满足就永远满足(「已压缩 N 次」只会越数越多),于是老会话每 5 分钟再交接一次,每次都新开一个会话,最后几个会话同时在干同一件事。(实测:02:04 与 02:09 同一会话连续两次;10/1 也有一次同会话连交 3 次。)
现在:每个会话只自动交接一次。终态取两个来源 —— 内存 + 标题里的 [已交接],所以 DSH 重启后依然有效。
- 修
lib/index.js触发门:加终态判定;交接成功才落终态(失败仍会重试) - 状态接口
/api/handoff/status新增doneSessions/doneSkips—— 一个 curl 就能看出是不是在重复触发 - 自检新增 2 个用例:同一会话 3 次 pre-step 只允许交接 1 次;标题带
[已交接]的会话跨重启不触发 - README(中英)补新语义与
cooldownMs的定位
更新(先完全退出桌面端):
"<DSH 安装目录>\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add dsh-session-shift
v0.2.2
DSH 插件:长会话到后段变慢(「只思考不输出」)时,自动把工作交接给一个新会话。
能做什么
- 自动触发:上下文压力到
thresholdRatio(出厂默认0.6),或本会话被压缩次数到maxCompactions(默认 2 次)——任一满足即可,冷却cooldownMs默认 5 分钟 - 交接包不过模型:改动过的文件 / 用过的工具 / 最近几轮用户+助手消息 / 停在哪儿,全部从会话机械提取,落盘
<项目>/.dsh/handoff/,可读、可对比 - 界面自动切到新会话(走 harness 的
uiWorkspace.openSession);旧会话只改名加[已交接],不归档、不删除 - 桌面端
handoff_now工具(支持dryRun试跑);web 端与命令行:GET /api/handoff/status、POST /api/handoff/run
安装
"<DSH 安装目录>\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add dsh-session-shiftdsh plugin --profile web add dsh-session-shift装完重启对应那一端;自检 curl "http://127.0.0.1:<端口>/api/handoff/status",输出里出现 "tool":"registered" 即成功。
桌面端注意:先打开过一次、执行前完全退出(profile 有写锁)。
文档
README 里有「它和名字相近的插件有什么区别」「权限与安全」两节,装之前可以扫一眼。
MIT