Skip to content

[codex] 支持 SSH 终端目录跟随与远程文件区加载反馈#50

Merged
St0ff3l merged 1 commit into
mainfrom
codex/ssh-cwd-follow
Jun 21, 2026
Merged

[codex] 支持 SSH 终端目录跟随与远程文件区加载反馈#50
St0ff3l merged 1 commit into
mainfrom
codex/ssh-cwd-follow

Conversation

@St0ff3l

@St0ff3l St0ff3l commented Jun 21, 2026

Copy link
Copy Markdown
Owner

背景

当前 SSH 终端和远程文件面板彼此独立:用户在终端中执行 cdpushd/popd,或通过 alias/function 改变工作目录后,文件面板不会自动跟随。若直接解析用户输入的 cd 文本,又无法正确覆盖命令失败、复合命令和脚本内部切目录等情况。

本 PR 复用成熟终端工具的设计思路:由远端交互式 shell 上报真实 cwd,main process 提取 cwd 变化,再由 workspace runtime 决定是否驱动远程文件面板。Renderer 只消费 snapshot 和展示开关,不解析终端文本。

主要改动

1. 建立 shell cwd integration

新增 shell-cwd-integration.ts

  • 通过 OSC 7 序列上报远端 shell 当前目录。
  • 按 bash、zsh、fish、POSIX 风格 shell 生成不同注入策略。
  • 支持 OSC 7 跨数据 chunk 的增量解析。
  • cwd 探测或注入失败时静默降级,不影响 SSH 终端、SFTP 和已有文件操作。
  • Profile 明确关闭 Exec Channel 时不尝试额外探测。

2. 使用物理目录,修复 /bin/X11 循环符号链接问题

Debian/Ubuntu 中 /bin/X11 常见为指向当前目录的符号链接。连续执行 cd X11 时,逻辑 $PWD 会增长为:

/bin/X11/X11/X11/...

如果直接上报 $PWD,文件面板会把每次增长都视为新目录,持续触发 SFTP 读取,严重时可能拖慢或断开会话。

本 PR 改为使用 pwd -P 上报物理路径,因此循环符号链接最终会稳定映射到同一个真实目录。同时增加 4096 字符 OSC cwd payload 防线,拒绝异常长路径。

3. 将跟随策略放在 workspace runtime

WorkspaceSessionRuntime 负责:

  • 按 tab 保存和去重 shell cwd。
  • 判断该 tab 是否开启目录跟随。
  • 串行执行远程目录读取,避免和其他文件操作并发冲突。
  • 同一个 cwd 重复上报时不刷新文件列表。
  • 用户手动浏览文件目录后,相同 cwd 的 prompt 不会立即抢回;下一次真实 cwd 改变时恢复跟随。
  • 跟随过程中状态再次变化时,避免旧请求覆盖新状态。

4. 拆分核心状态语义

SessionSnapshot 新增:

  • shellCwd:终端 shell 当前物理目录。
  • remotePath:远程文件面板当前展示目录。
  • followShellCwd:当前 tab 是否跟随终端目录。
  • remoteFilesLoading:远程文件区域是否正在读取目录。

避免继续用单一 remotePath 同时承载终端和文件面板语义。

5. 增加 renderer 开关和局部加载反馈

  • SSH 文件面板新增“跟随终端”开关。
  • 开关状态通过 main -> preload -> renderer IPC 链路更新。
  • 手动进入目录、刷新以及 cwd 自动跟随时,仅在右侧远程文件列表区域显示居中 spinner。
  • 不再使用右下角全局“更新中”表达目录加载,本地文件区域和其他工作区不被遮挡。
  • spinner 保留无障碍状态语义,并适配 prefers-reduced-motion
  • 补充中英文文案。

架构边界

完整链路为:

remote shell integration
  -> OSC 7 cwd extraction
    -> SSH controller cwd changed callback
      -> workspace runtime follow policy
        -> remote file snapshot refresh
          -> renderer display and toggle

保持以下约束:

  • Renderer 不直接解析终端输出,也不访问 SSH/SFTP client。
  • SSH cwd 感知位于 controller 层。
  • 去重、跟随策略和文件刷新位于 runtime 层。
  • 新状态统一定义在 packages/core
  • FTP 会话不启用 cwd 跟随。

用户影响

  • 在终端执行 cdpushd/popd 后,远程文件面板可以自动切换到真实目录。
  • 命令失败时不会错误跳转文件区。
  • 可以按 tab 关闭或重新开启“跟随终端”。
  • /bin/X11 等循环符号链接不会造成目录路径无限增长和重复读取。
  • 远程目录加载反馈更明确,只在真正受影响的文件列表区域显示。

暂不包含

  • 不持久化每个 profile 的跟随开关。
  • 不解析用户输入的 cd 命令。
  • 不向 renderer 暴露远端 shell 类型。
  • 不为 FTP 会话增加终端目录跟随。

验证

已完成:

  • npm run typecheck
  • npm run build -w @termdock/desktop
  • OSC 7 分片解析检查
  • 超长 cwd payload 拒绝检查
  • sh/bash/zsh/fish 注入脚本语法检查
  • 本地循环符号链接回归:逻辑 cwd 持续增长时,pwd -P 物理 cwd 保持稳定
  • git diff --check

建议合并前再连接真实 Debian/Ubuntu SSH 主机回归:

  1. bash/zsh 中执行成功和失败的 cd
  2. 执行 pushd/popd
  3. 连续进入 /bin/X11
  4. 手动浏览文件区后再次改变终端 cwd。
  5. 关闭并重新开启“跟随终端”。
  6. 验证远程文件区域局部 spinner。

Co-authored-by: Codex <codex@openai.com>
@St0ff3l St0ff3l marked this pull request as ready for review June 21, 2026 12:32
@St0ff3l St0ff3l merged commit 78c755e into main Jun 21, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant