在使用dsh-better-sidebar插件的引用功能时,发现dsh会自动将文件识别为绝对路径,从而导致找不到文件报错。 #4363
Unanswered
Astronaut224
asked this question in
Q&A
Replies: 0 comments
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.
问题根源:
在 Windows 上,node:path.isAbsolute('/udp-web/apps/screen') 返回 true。因为 POSIX 风格的 / 开头的路径在 Windows 上的 node:path 中被视为"绝对路径"(它被当作当前磁盘驱动器的根路径)。
所以:
用户在侧边栏点击 "@文件" → 插入 @udp-web/apps/screen 到输入框
AI 理解用户引用的是文件 udp-web/apps/screen
AI 调用 str_replace_editor 工具,传入 path: "/udp-web/apps/screen"
str_replace_editor 的 resolveTarget 检查 isAbsolute('/udp-web/apps/screen') → true,通过检查
调用 ctx.fs.resolve('/udp-web/apps/screen')
fs-local 的 resolve 调用 resolve(cwd, path) → 因为 path 以 / 开头被视为绝对路径 → 结果变成了 C:\udp-web\apps\screen(而不是拼接到实际的工作目录 D:\workspace\UDP\dataAnalysis 后面)
完整的调用链:
复制
Sidebar.tsx line 995: appendToDraft(ctx, sessionId,
@${relativeTo(cwd ?? '', path)})→ 插入 "@udp-web/apps/screen"
→ 用户发送消息,AI 看到 "@udp-web/apps/screen"
→ AI 调用 str_replace_editor view path="/udp-web/apps/screen"
→ dsh-tool-str-replace-editor resolveTarget:
第68行: isAbsolute('/udp-web/apps/screen') → true (Windows上/path被视为绝对路径!)
第69行: ctx.fs.resolve('/udp-web/apps/screen')
→ dsh-fs-local resolve:
第706行: resolveLocalTarget(opts?.cwd ?? this.config.cwd, path)
→ resolveLocalTarget:
第155行: displayPath = resolve(cwd, '/udp-web/apps/screen')
→ 在Windows上,resolve('D:\workspace\UDP\dataAnalysis', '/udp-web/apps/screen')
→ 结果是 'C:\udp-web\apps\screen' (因为'/'开头被当作C盘的根目录!)
解决方案(建议):
这个问题出在 str_replace_editor 工具(dsh-tool-str-replace-editor)的 resolveTarget 函数第 68 行。在 Windows 上,isAbsolute('/path') 返回 true,但用户实际期望的是一个相对于工作目录的路径。
有两种修复思路:
方案 A(推荐,在 dsh-tool-str-replace-editor 层面修复): 修改 resolveTarget 函数,对以 / 开头但在 Windows 上不是有效盘符绝对路径(即不是 C:\、D:\等)的情况,将其视为相对路径,用 path.resolve(cwd, path) 来解析。或者更简单:检测平台为 Windows 且路径以 / 开头但不含盘符时,移除开头的 / 再 resolve。
方案 B(在 dsh-fs-local 层面修复): 修改 resolveLocalTarget 函数,对以 / 开头但不含盘符的路径,在 Windows 上视为相对路径,拼接到 cwd 后面。
方案 C(在客户端 Sidebar.tsx 层面修复): @文件 按钮插入时,直接插入绝对路径而不是相对路径。但这会失去相对路径的简洁性。
方案 D(在 dsh-tool-str-replace-editor 的 resolveTarget 中修改): 将第 68 行的检查改为:在 Windows 上,路径必须以盘符开头(如 C:\)才视为绝对路径;否则视为相对路径。
最合适的修复位置是 方案 A,在 dsh-tool-str-replace-editor 的 resolveTarget 中。但请注意这属于 DSH 核心库(@deepseek-ai 包),修改后需要重新构建。或者考虑在 dsh-better-sidebar 层面,让 "@文件" 插入时使用更清晰的方式表明路径来源。
All reactions