Replies: 2 comments 1 reply
|
This is the same root cause as #6416 (verified there in depth, including the Confirmed on master c291e79:
User-side triage:
For maintainers: the durable fix is a cross-instance registry key or a shared |
1 reply
|
后续更新:0.1.6-alpha.2 的源码启动回归让本帖描述的“重复 完整修复需要同时处理两层:
这样既解决本帖的 profile/plugin 副本问题,也覆盖新的 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
In
@deepseek-ai/dsh-agent-loop(lib/index.js,runGroup → startCall) the tool-call scheduler is read as:TOOL_RUNTIME_SCHEDULERisSymbol("@deepseek-ai/dsh-tools.scheduler")(dsh-tools/lib/index.js:2430) — a module-localSymbol(), not a global-registrySymbol.for(...)— and its value is stored as a class instance field onToolRuntime:while
executionMode/prepareScheduledExecution/dispatchScheduledExecution/finalizeScheduledExecution/finishScheduledExecutionare prototype methods.Because the key is module-local, the lookup is only correct while exactly one instance of
@deepseek-ai/dsh-toolsexists in the process. When thetoolsservice is constructed from a second copy of the package, the twoSymbol()keys are different objects,ctx.tools[TOOL_RUNTIME_SCHEDULER]isundefined, and every tool call throws:This is reachable in a documented configuration
Profile module resolution is two-anchor — see the
@deepseek-ai/dsh-app-bootmodule doc: "Pnpm-managed entries in the profile'snode_modulesresolve first." So a pnpm-managed copy of@deepseek-ai/dsh-toolsinside a profile'snode_modulesshadows the installation copy for the loader'stoolsentry, while@deepseek-ai/dsh-agent-loop(loaded from the installation) imports the symbol from the installation copy.Measured on the reporter's machine:
Observed characteristics
readcall is enough to fail).minimal/standard/cordisall affected) — the host plane is involved.Suggested fix (in order of preference)
Symbol.for("@deepseek-ai/dsh-tools.scheduler")), or expose the staged view as a prototype getter onToolRuntime, so the contract survives duplicate module instances. Note that cordis itself usesSymbol.forfor its cross-package protocol (e.g.Symbol.for("cordis.shadow")) — this symbol is the exception.ctx.toolsexposes the four prototype methods but not the symbol, throw a diagnostic that names the duplicate-copy cause instead of a bareTypeErroron.prepare.node_modulesshadows an@deepseek-ai/dsh-*package that the installation already provides.Environment
dsh launcher
0.1.5-rc.1; installationdsh-agent-loop/dsh-tools0.1.5-rc.2; shadowing profile copydsh-tools0.1.0-rc.8; cordis4.0.2; Node v24.19.0; Windows 10.All reactions