@besales/mcp 1.0.0-beta.5 → 1.0.0-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +1 -1
  2. package/dist/http/api-client.d.ts +10 -0
  3. package/dist/http/api-client.js +32 -0
  4. package/dist/http/api-client.js.map +1 -1
  5. package/dist/resources/docs/platforms.md +48 -0
  6. package/dist/schemas/mcp-tools.json +536 -7
  7. package/dist/tools/definitions/agent-design.d.ts +2 -0
  8. package/dist/tools/definitions/agent-design.js +5 -0
  9. package/dist/tools/definitions/agent-design.js.map +1 -1
  10. package/dist/tools/definitions/agent-settings.d.ts +1 -0
  11. package/dist/tools/definitions/agent-settings.js +2 -0
  12. package/dist/tools/definitions/agent-settings.js.map +1 -1
  13. package/dist/tools/definitions/platform-setup.d.ts +1 -0
  14. package/dist/tools/definitions/task-state.d.ts +1 -1
  15. package/dist/tools/definitions/telegram-personal-connect.d.ts +12 -0
  16. package/dist/tools/definitions/telegram-personal-connect.js +61 -0
  17. package/dist/tools/definitions/telegram-personal-connect.js.map +1 -0
  18. package/dist/tools/definitions/telegram-personal-management.d.ts +1 -1
  19. package/dist/tools/definitions/telegram-personal-proxies.d.ts +42 -0
  20. package/dist/tools/definitions/telegram-personal-proxies.js +204 -0
  21. package/dist/tools/definitions/telegram-personal-proxies.js.map +1 -0
  22. package/dist/tools/definitions/telegram-proxy-stock.d.ts +34 -0
  23. package/dist/tools/definitions/telegram-proxy-stock.js +129 -0
  24. package/dist/tools/definitions/telegram-proxy-stock.js.map +1 -0
  25. package/dist/tools/definitions.d.ts +72 -4
  26. package/dist/tools/definitions.js +7 -0
  27. package/dist/tools/definitions.js.map +1 -1
  28. package/dist/tools/operation-recovery.d.ts +1 -1
  29. package/dist/tools/operation-recovery.js +1 -1
  30. package/dist/tools/operation-recovery.js.map +1 -1
  31. package/dist/tools/registry-mapping.cases.js +162 -0
  32. package/dist/tools/registry-mapping.cases.js.map +1 -1
  33. package/dist/tools/registry.js +18 -4
  34. package/dist/tools/registry.js.map +1 -1
  35. package/dist/tools/result.d.ts +1 -0
  36. package/dist/tools/result.js +57 -5
  37. package/dist/tools/result.js.map +1 -1
  38. package/docs/failure-semantics.md +4 -1
  39. package/docs/help-navigation.md +2 -0
  40. package/docs/telegram-personal-management.md +29 -2
  41. package/docs/telegram-personal-proxies.md +135 -0
  42. package/package.json +1 -1
  43. package/scripts/telegram-personal-proxy-mutants.mjs +171 -0
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "title": "besales-mcp Tool Definitions",
4
4
  "version": "1.2.0-draft",
5
- "lastUpdated": "2026-11-09",
5
+ "lastUpdated": "2026-11-12",
6
6
  "description": "MCP tool schemas для besales-mcp npm package. Активная v2-поверхность содержит ICP, Sandbox, Knowledge, prompt operations и stateless Platform Setup Bridge. Setup Pipeline session tools сохранены как Phase 4+ future design, но не входят в active toolset.",
7
7
  "executionModes": {
8
8
  "summary": "Каждая active LLM-операция имеет 2 MCP tools: get_instructions + submit. Claude локально между tools выполняет LLM-вызовы своими моделями. Auto-detection через JWT scope mcp:* → external default.",
@@ -996,7 +996,7 @@
996
996
  },
