1. 問題と目標
次の長時間コマンド実行をまたいで、単一で信頼できるライフサイクルが必要です。execのフォアグラウンド実行execのバックグラウンド実行processの後続アクション(poll、log、send-keys、paste、submit、kill、remove)- CLI エージェントランナーのサブプロセス
2. スコープと境界
- 実装は
src/process/supervisor内部に閉じる - このために新しい package は作らない
- 実用上可能な範囲で現行挙動との互換性を維持する
- terminal replay や tmux 風の session 永続化までスコープを広げない
3. このブランチで実装済みの内容
すでに存在する supervisor の基盤
- supervisor モジュールは
src/process/supervisor/*に配置済み - exec runtime と CLI runner は、すでに supervisor の spawn / wait を経由する構成になっている
- registry の finalize は冪等である
この実装パスで完了した項目
- 明示的な PTY コマンド契約
SpawnInputはsrc/process/supervisor/types.tsで判別共用体になった- PTY 実行では汎用
argvの再利用ではなくptyCommandを必須とした - supervisor は
src/process/supervisor/supervisor.tsでargvの join から PTY コマンド文字列を再構築しなくなった - exec runtime は
src/agents/bash-tools.exec-runtime.tsからptyCommandを直接渡すようになった
- process 層の型の分離
- supervisor の型は agent 層から
SessionStdinを import しなくなった - process ローカルの stdin 契約は
src/process/supervisor/types.tsのManagedRunStdinに置かれた - adapter は process 層の型だけに依存するようになった
src/process/supervisor/adapters/child.tssrc/process/supervisor/adapters/pty.ts
- process ツールのライフサイクル所有権の改善
src/agents/bash-tools.process.tsは、まず supervisor 経由で cancel を要求するようになったprocess kill/removeは、supervisor lookup に失敗した場合に process-tree ベースのフォールバック終了を使うようになったremoveは、終了要求を出した直後に実行中 session entry を削除することで、決定的な remove 動作を維持している
- watchdog デフォルトの単一ソース化
src/agents/cli-watchdog-defaults.tsに共有デフォルトを追加したsrc/agents/cli-backends.tsはその共有デフォルトを利用するようになったsrc/agents/cli-runner/reliability.tsも同じ共有デフォルトを利用するようになった
- 死んだ helper の削除
- 未使用の
killSessionhelper 経路をsrc/agents/bash-tools.shared.tsから削除した
- supervisor 直結経路のテスト追加
- supervisor cancel を経由した kill / remove のルーティングを確認する
src/agents/bash-tools.process.supervisor.test.tsを追加した
- 信頼性ギャップの修正完了
src/agents/bash-tools.process.tsは、supervisor lookup に失敗したとき OS レベルの実プロセス終了へフォールバックするようになったsrc/process/supervisor/adapters/child.tsは、標準の cancel / timeout kill 経路で process-tree 終了セマンティクスを使うようになった- 共通の process-tree utility を
src/process/kill-tree.tsに追加した
- PTY 契約のエッジケース検証を追加
src/process/supervisor/supervisor.pty-command.test.tsを追加し、PTY コマンドのそのまま転送と空コマンド拒否を検証したsrc/process/supervisor/adapters/child.test.tsを追加し、child adapter cancel 時の process-tree kill 挙動を検証した
4. 残るギャップと判断
信頼性の状態
この実装パスで必須だった 2 つの信頼性ギャップは解消済みです。process kill/removeには、supervisor lookup miss 時の実プロセス終了フォールバックが入った- child cancel / timeout は、標準 kill 経路で process-tree kill を使うようになった
- 両挙動に対する回帰テストも追加済み
永続性と起動時の整合
再起動時の挙動は、明示的に「メモリ内ライフサイクルのみ」と定義されました。reconcileOrphans()はsrc/process/supervisor/supervisor.tsで設計上 no-op のまま維持する- プロセス再起動後に active run は復元しない
- この境界は、中途半端な永続化によるリスクを避けるため、この実装パスでは意図的に残している
保守性のフォローアップ
src/agents/bash-tools.exec-runtime.tsのrunExecProcessは依然として複数責務を持っており、後続で責務ごとの helper に分割できる
5. 実装計画
必須だった信頼性項目と契約項目の実装は完了しています。 完了済み:process kill/removeのフォールバック実終了- child adapter の標準 kill 経路における process-tree cancel
- フォールバック kill と child adapter kill 経路の回帰テスト
- 明示的な
ptyCommandに基づく PTY コマンドのエッジケーステスト reconcileOrphans()を no-op とする、明示的なメモリ内再起動境界
runExecProcessを、挙動を変えずに責務別 helper へ分割する
6. ファイルマップ
process supervisor
src/process/supervisor/types.tsは、判別された spawn input と process ローカル stdin 契約を持つよう更新されたsrc/process/supervisor/supervisor.tsは、明示的なptyCommandを使うよう更新されたsrc/process/supervisor/adapters/child.tsとsrc/process/supervisor/adapters/pty.tsは、agent 層の型から切り離されたsrc/process/supervisor/registry.tsの冪等 finalize は変更せず維持した
exec と process の統合
src/agents/bash-tools.exec-runtime.tsは、PTY コマンドを明示的に渡しつつフォールバック経路を維持するよう更新されたsrc/agents/bash-tools.process.tsは、supervisor 経由の cancel と、必要時の実 process-tree 終了フォールバックを使うよう更新されたsrc/agents/bash-tools.shared.tsから直接 kill helper 経路を削除した
CLI の信頼性
src/agents/cli-watchdog-defaults.tsを共有ベースラインとして追加したsrc/agents/cli-backends.tsとsrc/agents/cli-runner/reliability.tsは同じデフォルト値を参照するようになった
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を使います。lint / docs を含む完全なゲートにはpnpm checkを使ってください pnpm tsgoに言及している古いメモは廃止済みです
8. 維持される運用保証
- exec env の hardening 挙動は変わらない
- 承認と allowlist のフローは変わらない
- 出力のサニタイズと出力上限は変わらない
- PTY adapter は、強制 kill 時の wait 完了と listener 解放を引き続き保証する
9. 完了の定義
- supervisor が managed run のライフサイクル所有者であること
- PTY spawn が、
argv再構築を行わない明示的なコマンド契約を使うこと - process 層が、supervisor stdin 契約に関して agent 層へ型依存しないこと
- watchdog デフォルトが単一ソースであること
- 対象の unit / e2e テストが green を維持すること
- 再起動時の永続性境界が明示的に文書化されているか、完全に実装されていること
10. まとめ
このブランチの監視構成は、より一貫性があり安全な形になっています。- 明示的な PTY 契約
- より整理された process layering
- process 操作に対する supervisor 主導の cancel 経路
- supervisor lookup miss 時の実フォールバック終了
- child run の標準 kill 経路における process-tree cancel
- 単一化された watchdog デフォルト
- 明示的なメモリ内再起動境界(この実装パスでは、再起動をまたぐ orphan reconcile は行わない)