Автономные кодовые агенты, работающие в фоновом режиме (background workers), часто сталкиваются с критической проблемой: при получении сигнала SIGKILL, нехватке памяти или перезагрузке контейнера их состояние, хранящееся в оперативной памяти, теряется. Это приводит к повреждению рабочих директорий, частично примененным git-патчам и «зависанию» репозиториев в неоднозначном состоянии. Классические stateless-рантаймы не подходят для продакшена, где требуется гарантия целостности данных.
Проблема: потеря контекста при масштабировании
Реальный кейс, описанный авторами, произошел во время автоматизированной миграции кодовой базы. Агент, выполнявший трансформацию Abstract Syntax Tree (AST) для 400 файлов, был принудительно завершен системой. Поскольку сессия хранилась только в памяти, после перезапуска процесс стер журнал выполнения (execution ledger). В результате половина модулей была обновлена, а остальные сохранили устаревшие ссылки, что потребовало ручного восстановления через git reset и часового forensic-дебаггинга.
Решение: Pi Durable и нативный SQLite
Для устранения этой уязвимости команда переархитектировала своих фоновых рабочих процессов, используя библиотеку @earendil-works/pi-durable в связке с встроенным модулем node:sqlite (доступен в Node.js 22+). Такой подход позволяет избежать внешних зависимостей и компиляционных проблем в контейнерных средах, обеспечивая атомарные транзакции и долговременное хранение состояния.
Ключевым элементом надежности стала настройка SQLite в режиме WAL (Write-Ahead Logging) с атомарными транзакциями. Это гарантирует, что даже при внезапном отключении питания или эвакьюации подов в Kubernetes история событий агента остается неизменной и восстанавливаемой.
Технические детали реализации
Инициализация хранилища требует явного задания параметров SQLite для обеспечения отказоустойчивости и высокой пропускной способности при конкурентном доступе. Ниже приведена структура таблиц и необходимые PRAGMA-настройки:
| Параметр / Таблица | Значение / Описание | Назначение |
|---|---|---|
PRAGMA journal_mode |
WAL |
Write-Ahead Logging: предотвращает блокировки записи и защищает от повреждения журнала при крашах. |
PRAGMA synchronous |
NORMAL |
Баланс между скоростью и безопасностью: гарантирует запись данных до того, как процесс завершится. |
PRAGMA foreign_keys |
ON |
Обеспечивает целостность связей между сессиями и их событиями. |
PRAGMA busy_timeout |
5000 мс |
Время ожидания при конфликтах блокировок в многопоточной среде. |
agent_sessions |
Таблица сессий | Хранит session_id, бинарное состояние (state_blob), статус и время обновления. |
execution_ledger |
Журнал событий | Append-only лог: event_id, имя инструмента, полезная нагрузка, результат и время выполнения. |
Такая архитектура позволяет агентам возобновлять выполнение с места прерывания (replay-safe), сохраняя строгую типизацию TypeScript и исключая потерю токенов контекста или состояния инструментов.
Источник: Towards AI pub ↗
