PTY and Process Supervision Plan
1. Problem and goal
다음 전반에 걸쳐 장시간 실행되는 명령에 대해 하나의 신뢰할 수 있는 lifecycle이 필요합니다.execforeground runexecbackground runprocess후속 action (poll,log,send-keys,paste,submit,kill,remove)- CLI agent runner subprocess
2. Scope and boundaries
- 구현은
src/process/supervisor내부에 유지 - 이를 위한 새 package는 만들지 않음
- 가능하면 현재 동작 호환성 유지
- terminal replay나 tmux 스타일 session persistence로 범위를 넓히지 않음
3. Implemented in this branch
Supervisor baseline already present
- supervisor module은 이미
src/process/supervisor/*아래에 존재 - exec runtime과 CLI runner는 이미 supervisor spawn/wait를 경유
- registry finalization은 idempotent
This pass completed
- Explicit PTY command contract
SpawnInput은 이제src/process/supervisor/types.ts에서 discriminated union- PTY run은 generic
argv재사용 대신ptyCommand를 요구 - supervisor는 더 이상
src/process/supervisor/supervisor.ts에서 argv join으로 PTY command string을 재구성하지 않음 - exec runtime은 이제
src/agents/bash-tools.exec-runtime.ts에서ptyCommand를 직접 전달
- Process layer type decoupling
- supervisor type은 더 이상 agents의
SessionStdin을 import하지 않음 - process 전용 stdin contract는
src/process/supervisor/types.ts의ManagedRunStdin에 위치 - adapter는 이제 process 레벨 type에만 의존:
src/process/supervisor/adapters/child.tssrc/process/supervisor/adapters/pty.ts
- Process tool lifecycle ownership improvement
src/agents/bash-tools.process.ts는 이제 supervisor를 먼저 통해 cancellation 요청process kill/remove는 supervisor lookup이 실패하면 process-tree fallback termination 사용remove는 termination 요청 직후 실행 중인 session entry를 바로 제거해 deterministic remove behavior 유지
- Single source watchdog defaults
- 공유 기본값을
src/agents/cli-watchdog-defaults.ts에 추가 src/agents/cli-backends.ts가 이 공유 기본값 사용src/agents/cli-runner/reliability.ts도 같은 기본값 사용
- Dead helper cleanup
src/agents/bash-tools.shared.ts에서 미사용killSessionhelper path 제거
- Direct supervisor path tests added
- kill과 remove가 supervisor cancellation을 경유하는지 검증하는
src/agents/bash-tools.process.supervisor.test.ts추가
- Reliability gap fixes completed
src/agents/bash-tools.process.ts는 이제 supervisor lookup이 실패하면 실제 OS 수준 process termination으로 fallbacksrc/process/supervisor/adapters/child.ts는 기본 cancel/timeout kill path에서 process-tree termination semantics 사용- 공유 process-tree utility를
src/process/kill-tree.ts에 추가
- PTY contract edge-case coverage added
- verbatim PTY command forwarding과 empty-command rejection을 검증하는
src/process/supervisor/supervisor.pty-command.test.ts추가 - child adapter cancellation에서 process-tree kill behavior를 검증하는
src/process/supervisor/adapters/child.test.ts추가
4. Remaining gaps and decisions
Reliability status
이번 패스에서 요구된 두 가지 reliability gap은 이제 해소되었습니다.process kill/remove는 supervisor lookup이 실패해도 실제 OS termination fallback을 가짐- child cancel/timeout은 이제 default kill path에서 process-tree kill semantics 사용
- 두 동작 모두에 대한 regression test 추가 완료
Durability and startup reconciliation
restart 동작은 이제 in-memory lifecycle only로 명시적으로 정의됩니다.reconcileOrphans()는 의도적으로src/process/supervisor/supervisor.ts에서 no-op으로 유지- process restart 후 active run은 복구되지 않음
- 부분 persistence 위험을 피하기 위해 이번 구현 패스에서 의도적으로 이 경계를 유지함
Maintainability follow-ups
src/agents/bash-tools.exec-runtime.ts의runExecProcess는 여전히 여러 책임을 동시에 가지므로, 후속 패스에서 behavior drift 없이 helper로 분리 가능
5. Implementation plan
필수 reliability 및 contract 항목에 대한 이번 구현 패스는 완료되었습니다. Completed:process kill/removefallback real termination- child adapter default kill path의 process-tree cancellation
- fallback kill 및 child adapter kill path에 대한 regression test
- 명시적
ptyCommand기준의 PTY command edge-case test reconcileOrphans()를 no-op으로 둔 명시적 in-memory restart boundary
- behavior drift 없이
runExecProcess를 더 집중된 helper로 분리
6. File map
Process supervisor
src/process/supervisor/types.ts: discriminated spawn input과 process 전용 stdin contract로 갱신src/process/supervisor/supervisor.ts: 명시적ptyCommand사용으로 갱신src/process/supervisor/adapters/child.ts,src/process/supervisor/adapters/pty.ts: agent type 의존 제거src/process/supervisor/registry.ts: idempotent finalize는 유지, 변경 없음
Exec and process integration
src/agents/bash-tools.exec-runtime.ts: PTY command를 명시적으로 전달하고 fallback path 유지src/agents/bash-tools.process.ts: supervisor를 통한 cancel과 실제 process-tree fallback termination 지원src/agents/bash-tools.shared.ts: 직접 kill helper path 제거
CLI reliability
src/agents/cli-watchdog-defaults.ts: 공유 baseline 추가src/agents/cli-backends.ts,src/agents/cli-runner/reliability.ts: 같은 기본값 사용
7. Validation run in this pass
Unit test: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 gate는pnpm check)를 사용하세요.pnpm tsgo를 언급한 오래된 노트는 더 이상 유효하지 않습니다.
8. Operational guarantees preserved
- Exec env hardening 동작은 변하지 않음
- Approval 및 allowlist flow는 변하지 않음
- Output sanitization과 output cap은 변하지 않음
- PTY adapter는 강제 kill 후에도 wait settlement와 listener disposal을 계속 보장
9. Definition of done
- supervisor가 managed run의 lifecycle owner여야 한다
- PTY spawn은 argv 재구성 없이 명시적 command contract를 사용해야 한다
- supervisor stdin contract에서 process layer는 agent layer type에 의존하지 않아야 한다
- watchdog defaults는 single source여야 한다
- 대상 unit/e2e test가 녹색 상태여야 한다
- restart durability boundary가 명시적으로 문서화되었거나 완전히 구현되어야 한다
10. Summary
이 브랜치는 이제 더 일관되고 안전한 supervision 구조를 갖습니다.- 명시적 PTY contract
- 더 깔끔한 process layering
- process operation에 대한 supervisor 중심 cancellation path
- supervisor lookup miss 시 실제 fallback termination
- child-run default kill path의 process-tree cancellation
- 통합된 watchdog defaults
- 명시적인 in-memory restart boundary(이번 패스에서는 restart 간 orphan reconciliation 없음)