Repository navigation
Releases
v0.3.11 — 冷恢复 preset 挂载失败不再静默投递
0.3.11 — 冷恢复 preset 挂载失败不再静默投递
修复 #1:冷恢复时 agent preset 解析/挂载失败曾被静默吞掉,cross_session_send 仍继续投递,最终得到一个只有全局插件工具、却能回消息的轻量 Agent。
变更
installPreset不再返回undefined后继续组合;失败会抛出并保留原始错误。presetId缺失时回退宿主agentPresets.defaultId;旧版服务没有defaultId时由mount()使用默认语义。- 请求的 preset 失败时尝试宿主默认 preset;默认 preset 也失败或
agentPresets服务缺失时明确抛错。 resumeColdAgent/cross_session_spawn检查 preset 是否真正挂载;未挂载时释放 handle、返回错误,不投递消息。- README 补充冷恢复行为与 0.3.11 版本记录。
验收
node --check:lib/index.js、lib/bridge-core.js、lib/state.js、lib/host-fallback.js、verify-preset-mount.mjs全通过。- 本地回归
verify-preset-mount.mjs:8/8 PASS,覆盖缺失 presetId、指定 preset 失败回退默认、默认也失败、服务缺失、旧版无resolve/defaultId、冷恢复吞异常等路径。 npm pack --dry-run/npm pack:0.3.11 包 12 个文件,测试脚本未进包。
对应提交:a1bc570(fix(0.3.11): 冷恢复 preset 挂载失败不再静默投递)。
v0.3.10 — 补齐别名解析(cwd 归一化收口)
v0.3.10
补齐 v0.3.9 没修完的那一半:别名解析在 send / reply / read / rename / archive 上仍然失败。
0.3.9 的问题
0.3.9 修掉了"把 { cwd } 当 signal 传给 listSessions(signal?) 导致 TypeError 被静默吞掉"的根因,
但候选集的过滤写成了 normalizeCwd(header.cwd) !== cwd。而 cwd 这个入参有的调用方传归一化值
(cross_session_list / status:normalizeCwd(workspaceOf(...))),有的传裸值
(send / reply / read / rename / archive:直接 workspaceOf(...))。
normalizeCwd 在 Windows 下会 toLowerCase ⇒ 'g:\work' !== 'G:\work' 恒真 ⇒ 候选集仍为空。
实测(重启到 0.3.9 后):status 对列表里 17 个别名全部解析成功,但
read(cs_yybWQl2PyB) 仍报「找不到该别名对应的会话」。
0.3.10 的修法
把归一化收口到 collectSessionIdCandidates 入口:
const root = normalizeCwd(cwd); // 无论调用方传什么,先归一化
...
if (normalizeCwd(header.cwd ?? '') !== root) continue; // 两侧都归一化再比一处收口覆盖全部 8 个调用点。
资产
dsh-cross-session-approval.tgz— 无版本号别名,latest/download/永久有效dsh-cross-session-approval-0.3.10.tgz— 本版固定名
sha256 9959e29c00cca184751ad24041103fe93546083bb6228776fbc9ec1a57e27752
v0.3.9 — 修复别名解析候选集(列表有别名、发送说没有)
⚠️ 此版修复不完整,请直接使用 v0.3.10 及以后。
0.3.9 只修好了status/list路径(它们传归一化过的 cwd),
send/reply/read/rename/archive因为传的是裸workspaceOf(...),
候选集过滤normalizeCwd(header.cwd) !== cwd恒不相等 ⇒ 仍然"找不到该别名"。
详见 v0.3.10 的说明。
v0.3.9
修复:cross_session_list 给出的别名约半数解析不到("列表说有、发消息说没有")。
根因
别名解析的候选集把 { cwd } 当作 signal 传给了宿主的 sessionQuery.listSessions(signal?)。
宿主实现首行是 signal?.throwIfAborted(),在非 signal 对象上抛
TypeError: signal?.throwIfAborted is not a function,又被该处原来的空 catch {} 静默吞掉
⇒ 候选集退化成「仅登记表(workers + leadSessionId)」。
于是列表里凡不是登记 worker / lead 的宿主会话,别名一律解析不到:
send / reply / read / rename / archive 全部受影响,status 还会误报「没有登记的任务会话」。
同一处第二个缺陷:旧代码读 r?.id ?? r?.session_id,而宿主返回 { header, live, persisted },
真实 id 在 record.header.id。
修法
- 改用宿主唯一支持的
listSessions()(无参),并套用与cross_session_list完全相同的过滤:
排除parentSession子会话、按normalizeCwd(header.cwd) === cwd; - 两处互加交叉引用注释,防止再次分叉;
- 枚举失败不再静默降级,改为
ctx.logger.warn留痕。
资产
dsh-cross-session-approval.tgz— 无版本号别名,latest/download/永久有效dsh-cross-session-approval-0.3.9.tgz— 本版固定名
sha256 783db4ffbf33789318f7ba45653f453d0a6d6708a3f5b4d8486f8b788c9d174e
v0.3.8 — dsh-cross-session-approval
v0.3.8
改名:包名 / 插件 id 由 dsh-cross-session-2 统一为 dsh-cross-session-approval。
SESSION_ALIAS_SALT改用新包名 ⇒ 旧cs_别名全部作废(重新cross_session_list取新别名;真实 session-id / 登记表 / 会话内容不受影响)- 消息前缀统一为
[dsh-cross-session-approval] - 补 MIT LICENSE;公开前清理(去内部话术、宿主私有行号引用等)
能力:10 个工具(cross_session_spawn / send / reply / status / read / list / broadcast / rename / archive / approve)+ 跨会话审批桥(R1′ 固定所有者、危险删除强制拒绝)+ 子会话权限夹紧(A 发布前三维 / F 派生入口)+ cs_ base62 会话别名(规避显示层 UUID 遮蔽)。
要求:DeepSeek Harness 0.2.x。已知边界与信任模型见 README。
安装
从 GitHub(已提交 lib/ 构建产物,无需构建):
dsh plugin --profile web add github:zsjs110110-cpu/dsh-cross-session-approval
或用本 Release 的预构建 tarball(免 allowBuilds 构建授权):
dsh plugin --profile web add https://github.com/zsjs110110-cpu/dsh-cross-session-approval/releases/latest/download/dsh-cross-session-approval.tgz
资产
dsh-cross-session-approval.tgz— 无版本号别名,latest/download/永久有效dsh-cross-session-approval-0.3.8.tgz— 本版固定名
sha256 190c2963d760750bdc363994da95581fdf689e69f2eb3ed1f3292e803a26ca87