Repository navigation
Releases
v1.4.2
延迟归档到点撞上还在跑的活,不再可能把它掐断:顺延,最多 60 秒 × 10 次,之后放弃归档、会话原样留在侧边栏。
修复
- 到点归档不再传
stopActivity。 先问宿主这个会话还有没有活(workspace/session-activity瀑布),有活就顺延 60 秒重查,最多 10 次;顺延用尽就放弃归档,日志记一行「旧会话一直有活,放弃到点归档」。以前这条路径会直接掐掉正在进行的那一轮。 - 归档调用改成
archiveSession(fromId)不带第二参:宿主在这几毫秒里又判活跃会抛WorkspaceActiveSessionError,插件接住继续顺延,整条路径没有强杀。换新即归档那条(archiveOnRotate)仍是stopActivity: true—— 那时这一轮已经结束了。 - 待办条目新增
retries并随state.json持久化;只有归档成功或放弃才删条目,顺延途中不丢。被挡过的那一轮结束后 3 秒补做一次,其余照旧顺延整段保留期。 - 定时器与
turn/end补做可能同时到,加deferredBusy占位,同一条待办不会归档两次。
测试
新增 test/deferred.test.mjs:3 条 deferredStep 纯函数用例(归档 / 顺延 / 顺延用尽)+ 4 条集成用例(临时 DSH_HOME + 假 ctx 跑真 apply())。npm test 53 pass / 0 fail(原 46 + 新 7)。
文档
- README /
README.en.md/docs/index.md的延迟归档说明与「已知限制」改成顺延语义。 docs/usage-data.md:实测参考表三行显式标成「可复算」,写明口径与复算命令tools/usage-summary.ps1 -Path <zip>。PROMO.md里的本机路径换成占位符。.gitignore修好被注释吞掉的一行,.tmp-release/现在真的被忽略。
安装
dsh plugin add github:cry-flu/dsh-session-rotate#v1.4.2
附件
dsh-session-rotate-1.4.2.tgz(47307 B)
sha256 6b5a2e04935adb8bf84f741abdd396cbfefdc9a6f83656d71af2c6f600cfe39c
v1.4.1
修复 1.4.0 里设置页一个开关的显示条件。
- 「归档到点时自动跳到新会话」原先只判
autoSwitch:把「归档前先留」填0时,这一行照样出现,勾上也照旧无效(此时archivePlan返回'none',根本不会建延迟归档)。 - 现在改为
autoSwitch || !(deferArchive > 0)才不渲染(lib/client.js:470、lib/client.js:482),界面、文案、服务端判定三者一致。
1.4.0 没有单独发过版(没打过 tag),这是第一个带此修复的发布。
本次重打包补入(运行时代码无改动):重录的 6 镜头演示 GIF,以及 README 一条使用提醒 —— 延迟归档的保留期内不要在旧会话里继续发消息:顺延只在轮与轮之间重算,跑得比剩余保留期长的那一轮会被 stopActivity 的归档中途掐掉并归档,任务做一半就断。
完整变更见 CHANGELOG.md。
安装
dsh plugin add github:cry-flu/dsh-session-rotate它只做登记(写 profile 的 package.json 依赖与 bundle 名单)。这个包的 bundle patch 是刻意留空的(挂载条目要带 workspaces 配置,只能写在 profile 里),所以还得在 profile 的 cordis.patch.yml 末尾 insert 一条 dsh-session-rotate,否则设置页里不会出现「会话换新」。四步完整步骤见 README 的安装一节:关键是第 3 步的 workspaces 填你在用的工作区名,第 4 步整个 DSH 换进程重启(重开窗口不算)。
v1.1.0
换新后不必回旧会话翻最后一条回复。
变更
- 交接摘要附上上一轮回复全文:以前只取最后 200 字压成一行,常常是半句开头;现在整段照贴(≤4000 字,超出头尾各留一段),换新后在新会话第一条消息里就能读完。
- 新增
archiveOnRotate(默认true):设false后换新不再归档旧会话,旧会话留在列表里方便回看;设置页对应勾选「换新时归档旧会话」。 - 交接摘要的「步数」行写明旧会话是否已归档,不再一律写「已归档」。
summaryText提到模块作用域并补测试(27 个用例)。
安装
dsh plugin add github:cry-flu/dsh-session-rotate
完整差异:v1.0.0...v1.1.0
v1.0.0
长会话越滚越贵。步数到上限时,这个插件在这一轮答完之后(绝不中途打断)自动开新会话、把一份本地拼出来的交接摘要投过去、归档旧会话,再把界面切到新会话。摘要不调用模型,是纯本地模板拼装——省下的是「手动总结 + 复制 + 新建会话 + 记住进度」这四步。
它解决什么
- 省钱但不额外花钱:交接摘要由本地模板生成(取最近用户消息 + 最后一条回复,最多 16 行),零模型调用。真正计费的只有新会话的第一轮请求。
- 不打断:只在轮与轮之间判定,正在跑的轮一定跑完。上限是软上限,换新点会在
maxSteps附近浮动。 - 可先空跑验证:
dryRun只写日志、不建会话、不归档、不跳转。 - 不会连环换:
minSteps硬下限 +cooldownMinutes冷却 +maxRotations连续触发后自动暂停该工作区(状态持久化在state.json,重启不清零)。
安装(四步)
- profile 的
package.json里登记依赖和 bundle:{ "dependencies": { "dsh-session-rotate": "github:cry-flu/dsh-session-rotate" }, "dsh": { "profile": { "bundles": ["...", "dsh-session-rotate"] } } } - 让
node_modules里有这个名字(跑包管理器 install,或cmd /c mklink /J "<profile>\node_modules\dsh-session-rotate" "<插件目录绝对路径>")。 - 在 profile 的
cordis.patch.yml末尾挂载:- insert: - id: dsh-session-rotate name: dsh-session-rotate config: defaultMaxSteps: 40 workspaces: - name: my-workspace # 与侧边栏显示名完全一致 maxSteps: null # null / 省略 / 0 / "" = 跟随 defaultMaxSteps
workspaces为空数组 = 所有工作区都不生效,用哪个就加哪一行。 - 整个 DSH 换进程重启一次。「重开窗口」不会重载插件;重启后 Web GUI 端口会变。
先空跑确认再真用
把要测的工作区加进 workspaces(maxSteps 填你真实在用的值),打开 dryRun,正常干活跨过那个步数,然后看 ~/.dsh/session-rotate/debug.log:命中会记一条 [dry-run] 只记日志不换(同一会话同一档步数只记一次)。
别把 maxSteps 调成 2、3 去真测——换新是真的换,一晚上能刷出一屏空会话。
已知限制(先说清楚)
- 热重载无效:改插件代码(尤其
lib/client.js)后必须整个 DSH 换进程重启。 - 上限是软上限:判定只在轮间发生,开预判通常略早,关预判可能明显偏高(一轮能跑掉二十几步)。
- 新会话第一轮照常计费:摘要本身零成本,但那一轮请求是真的。
- 只对顶层会话生效,子会话跳过;每个会话只触发一次。
兼容性
只在我本人环境验证过:DSH 桌面版 0.2.1-rc.3(Windows)+ Node v24.18.0,npm test → 23 pass / 0 fail。CI 在 ubuntu + windows × node 20/22/24 跑单测,但不覆盖宿主行为,其他环境请先小范围试用。
注意
不在 npm 上。 包名 dsh-session-rotate 在 npm 上属于另一位作者的同名插件,不是本项目。
大部分代码由 AI 辅助生成,经人工审查与本地测试,但不保证所有环境行为如预期。有问题请开 issue,最想要的是「你的环境里到底能不能正常触发」。
v1.0.0 相对 0.2.1 的变更
版本变更清单
- 版本号
0.2.1→1.0.0;engines.node声明>=20。 npm test改为node --test:自动发现测试文件,不依赖 shell 展开 glob,Node 20 / 22 / 24 都能跑。package.json补齐repository/bugs/homepage/author。- README:删除全部本机绝对路径,安装步骤改为
github:OWNER/REPO;补充「改完代码怎么让它真正加载」。 - 新增
.github/workflows/test.yml:Ubuntu / Windows × Node 20 / 22 / 24 跑单测。
已知限制
上限是软上限,真实换新点会在 maxSteps 附近浮动。