You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
值得注意:mount.ts 对同类碰撞本有审计防护——拒绝"向 root realm 发布服务"的行,注释明确写道 "such a service is process-global rather than per-session and the second session mounting the same preset collides with the first"(packages/preset/agent-presets/src/mount.ts:13)。但该审计只覆盖"发布服务",不覆盖"向宿主平面服务注册条目"(cordisInspect.register() 属于后者),tool-cordis 恰好走在审计之外的路径上。
同族缺口源码中已有未了结的 TODO:packages/preset/agent-presets/src/index.ts:502 —— preset 文件变更换 generation 时旧 standing mount 的注册不回收("reclaim the superseded generation once the last agent joined to it is gone")。也就是说编辑自定义 preset 文件后在同一进程内再开新会话同样会触发重复注册。
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
摘要 / Summary
同一 app 进程内先后挂载两个都包含
tool-cordis行的 agent preset(内置cordis预设 + 由它复制的自定义预设,如rd-pipeline)时,第二个 preset 的挂载失败,导致该 preset 下的既有会话 resume 直接失败:环境 / Environment
@deepseek-ai/dsh0.1.0-rc.6)deepseek-harnessmaster(47f94385…,tool-cordis/cordis-host-runner自 0.1.0-rc.5 起无相关修改)复现步骤 / Reproduction
cordis预设为自定义预设(该预设preset.yml自述"用于创建自定义 Agent preset"),保留其中的tool-cordis行;'Service'等 provider 注册进进程级全局表);cordis预设的既有会话(或挂载任一第二个含tool-cordis的 preset);期望行为 / Expected
tool-cordis时能正常共存、各自会话可正常 resume;或根因分析 / Root Cause
tool-cordis挂载时把一组写死的 provider id('Service'、'Event'等,packages/extensions/tool-cordis/src/providers.ts:29-32)通过(
packages/extensions/tool-cordis/src/index.ts:37-38)注册进CordisInspectRegistryService。该注册表是进程级全局单例(packages/extensions/cordis-host-runner/src/index.ts:143构造,构造注释自称 "the process-global Host registry"),providers是普通Map,不按 preset/scope 隔离;重复 id 直接抛already registered(packages/extensions/cordis-host-runner/src/inspect-registry.ts:64)。而 agent-preset 的挂载是每 preset 单例的 standing mount(
packages/preset/agent-presets/src/index.ts的ensureStanding,按{ agentPreset: preset.id }建 scope,同一进程内每个 preset 只挂载一次、其下所有会话共享)。两个不同 preset 各自挂载 → 各自执行tool-cordis的apply()→ 第二次注册'Service'即冲突。值得注意:
mount.ts对同类碰撞本有审计防护——拒绝"向 root realm 发布服务"的行,注释明确写道 "such a service is process-global rather than per-session and the second session mounting the same preset collides with the first"(packages/preset/agent-presets/src/mount.ts:13)。但该审计只覆盖"发布服务",不覆盖"向宿主平面服务注册条目"(cordisInspect.register()属于后者),tool-cordis恰好走在审计之外的路径上。同族缺口源码中已有未了结的 TODO:
packages/preset/agent-presets/src/index.ts:502—— preset 文件变更换 generation 时旧 standing mount 的注册不回收("reclaim the superseded generation once the last agent joined to it is gone")。也就是说编辑自定义 preset 文件后在同一进程内再开新会话同样会触发重复注册。建议修复 / Suggested Fix
CordisInspectRegistryService.register()幂等:相同 manifest 的重复注册改为引用计数复用(dispose 时 refs-1、归零才删除),而非抛错;或agent-presets/src/index.ts:502的 TODO(为 StandingMount 增加 joined-agent 计数),消除 generation 变更路径的同类冲突。临时绕过 / Workaround
tool-cordis的 preset(切换前重启 app);或tool-cordis行(若该模式不需要模型侧 cordis 检查/运行/自修改工具;官方创作路径复制的预设默认都带这一行,容易踩中)。附:关键代码位置
packages/extensions/cordis-host-runner/src/inspect-registry.ts:64already registered抛错点packages/extensions/cordis-host-runner/src/index.ts:143packages/extensions/tool-cordis/src/index.ts:37-38packages/extensions/tool-cordis/src/providers.ts:29-32'Service'provider 注册packages/preset/agent-presets/src/mount.ts:13packages/preset/agent-presets/src/index.ts:502All reactions