План надзора за PTY и процессами
1. Проблема и цель
Нам нужен один надежный жизненный цикл для долгоживущего выполнения команд в:
execзапуски на переднем планеexecфоновые запускиprocessпоследующие действия (poll,log,send-keys,paste,submit,kill,remove)- Подпроцессы CLI agent runner
Цель - не просто поддержка PTY. Цель - предсказуемое владение, отмена, таймаут и очистка без небезопасных эвристик сопоставления процессов.
2. Область и границы
- Сохранить реализацию внутренней в
src/process/supervisor. - Не создавать новый пакет для этого.
- Сохранить совместимость текущего поведения, где практично.
- Не расширять область до воспроизведения терминала или сохранения сессий в стиле tmux.
3. Реализовано в этой ветке
Базовый уровень Supervisor уже присутствует
- Модуль Supervisor присутствует в
src/process/supervisor/*. - Exec runtime и CLI runner уже маршрутизируются через spawn и wait supervisor.
- Финализация Registry идемпотентна.
Этот проход завершен
- Явный контракт команды PTY
SpawnInputтеперь размеченное объединение вsrc/process/supervisor/types.ts.- Запуски PTY требуют
ptyCommandвместо переиспользования общегоargv. - Supervisor больше не перестраивает строки команд PTY из объединений argv в
src/process/supervisor/supervisor.ts. - Exec runtime теперь передает
ptyCommandнапрямую вsrc/agents/bash-tools.exec-runtime.ts.
- Развязка типов слоя процесса
- Типы Supervisor больше не импортируют
SessionStdinиз agents. - Контракт процессного локального stdin живет в
src/process/supervisor/types.ts(ManagedRunStdin). - Адаптеры теперь зависят только от типов уровня процесса:
src/process/supervisor/adapters/child.tssrc/process/supervisor/adapters/pty.ts
- Улучшение владения жизненным циклом инструмента Process
src/agents/bash-tools.process.tsтеперь запрашивает отмену через supervisor первым.process kill/removeтеперь используют резервное завершение process-tree, когда поиск supervisor пропускает.removeсохраняет детерминированное поведение удаления, немедленно сбрасывая записи запущенной сессии после запроса завершения.
- Значения по умолчанию одного источника watchdog
- Добавлены общие значения по умолчанию в
src/agents/cli-watchdog-defaults.ts. src/agents/cli-backends.tsиспользует общие значения по умолчанию.src/agents/cli-runner/reliability.tsиспользует те же общие значения по умолчанию.
- Очистка мертвого помощника
- Удален неиспользуемый путь помощника
killSessionизsrc/agents/bash-tools.shared.ts.
- Добавлены тесты прямого пути supervisor
- Добавлен
src/agents/bash-tools.process.supervisor.test.tsдля покрытия kill и remove маршрутизации через отмену supervisor.
- Исправления пробелов надежности завершены
src/agents/bash-tools.process.tsтеперь откатывается к реальному завершению процесса на уровне ОС, когда поиск supervisor пропускает.src/process/supervisor/adapters/child.tsтеперь использует семантику завершения process-tree для путей kill по умолчанию cancel/timeout.- Добавлена общая утилита process-tree в
src/process/kill-tree.ts.
- Добавлено покрытие граничных случаев контракта PTY
- Добавлен
src/process/supervisor/supervisor.pty-command.test.tsдля дословной пересылки команд PTY и отклонения пустых команд. - Добавлен
src/process/supervisor/adapters/child.test.tsдля поведения kill process-tree в отмене адаптера child.
4. Оставшиеся пробелы и решения
Статус надежности
Два требуемых пробела надежности для этого прохода теперь закрыты:
process kill/removeтеперь имеет реальный откат завершения ОС, когда поиск supervisor пропускает.- child cancel/timeout теперь использует семантику kill process-tree для пути kill по умолчанию.
- Регрессионные тесты были добавлены для обоих поведений.
Долговечность и согласование запуска
Поведение перезапуска теперь явно определено как жизненный цикл только в памяти.
reconcileOrphans()остается no-op вsrc/process/supervisor/supervisor.tsпо дизайну.- Активные запуски не восстанавливаются после перезапуска процесса.
- Эта граница намеренна для этого прохода реализации, чтобы избежать рисков частичного сохранения.
Продолжения поддерживаемости
runExecProcessвsrc/agents/bash-tools.exec-runtime.tsвсе еще обрабатывает несколько обязанностей и может быть разделен на целевые помощники в продолжении.
5. План реализации
Проход реализации для требуемых пунктов надежности и контракта завершен.
Завершено:
process kill/removeоткат реального завершения- отмена process-tree для пути kill по умолчанию адаптера child
- регрессионные тесты для отката kill и пути kill адаптера child
- тесты граничных случаев команды PTY под явной
ptyCommand - явная граница перезапуска в памяти с
reconcileOrphans()no-op по дизайну
Опциональное продолжение:
- разделить
runExecProcessна целевые помощники без расхождения поведения
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развязаны от типов agent.src/process/supervisor/registry.tsидемпотентная финализация не изменена и сохранена.
Интеграция Exec и process
src/agents/bash-tools.exec-runtime.tsобновлен для явной передачи команды PTY и сохранения пути отката.src/agents/bash-tools.process.tsобновлен для отмены через supervisor с реальным откатом завершения process-tree.src/agents/bash-tools.shared.tsудален прямой путь помощника kill.
Надежность 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
E2E цели:
pnpm test:e2e src/agents/cli-runner.e2e.test.tspnpm test:e2e src/agents/bash-tools.exec.pty-fallback.e2e.test.ts src/agents/bash-tools.exec.background-abort.e2e.test.ts src/agents/bash-tools.process.send-keys.e2e.test.ts
Примечание по проверке типов:
pnpm tsgoв настоящее время падает в этом репо из-за предсуществующей проблемы зависимости типизации UI (разрешение@vitest/browser-playwright), не связанной с этой работой по надзору за процессами.
8. Сохраненные операционные гарантии
- Поведение усиления окружения Exec не изменено.
- Поток одобрения и allowlist не изменен.
- Санитизация вывода и ограничения вывода не изменены.
- Адаптер PTY все еще гарантирует урегулирование wait при принудительном kill и удалении слушателя.
9. Определение завершения
- Supervisor - владелец жизненного цикла для управляемых запусков.
- Spawn PTY использует явный контракт команды без реконструкции argv.
- Слой процесса не имеет зависимости типа от слоя agent для контрактов stdin supervisor.
- Значения по умолчанию Watchdog - один источник.
- Целевые юнит и e2e тесты остаются зелеными.
- Граница долговечности перезапуска явно документирована или полностью реализована.
10. Резюме
Ветка теперь имеет связную и более безопасную форму надзора:
- явный контракт PTY
- более чистое наслоение процесса
- путь отмены, управляемый supervisor, для операций процесса
- реальное резервное завершение, когда поиск supervisor пропускает
- отмена process-tree для путей kill по умолчанию child-run
- унифицированные значения по умолчанию watchdog
- явная граница перезапуска в памяти (нет согласования orphan через перезапуск в этом проходе)