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
{{ message }}
Repository navigation
[Bug] scope.js 裸读 ctx.workspaceRegistry 触发 "cannot get property without inject":每次写入刷告警且 workspace_scope 退化为原始 cwd #487
Activity
modusensus commentedon Oct 19, 2026
谢谢报告,定位是准的。我们独立核实后确认这确实是个 bug,并且已经开工修。下面三点补充,其中一点和报告里的描述不一致。
一、确认成立
src/scope.js:67直接读属性:src/index.js:45的 inject 声明里确实没有workspaceRegistry:cordis 4 的 Proxy 在读取未注入属性时会抛错而不是返回 undefined,抛错点在
@deepseek-ai/cordis的lib/index.js:676:所以这里必然进入
src/scope.js:75的降级分支。这段代码自 v0.8.0 引入(同src/scope.js的 A1 提交)起一直如此。二、但 warn 不是「每次写入一条」
src/scope.js:25的warnOnce是按解析器实例去重的,而解析器在三个工厂里各建一次(createTools、createInjector、createSummarizer)。所以全程最多 3 条 warn,与写入次数无关。用一个复刻 cordis Proxy 形状的 ctx(读未声明属性即 throw)连打 20 次写入,实测:
如果你那边看到的是每次写入都刷,那可能是宿主在每次写入时重建了插件实例、或者 logger 被换过——如果是这样,麻烦贴一下相邻几条 warn 的时间戳,这本身是另一个值得查的问题。但按当前代码,正常进程内是只打一次。
三、真实损失比报告里写的更重
报告把它归为「日志噪声 + 字段不精确」,但宿主其实是提供了这个服务的——宿主文档(cordis 插件开发指南的 workspace 包表)里写着
@deepseek-ai/dsh-workspace提供ctx.workspaceRegistry。也就是说服务存在、只是没在 inject 里,用免 inject 读取能真的把它读回来。实测同一形状下两种写法:
所以修好之后不只是消 warning,而是把 registry 反查那两层能力一起恢复了:realpath 归一(
workspace_scope存的是规范路径而不是原始 cwd 字符串)和成员资格校验(id 命中 + canonical cwd 校验)。这两项从 v0.8.0 起一直没生效,单工作区感觉不到,多工作区或路径写法不一致时就会对不上。四、修法按 A,但写法比建议里的更严一点
同意选 A(保留软依赖语义,不加注入)。有两点要偏离报告给的示例代码:
不要只包一层
try { ctx.reflect.get(...) }。cordis 的reflect.get(name, strict = true)在服务未提供时返回undefined,并不抛错(lib/index.js:763-772)。真正要防的是旧宿主里ctx是普通对象、根本没有reflect。仓库里已有两处同一先例(src/api.js:205、src/index.js:583):这里照抄同一形状最稳。
不要加进 inject。理由和报告一致,而且本仓有过实战教训:
src/index.js:39-44的注释记着,v0.7.23 把webServer移出 inject 想支持 headless,结果 cordis 不再等待服务就绪,桌面端直接崩在 apply 阶段。加workspaceRegistry会走同一条死路。五、测试为什么没拦住
现有
test/scope-storage.test.js里三处 registry 测试都用普通对象伪造 ctx(ctx: { workspaceRegistry: { list: ... } })——普通对象裸读不抛错,返回正常数组,所以这条路径在测试里看着是通的。修复会带一个「读未声明属性即抛错」的 Proxy 形状的 ctx 回归锁,两个方向都钉住:
修好后会在这个 issue 里回一条,带上合并的 PR 号。
modusensus commentedon Oct 19, 2026
修复已提交,PR #488。等你复核。
Merge pull request #488 from slow-stack/fix/scope-reflect-get
fix(scope): 免 inject 读取 workspaceRegistry,canonical 归一与成员校验恢复生效 (slow…
release: v0.9.3