997
997
  {
998
998
  "name": "besales_sandbox_run_start",
999
- "description": "Start sandbox run для agent (full multi-persona × multi-scenario testing). Queued async. Без вопроса запускай обычный прогон: mode=single_agent и client_mode=scripted (умолчания схемы) — это дешёвый, воспроизводимый прогон для регрессии и проверки кандидата промпта до публикации (candidate_prompt). Перед запуском спроси пользователя одним коротким вопросом с ценой в одну фразу только если нужен client_mode=simulated (LLM играет клиента — дороже и каждый раз по-разному), оба режима клиента (= два прогона) либо mode=workflow (все агенты канала через роутер — шире и дороже).",
999
+ "description": "Start sandbox run для agent (full multi-persona × multi-scenario testing). Queued async. Без вопроса запускай обычный прогон: mode=single_agent и client_mode=scripted (умолчания схемы) — это дешёвый, воспроизводимый прогон для регрессии и проверки кандидата промпта до публикации (candidate_prompt). Перед запуском спроси пользователя одним коротким вопросом с ценой в одну фразу только если нужен client_mode=simulated (LLM играет клиента — дороже и каждый раз по-разному), оба режима клиента (= два прогона) либо mode=workflow (все агенты канала через роутер — шире и дороже). request_key (UUID) — идемпотентность повторного запуска: для повтора того же намерения передай тот же ключ; без поля мост генерирует один ключ на вызов, транспорт внутри вызова использует его повторно. icp_profile_id: UUID — выбранный портрет, null — без выбора, отсутствие — основной портрет агента.",
1000
1000
  "inputSchema": {
1001
1001
  "type": "object",
1002
1002
  "required": [
@@ -1075,6 +1075,19 @@
1075
1075
  "default": 10
1076
1076
  }
1077
1077
  }
1078
+ },
1079
+ "request_key": {
1080
+ "type": "string",
1081
+ "format": "uuid",
1082
+ "description": "Ключ идемпотентности запуска; один на намерение. Если пропущен, мост генерирует UUID один раз на вызов."
1083
+ },
1084
+ "icp_profile_id": {
1085
+ "type": [
1086
+ "string",
1087
+ "null"
1088
+ ],
1089
+ "format": "uuid",
1090
+ "description": "UUID выбранного портрета; null — без выбора; отсутствие — основной портрет агента."
1078
1091
  }
1079
1092
  }
1080
1093
  }
@@ -3341,7 +3354,7 @@
3341
3354
  },
3342
3355
  {
3343
3356
  "name": "besales_agent_clone",
3344
- "description": "Deep-clone an existing agent into a NEW agent on the SAME platform (mirrors the besales GUI clone button). Copies baseSystemPrompt, knowledge namespaces, model/model_lane/runtime config, tools + builtin tools, agent + workspace variable overrides, ICP links, and ALL triggers + actions (with FK remap to new ids). Does NOT copy routing rules (per-router) or per-platform behavior — the clone is inert until wired into the router. Prompt is identical to source; PromptHub auto-bootstraps a fresh version on the first prompt op. Cross-platform clone is not supported — use besales_platform_clone_* for that.",
3357
+ "description": "Deep-clone an existing agent into a NEW agent on the SAME platform (mirrors the besales GUI clone button). Copies baseSystemPrompt, knowledge namespaces, model/model_lane/runtime config, tools + builtin tools, agent + workspace variable overrides, ICP links, and ALL triggers + actions (with FK remap to new ids). Does NOT copy routing rules (per-router) or per-platform behavior — the clone is inert until wired into the router. Prompt is identical to source; PromptHub auto-bootstraps a fresh version on the first prompt op. Cross-platform clone is not supported — use besales_platform_clone_* for that. Если у исходного агента есть необратимые действия, включая закрытие разговора после тишины, требуется отдельное явное согласие человека: explicit_confirmation=true. Без него API вернёт 400 TRIGGER_DANGEROUS_CONFIRMATION_REQUIRED. Не подтверждай за человека.",
3345
3358
  "inputSchema": {
3346
3359
  "type": "object",
3347
3360
  "required": [
@@ -3367,6 +3380,10 @@
3367
3380
  "display_name": {
3368
3381
  "type": "string",
3369
3382
  "description": "Отображаемое имя нового агента; если не задано — зеркалит name."
3383
+ },
3384
+ "explicit_confirmation": {
3385
+ "type": "boolean",
3386
+ "description": "Отдельное согласие человека на копирование необратимых действий, включая закрытие разговора после тишины. При таких действиях требуется true."
3370
3387
  }
3371
3388
  }
3372
3389
  }
@@ -11954,7 +11971,7 @@
11954
11971
  },
11955
11972
  {
11956
11973
  "name": "besales_platform_create_init",
11957
- "description": "v1.5 Increment 5b: создать platform provisioning сессию (Setup URL pattern) для API-key канала. Секреты НЕ передаются через MCP — пользователь вводит их на setup_page_url. Возвращает { setup_ref, setup_page_url, expires_at, required_secret_fields }. OAuth-каналы (Instagram/Avito) — besales_platform_create_oauth_init; TelegramPersonal не поддержан. Scope: mcp:platform-setup.",
11974
+ "description": "v1.5 Increment 5b: создать platform provisioning сессию (Setup URL pattern) для API-key канала. Секреты НЕ передаются через MCP — пользователь вводит их на setup_page_url. Возвращает { setup_ref, setup_page_url, expires_at, required_secret_fields }. OAuth-каналы (Instagram/Avito) — besales_platform_create_oauth_init; TelegramPersonal не поддержан; номера в существующий канал — besales_platform_telegram_personal_connect_link. Scope: mcp:platform-setup.",
11958
11975
  "inputSchema": {
11959
11976
  "type": "object",
11960
11977
  "required": [
@@ -19003,6 +19020,500 @@
19003
19020
  }
19004
19021
  }
19005
19022
  }
