Эксперименты
План супервизии PTY и процессов
1. Проблема и цель
Нам нужен один надежный жизненный цикл для долгосрочного выполнения команд в следующих сценариях:
execзапуски в foregroundexecзапуски в background- Последующие действия
process(poll,log,send-keys,paste,submit,kill,remove) - Подпроцессы CLI agent runner
Цель — не просто поддержка PTY. Цель — предсказуемое владение, отмена, таймаут и очистка без небезопасных эвристик сопоставления процессов.
2. Область действия и границы
- Оставить реализацию внутренней в
src/process/supervisor. - Не создавать новый пакет для этого.
- Сохранить совместимость с текущим поведением, где это практично.
- Не расширять область действия до воспроизведения терминала или сохранения сессий в стиле tmux.
3. Реализовано в этой ветке
Базовый уровень супервизора уже присутствует
- Модуль супервизора находится в
src/process/supervisor/*. - Exec runtime и CLI runner уже направляются через spawn и wait супервизора.
- Финализация реестра идемпотентна.
В этом этапе завершено
- Явный контракт PTY-команды
SpawnInputтеперь является размеченным объединением вsrc/process/supervisor/types.ts.- Для PTY-запусков требуется
ptyCommandвместо повторного использования общегоargv. - Супервизор больше не пересобирает строки PTY-команд из объединения argv в
src/process/supervisor/supervisor.ts. - Exec runtime теперь передает
ptyCommandнапрямую вsrc/agents/bash-tools.exec-runtime.ts.
- Разделение типов на уровне процесса
- Типы супервизора больше не импортируют
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сохраняет детерминированное поведение удаления, немедленно удаляя записи о запущенных сессиях после запроса на завершение.
- Единый источник значений по умолчанию для 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.
- Добавлены тесты прямого пути супервизора
- Добавлен
src/agents/bash-tools.process.supervisor.test.tsдля покрытия маршрутизации kill и remove через отмену в супервизоре.
- Устранены пробелы в надежности
src/agents/bash-tools.process.tsтеперь использует реальное завершение процесса на уровне ОС в качестве запасного варианта, если поиск в супервизоре не дал результатов.src/process/supervisor/adapters/child.tsтеперь использует семантику завершения дерева процессов для путей отмены/таймаута по умолчанию.- Добавлена общая утилита для работы с деревом процессов в
src/process/kill-tree.ts.
- Добавлено покрытие крайних случаев контракта PTY
- Добавлен
src/process/supervisor/supervisor.pty-command.test.tsдля проверки дословной передачи PTY-команды и отклонения пустых команд. - Добавлен
src/process/supervisor/adapters/child.test.tsдля проверки поведения завершения дерева процессов при отмене в адаптере child.
4. Оставшиеся пробелы и решения
Статус надежности
Два необходимых пробела в надежности для этого этапа теперь устранены:
process kill/removeтеперь имеет запасной вариант реального завершения на уровне ОС, если поиск в супервизоре не дал результатов.- Отмена/таймаут для child теперь использует семантику завершения дерева процессов для пути kill по умолчанию.
- Для обоих поведений добавлены регрессионные тесты.
Устойчивость и восстановление при запуске
Поведение при перезапуске теперь явно определено как жизненный цикл только в памяти.
reconcileOrphans()остается no-op вsrc/process/supervisor/supervisor.tsпо дизайну.- Активные запуски не восстанавливаются после перезапуска процесса.
- Эта граница является преднамеренной для этого этапа реализации, чтобы избежать рисков частичного сохранения состояния.
Последующие действия по поддержке
runExecProcessвsrc/agents/bash-tools.exec-runtime.tsпо-прежнему обрабатывает несколько обязанностей и может быть разделена на сфокусированные вспомогательные функции в последующей работе.
5. План реализации
Этап реализации для требуемых элементов надежности и контракта завершен. Выполнено:
- Запасной вариант реального завершения для
process kill/remove - Отмена через дерево процессов для пути 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отделены от типов агентов.src/process/supervisor/registry.tsидемпотентная финализация не изменена и сохранена.
Интеграция Exec и Process
src/agents/bash-tools.exec-runtime.tsобновлен для явной передачи PTY-команды и сохранения запасного пути.src/agents/bash-tools.process.tsобновлен для отмены через супервизор с запасным вариантом реального завершения дерева процессов.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 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для полной проверки линтера/документации) в этом репозитории. Более старые заметки, упоминающиеpnpm tsgo, устарели.
8. Сохраненные операционные гарантии
- Поведение укрепления окружения Exec не изменено.
- Поток утверждения и разрешенного списка не изменен.
- Санитизация вывода и ограничения вывода не изменены.
- Адаптер PTY по-прежнему гарантирует завершение wait при принудительном kill и освобождении слушателей.
9. Критерии завершения
- Супервизор является владельцем жизненного цикла для управляемых запусков.
- PTY spawn использует явный контракт команды без реконструкции argv.
- Уровень процесса не имеет зависимостей типов от уровня агентов для контрактов stdin супервизора.
- Значения по умолчанию для watchdog имеют единый источник.
- Целевые модульные и e2e тесты остаются зелеными.
- Граница устойчивости к перезапуску явно задокументирована или полностью реализована.
10. Итог
Ветка теперь имеет согласованную и более безопасную структуру супервизии:
- явный контракт PTY
- более чистое разделение на уровни процессов
- путь отмены, управляемый супервизором, для операций с процессами
- реальное завершение в качестве запасного варианта, если поиск в супервизоре не дал результатов
- отмена через дерево процессов для путей kill по умолчанию в child-запусках
- унифицированные значения по умолчанию для watchdog
- явная граница перезапуска в памяти (без восстановления потерянных процессов при перезапуске в этом этапе)
План шлюза OpenResponsesПлан агностического канала привязки сессии