@ 文件补全无法识别 Windows 目录软连接(junction / 指向目录的符号链接) #5412
Replies: 1 comment
|
两条代码路径都在上游 master(4e84901e64 = alpha.4)逐行确认,你的根因判断准确,但修复要注意一个安全约束: 1. 全局索引扫描(file-reference-local/src/search.ts)
2. 目录展开(同文件 :240-255 的 listDirectory + :257-280 的 resolveDisplayDirectory)
3. 安全约束(修复必须守住的):
4. 测试:search.spec.ts 已存在;POSIX 上 顺带:这是 Windows 路径处理域的又一例(此前 #1420 是 shell:true 参数路径带空格被拆碎),同域问题建议归一个 owner 视角统一审。若确认按 containment 方向修,我可以补一版搜索路径的 diff 草图。 |
Uh oh!
There was an error while loading. Please reload this page.
所属包:
@deepseek-ai/dsh(dsh web) · 组件:@deepseek-ai/dsh-file-reference-local使用场景
我们会把多个独立项目通过软链接聚合到一个"虚拟项目"目录里。在 Windows 上这些链接是目录 junction(
mklink /J创建),例如:开发这个聚合模块时,我们经常需要引用那些链接项目里的文件(README、mapper XML、共享接口等),因此依赖聊天里的
@文件补全来找到并打开它们。问题:
@既不会列出这些软链接目录,也无法展开它们。@service-a→ 搜不到service-a。@service-a/→ 列不出任何内容。探查到的根因
在
dsh-file-reference-local里,搜索由WorkspaceFileSearch(位于lib/index.js)实现。有两条路径都会把符号链接丢弃:全局索引扫描 —
scanWorkspace用entry.isDirectory()判断目录:在 Windows 上,Node 会把这个 junction 报告为
Dirent.isSymbolicLink() === true、Dirent.isDirectory() === false。于是这个软链接目录既不会作为候选项,也不会被递归进去 → 它及其中所有内容对@都不可见。目录展开 —
resolveDisplayDirectory逐段校验路径,并对任何符号链接一刀切拒绝:所以
@dir/也无法穿过软链接目录。我已在 Windows 上直接验证了 Node 的行为:对这些 junction 执行
readdir(..., { withFileTypes: true }),返回的都是isDir=false, isSymlink=true;lstat也报告isSymbolicLink()===true。建议的改进
当
@补全遇到"目标stat解析后是一个目录"的符号链接时,把它当作目录处理:scanWorkspace/listDirectory中:对entry.isSymbolicLink()且非entry.isFile()的条目,用fs.stat(跟随链接)解析;如果目标是目录,则以kind: "directory"入索引并递归进去。resolveDisplayDirectory中:把"凡符号链接一律拒绝"改为基于stat的目录判断,使软链接目录可以被进入,同时仍然忽略"指向文件的链接"和悬空链接。fromRoot逃逸保护(路径仍是以 workspace 根为基准做普通字符串解析,因此即使 junction 指向根目录之外也是安全的)。需要注意的权衡:跟随链接意味着索引可能把工作目录之外的大目录树也拉进来。一个保守的做法是只跟随解析后仍落在 workspace 根目录内的链接,和/或增加一个配置项(例如
followDirectoryLinks)以便按需关闭。已有的maxEntries上限会限制总的索引条目数。All reactions