19023
+ },
19024
+ {
19025
+ "name": "besales_platform_telegram_personal_proxy_import_link",
19026
+ "description": "Выдать ссылку для массовой загрузки прокси личного Telegram в пул канала. Требует manage:channels; профиль platform. Ссылку отдать человеку: логины и пароли он вводит на защищённой странице после входа в приложение, не в чате. Ссылка одноразовая, живёт до expires_at. В ответе session_id, setup_page_url, expires_at; итог читай через besales_platform_telegram_personal_proxy_import_status. Создание ссылки ещё не означает загрузку прокси. Не передавай строки прокси через MCP.",
19027
+ "inputSchema": {
19028
+ "type": "object",
19029
+ "additionalProperties": false,
19030
+ "required": [
19031
+ "channel_id"
19032
+ ],
19033
+ "properties": {
19034
+ "workspace_id": {
19035
+ "type": "string",
19036
+ "format": "uuid"
19037
+ },
19038
+ "channel_id": {
19039
+ "type": "string",
19040
+ "format": "uuid"
19041
+ }
19042
+ }
19043
+ }
19044
+ },
19045
+ {
19046
+ "name": "besales_platform_telegram_personal_proxy_import_status",
19047
+ "description": "Прочитать итог загрузки прокси личного Telegram по session_id и channel_id. Требует manage:channels (контракт защищённого импорта); профили readonly и platform. Возвращает только sessionId, status, expiresAt и summary: total, pending, accepted, duplicates, invalid, checkFailed, rejected, registered. Строк, логинов и паролей нет. COMPLETED — обработка завершена, итог смотри в счётчиках; AWAITING_INPUT — ждёт человека, SUBMITTING/PROCESSING — в работе, UNKNOWN — исход неизвестен, повтори чтение позже; EXPIRED/CANCELLED — сессия закрыта. Ничего не меняет.",
19048
+ "inputSchema": {
19049
+ "type": "object",
19050
+ "additionalProperties": false,
19051
+ "required": [
19052
+ "channel_id",
19053
+ "session_id"
19054
+ ],
19055
+ "properties": {
19056
+ "workspace_id": {
19057
+ "type": "string",
19058
+ "format": "uuid"
19059
+ },
19060
+ "channel_id": {
19061
+ "type": "string",
19062
+ "format": "uuid"
19063
+ },
19064
+ "session_id": {
19065
+ "type": "string",
19066
+ "format": "uuid"
19067
+ }
19068
+ }
19069
+ }
19070
+ },
19071
+ {
19072
+ "name": "besales_platform_telegram_personal_proxy_delete",
19073
+ "description": "Удалить свободный прокси из пула канала личного Telegram. Требует manage:channels; профиль platform. Удаление необратимо: покажи человеку канал и proxy_id и получи явное согласие, затем передай explicit_confirmation:true. Без подтверждения отказ до HTTP. 204 — прокси удалён; 409 TELEGRAM_PROXY_NOT_EMPTY — сначала переключите номера на другой прокси; 404 TELEGRAM_PROXY_NOT_FOUND — прокси не найден. Логины, пароли, host и port через MCP не принимаются.",
19074
+ "inputSchema": {
19075
+ "type": "object",
19076
+ "additionalProperties": false,
19077
+ "required": [
19078
+ "channel_id",
19079
+ "proxy_id",
19080
+ "explicit_confirmation"
19081
+ ],
19082
+ "properties": {
19083
+ "workspace_id": {
19084
+ "type": "string",
19085
+ "format": "uuid"
19086
+ },
19087
+ "channel_id": {
19088
+ "type": "string",
19089
+ "format": "uuid"
19090
+ },
19091
+ "proxy_id": {
19092
+ "type": "string",
19093
+ "format": "uuid"
19094
+ },
19095
+ "explicit_confirmation": {
19096
+ "type": "boolean",
19097
+ "const": true,
19098
+ "description": "Только после явного согласия человека."
19099
+ }
19100
+ }
19101
+ }
19102
+ },
19103
+ {
19104
+ "name": "besales_platform_telegram_personal_account_proxy_change",
19105
+ "description": "Переключить свой личный номер Telegram на существующий прокси пула канала. Требует manage:channels; профиль platform. Номер переподключится: покажи человеку номер и целевой прокси и получи явное согласие, затем передай explicit_confirmation:true. Обязательны channel_id, account_id, proxy_id, стабильный action_id (UUID) и явный country_change_confirmed; значение по умолчанию не подставляй. Ответ — квитанция message, action_id, state, code?, retry_after_ms?. Успех только state=SUCCEEDED; UNKNOWN/PENDING не объявляй успехом, FAILED/EXPIRED — отказ. При повторе того же намерения сохраняй action_id и все аргументы, новый ключ автоматически не создавай. 404 TELEGRAM_PROXY_NOT_FOUND — целевой прокси не найден. При смене страны без согласия передай отказ человеку, автоматически согласие не повышай. Логины, пароли, host, port и edit-proxy через MCP не принимаются.",
19106
+ "inputSchema": {
19107
+ "type": "object",
19108
+ "additionalProperties": false,
19109
+ "required": [
19110
+ "channel_id",
19111
+ "account_id",
19112
+ "action_id",
19113
+ "proxy_id",
19114
+ "country_change_confirmed",
19115
+ "explicit_confirmation"
19116
+ ],
19117
+ "properties": {
19118
+ "workspace_id": {
19119
+ "type": "string",
19120
+ "format": "uuid"
19121
+ },
19122
+ "channel_id": {
19123
+ "type": "string",
19124
+ "format": "uuid"
19125
+ },
19126
+ "account_id": {
19127
+ "type": "string",
19128
+ "format": "uuid"
19129
+ },
19130
+ "action_id": {
19131
+ "type": "string",
19132
+ "format": "uuid",
19133
+ "description": "Стабильный UUID намерения: создай один раз, сохрани для повтора с теми же аргументами."
19134
+ },
19135
+ "proxy_id": {
19136
+ "type": "string",
19137
+ "format": "uuid"
19138
+ },
19139
+ "country_change_confirmed": {
19140
+ "type": "boolean",
19141
+ "description": "Явное решение человека о смене страны: true подтверждает, false не подтверждает. Обязательное поле без значения по умолчанию."
19142
+ },
19143
+ "explicit_confirmation": {
19144
+ "type": "boolean",
19145
+ "const": true,
19146
+ "description": "Только после явного согласия человека."
19147
+ }
19148
+ }
19149
+ }
19150
+ },
19151
+ {
19152
+ "name": "besales_platform_telegram_personal_proxy_stock_list",
19153
+ "description": "Прочитать общий запас прокси пространства. Требует read:channels; профили readonly и platform. Фильтры status, country_code (две заглавные буквы), search (до 200 знаков), cursor (UUID), limit (1–100, сервер по умолчанию 50). nextCursor продолжает список; counts, freeProxies, countryCounts и freeCountryCounts относятся ко всему пулу без фильтров. Занятость — occupiedSlots, ёмкость — maxAccounts; accountsCount не показывает свободные места. Данные о стране — IPinfo (https://ipinfo.io). Запаса ещё нет — пустой список и нули. Логины и пароли не возвращаются.",
19154
+ "inputSchema": {
19155
+ "type": "object",
19156
+ "additionalProperties": false,
19157
+ "required": [],
19158
+ "properties": {
19159
+ "workspace_id": {
19160
+ "type": "string",
19161
+ "format": "uuid"
19162
+ },
19163
+ "status": {
19164
+ "type": "string",
19165
+ "enum": [
19166
+ "ACTIVE",
19167
+ "CHECKING",
19168
+ "ERROR",
19169
+ "INACTIVE"
19170
+ ]
19171
+ },
19172
+ "country_code": {
19173
+ "type": "string",
19174
+ "pattern": "^[A-Z]{2}$"
19175
+ },
19176
+ "search": {
19177
+ "type": "string",
19178
+ "maxLength": 200
19179
+ },
19180
+ "cursor": {
19181
+ "type": "string",
19182
+ "format": "uuid"
19183
+ },
19184
+ "limit": {
19185
+ "type": "integer",
19186
+ "minimum": 1,
19187
+ "maximum": 100
19188
+ }
19189
+ }
19190
+ }
19191
+ },
19192
+ {
19193
+ "name": "besales_platform_telegram_personal_proxy_stock_import_link",
19194
+ "description": "Выдать ссылку массового импорта в общий запас прокси пространства. Требует manage:channels и ключ вида MCP: ядро проверяет живой ключ, создателя и его свежую роль CHANNEL_MANAGE, аудит пишет до вызова фермы. Профиль platform. Логины и пароли человек вводит на защищённой странице после входа, не в чате. Одноразовая ссылка действует до expires_at; в ответе session_id, setup_page_url, expires_at, без setup_ref. До 50 строк, 1–3 номера на прокси. Выдача ссылки не означает загрузку; итог — besales_platform_telegram_personal_proxy_stock_import_status. После обрыва автоматически новую ссылку не создавай.",
19195
+ "inputSchema": {
19196
+ "type": "object",
19197
+ "additionalProperties": false,
19198
+ "required": [],
19199
+ "properties": {
19200
+ "workspace_id": {
19201
+ "type": "string",
19202
+ "format": "uuid"
19203
+ }
19204
+ }
19205
+ }
19206
+ },
19207
+ {
19208
+ "name": "besales_platform_telegram_personal_proxy_stock_import_status",
19209
+ "description": "Прочитать состояние и счётчики импорта в общий запас по session_id. Требует manage:channels и ключ вида MCP со свежей ролью CHANNEL_MANAGE создателя; профили readonly и platform. Только sessionId, status, expiresAt, summary (total, pending, accepted, duplicates, invalid, checkFailed, rejected, registered), без строк прокси. COMPLETED — обработка завершена, смотри счётчики; UNKNOWN не означает успех, повтори чтение позже; EXPIRED/CANCELLED — закрыта.",
19210
+ "inputSchema": {
19211
+ "type": "object",
19212
+ "additionalProperties": false,
19213
+ "required": [
19214
+ "session_id"
19215
+ ],
19216
+ "properties": {
19217
+ "workspace_id": {
19218
+ "type": "string",
19219
+ "format": "uuid"
19220
+ },
19221
+ "session_id": {
19222
+ "type": "string",
19223
+ "format": "uuid"
19224
+ }
19225
+ }
19226
+ }
19227
+ },
19228
+ {
19229
+ "name": "besales_platform_telegram_personal_proxy_stock_delete",
19230
+ "description": "Удалить свободный прокси из общего запаса пространства. Требует manage:channels и ключ вида MCP: ядро проверяет живой ключ, создателя и его свежую роль CHANNEL_MANAGE, аудит пишет до вызова фермы. Профиль platform. Удаление необратимо: покажи человеку пространство и proxy_id, получи явное согласие и передай explicit_confirmation:true. Без него отказ до HTTP. 204 — удалён; 409 TELEGRAM_PROXY_NOT_EMPTY — идёт операция, повторить позже; 404 TELEGRAM_PROXY_NOT_FOUND — не найден; 503 не означает успех.",
19231
+ "inputSchema": {
19232
+ "type": "object",
19233
+ "additionalProperties": false,
19234
+ "required": [
19235
+ "proxy_id",
19236
+ "explicit_confirmation"
19237
+ ],
19238
+ "properties": {
19239
+ "workspace_id": {
19240
+ "type": "string",
19241
+ "format": "uuid"
19242
+ },
19243
+ "proxy_id": {
19244
+ "type": "string",
19245
+ "format": "uuid"
19246
+ },
19247
+ "explicit_confirmation": {
19248
+ "type": "boolean",
19249
+ "const": true,
19250
+ "description": "Только после явного согласия человека."
19251
+ }
19252
+ }
19253
+ }
19254
+ },
19255
+ {
19256
+ "name": "besales_platform_telegram_personal_proxy_stock_check",
19257
+ "description": "Проверить прокси общего запаса по proxy_id, обновить здоровье и страну. Требует manage:channels и ключ вида MCP: ядро проверяет живой ключ, создателя и его свежую роль CHANNEL_MANAGE, аудит пишет до вызова фермы. Профиль platform. 200 — результат проверки, 202 CHECKING — проверка ещё идёт, не объявляй прокси рабочим. Данные о стране — IPinfo (https://ipinfo.io).",
19258
+ "inputSchema": {
19259
+ "type": "object",
19260
+ "additionalProperties": false,
19261
+ "required": [
19262
+ "proxy_id"
19263
+ ],
19264
+ "properties": {
19265
+ "workspace_id": {
19266
+ "type": "string",
19267
+ "format": "uuid"
19268
+ },
19269
+ "proxy_id": {
19270
+ "type": "string",
19271
+ "format": "uuid"
19272
+ }
19273
+ }
19274
+ }
19275
+ },
19276
+ {
19277
+ "name": "besales_platform_telegram_personal_proxy_stock_check_all",
19278
+ "description": "Поставить на проверку все прокси общего запаса пространства. Требует manage:channels и ключ вида MCP: ядро проверяет живой ключ, создателя и его свежую роль CHANNEL_MANAGE, аудит пишет до вызова фермы. Профиль platform. queued — сколько поставлено в очередь, не число рабочих прокси. Итог перечитай через besales_platform_telegram_personal_proxy_stock_list.",
19279
+ "inputSchema": {
19280
+ "type": "object",
19281
+ "additionalProperties": false,
19282
+ "required": [],
19283
+ "properties": {
19284
+ "workspace_id": {
19285
+ "type": "string",
19286
+ "format": "uuid"
19287
+ }
19288
+ }
19289
+ }
19290
+ },
19291
+ {
19292
+ "name": "besales_platform_telegram_personal_proxies",
19293
+ "description": "Прочитать прокси существующего канала личного Telegram. Требует read:channels; профили readonly и platform. Фильтры status, country_code (две заглавные буквы), search (до 200 знаков), cursor (UUID), limit (1–100, сервер по умолчанию 50). nextCursor продолжает список; counts, freeProxies, countryCounts и freeCountryCounts относятся ко всему пулу без фильтров. Занятость — occupiedSlots, ёмкость — maxAccounts; accountsCount не показывает свободные места. Данные о стране — IPinfo (https://ipinfo.io). Для явной пары используй proxy_id, свободный прокси выбирай с учётом occupiedSlots, статуса и ёмкости.",
19294
+ "inputSchema": {
19295
+ "type": "object",
19296
+ "additionalProperties": false,
19297
+ "required": [
19298
+ "channel_id"
19299
+ ],
19300
+ "properties": {
19301
+ "workspace_id": {
19302
+ "type": "string",
19303
+ "format": "uuid"
19304
+ },
19305
+ "channel_id": {
19306
+ "type": "string",
19307
+ "format": "uuid"
19308
+ },
19309
+ "status": {
19310
+ "type": "string",
19311
+ "enum": [
19312
+ "ACTIVE",
19313
+ "CHECKING",
19314
+ "ERROR",
19315
+ "INACTIVE"
19316
+ ]
19317
+ },
19318
+ "country_code": {
19319
+ "type": "string",
19320
+ "pattern": "^[A-Z]{2}$"
19321
+ },
19322
+ "search": {
19323
+ "type": "string",
19324
+ "maxLength": 200
19325
+ },
19326
+ "cursor": {
19327
+ "type": "string",
19328
+ "format": "uuid"
19329
+ },
19330
+ "limit": {
19331
+ "type": "integer",
19332
+ "minimum": 1,
19333
+ "maximum": 100
19334
+ }
19335
+ }
19336
+ }
19337
+ },
19338
+ {
19339
+ "name": "besales_platform_telegram_personal_proxy_take_from_stock",
19340
+ "description": "Забрать прокси из общего запаса пространства в канал целиком, всё или ничего. Требует manage:channels и ключ вида MCP: ядро проверяет живой ключ, создателя и его свежую роль CHANNEL_MANAGE, аудит пишет до вызова фермы. Профиль platform. Перед вызовом покажи человеку, какие прокси (или сколько и из какой страны) и в какой канал переносишь, и получи «да». Поля explicit_confirmation нет. Ровно одна форма: proxy_ids (1–50 разных UUID) или count с необязательной country_code. count — число прокси: сколько ПРОКСИ забрать; у прокси 1–3 места (maxAccounts). При country_code прокси без определённой страны не участвуют; страны не смешиваются: нехватка означает отказ, без добора из других стран. Под N номеров выбирай proxy_ids из списка запаса по местам: заранее вычти места явных пар, затем выбери конкретные ACTIVE свободные прокси нужной страны, пока сумма maxAccounts не покроет недостачу. Если мест не хватает, не вызывай перенос. action_id (UUID) создаётся один на намерение и передаётся только заголовком X-Idempotency-Key. Новое намерение человека — новый action_id. Повтор того же намерения — тот же ключ и аргументы, в том числе при 503 (исход неизвестен). NOT_ENOUGH/REFUSED — ничего не перенесено, исправь причину; отказ ключом не запоминается. Изменение набора прокси согласуй как новое намерение с новым action_id. При IDEMPOTENCY_REQUEST_MISMATCH для того же намерения восстанови прежние аргументы и сохрани action_id; для нового намерения создай новый action_id после согласия человека.",
19341
+ "inputSchema": {
19342
+ "type": "object",
19343
+ "additionalProperties": false,
19344
+ "required": [
19345
+ "channel_id",
19346
+ "action_id"
19347
+ ],
19348
+ "properties": {
19349
+ "workspace_id": {
19350
+ "type": "string",
19351
+ "format": "uuid"
19352
+ },
19353
+ "channel_id": {
19354
+ "type": "string",
19355
+ "format": "uuid"
19356
+ },
19357
+ "action_id": {
19358
+ "type": "string",
19359
+ "format": "uuid"
19360
+ },
19361
+ "proxy_ids": {
19362
+ "type": "array",
19363
+ "items": {
19364
+ "type": "string",
19365
+ "format": "uuid"
19366
+ },
19367
+ "minItems": 1,
19368
+ "maxItems": 50,
19369
+ "uniqueItems": true
19370
+ },
19371
+ "count": {
19372
+ "type": "integer",
19373
+ "minimum": 1,
19374
+ "maximum": 50,
19375
+ "description": "Число прокси, не мест. Под номера выбирай proxy_ids по maxAccounts."
19376
+ },
19377
+ "country_code": {
19378
+ "type": "string",
19379
+ "pattern": "^[A-Z]{2}$"
19380
+ }
19381
+ },
19382
+ "oneOf": [
19383
+ {
19384
+ "required": [
19385
+ "proxy_ids"
19386
+ ],
19387
+ "not": {
19388
+ "anyOf": [
19389
+ {
19390
+ "required": [
19391
+ "count"
19392
+ ]
19393
+ },
19394
+ {
19395
+ "required": [
19396
+ "country_code"
19397
+ ]
19398
+ }
19399
+ ]
19400
+ }
19401
+ },
19402
+ {
19403
+ "required": [
19404
+ "count"
19405
+ ],
19406
+ "not": {
19407
+ "required": [
19408
+ "proxy_ids"
19409
+ ]
19410
+ }
19411
+ }
19412
+ ]
19413
+ }
19414
+ },
19415
+ {
19416
+ "name": "besales_platform_telegram_personal_proxy_return_to_stock",
19417
+ "description": "Вернуть свободный прокси канала в общий запас пространства. Требует manage:channels и ключ вида MCP: ядро проверяет живой ключ, создателя и его свежую роль CHANNEL_MANAGE, аудит пишет до вызова фермы. Профиль platform. Перед вызовом покажи человеку, какой прокси из какого канала возвращаешь в общий запас пространства, и получи «да». Поля explicit_confirmation нет. Обязательный action_id (UUID) создаётся один на намерение и передаётся только заголовком X-Idempotency-Key, тело отсутствует. Новое намерение человека — новый action_id. Повтор того же намерения — тот же ключ и аргументы; при 503 исход неизвестен, сохрани их. При IDEMPOTENCY_REQUEST_MISMATCH для того же намерения восстанови прежние аргументы и сохрани action_id; для нового намерения создай новый action_id после согласия человека. TELEGRAM_PROXY_NOT_EMPTY — сначала освободи прокси; TELEGRAM_PROXY_ADDRESS_IN_USE — такой адрес уже в запасе, предложи удалить этот прокси из канала; NOT_FOUND — перечитай список.",
19418
+ "inputSchema": {
19419
+ "type": "object",
19420
+ "additionalProperties": false,
19421
+ "required": [
19422
+ "channel_id",
19423
+ "proxy_id",
19424
+ "action_id"
19425
+ ],
19426
+ "properties": {
19427
+ "workspace_id": {
19428
+ "type": "string",
19429
+ "format": "uuid"
19430
+ },
19431
+ "channel_id": {
19432
+ "type": "string",
19433
+ "format": "uuid"
19434
+ },
19435
+ "proxy_id": {
19436
+ "type": "string",
19437
+ "format": "uuid"
19438
+ },
19439
+ "action_id": {
19440
+ "type": "string",
19441
+ "format": "uuid"
19442
+ }
19443
+ }
19444
+ }
19445
+ },
19446
+ {
19447
+ "name": "besales_platform_telegram_personal_connect_link",
19448
+ "description": "Выдать ссылку подключения номеров в существующий канал личного Telegram. Требует manage:channels, ключ MCP и свежую роль CHANNEL_MANAGE создателя на канал; профиль platform. channel_id обязателен. proxy_plan необязателен: ровно pairs (1–50 пар phone E.164 и proxy_id; разные телефоны, не больше трёх пар на один прокси) или country_code. При country_code прокси без определённой страны не участвуют; страны не смешиваются: нехватка означает отказ, без добора из других стран. План только заполняет страницу, не бронирует, не переносит и не подключает. Пары хранят исходный proxy_id: адрес только для показа, обратного разрешения адреса нет; пропавший id блокирует старт до правки человеком. Занятость проверяет страница при старте. Коды Telegram и пароль 2FA вводит человек на защищённой странице после входа, не в чате. В ответе setup_page_url и expires_at, без setup_ref и телефонов. Итог — besales_platform_telegram_personal_accounts. После обрыва автоматически новую ссылку не создавай.",
19449
+ "inputSchema": {
19450
+ "type": "object",
19451
+ "additionalProperties": false,
19452
+ "required": [
19453
+ "channel_id"
19454
+ ],
19455
+ "properties": {
19456
+ "workspace_id": {
19457
+ "type": "string",
19458
+ "format": "uuid"
19459
+ },
19460
+ "channel_id": {
19461
+ "type": "string",
19462
+ "format": "uuid"
19463
+ },
19464
+ "proxy_plan": {
19465
+ "oneOf": [
19466
+ {
19467
+ "type": "object",
19468
+ "additionalProperties": false,
19469
+ "required": [
19470
+ "pairs"
19471
+ ],
19472
+ "properties": {
19473
+ "pairs": {
19474
+ "type": "array",
19475
+ "minItems": 1,
19476
+ "maxItems": 50,
19477
+ "uniqueItems": true,
19478
+ "description": "Разные телефоны E.164; один proxy_id не больше трёх раз. Исходный id сохраняется, адрес обратно в id не разрешается.",
19479
+ "items": {
19480
+ "type": "object",
19481
+ "additionalProperties": false,
19482
+ "required": [
19483
+ "phone",
19484
+ "proxy_id"
19485
+ ],
19486
+ "properties": {
19487
+ "phone": {
19488
+ "type": "string",
19489
+ "pattern": "^\\+[1-9]\\d{6,14}$"
19490
+ },
19491
+ "proxy_id": {
19492
+ "type": "string",
19493
+ "format": "uuid"
19494
+ }
19495
+ }
19496
+ }
19497
+ }
19498
+ }
19499
+ },
19500
+ {
19501
+ "type": "object",
19502
+ "additionalProperties": false,
19503
+ "required": [
19504
+ "country_code"
19505
+ ],
19506
+ "properties": {
19507
+ "country_code": {
19508
+ "type": "string",
19509
+ "pattern": "^[A-Z]{2}$"
19510
+ }
19511
+ }
19512
+ }
19513
+ ]
19514
+ }
19515
+ }
19516
+ }
19006
19517
  }
