Skip to content

Releases

v0.2.6 — 补 engines 兼容声明与权限边界

Choose a tag to compare

@easerlee easerlee released this 31 Oct 22:16

改什么

响应 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 — 交接时不再吞掉刚发出的消息

Choose a tag to compare

@easerlee easerlee released this 22 Oct 03:41

修什么

交接后停老会话那一轮时,不再连带停掉「刚起的一轮」。

原先的逻辑是无条件停:老会话正在跑的那一轮会被打断。如果人刚发出消息、交接恰好在同一秒触发,那一轮会在发出后几毫秒内被停掉 —— 消息留在日志里,但没人回答。2026-10-17 真实发生过一次:消息入队 0.2 秒后触发交接,1 毫秒后这一轮被停。

现在的行为

  • 新增 liveGraceMs(默认 60000):老会话当前这一轮起不到这么久就跳过停止,让这一轮答完
  • 拖久了的轮次照停 —— 防「两个会话同时改同一批文件」的初衷不变
  • 交接结果里多了 stopSkipped(live-turn / disabled)和 turnAgeMs,事后能看出为什么没停

自检加了两例:刚起的一轮不停(stops 为空)、拖久了的一轮照停。

v0.2.4 — 标题(接 N)递增编号 + 交接后停掉老会话那一轮

Choose a tag to compare

@easerlee easerlee released this 16 Oct 19:05

三处改动

  1. 新会话标题改为递增编号:原标题(接 N)。N 从旧标题里最高的那个编号 +1,一个都没有就从 1 开始。历史遗留的 (接 02-15)(时间戳式)会被换成编号,永远不会出现 () 套 ()。
  2. 交接完成后停掉老会话正在跑的那一轮(新配置 stopOldSession,默认开)。走 harness 的 workspace/session-stop —— 和界面上的「停止」同一条路径(agent.cancel({kind:'user'})),不归档、不删会话。不这么做的话,老会话继续干、新会话拿着同一份交接包也干,两边会同时改同一批文件。
  3. 标题被运行环境自动起名覆盖后写回一次。实测:新会话的标题会被按内容重新概括(两份内容一样的副本会得到同一个名字),插件在新会话第一轮结束前写回自己的标题,之后不再碰它 —— 你自己改名不会被抢回去。

其它:自检新增 3 组用例(编号 4 种旧标题 / 停老会话那一轮 / 标题写回一次后不再抢);README 中英同步「交接真正发生时的三件事」。

npm 上的 0.2.3 未发布(发布凭证过期),直接以 0.2.4 为准;npm 上仍然只有 0.2.2。

v0.2.3 — 修复:自动交接每个会话只做一次

Choose a tag to compare

@easerlee easerlee released this 16 Oct 18:22

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

Choose a tag to compare

@easerlee easerlee released this 03 Oct 17:29

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-shift
dsh plugin --profile web add dsh-session-shift

装完重启对应那一端;自检 curl "http://127.0.0.1:<端口>/api/handoff/status",输出里出现 "tool":"registered" 即成功。

桌面端注意:先打开过一次、执行前完全退出(profile 有写锁)。

文档

README 里有「它和名字相近的插件有什么区别」「权限与安全」两节,装之前可以扫一眼。

MIT