问题描述
点击对话中指向当前会话工作区之外的文件引用时,文件工作台(better-sidebar)会直接报错:
path "..." is outside workspace
而不是提供可用兜底(只读预览 / 系统编辑器打开 / 在资源管理器中定位)。
复现步骤
- 启动一个 DSH web 会话,工作区为任意项目目录(如
/home/user/project-a)。
- 让助手在对话中引用一个工作区外的文件(例如用户目录下其他位置的文件:
~/.some-dir/some-file.md),并渲染成可点击的文件引用。
- 点击该引用。
- better-sidebar 文件工作台报 403:
path "..." is outside workspace。
期望行为
对话里的文件引用并不保证位于会话工作区内。点击后应优雅降级,而不是抛裸 403:
- 只读预览该文件(放开工作区外的读访问,同时保持写仍被围栏限制),或
- 回退到原
workspaces.openPath(系统默认方式打开),或
- 至少提供内联操作(如「在系统编辑器中打开」/「在资源管理器中定位」)并配清晰提示。
根因(代码层面,供维护者参考)
拦截点位于 lib/index.js:
async function assertWithinWorkspace(workspace, target) {
if (!isWithin(workspace, target))
throw new SidebarError("forbidden", `path "${target}" is outside workspace`, 403);
}
所有读路径(readText、媒体路由、编辑器打开)都经 ensureWorkspacePath(cwd, ...) 校验,cwd 取自会话 header / 客户端 cwd / 持久化 meta / process.cwd()(见 sessionCwdOf)。目前没有任何配置可添加额外工作区根或外部目录(PrefsSchema / host Config 只有大小限制、终端、浏览器、tab/viewer 开关,没有路径相关项);且 interceptOpenPath: true(默认)会让所有对话文件打开都走侧边栏,因此工作区外文件引用必然触发此错误。
可选的实现方向
- 增加可选的白名单/附加根目录配置(宿主配置或按会话设置),列出允许在工作区外只读打开(或限制在
readLimit / mediaLimit 内)的目录。
- 拦截时若目标在工作区外,回退到原始
workspaces.openPath(系统打开),而不是抛错。
- 只读放开工作区外的绝对路径读取(读已被
readLimit / mediaLimit 限制),写路径继续保持围栏。
如果上面某个方向可行,我可以提供补丁。
问题描述
点击对话中指向当前会话工作区之外的文件引用时,文件工作台(better-sidebar)会直接报错:
而不是提供可用兜底(只读预览 / 系统编辑器打开 / 在资源管理器中定位)。
复现步骤
/home/user/project-a)。~/.some-dir/some-file.md),并渲染成可点击的文件引用。path "..." is outside workspace。期望行为
对话里的文件引用并不保证位于会话工作区内。点击后应优雅降级,而不是抛裸 403:
workspaces.openPath(系统默认方式打开),或根因(代码层面,供维护者参考)
拦截点位于
lib/index.js:所有读路径(
readText、媒体路由、编辑器打开)都经ensureWorkspacePath(cwd, ...)校验,cwd取自会话 header / 客户端 cwd / 持久化 meta /process.cwd()(见sessionCwdOf)。目前没有任何配置可添加额外工作区根或外部目录(PrefsSchema / host Config 只有大小限制、终端、浏览器、tab/viewer 开关,没有路径相关项);且interceptOpenPath: true(默认)会让所有对话文件打开都走侧边栏,因此工作区外文件引用必然触发此错误。可选的实现方向
readLimit/mediaLimit内)的目录。workspaces.openPath(系统打开),而不是抛错。readLimit/mediaLimit限制),写路径继续保持围栏。如果上面某个方向可行,我可以提供补丁。