PTY 與進程監督計畫
PTY 與進程監督計畫
Section titled “PTY 與進程監督計畫”1. 問題與目標
Section titled “1. 問題與目標”我們需要一個可靠的長時間執行命令生命週期,涵蓋:
exec前台執行exec背景執行process後續動作 (poll,log,send-keys,paste,submit,kill,remove)- CLI agent runner 子進程
目標不僅僅是支援 PTY。目標是可預測的所有權、取消、逾時和清理,且不使用不安全的進程匹配啟發式方法。
2. 範圍與邊界
Section titled “2. 範圍與邊界”- 將實作保留在
src/process/supervisor內部。 - 不要為此建立一個新的套件。
- 在實務上保持目前行為的相容性。
- 不要將範圍擴大到終端機重播或 tmux 樣式的會話持久性。
3. 本分支中已實作的內容
Section titled “3. 本分支中已實作的內容”Supervisor 基準已存在
Section titled “Supervisor 基準已存在”- Supervisor 模組已置於
src/process/supervisor/*之下。 - Exec runtime 和 CLI runner 已經透過 supervisor spawn 和 wait 進行路由。
- Registry 最終處理是冪等的。
此階段已完成
Section titled “此階段已完成”- 明確的 PTY 命令合約
SpawnInput現在是src/process/supervisor/types.ts中的一個可辨識聯集。- PTY 執行需要
ptyCommand,而不是重複使用通用的argv。 - Supervisor 不再在
src/process/supervisor/supervisor.ts中從 argv 連接重建 PTY 命令字串。 - Exec runtime 現在直接在
src/agents/bash-tools.exec-runtime.ts中傳遞ptyCommand。
- 進程層類型解耦
- Supervisor types no longer import
SessionStdinfrom agents. - Process local stdin contract lives in
src/process/supervisor/types.ts(ManagedRunStdin). - Adapters now depend only on process level types:
src/process/supervisor/adapters/child.tssrc/process/supervisor/adapters/pty.ts
- Process tool lifecycle ownership improvement
src/agents/bash-tools.process.tsnow requests cancellation through supervisor first.process kill/removenow use process-tree fallback termination when supervisor lookup misses.removekeeps deterministic remove behavior by dropping running session entries immediately after termination is requested.
- Single source watchdog defaults
- Added shared defaults in
src/agents/cli-watchdog-defaults.ts. src/agents/cli-backends.tsconsumes the shared defaults.src/agents/cli-runner/reliability.tsconsumes the same shared defaults.
- Dead helper cleanup
- Removed unused
killSessionhelper path fromsrc/agents/bash-tools.shared.ts.
- Direct supervisor path tests added
- Added
src/agents/bash-tools.process.supervisor.test.tsto cover kill and remove routing through supervisor cancellation.
- Reliability gap fixes completed
src/agents/bash-tools.process.tsnow falls back to real OS-level process termination when supervisor lookup misses.src/process/supervisor/adapters/child.tsnow uses process-tree termination semantics for default cancel/timeout kill paths.- Added shared process-tree utility in
src/process/kill-tree.ts.
- PTY contract edge-case coverage added
- Added
src/process/supervisor/supervisor.pty-command.test.tsfor verbatim PTY command forwarding and empty-command rejection. - Added
src/process/supervisor/adapters/child.test.tsfor process-tree kill behavior in child adapter cancellation.
4. Remaining gaps and decisions
Section titled “4. Remaining gaps and decisions”Reliability status
Section titled “Reliability status”The two required reliability gaps for this pass are now closed:
process kill/removenow has a real OS termination fallback when supervisor lookup misses.- child cancel/timeout now uses process-tree kill semantics for default kill path.
- Regression tests were added for both behaviors.
Durability and startup reconciliation
Section titled “Durability and startup reconciliation”Restart behavior is now explicitly defined as in-memory lifecycle only.
- 根據設計,
reconcileOrphans()在src/process/supervisor/supervisor.ts中仍然是一個空操作。 - 程序重啟後不會恢復正在運行的實例。
- 此邊界是此實現階段有意為之,以避免部分持久化的風險。
可維護性後續工作
Section titled “可維護性後續工作”runExecProcess在src/agents/bash-tools.exec-runtime.ts中仍然處理多種職責,可以在後續工作中拆分為專注的輔助程式。
5. 實作計畫
Section titled “5. 實作計畫”所需可靠性和契約項目的實現階段已完成。
已完成:
process kill/remove備援真實終止- 子配接器預設殺死路徑的程序樹取消
- 備援殺死和子配接器殺死路徑的回歸測試
- 在明確的
ptyCommand下進行的 PTY 指令邊緣情況測試 - 明確的記憶體內重啟邊界,根據設計
reconcileOrphans()為空操作
可選後續工作:
- 將
runExecProcess拆分為專注的輔助程式,且不改變行為
6. 檔案對應
Section titled “6. 檔案對應”src/process/supervisor/types.ts已更新,增加了可區分的生成輸入和程序本地 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移除了直接殺死輔助路徑。
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
E2E 目標:
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
Typecheck 備註:
- 在此儲存庫中使用
pnpm build(以及pnpm check進行完整的 lint/docs 檢查)。提及pnpm tsgo的舊備註已過時。
8. 保留的操作保證
Section titled “8. 保留的操作保證”- Exec env 加強行為保持不變。
- 審核與許可清單流程保持不變。
- 輸出清理與輸出上限保持不變。
- PTY 配接器仍保證在強制終止和監聽器處置時等待結果。
9. 完成的定義
Section titled “9. 完成的定義”- Supervisor 是受控執行的生命週期擁有者。
- PTY 產生使用明確的指令合約,不進行 argv 重建。
- Process 層對於 supervisor stdin 合約不依賴 agent 層的類型。
- Watchdog 預設值為單一來源。
- 目標單元測試與 e2e 測試保持綠燈(通過)。
- 重新啟動持久性邊界已明確記錄或完整實作。
10. 總結
Section titled “10. 總結”此分支現具備連貫且更安全的監督形狀:
- 明確的 PTY 合約
- 更清晰的 process 分層
- supervisor 驅動的程序操作取消路徑
- supervisor 查找未命中時的真正備用終止
- 子執行預設終止路徑的程序樹取消
- 統一的 watchdog 預設值
- 明確的記憶體內重新啟動邊界(此階段不進行重新啟動期間的孤立協調)