Аудит и исправление логики плагина composio-direct (#184)#185
Conversation
Adding .gitkeep for PR creation (default mode). This file will be removed when the task is complete. Issue: xlabtg#184
Adding .gitkeep for PR creation (default mode). This file will be removed when the task is complete. Issue: xlabtg#184
|
🤖 AI Work Session Started Starting automated work session at 2026-06-14T10:41:44.669Z The PR has been converted to draft mode while work is in progress. This comment marks the beginning of an AI work session. Please wait for the session to finish, and provide your feedback. |
… с Composio v3 API
Плагин перестал работать с агентом по двум связанным причинам, обе устранены.
Причина A — мёртвый код @composio/core SDK.
В index.js оставались ветки, которые пытались загрузить npm-пакет
@composio/core (loadComposioSdk/getComposioSdk) и выполнять через него
search_tools, execute_tool и multi_execute. Пакет в рантайме недоступен,
поэтому код всегда молча уходил в HTTP-fallback — это балласт. Именно из-за
него ранее появлялся package-lock.json, а с ним и падение «spawn npm ENOENT»
при npm ci (npm нет в PATH рантайма). Весь SDK-путь удалён; плагин теперь
самодостаточен и ходит в Composio v3 только напрямую по HTTPS, без шага
установки зависимостей, который может упасть.
Причина B — connected_account_id попадал в arguments.
В execute_tool и multi_execute идентификатор подключения подмешивался внутрь
объекта arguments ({ ...parameters, connected_account_id }). По Composio v3 API
connected_account_id — это поле верхнего уровня тела запроса execute, а не
аргумент инструмента. У инструментов со строгой схемой (additionalProperties:
false) лишнее поле в arguments приводит к отклонению вызова. Поэтому любое
выполнение, где агент переиспользует подключение (передаёт connected_account_id),
ломалось. Теперь connected_account_id передаётся строго на верхнем уровне тела,
а arguments содержит только параметры инструмента.
Тело запроса execute приведено к виду из документации Composio v3:
{ user_id, arguments, version, connected_account_id? }.
Тесты: два регрессионных теста, ранее закреплявшие неверное поведение
(connected_account_id внутри arguments), переписаны под корректный контракт —
проверяют, что connected_account_id лежит на верхнем уровне тела и что в
arguments его нет. Прогон: 56/56 тестов плагина проходят, npm run validate
показывает «composio-direct: 27 tool(s) validated», eslint и tsc — без ошибок.
Версия плагина поднята 1.8.0 -> 1.9.0 (manifest.json, package.json, inline
manifest в index.js) для следующего релиза.
Working session summaryГотово. Задача #184 полностью решена; PR #185 обновлён и помечен ready. ИтогКорневые причины «плагин перестал работать с агентом» (обе устранены):
Проверка соответствия Composio v3 API: сверено с официальной OpenAPI-спецификацией Тесты: два регрессионных теста, ранее закреплявшие неверное поведение, переписаны под корректный контракт. Прогон: 56/56 тестов плагина, Версия: 1.8.0 → 1.9.0 ( CI: все проверки, касающиеся PR: #185 This summary was automatically extracted from the AI working session output. |
🤖 Solution Draft LogThis log file contains the complete execution trace of the AI solution draft process. 💰 Cost estimation:
📊 Context and tokens usage:Claude Opus 4.8: (5 sub-sessions)
Total: (49.0K new + 507.3K cache writes + 9.8M cache reads) input tokens, 153.1K output tokens, $12.148922 cost Claude Haiku 4.5:
Total: 50.5K input tokens, 3.5K output tokens, $0.077758 cost 🤖 Models used:
📎 Log file uploaded as Gist (5923KB)Now working session is ended, feel free to review and add any feedback on the solution draft. |
🔄 Auto-restart triggered (iteration 1)Reason: CI failures detected Starting new session to address the issues. Auto-restart-until-mergeable mode is active. This run will stop after 5 restart iterations. |
Бамп версии composio-direct/package.json триггерит workflow «Plugin Dependencies», который прогоняет npm audit --audit-level=high по всем плагинам с lock-файлом. С момента последнего пиннинга (Initial commit) опубликованы новые advisory, и job validate падал на 4 плагинах: - dedust, evaa, stonfi: axios 1.13.5 -> 1.17.0, follow-redirects -> 1.16.0 - finam-trade: @grpc/grpc-js 1.14.3 -> 1.14.4, protobufjs 7.5.5 -> 7.6.4 Все обновления semver-совместимы (npm audit fix без --force), изменены только package-lock.json (package.json не тронуты), lockfileVersion сохранён (3). npm audit --audit-level=high: 0 high/critical по всем плагинам. Тесты finam-trade (grpc/protobuf): 16/16. Полный прогон: 440/440. validate-plugins.mjs: 34 плагина, 0 ошибок.
Working session summaryВсё завершено и подтверждено: рабочее дерево чистое, ветка синхронизирована с remote, фикс присутствует в ИтогПадавшая CI-проверка Что было сделано1. Диагностика падения 2. Исправление CI (коммит
Решение честное: gate был добавлен намеренно (#128), ослаблять его или откатывать бамп версии (создав рассинхрон 3. Проверка фикса issue #184 4. Финализация Результаты проверок
PR: #185 (MERGED) This summary was automatically extracted from the AI working session output. |
🔄 Auto-restart-until-mergeable Log (iteration 1)This log file contains the complete execution trace of the AI solution draft process. 💰 Cost estimation:
📊 Context and tokens usage:Claude Opus 4.8: (2 sub-sessions)
Total: (12.9K new + 209.9K cache writes + 4.4M cache reads) input tokens, 82.7K output tokens, $5.658831 cost Claude Haiku 4.5:
Total: 16.4K input tokens, 571 output tokens, $0.029304 cost 🤖 Models used:
📎 Log file uploaded as Gist (8210KB)Now working session is ended, feel free to review and add any feedback on the solution draft. |
Аудит и исправление логики плагина composio-direct
Closes #184
Плагин
composio-directперестал работать с агентом. Я разобрал всю логику плагина, нашёл корневые причины и привёл выполнение инструментов в полное соответствие с Composio v3 API (сверено с официальной OpenAPI-спецификациейbackend.composio.dev).Корневые причины
A. Мёртвый код
@composio/coreSDKВ
index.jsоставались ветки, пытавшиеся динамически подгрузить npm-пакет@composio/core(loadComposioSdk/getComposioSdk) и выполнять через негоsearch_tools,execute_toolиmulti_execute. В рантайме агента пакет недоступен, поэтому код всегда молча уходил в HTTP-fallback — это балласт без эффекта.Именно этот SDK-путь породил историю с
package-lock.json: чтобы «установить» SDK, в плагин добавили lock-файл, а вместе с ним загрузчик плагинов начал зватьnpm ci, который падал сspawn npm ENOENT(в рантайме нетnpmвPATH). Lock-файл затем убрали (#173), но мёртвый SDK-код, который к нему привёл, остался.B.
connected_account_idпопадал внутрьargumentsВ
execute_toolиmulti_executeидентификатор подключения подмешивался прямо в объект аргументов инструмента:По Composio v3 API
connected_account_id— это поле верхнего уровня тела запросаexecute, а не аргумент инструмента. У инструментов со строгой схемой (additionalProperties: false) лишнее поле вargumentsприводит к отклонению вызова. Поэтому любое выполнение, где агент переиспользует подключение (передаётconnected_account_id), ломалось — это и есть «плагин перестал работать с агентом».Что исправлено
Удалён весь код
@composio/coreSDK (ComposioClass,loadComposioSdk,getComposioSdk,composioSdkCacheи SDK-ветки в трёх инструментах). Плагин теперь самодостаточен и общается с Composio v3 строго напрямую по HTTPS — без шага установки зависимостей, который мог упасть.connected_account_idпередаётся строго на верхнем уровне тела запроса, аargumentsсодержит только параметры инструмента. Телоexecuteприведено к виду из спецификации:Версия плагина поднята 1.8.0 → 1.9.0 (
manifest.json,package.json, inline-manifest вindex.js).Остальные 25 инструментов (toolkits, files, triggers, webhooks, connections, auth, meta-tools) проверены на соответствие — менять ничего не потребовалось.
Как воспроизвести баг (до фикса)
composio_execute_toolдля инструмента со строгой схемой (additionalProperties: false), передавconnected_account_id(агент так делает при переиспользовании подключения), например:{ "tool_slug": "COINMARKETCAP_CRYPTOCURRENCY_LISTINGS_LATEST", "parameters": { "symbol": "BTC" }, "connected_account_id": "ca_..." }arguments: { symbol: "BTC", connected_account_id: "ca_..." }→ Composio отклонял вызов из-за неизвестного поля в аргументах.connected_account_idуходит отдельным полем тела,argumentsостаётся{ symbol: "BTC" }.Тесты, подтверждающие фикс
Два регрессионных теста, которые раньше закрепляли неверное поведение (
connected_account_idвнутриarguments), переписаны под корректный контракт. Теперь они проверяют, что идентификатор лежит на верхнем уровне тела и что вargumentsего нет:Аналогичная проверка добавлена для
composio_multi_execute.Проверка соответствия Composio v3 API
Сверено с официальной OpenAPI-спецификацией (
/api/v3/tools/execute/{tool_slug}):connected_account_id(string) иarguments(object) — соседние поля верхнего уровня тела запроса;argumentsполяconnected_account_idнет;GET/POST /auth_configs,POST /connected_accounts/link,GET /tools,GET /tools/{slug},POST /tools/execute/{slug},GET /connected_accounts[/{id}],GET /toolkits[/{slug}],GET /files/list,POST /files/upload/request,GET /triggers_types[/{slug}],GET /trigger_instances/active,POST /trigger_instances/{slug}/upsert,PATCH|DELETE /trigger_instances/manage/{id},GET /webhook_subscriptions/event_types,GET|POST /webhook_subscriptions,GET|PATCH|DELETE /webhook_subscriptions/{id},POST /webhook_subscriptions/{id}/rotate_secret). Легаси-путей v1/v2 в плагине нет.Результаты прогонов
node --testпо всем файлам плагина: 57/57 тестов проходят.npm run validate:composio-direct: 27 tool(s) validated.npm run lint(eslint): без ошибок вcomposio-direct.npm run typecheck(tsc): без ошибок.CI-проверка
validate(workflow «Plugin Dependencies») — исправленаWorkflow «Plugin Dependencies» запускается на любое изменение
plugins/*/package.jsonи прогоняетnpm audit --audit-level=highпо всем плагинам с lock-файлом, а не только по изменённым (gate добавлен намеренно в #128, чтобы блокировать merge при high/critical уязвимостях). Штатный бамп версииcomposio-direct/package.json(1.8.0 → 1.9.0) триггернул workflow — и аудит подсветил уязвимости, опубликованные с апреля (последний зелёный прогон) на давно зафиксированные транзитивные зависимости других плагинов. Самcomposio-directnpm-зависимостей и lock-файла не имеет, поэтому в шагахnpm ci/npm auditпропускается (continue) — корень был не в нём, но gate всё равно нужно починить, иначе CI красный.Главный нарушитель — axios в
dedust/evaa/stonfi: на версии 1.13.5 накопились high-severity advisory (SSRF через обходNO_PROXY, prototype-pollution с обходом аутентификации и подменой ответа — GHSA-3p68-rc4w-qgx5, GHSA-w9j2-pvgh-6h63 и др.). Вfinam-tradehigh-severity была в деревеprotobufjs/@grpc/grpc-js.Уязвимости устранены semver-безопасным
npm audit fix(без--force): менялись только lock-файлы,package.jsonне тронут,lockfileVersionостался 3, поведение плагинов в пределах объявленных ими semver-диапазонов не меняется.dedustaxios1.13.5 → 1.17.0,follow-redirects1.15.11 → 1.16.0evaaaxios1.13.5 → 1.17.0,follow-redirects1.15.11 → 1.16.0stonfiaxios1.13.5 → 1.17.0,follow-redirects1.15.11 → 1.16.0finam-trade@grpc/grpc-js1.14.3 → 1.14.4,protobufjs7.5.5 → 7.6.4,@protobufjs/utf81.1.0 → 1.1.1После фикса локальная репликация шага «Install and audit deps» из
plugin-deps.ymlдаёт 0 high/critical по всем 10 плагинам с lock-файлом (audit-цикл завершается с exit code 0).