19007
19518
  ],
19008
19519
  "resources": [
@@ -19242,7 +19753,7 @@
19242
19753
  }
19243
19754
  ],
19244
19755
  "summary": {
19245
- "total_tools": 306,
19756
+ "total_tools": 320,
19246
19757
  "tools_by_category": {
19247
19758
  "workspace_and_help": 18,
19248
19759
  "agent_configuration": 15,
@@ -19250,7 +19761,7 @@
19250
19761
  "icp": 11,
19251
19762
  "knowledge_and_content": 52,
19252
19763
  "crm_and_data_sources": 32,
19253
- "channels_and_credentials": 26,
19764
+ "channels_and_credentials": 40,
19254
19765
  "dialogues_and_contacts": 35,
19255
19766
  "automation": 5,
19256
19767
  "outbound_and_analytics": 72
@@ -19465,6 +19976,24 @@
19465
19976
  "besales_followup_sequence_list",
19466
19977
  "besales_followup_step_stats"
19467
19978
  ]
19468
- }
19979
+ },
19980
+ "newly_added_in_PROXYMCP1M": [
19981
+ "besales_platform_telegram_personal_proxy_import_link",
19982
+ "besales_platform_telegram_personal_proxy_import_status",
19983
+ "besales_platform_telegram_personal_proxy_delete",
19984
+ "besales_platform_telegram_personal_account_proxy_change"
19985
+ ],
19986
+ "newly_added_in_PROXYPOOL1M": [
19987
+ "besales_platform_telegram_personal_proxy_stock_list",
19988
+ "besales_platform_telegram_personal_proxy_stock_import_link",
19989
+ "besales_platform_telegram_personal_proxy_stock_import_status",
19990
+ "besales_platform_telegram_personal_proxy_stock_delete",
19991
+ "besales_platform_telegram_personal_proxy_stock_check",
19992
+ "besales_platform_telegram_personal_proxy_stock_check_all",
19993
+ "besales_platform_telegram_personal_proxies",
19994
+ "besales_platform_telegram_personal_proxy_take_from_stock",
19995
+ "besales_platform_telegram_personal_proxy_return_to_stock",
19996
+ "besales_platform_telegram_personal_connect_link"
19997
+ ]
19469
19998
  }
