Add Herdr update and live handoff menu actions
The Ctrl+A h command menu gains two host-scoped actions: a plain `herdr update` that streams updater output into the popup, and an experimental update-and-hot-restart flow that verifies a live server handoff and reconnects the originating Hub tab once the popup closes. Remote updates use the remote host's own proxy settings. A standalone helper reads literal proxy assignments from shell profiles and running Clash/Mihomo listeners without executing startup files; Windows reads process, user and machine proxy variables through PowerShell.
This commit is contained in:
@@ -110,7 +110,7 @@ Hub 使用独立 tmux socket `herdr-hub`,不会接管普通 tmux server。外
|
||||
### Fork 当前 Agent 到新 Tab
|
||||
|
||||
按 **Ctrl+A h** 打开独立的 Herdr 命令菜单,选择“Fork 当前会话到新 Tab”,
|
||||
按 Enter 或单击执行,Esc 关闭。菜单只显示当前 Agent、Workspace、主操作和必要的状态信息。
|
||||
按 Enter 或单击执行,Esc 关闭。菜单显示当前 Agent、Workspace、Fork 和更新操作及必要的状态信息。
|
||||
操作正在执行时需等待结果后再关闭,以免将关闭弹窗误认为取消已经发送的请求。
|
||||
Sessions 弹窗仍使用 `Ctrl+A g`;两个菜单都使用 Hub 外层的 `Ctrl+A` 前缀。
|
||||
快捷键集中定义在 `herdr_hub/control.py` 的 `CONTROL_KEY` 常量中。
|
||||
@@ -124,6 +124,9 @@ Codex 执行 `codex fork UUID`;Claude 执行 `claude --resume SESSION_ID --for
|
||||
支持本地 default / named session,以及通过 SSH 控制的远端 native / Windows SSH endpoint。
|
||||
控制目标取自触发菜单的 Hub window metadata,不使用 popup 继承的 Herdr socket 或 pane 环境变量。
|
||||
目标必须运行 Herdr 0.9+,并安装对应 Agent;当前 pane 必须已报告可用的 Agent session ID。
|
||||
Fork 显示灰色时,菜单会说明原因;按 `Ctrl+R` 可重新读取当前 Agent 信息。
|
||||
若提示尚未上报会话 ID,在该主机检查 `herdr integration status`,确认对应 Agent 的集成已加载。
|
||||
识别出 Codex / Claude 并不代表已经取得 conversation ID;Hub 不会根据目录猜测会话。
|
||||
远端控制使用非交互 SSH(需要已信任的主机密钥和可用认证);Windows 需要 PowerShell。
|
||||
启动 blocked、失败、超时或响应不完整时,菜单保留错误信息,**不会自动关闭任何 Tab**。
|
||||
超时并不代表远端没有创建或启动成功,请先检查提示中的新 Tab,再重新打开菜单重试。
|
||||
@@ -132,6 +135,54 @@ CLI 入口是 `herdr-hub control`。弹窗打开时会锁定 Hub 当前激活的
|
||||
再从其 Endpoint 对应的 Herdr server 读取当前页面的 Agent conversation。
|
||||
更新后运行 `herdr-hub refresh` 配置现有 Hub 的快捷键。`herdr-hub doctor` 会显示入口和版本要求。
|
||||
|
||||
### 从命令菜单更新 Herdr
|
||||
|
||||
需要让运行中的服务器也使用新版本时,按 **Ctrl+A h → 更新并热重启 Herdr**。
|
||||
此操作先更新当前 Tab 所在主机的 Herdr,再对当前 Session 执行实验性的 live handoff,
|
||||
尝试保留 Agent、shell 和其他 pane 进程。它会核对服务器版本;确认使用更新后的版本后,
|
||||
自动关闭菜单并重新连接打开菜单时的那个 Hub Tab。即使此前已安装新版本、服务器仍是旧版,
|
||||
也会尝试热切换。该 Session 内的所有 Workspace/Tab 共用服务器,因此都会随之切换。
|
||||
|
||||
更新阶段使用 `herdr --session NAME update --handoff`,兼容 0.8.x 在非交互 SSH 下的更新要求。
|
||||
原生更新已经尝试热切换却未切换成功时,不会再次发送请求;仅在安装文件未变化、旧服务器仍运行时补做热切换。
|
||||
|
||||
热切换适用于支持该能力的 Linux/macOS Herdr 服务器;远端还需有 `python3`。
|
||||
Windows 不支持此入口,可以使用下面的普通更新。失败、超时、服务器不支持或未确认新版本时,
|
||||
菜单保留诊断,不自动执行普通重启,也不重试热切换。连接中断时操作可能已经完成,请先检查
|
||||
目标 Session。普通重启会结束 pane 进程;缺少会话 ID 的 Agent 不能保证自动恢复。
|
||||
|
||||
按 **Ctrl+A h**,选择“更新 Herdr”,按 Enter 或单击执行。更新目标跟随打开菜单时的
|
||||
当前 Hub Tab:本地 Session 更新本机,远端 Session 通过 SSH 更新对应主机(包括 Windows)。
|
||||
菜单会显示目标主机;更新作用于该主机的 Herdr 安装,而非单个 Session。当前 pane 没有
|
||||
Agent 或无法读取 Agent 信息时,仍可使用更新操作。
|
||||
|
||||
该操作执行 `herdr update`,沿用目标主机已有的更新渠道,不传入 `--handoff`。
|
||||
它适用于 Herdr 自带安装器管理的安装;Homebrew、mise、Nix 等安装需使用对应包管理器更新。
|
||||
这个普通更新入口不自动重启 Session 或重新连接客户端。完成后可关闭菜单,按 `Ctrl+A R` 重新连接;
|
||||
服务器端新功能可能仍需另行重启服务器。兼容的服务器会继续运行;旧版本升级若要求停止
|
||||
Session 或交互确认,本菜单不会代为确认,请根据命令输出在终端处理。
|
||||
|
||||
更新在后台执行,实时显示命令输出,最长等待 5 分钟。小窗口自动使用紧凑布局,保证结果区可见。
|
||||
下载器没有新输出时,菜单显示已执行时间和无新输出时间。
|
||||
读取 Agent 信息期间也可选择更新。结果留在菜单内,可用 Page Up/Down 翻阅,Esc 关闭。
|
||||
执行期间需等待结果;同一次菜单内更新只能执行一次,失败或超时也不会自动重试。
|
||||
超时或 SSH 断开不代表目标主机已取消更新,请检查目标状态后再重新打开菜单。
|
||||
|
||||
远端更新使用远端自己的代理。优先保留 SSH 进程已有的 `http_proxy`、`https_proxy`、
|
||||
`all_proxy`、`no_proxy`(兼容大写);Linux/macOS 还通过远端 `python3` 读取
|
||||
`/etc/environment`、`/etc/profile`、`/etc/profile.d/*.sh`、`~/.config/environment.d/*.conf`
|
||||
及用户 profile、bash/zsh 配置中的独立、无缩进的字面量赋值或 `export` 行。
|
||||
不会执行整个 shell 配置文件,也不解析命令替换、变量引用或条件表达式。
|
||||
没有上述代理变量时,还会读取远端 Clash Verge、Mihomo/Clash 常见运行配置中的
|
||||
`mixed-port`、`port` 或 `socks-port`,确认对应回环端口可连接后用于本次更新。
|
||||
Linux 下会优先从正在运行的 Mihomo/Clash 进程读取 `-f` / `-d` 指定的配置路径,支持 systemd 服务使用自定义目录。
|
||||
这覆盖了 TUN 模式下没有环境变量的情况,不会修改桌面系统代理开关。
|
||||
需要认证的应用代理、不在已支持路径中的配置及未运行的端口不会自动采用。
|
||||
Windows 普通更新会补读远端用户和系统的代理环境变量。
|
||||
检测结果只显示配置来源,不显示代理地址或凭据;配置仅传给本次更新进程。
|
||||
没有检测到代理时沿用远端网络和 curl 自身配置,不自动借用本机代理。
|
||||
“未检测到代理”只是网络方式说明;更新失败时,菜单会先显示末尾的具体错误,再列完整输出。
|
||||
|
||||
## 远端 Session 弹窗
|
||||
|
||||
弹窗由 tmux `display-popup` 和 Hub 内置选择器组成,不依赖 fzf。它会立即显示已打开的
|
||||
|
||||
Reference in New Issue
Block a user