实验
PTY 与进程监督计划
1. 问题与目标
我们需要为长时间运行的命令执行建立一个可靠的生命周期,涵盖:
exec前台运行exec后台运行process后续操作 (poll,log,send-keys,paste,submit,kill,remove)- CLI 代理运行器子进程
目标不仅仅是支持 PTY。目标是实现可预测的所有权、取消、超时和清理,无需不安全的进程匹配启发式方法。
2. 范围与边界
- 将实现保持在
src/process/supervisor内部。 - 不要为此创建新的包。
- 在可行的情况下保持当前行为兼容性。
- 不要将范围扩大到终端回放或 tmux 风格的会话持久化。
3. 本分支已实现的内容
监督器基线已存在
- 监督器模块已就位,位于
src/process/supervisor/*。 - Exec 运行时和 CLI 运行器已通过监督器的 spawn 和 wait 进行路由。
- 注册表终结是幂等的。
本次已完成
- 明确的 PTY 命令契约
SpawnInput现在是src/process/supervisor/types.ts中的一个可辨识联合类型。- PTY 运行需要
ptyCommand,而不是重用通用的argv。 - 监督器不再在
src/process/supervisor/supervisor.ts中通过 argv 连接重建 PTY 命令字符串。 - Exec 运行时现在在
src/agents/bash-tools.exec-runtime.ts中直接传递ptyCommand。
- 进程层类型解耦
- 监督器类型不再从 agents 导入
SessionStdin。 - 进程本地 stdin 契约位于
src/process/supervisor/types.ts(ManagedRunStdin)。 - 适配器现在仅依赖于进程层类型:
src/process/supervisor/adapters/child.tssrc/process/supervisor/adapters/pty.ts
- 进程工具生命周期所有权改进
src/agents/bash-tools.process.ts现在首先通过监督器请求取消。process kill/remove现在在监督器查找失败时使用进程树回退终止。remove通过在请求终止后立即删除正在运行的会话条目,保持确定性的移除行为。
- 单一来源的看门狗默认值
- 在
src/agents/cli-watchdog-defaults.ts中添加了共享默认值。 src/agents/cli-backends.ts使用共享默认值。src/agents/cli-runner/reliability.ts使用相同的共享默认值。
- 已死辅助代码清理
- 从
src/agents/bash-tools.shared.ts中移除了未使用的killSession辅助路径。
- 添加了直接监督器路径测试
- 添加了
src/agents/bash-tools.process.supervisor.test.ts以覆盖通过监督器取消进行 kill 和 remove 路由的情况。
- 可靠性缺口修复完成
src/agents/bash-tools.process.ts现在在监督器查找失败时回退到真正的操作系统级进程终止。src/process/supervisor/adapters/child.ts现在对默认的取消/超时终止路径使用进程树终止语义。- 在
src/process/kill-tree.ts中添加了共享的进程树工具。
- 添加了 PTY 契约边缘情况覆盖
- 添加了
src/process/supervisor/supervisor.pty-command.test.ts用于逐字 PTY 命令转发和空命令拒绝。 - 添加了
src/process/supervisor/adapters/child.test.ts用于子适配器取消中的进程树终止行为。