19470
19999
  }
@@ -170,6 +170,8 @@ export declare const agentDesignTools: (import("./shared.js").ToolDefinition<{
170
170
  changelog_note?: string | undefined;
171
171
  }> | import("./shared.js").ToolDefinition<{
172
172
  agent_id: string;
173
+ request_key?: string | undefined;
174
+ icp_profile_id?: string | null | undefined;
173
175
  candidate_prompt?: string | undefined;
174
176
  scenario_ids?: string[] | undefined;
175
177
  options?: {
@@ -1,4 +1,5 @@
1
1
  import { icpImportSourceSchema, legacyIcpImportConfigSchema } from './icp-import-source.js';
2
+ import { randomUUID } from 'node:crypto';
2
3
  import { z } from 'zod';
3
4
  import { assertCompleteList } from '../incomplete-list.js';
4
5
  import { PROMPT_LANGUAGE_CODE_MAX_LENGTH } from './prompt-authoring.constants.js';
@@ -581,6 +582,8 @@ export const agentDesignTools = [
581
582
  requiredFields: ['agent_id'],
582
583
  schema: z.object({
583
584
  agent_id: uuidSchema,
585
+ request_key: uuidSchema.optional(),
586
+ icp_profile_id: uuidSchema.nullable().optional(),
584
587
  // Прогон по ещё не активированному тексту промпта: проверка кандидата ДО того, как он
585
588
  // станет промптом агента. Без поля кандидата проверить нечем — приходилось бы активировать
586
589
  // черновик на живом агенте.
@@ -606,6 +609,8 @@ export const agentDesignTools = [
606
609
  createRequest: (input) => ({
607
610
  path: `/agents/${input.agent_id}/sandbox-runs`,
608
611
  body: compactObject({
612
+ requestKey: input.request_key ?? randomUUID(),
613
+ icpProfileId: input.icp_profile_id,
609
614
  candidatePrompt: input.candidate_prompt,
610
615
  scenarioIds: input.scenario_ids,
611
616
  options: input.options