issue: terminal session working directory and file browser reset to the root after every command

该问题通常出现在 Open WebUI 已启用 Open Terminal 并配置了非 / 的文件浏览器根目录时:每次终端命令执行后,前端会收到 terminal:run_command 事件并把文件导航强制设回 / ,经 root clamp 后回写 POST /files/cwd ,导致会话工作

快速结论:该问题通常出现在 Open WebUI 已启用 Open Terminal 并配置了非 / 的文件浏览器根目录时:每次终端命令执行后,前端会收到 terminal:run_command 事件并把文件导航强制设回 /,经 root clamp 后回写 POST /files/cwd,导致会话工作目录和文件面板一起回到根目录。优先排查前端事件处理逻辑与 OPEN_TERMINAL_FILE_BROWSER_ROOT 配置。

适用环境:Issue 已确认的环境为 Open WebUI v0.11.3(Docker 安装)、Debian 13、Firefox、open-terminal 0.12.5(通过 pipx 安装在终端容器内)。报告称该问题在 main/dev 分支研究快照时仍存在,但未给出可验证的修复版本。

最快修复方案:暂无确认的一步修复方案。Issue 中给出的建议方向是修改 Chat.svelte 中 terminal:run_command 的处理逻辑:不再执行 showFileNavDir.set('/'),改为刷新当前目录;或让 FileNav 把 root 外的请求当作刷新而不是导航到根目录。

注意事项:上述仅为 Issue 讨论中提出的修复建议,未在 Issue 中确认已被合并或发布。除非能自行修改前端源码并重新构建,否则等待官方修复。修改前建议先确认当前使用的 Open WebUI 版本是否已包含相关改动。

问题场景

在 Open WebUI 中开启 Open Terminal 后,打开文件浏览器面板并进入根目录下的某个子目录,然后在聊天中让 agent 执行命令。第一条命令会在所选子目录中执行,但从第二条命令开始,终端会话工作目录会静默重置到文件浏览器根目录,文件面板也会跳回根目录,正在查看的文件预览可能被关闭。

该行为只在所选目录位于文件浏览器根目录之下时可见;如果选中的就是根目录本身,则看不出变化,因此容易长期不被发现。

报错原文

issue: terminal session working directory and file browser reset to the root after every command

Command #1 after selecting a folder runs in the selected folder (e.g. pwd prints [browser-root]/subfolder).

Command #2, seconds later, runs in the file browser root (pwd prints [browser-root]).

The file browser panel also visibly jumps back to the root after each command run.

POST /execute
POST /files/cwd

Could not read file.

原因分析

Issue 评论中的因果链追踪显示,问题不在 open-terminal 接收端,而在 Open WebUI 前端事件处理:

  1. 中间件在每条终端命令后发出 terminal:run_command 事件,data 为空对象。
  2. Chat.svelte 对该事件的处理是无条件执行 showFileNavDir.set('/')。
  3. FileNav.svelte 收到导航请求后,如果 / 位于配置的文件浏览器根目录之外(例如根目录为 /workspace),会把路径 clamp 回浏览器根目录。
  4. loadDir() 随后无条件调用 setCwd(...),产生指向浏览器根目录的 POST /files/cwd。
  5. open-terminal 把该路径写入其按会话维护的 cwd store,后续 /execute 请求都从该 store 解析工作目录。

因此第二条命令回到根目录是这条链条的预期结果。接收端符合其 API 契约,错误的根目录写入源自前端事件处理。

评论还指出两个相关影响:其一,loadDir() 无条件触发 setCwd(),会连带影响 agent 的相对路径工具调用(run_command 默认 cwd、read_file、write_file、display_file),使其在命令执行后静默指向浏览器根目录,直到用户手动把面板导航到真实目录、终端容器重启,或 open-terminal 的 7 天 cwd TTL 到期;使用绝对路径的模型不受影响。其二,terminal_event_handler 对 display_file / write_file / replace_file_content 发出的是模型原始参数字符串而非服务端解析后的绝对路径,相对路径参数会通不过 isInsideFileRoot 前缀校验,触发同样的 clamp 与 setCwd 回写。此外,showFileNavPath 订阅中的 await loadDir(dir) → await tick() → openEntry(entry) 顺序存在竞态,若 terminal:run_command 反弹落在 await 之间,预览会用根目录拼接文件名并报 Could not read file.。

环境排查

  • 确认 Open WebUI 版本,Issue 中确认受影响的是 v0.11.3,评论称 main 在 2026-09-19 时仍存在。
  • 确认安装方式,Issue 中为 Docker。
  • 确认操作系统,Issue 中为 Debian 13。
  • 确认浏览器,Issue 中为 Firefox。
  • 确认是否启用 Open Terminal,以及 open-terminal 版本,Issue 中为 0.12.5,通过 pipx 安装在终端容器内。
  • 确认是否配置了 OPEN_TERMINAL_FILE_BROWSER_ROOT,且该值不是 /;未配置非 / 根目录时不容易观察到该问题。
  • 确认能否访问容器或反向代理访问日志,观察每次 POST /execute 后是否紧跟一个指向根目录的 POST /files/cwd。
  • Ollama 版本在 Issue 中未填写,无法据此排查。

解决步骤

  1. 按 Issue 复现路径确认现象:进入根目录下的子目录,执行 pwd,等待几秒再执行 pwd;若第二次输出根目录,即命中该问题。
  2. 在容器或反向代理日志中确认每次 POST /execute 后是否伴随指向根目录的 POST /files/cwd,以区分本问题与 open-terminal 自身状态异常。
  3. 如果使用源码部署并希望试验性修复,可优先尝试评论中建议的方向:在 Chat.svelte 中把 terminal:run_command 处理改为刷新当前目录,而不是 showFileNavDir.set('/');或让 FileNav 把 root 外的导航请求当作刷新处理。
  4. 若暂无自行改码条件,可先把文件浏览器根目录设为 / 作为绕过观察,但 Issue 未验证该做法能否完全规避 agent 相对路径被重定向的问题。
  5. 临时缓解:让 agent 使用绝对路径,或在每条命令中显式 cd 到目标目录,避免依赖会话 cwd。
  6. 关注上游是否发布包含该前端事件处理修改的版本,升级前先确认发行说明或对应提交。

验证方法

重新进入文件浏览器根目录下的子目录,执行 pwd,等待几秒后再次执行 pwd。如果两次都输出子目录路径,且日志中不再出现命令执行后紧跟指向根目录的 POST /files/cwd,说明前端不再把导航重置到根目录,问题已缓解。若同时验证 agent 相对路径写入,可让 agent 在子目录中执行一次相对路径 write_file,确认文件落在预期子目录而非根目录。

参考来源

open-webui/open-webui #30051

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 27083

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注