ADR 0016: Внешний агент по Agent Client Protocol (stdio, Cursor CLI)¶
Статус: Accepted · Implemented
Дата: 2026-04-05
Связанные ADR¶
| ADR | Роль |
|---|---|
| 0008 | MCP — другой контур: сервер инструментов IDE; не путать с ACP |
Вне ADR¶
| Документ | Роль |
|---|---|
| note-acp-cascade-cursor-v1.md | терминология и ссылки на спецификацию |
| concept-pfd-mfd-cascade-v1.md | concept pfd mfd cascade v1 |
Снимок реализации¶
| Элемент | Значение |
|---|---|
| — | Cursor ACP / stdio в чате и настройках; ортогонально MCP — см. текст |
Контекст¶
Нужна связь встроенного чата CascadeIDE с внешним агентом (в первую очередь Cursor через официальный CLI и режим ACP), без встраивания UI Cursor и без собственного провода «с нуля».
Agent Client Protocol (ACP) — открытый контракт клиент↔агент (JSON-RPC по строкам, типичный транспорт stdio). PoC пройден: ответы в чате, русский текст, сессия и обратные вызовы к IDE (fs, terminal) по спецификации.
Решение¶
-
Транспорт: подпроцесс
cursor-agent(или эквивалент из пакета dist-package) с аргументомacp, stdin/stdout для протокола, без консольного окна (CreateNoWindow), перенаправление потоков. -
Кодировка: для Windows явно задавать UTF-8 для перенаправленных stdin/stdout/stderr процесса агента (и для дочерних процессов ACP-terminal), иначе ответы на русском декодируются в OEM и дают «кракозябры».
-
Клиентский SDK: библиотека AgentClientProtocol (community, upstream acp-csharp) — вендор в
externals/acp-csharp/как исходники, подключаются черезProjectReference. Исходники подexternals/**/*.csне компилируются в основной сборке IDE (Compile RemoveвCascadeIDE.csproj), чтобы вложенный sandbox с top-levelMainне перехватывал точку входа приложения. -
Интеграция в продукт: отдельный провайдер чата (Cursor ACP), настройка пути к
cursor-agent.cmdили к каталогу сdist-package; жизненный цикл сессии ACP и зеркалирование terminal/fs — вServices/CursorAcp/. -
Аутентификация Cursor: не интерактивно внутри WinExe-чата при первом запуске; пользователь проходит
agent login/ API key в обычном терминале или через переменные окружения (как в документации Cursor). Ошибки агента до UI — по мере развития можно дублировать stderr в чат/лог (не часть этого ADR). -
Границы: ACP — про диалог с внешним агентом. MCP-сервер IDE (
--mcp-stdio, инструменты для агента) остаётся отдельным контуром (0008); объединение сценариев — последующими итерациями.
Последствия¶
- Обновления upstream
acp-csharp— осознанный merge/вендоринг; при смене major спецификации ACP — проверка совместимости сcursor-agent. - Зависимость от формата CLI Cursor (аргумент
acp); при изменениях документации Cursor — регрессия вручную или смоук-сценарий. - Дублирование типов при ошибочном включении исходников SDK и ссылки на пакет — предотвращается
Compile Removeдляexternals.
Отклонённые альтернативы¶
- Только Ollama / только локальные LLM без ACP — остаётся другим провайдером; не покрывает сценарий «тот же агент, что в Cursor».
- Свой бинарный протокол поверх stdio — отклонён в пользу стандарта ACP и готового клиентского SDK.
- Встраивание webview Cursor — вне scope десктопного клиента ACP.
Обсуждение (не блокирует Accepted)¶
- Подмодуль вместо вендоринга
externals/acp-csharp— возможна миграция при стабилизации процесса обновлений. - Вывод stderr агента в UI чата при ошибках и «Authentication required».