Replies: 5 comments
|
补充定位(根因已进一步收窄,并验证了修复方向) 触发本 bug 的是同一升级窗口(
实测证据(给 loader
修复方向建议(按彻底程度):
|
0 replies
|
I've had the same problem today and i can confirm that |
0 replies
|
已收到这条反馈。 |
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.
Summary
升级后在源码启动(
node --import tsx/esm apps/cli/src/bin.ts,即pnpm dsh)且仓库存在已构建lib/产物的状态下,每一轮 turn 的第一个工具调用(bash、glob 等任意工具)都会失败,整个 turn 以UNKNOWN结束:受影响场景:任意已有工作区中,agent 的所有工具调用全部失败,任务无法推进。会话日志里每个 turn 都是
tool/call之后直接turn/end {kind:'error', code:'UNKNOWN'}。Reproduction
无 key 即可复现(官方 recorded-session 回放):
pnpm run build pnpm run test:snapshot -t bash-tool-turn # → FAIL: dsh: UNKNOWN: Cannot read properties of undefined (reading 'prepare')而 CI 的跑法(单一 lib 平面)通过:
DSH_EXAMPLE_MODE=lib pnpm run test:snapshot -t bash-tool-turn # → PASS线上场景:
pnpm dsh web启动物化在~/.dsh/profiles/web的 live profile 后,任意会话的第一个工具调用即崩。Current behavior
lib/:所有工具调用失败(上述 TypeError),turn 以{kind:'error', code:'UNKNOWN'}结束。pnpm run clean删除lib/后源码启动:启动期失败,约 47 个插件failed to import("required plugins did not activate")——仓库外配置条目只能经 packageexports解析到lib/,没有lib/就 loudly 失败。即源码启动对配置树在仓库外的 profile(任何 live profile)两种状态都无法工作。
Expected behavior
按
.agents/notes/implemented/architecture/2026-07-29-dsh-source-launch-tsx-esm.md的契约("tsx applies thepathsmap unconditionally"),源码启动应把所有 cordis.yml 裸插件解析到与仓库内模块相同的单一平面(src/),工具调用正常工作。Root cause
paths)解析到src/;ctx.loader.internal.import(name, ctx.baseUrl)(vendor/loader/src/config/tree.ts:122),即 Node 内部 ESM loader(经node-addon-require-builtin可达,vendor/loader/src/index.ts:73),解析父路径是配置文件所在目录;~/.dsh/profiles/<name>)时,该父路径没有 tsconfig 生效,解析退回 packageexports→lib/;@deepseek-ai/dsh-tools被加载两份。TOOL_RUNTIME_SCHEDULER是Symbol()(packages/core/tools/src/index.ts:463),按模块实例唯一:tools服务由一份实例提供,而 agent-loop(整体来自lib/)用另一份实例的 Symbol 读取ctx.tools[TOOL_RUNTIME_SCHEDULER]得到undefined,第一个工具调用在packages/core/agent-loop/src/tool-calls.ts:170抛出undefined.prepare()→ turn 捕获后展平为UNKNOWN(packages/core/agent-loop/src/agent.ts)。模块加载探针实测(临时在模块顶部插桩):
(agent-loop 的 src 副本从未被加载,所以 turn 的
UNKNOWN来自 lib 副本的 catch。)为什么 CI 没拦住
snapshot 门禁在 CI 中是
DSH_EXAMPLE_MODE=lib且先pnpm run build(scripts/run-gates.ts的snapshotGate)——单一 lib 平面,天然一致。src 启动契约冒烟(apps/cli/tests/source-launch.compat.spec.ts)只断言 TTY 拒绝退出码,不做完整插件启动。"源码启动 × 已构建lib/"这个组合在 CI 中没有覆盖。修复方向建议
让源码启动下裸插件解析保持单平面。例如:source launch 下不启用 internal loader(
ModuleLoader.fromInternal()),tree.ts退回普通import(name)——tsx hook 会把解析统一到src/;或让 loader 的解析按 tsconfigpaths映射。Workaround(修复前)
pnpm run build后改用构建入口启动(单一 lib 平面,已验证 lib 模式 snapshot 通过):注意 restart-dsh 插件会按当前进程原始 argv 重放启动命令,从源码入口切到 lib 入口时不要用它的重启按钮。
Environment
ddefc45fbc(release dsh 0.1.6-alpha.2),工作树干净~/.dsh/profiles/web(含 marketplace 插件物化树)补充说明
internal.import这条解析路径自初始 vendoring(72688a3888)就存在,不是近期提交引入的回归;"升级 + 重新构建"只是第一次同时凑齐了三个条件(源码启动 × 仓库外 profile 配置树 × 已构建lib/)。All reactions