PTY and Process Supervision Plan
PTY 和进程监督计划
Section titled “PTY 和进程监督计划”1. 问题和目标
Section titled “1. 问题和目标”我们需要为长时间运行的命令执行提供一个可靠的生命周期,覆盖:
exec前台运行exec后台运行process后续操作(poll、log、send-keys、paste、submit、kill、remove)- CLI 代理运行器子进程
目标不仅仅是支持 PTY。目标是可预测的所有权、取消、超时和清理,没有不安全的进程匹配启发式。
2. 范围和边界
Section titled “2. 范围和边界”- 保持实现在
src/process/supervisor内部。 - 不为此创建新包。
- 在实际可行的情况下保持当前行为兼容性。
- 不将范围扩大到终端重放或 tmux 风格的会话持久化。
3. 本分支中的实现
Section titled “3. 本分支中的实现”监督器基线已就位
Section titled “监督器基线已就位”- 监督器模块位于
src/process/supervisor/*下。 - Exec 运行时和 CLI 运行器已通过监督器 spawn 和 wait 路由。
- 注册表最终化是幂等的。
本轮完成内容
Section titled “本轮完成内容”- 显式 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现在对默认的 cancel/超时 kill 路径使用进程树终止语义。- 在
src/process/kill-tree.ts中添加了共享的进程树工具。
- 添加了 PTY 契约边缘情况覆盖
- 添加了
src/process/supervisor/supervisor.pty-command.test.ts用于逐字 PTY 命令转发和空命令拒绝。 - 添加了
src/process/supervisor/adapters/child.test.ts用于子适配器取消中的进程树 kill 行为。
4. 剩余缺口和决策
Section titled “4. 剩余缺口和决策”本轮所需的两个可靠性缺口现已关闭:
process kill/remove现在在监督器查找未命中时有真实的操作系统终止回退。- 子进程 cancel/超时现在对默认 kill 路径使用进程树 kill 语义。
- 已为这两种行为添加了回归测试。
持久性和启动协调
Section titled “持久性和启动协调”重启行为现在被显式定义为仅内存生命周期。
reconcileOrphans()在src/process/supervisor/supervisor.ts中设计上保持为空操作。- 活跃运行在进程重启后不恢复。
- 此边界对于本次实现轮是有意的,以避免部分持久化的风险。
可维护性后续
Section titled “可维护性后续”src/agents/bash-tools.exec-runtime.ts中的runExecProcess仍然处理多个职责,可在后续中拆分为专注的辅助函数。
5. 实现计划
Section titled “5. 实现计划”所需可靠性和契约项目的实现轮次已完成。
已完成:
process kill/remove回退真实终止- 子适配器默认 kill 路径的进程树取消
- 回退 kill 和子适配器 kill 路径的回归测试
- 显式
ptyCommand下的 PTY 命令边缘情况测试 - 显式的仅内存重启边界,
reconcileOrphans()设计上为空操作
可选后续:
- 将
runExecProcess拆分为专注的辅助函数且不改变行为
6. 文件映射
Section titled “6. 文件映射”src/process/supervisor/types.ts已更新为可辨识 spawn 输入和进程本地 stdin 契约。src/process/supervisor/supervisor.ts已更新为使用显式ptyCommand。src/process/supervisor/adapters/child.ts和src/process/supervisor/adapters/pty.ts已与代理类型解耦。src/process/supervisor/registry.ts幂等最终化未更改并保留。
Exec 和进程集成
Section titled “Exec 和进程集成”src/agents/bash-tools.exec-runtime.ts已更新为显式传递 PTY 命令并保留回退路径。src/agents/bash-tools.process.ts已更新为通过监督器取消并带真实进程树回退终止。src/agents/bash-tools.shared.ts已移除直接 kill 辅助路径。
CLI 可靠性
Section titled “CLI 可靠性”src/agents/cli-watchdog-defaults.ts已添加为共享基线。src/agents/cli-backends.ts和src/agents/cli-runner/reliability.ts现在消费相同的默认值。
7. 本轮验证运行
Section titled “7. 本轮验证运行”单元测试:
pnpm vitest src/process/supervisor/registry.test.tspnpm vitest src/process/supervisor/supervisor.test.tspnpm vitest src/process/supervisor/supervisor.pty-command.test.tspnpm vitest src/process/supervisor/adapters/child.test.tspnpm vitest src/agents/cli-backends.test.tspnpm vitest src/agents/bash-tools.exec.pty-cleanup.test.tspnpm vitest src/agents/bash-tools.process.poll-timeout.test.tspnpm vitest src/agents/bash-tools.process.supervisor.test.tspnpm vitest src/process/exec.test.ts
端到端目标:
pnpm vitest src/agents/cli-runner.test.tspnpm vitest run src/agents/bash-tools.exec.pty-fallback.test.ts src/agents/bash-tools.exec.background-abort.test.ts src/agents/bash-tools.process.send-keys.test.ts
类型检查说明:
- 在此仓库中使用
pnpm build(以及pnpm check用于完整的 lint/文档门控)。提到pnpm tsgo的旧笔记已过时。
8. 保留的运营保证
Section titled “8. 保留的运营保证”- Exec 环境加固行为未更改。
- 审批和允许列表流程未更改。
- 输出净化和输出上限未更改。
- PTY 适配器仍然保证在强制 kill 和监听器释放时的 wait 结算。
9. 完成定义
Section titled “9. 完成定义”- 监督器是托管运行的生命周期所有者。
- PTY spawn 使用显式命令契约,无 argv 重建。
- 进程层在监督器 stdin 契约方面不依赖代理层类型。
- 看门狗默认值为单一来源。
- 定向的单元和端到端测试保持绿色。
- 重启持久性边界被显式记录或完全实现。
10. 总结
Section titled “10. 总结”此分支现在具有一致且更安全的监督形状:
- 显式 PTY 契约
- 更清晰的进程分层
- 监督器驱动的进程操作取消路径
- 监督器查找未命中时的真实回退终止
- 子运行默认 kill 路径的进程树取消
- 统一的看门狗默认值
- 显式的仅内存重启边界(本轮不跨重启协调孤儿进程)