ACP Внутреннее устройство
Адаптер ACP оборачивает синхронный AIAgent Hermes в асинхронный stdio-сервер JSON-RPC.
Ключевые файлы реализации:
acp_adapter/entry.pyacp_adapter/server.pyacp_adapter/session.pyacp_adapter/events.pyacp_adapter/permissions.pyacp_adapter/tools.pyacp_adapter/auth.pyacp_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
Заголовок раздела «HermesACPAgent»acp_adapter/server.py реализует протокол агента ACP.
Обязанности:
- инициализация / аутентификация
- методы сессий new/load/resume/fork/list/cancel
- выполнение prompt
- переключение модели сессии
- подключение обратных вызовов AIAgent к асинхронным уведомлениям ACP
SessionManager
Заголовок раздела «SessionManager»acp_adapter/session.py отслеживает активные сессии ACP.
Каждая сессия хранит:
session_idagentcwdmodelhistorycancel_event
Менеджер потокобезопасен и поддерживает:
- create
- get
- remove
- fork
- list
- cleanup
- cwd updates
Мост событий
Заголовок раздела «Мост событий»acp_adapter/events.py преобразует колбэки AIAgent в события ACP session_update.
Передаваемые через мост колбэки:
tool_progress_callbackthinking_callbackstep_callbackmessage_callback
Поскольку AIAgent выполняется в рабочем потоке, а ACP I/O работает в основном цикле событий, мост использует:
asyncio.run_coroutine_threadsafe(...)Мост разрешений
Заголовок раздела «Мост разрешений»acp_adapter/permissions.py преобразует опасные запросы подтверждения в терминале в запросы разрешений ACP.
Сопоставление:
allow_once-> Hermesonceallow_always-> Hermesalways- опции отклонения -> Hermes
deny
Тайм-ауты и сбои моста по умолчанию запрещают действие.
Вспомогательные средства рендеринга инструментов
Заголовок раздела «Вспомогательные средства рендеринга инструментов»acp_adapter/tools.py сопоставляет инструменты Hermes с типами инструментов ACP и формирует содержимое для редактора.
Примеры:
patch/write_file-> различия файловterminal-> текст команд оболочкиread_file/search_files-> предварительный просмотр текста- большие результаты -> усечённые текстовые блоки для безопасности интерфейса
Жизненный цикл сессии
Заголовок раздела «Жизненный цикл сессии»textnew_session(cwd) -> создать SessionState -> создать AIAgent(platform="acp", enabled_toolsets=["hermes-acp"]) -> привязать task_id/session_id к переопределению cwd```prompt(..., session_id) -> извлечение текста из блоков контента ACP -> сброс события отмены -> установка callback-функций + моста одобрения -> запуск AIAgent в ThreadPoolExecutor -> обновление истории сессии -> отправка финального фрагмента сообщения агентаcancel(session_id):
- устанавливает событие отмены сессии
- вызывает
agent.interrupt()при наличии - приводит к тому, что ответ prompt возвращает
stop_reason="cancelled"
Форкингfork_session() выполняет глубокое копирование истории сообщений в новую активную сессию, сохраняя состояние разговора и при этом предоставляя форку собственный идентификатор сессии и рабочий каталог.
Заголовок раздела «Форкингfork_session() выполняет глубокое копирование истории сообщений в новую активную сессию, сохраняя состояние разговора и при этом предоставляя форку собственный идентификатор сессии и рабочий каталог.»Поведение Provider/auth
Заголовок раздела «Поведение Provider/auth»ACP не реализует собственное хранилище аутентификации.
Вместо этого он повторно использует резолвер среды выполнения Hermes:
acp_adapter/auth.pyhermes_cli/runtime_provider.py
Таким образом, ACP объявляет и использует текущий настроенный provider/credentials Hermes.
Привязка рабочего каталогаACP сессии несут с собой рабочий каталог редактора.
Заголовок раздела «Привязка рабочего каталогаACP сессии несут с собой рабочий каталог редактора.»Менеджер сессий привязывает этот рабочий каталог к идентификатору сессии ACP через переопределения terminal/file с областью видимости задачи, поэтому инструменты для работы с файлами и терминалом работают относительно рабочего пространства редактора.
Дублирующиеся вызовы инструментов с одинаковым именем
Заголовок раздела «Дублирующиеся вызовы инструментов с одинаковым именем»Мост событий отслеживает идентификаторы инструментов FIFO для каждого имени инструмента, а не только один идентификатор на имя. Это важно для:
- параллельных вызовов с одинаковым именем
- повторяющихся вызовов с одинаковым именем на одном шагеБез очередей FIFO события завершения привязывались бы к неверному вызову инструмента.
Восстановление callback-функции одобрения
Заголовок раздела «Восстановление callback-функции одобрения»ACP временно устанавливает callback-функцию одобрения на инструмент терминала во время выполнения prompt, а затем восстанавливает предыдущую callback-функцию. Это позволяет избежать того, чтобы обработчики одобрения, специфичные для сессии ACP, оставались установленными глобально навсегда.
Текущие ограничения
Заголовок раздела «Текущие ограничения»- ACP сессии сохраняются в общей
~/.hermes/state.db(SessionDB) и прозрачно восстанавливаются при перезапуске процессов; они отображаются вsession_search - нетекстовые блоки prompt в настоящее время игнорируются при извлечении текста запроса
- UX редактора варьируется в зависимости от реализации клиента ACP
Связанные файлы
Заголовок раздела «Связанные файлы»tests/acp/— набор тестов ACPtoolsets.py— определение набора инструментовhermes-acphermes_cli/main.py— подкомандаhermes acpCLIpyproject.toml— необязательная зависимость[acp]+ скриптhermes-acp