Внутреннее устройство ACP
Адаптер ACP оборачивает синхронный AIAgent Hermes в асинхронный JSON-RPC stdio-сервер.
Ключевые файлы реализации:
-
acp_adapter/entry.py -
acp_adapter/server.py -
acp_adapter/session.py -
acp_adapter/events.py -
acp_adapter/permissions.py -
acp_adapter/tools.py -
acp_adapter/auth.py -
acp_registry/agent.json
Процесс загрузки
hermes acp / hermes-acp / python -m acp_adapter
-> acp_adapter.entry.main()
-> load ~/.hermes/.env
-> configure stderr logging
-> construct HermesACPAgent
-> acp.run_agent(agent, use_unstable_protocol=True)
Stdout зарезервирован для ACP JSON-RPC транспорта. Человекочитаемые логи направляются в stderr.
Основные компоненты
HermesACPAgent
acp_adapter/server.py реализует протокол ACP-агента.
Обязанности:
-
инициализация / аутентификация
-
методы сессий: new/load/resume/fork/list/cancel
-
выполнение prompt
-
переключение модели сессии
-
подключение синхронных колбэков AIAgent к асинхронным уведомлениям ACP
SessionManager
acp_adapter/session.py отслеживает активные ACP-сессии.
Каждая сессия хранит:
-
session_id -
agent -
cwd -
model -
history -
cancel_event
Менеджер потокобезопасен и поддерживает:
-
создание
-
получение
-
удаление
-
форк
-
список
-
очистка
-
обновление cwd
Мост событий
acp_adapter/events.py преобразует колбэки AIAgent в события ACP session_update.
Проксируемые колбэки:
-
tool_progress_callback -
thinking_callback(в настоящее время установлен вNoneв ACP-мосте — рассуждения передаются черезstep_callback) -
step_callback
Поскольку AIAgent выполняется в рабочем потоке, а ACP I/O работает в главном цикле событий, мост использует:
asyncio.run_coroutine_threadsafe(...)
Мост разрешений
acp_adapter/permissions.py адаптирует опасные запросы подтверждения терминала в запросы разрешений ACP.
Соответствие:
-
allow_once→ Hermesonce -
allow_always→ Hermesalways -
опции отклонения → Hermes
deny
Таймауты и ошибки моста по умолчанию отклоняют запрос.
Вспомогательные функции рендеринга инструментов
acp_adapter/tools.py сопоставляет инструменты Hermes с видами инструментов ACP и формирует контент для редактора.
Примеры:
-
patch/write_file→ файловые diffs -
terminal→ текст команды оболочки -
read_file/search_files→ текстовые превью -
большие результаты → усечённые текстовые блоки для безопасности UI
Жизненный цикл сессии
new_session(cwd)
-> create SessionState
-> create AIAgent(platform="acp", enabled_toolsets=["hermes-acp"])
-> bind task_id/session_id to cwd override
prompt(..., session_id)
-> extract text from ACP content blocks
-> reset cancel event
-> install callbacks + approval bridge
-> run AIAgent in ThreadPoolExecutor
-> update session history
-> emit final agent message chunk
Отмена
cancel(session_id):
-
устанавливает событие отмены сессии
-
вызывает
agent.interrupt()когда доступно -
приводит к возврату
stop_reason="cancelled"в ответе на prompt
Форк
fork_session() делает глубокую копию истории сообщений в новую активную сессию, сохраняя состояние разговора и присваивая форку собственный ID сессии и cwd.
Поведение провайдера/аутентификации
ACP не реализует собственное хранилище аутентификации.
Вместо этого он использует рантайм-резолвер Hermes:
-
acp_adapter/auth.py -
hermes_cli/runtime_provider.py
Таким образом, ACP использует текущий настроенный провайдер/учётные данные Hermes.
Привязка рабочей директории
ACP-сессии содержат cwd редактора.
Менеджер сессий привязывает этот cwd к ID ACP-сессии через переопределения терминала/файлов в рамках задачи, поэтому инструменты терминала и файлов работают относительно рабочей области редактора.
Дублирующиеся вызовы инструментов с одинаковыми именами
Мост событий отслеживает ID инструментов в порядке FIFO для каждого имени инструмента, а не только один ID на имя. Это важно для:
-
параллельных вызовов с одинаковым именем
-
повторяющихся вызовов с одинаковым именем в одном шаге
Без очередей FIFO события завершения привязывались бы к неверному вызову инструмента.
Восстановление колбэка подтверждения
ACP временно устанавливает колбэк подтверждения на инструменте терминала во время выполнения prompt, а затем восстанавливает предыдущий колбэк. Это предотвращает бессрочную глобальную установку обработчиков подтверждения, специфичных для ACP-сессии.
Текущие ограничения
-
ACP-сессии сохраняются в общую БД
~/.hermes/state.db(SessionDB) и прозрачно восстанавливаются при перезапуске процесса; они отображаются вsession_search -
не текстовые блоки prompt в настоящее время игнорируются при извлечении текста запроса
-
пользовательский интерфейс редактора зависит от реализации ACP-клиента
Связанные файлы
-
tests/acp/— набор тестов ACP -
toolsets.py— определение инструментарияhermes-acp -
hermes_cli/main.py— CLI-подкомандаhermes acp -
pyproject.toml— опциональная зависимость[acp]+ скриптhermes-acp