@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
@@ -189,14 +189,20 @@ function outcomeIsAmbiguous(context) {
189
189
  *
190
190
  * ⛔ Совет повторить здесь опаснее самой ошибки: повторное создание заведёт вторую сущность,
191
191
  * повторный запуск волны отправит сообщения людям второй раз, повторный перевыпуск отзовёт
192
- * ключ, который партнёр только что получил. Поэтому текст называет проверку, а не повтор.
192
+ * ключ, который партнёр только что получил. Для песочницы безопасен тот же запуск с прежним ключом.
193
193
  */
194
194
  function ambiguousOutcomeResult(cause, context) {
195
- const verify = context.verifyWithToolName
196
- ? `Сверьтесь через \`${context.verifyWithToolName}\`.`
197
- : 'Сверьтесь состоянием на стороне Besales (списком или *_status-инструментом этой операции).';
195
+ const isSandboxStart = context.toolName === 'besales_sandbox_run_start';
196
+ const verify = isSandboxStart
197
+ ? 'Повтори besales_sandbox_run_start с теми же аргументами и тем же request_key из requestIdentity: сервер вернёт тот же прогон. Новый request_key не создавай.'
198
+ : context.verifyWithToolName
199
+ ? `Сверьтесь через \`${context.verifyWithToolName}\`.`
200
+ : 'Сверьтесь состоянием на стороне Besales (списком или *_status-инструментом этой операции).';
201
+ const retryWarning = isSandboxStart
202
+ ? ''
203
+ : `Не повторяйте вызов: повтор ${context.sideEffect === 'spend' ? 'заплатит второй раз' : 'заведёт второй экземпляр'}. `;
198
204
  const message = `OUTCOME_UNKNOWN: ${cause} Запрос ушёл, ответа нет — операция могла СОСТОЯТЬСЯ. ` +
199
- `Не повторяйте вызов: повтор ${context.sideEffect === 'spend' ? 'заплатит второй раз' : 'заведёт второй экземпляр'}. ${verify}`;
205
+ `${retryWarning}${verify}`;
200
206
  return errorToolResult(message, {
201
207
  code: 'OUTCOME_UNKNOWN',
202
208
  message,
@@ -240,6 +246,42 @@ function mapApiClientError(error, context, workspaceId) {
240
246
  if (!error.status) {
241
247
  return errorToolResult('Not connected to Besales. Run `besales-mcp connect` first.');
242
248
  }
249
+ if (error.status === 409 && error.details?.code === 'TELEGRAM_PROXY_NOT_EMPTY') {
250
+ if (context.toolName === 'besales_platform_telegram_personal_proxy_stock_delete') {
251
+ const hint = 'По прокси идёт операция. Дождись её завершения и повтори удаление из запаса позже.';
252
+ return apiErrorResult(error, hint, hint);
253
+ }
254
+ if (context.toolName === 'besales_platform_telegram_personal_proxy_return_to_stock') {
255
+ const hint = 'Сначала освободи прокси от номеров, броней и операций, затем верни его в запас.';
256
+ return apiErrorResult(error, hint, hint);
257
+ }
258
+ const hint = 'Сначала переключите номера на другой прокси, затем удалите освободившийся прокси.';
259
+ return apiErrorResult(error, `Прокси используется номерами. ${hint}`, hint);
260
+ }
261
+ if (error.status === 409 && error.details?.code === 'TELEGRAM_PROXY_ADDRESS_IN_USE') {
262
+ const hint = 'Такой адрес уже есть в запасе. Предложи удалить этот прокси из канала.';
263
+ return apiErrorResult(error, hint, hint);
264
+ }
265
+ if (error.status === 409 && error.details?.code === 'TELEGRAM_PROXY_STOCK_NOT_ENOUGH') {
266
+ const available = error.details.available;
267
+ const hint = 'Ничего не перенесено. Перечитай запас и выбери доступные прокси; под номера считай места по maxAccounts.';
268
+ return apiErrorResult(error, `В запасе недостаточно прокси${available === undefined ? '' : ': доступно ' + available}. ${hint}`, hint);
269
+ }
270
+ if (error.status === 409 && error.details?.code === 'TELEGRAM_PROXY_STOCK_REFUSED') {
271
+ const hint = 'Ничего не перенесено. Устрани причины отказов ниже. Повтори то же намерение с тем же action_id и аргументами; если меняешь набор прокси, согласуй новое намерение с человеком и создай новый action_id.';
272
+ return apiErrorResult(error, hint, hint);
273
+ }
274
+ if (error.status === 409 && error.details?.code === 'IDEMPOTENCY_REQUEST_MISMATCH' && (context.toolName === 'besales_platform_telegram_personal_proxy_take_from_stock' ||
275
+ context.toolName === 'besales_platform_telegram_personal_proxy_return_to_stock')) {
276
+ const hint = 'Для того же намерения восстанови прежние аргументы и сохрани action_id. Новое намерение человека — новый action_id; перед новым переносом покажи, что и куда переносишь, и получи «да».';
277
+ return apiErrorResult(error, hint, hint);
278
+ }
279
+ if (error.status === 404 && error.details?.code === 'TELEGRAM_PROXY_NOT_FOUND') {
280
+ const hint = context.toolName?.startsWith('besales_platform_telegram_personal_proxy_stock_')
281
+ ? 'Прокси не найден в запасе пространства. Перечитай список и проверь proxy_id.'
282
+ : 'Прокси не найден в пуле канала. Проверьте канал и proxy_id в приложении.';
283
+ return apiErrorResult(error, hint, hint);
284
+ }
243
285
  if (error.status === 409 &&
244
286
  error.details?.code === 'ICP_INGEST_CONTINUATION_EXPIRED') {
245
287
  const hint = 'Остаток выборки устарел — начните новый импорт. Не повторяй продолжение автоматически; новый импорт запускай по решению человека с новым request_key и gdpr_confirmed=true.';
@@ -341,6 +383,16 @@ function formatSafeDetails(details) {
341
383
  if (!details)
342
384
  return undefined;
343
385
  const parts = [];
386
+ for (const item of details.items ?? [])
387
+ parts.push(`${item.proxyId}: ${item.reason}.`);
388
+ if (details.code === 'TELEGRAM_PROXY_COUNTRY_NOT_ENOUGH') {
389
+ if (details.available !== undefined)
390
+ parts.push(`Доступно мест: ${details.available}.`);
391
+ if (details.requested !== undefined)
392
+ parts.push(`Запрошено мест: ${details.requested}.`);
393
+ }
394
+ for (const file of details.files ?? [])
395
+ parts.push(`${file.fileName}: ${file.reason}.`);
344
396
  for (const workflow of details.workflows ?? [])
345
397
  parts.push(`«${workflow.name}»: живых прогонов ${workflow.liveRuns}.`);
346
398
  if (details.serviceAccountEmail && details.code !== 'DOCUMENT_ACCESS_CONFIRMATION_REQUIRED' && details.code !== 'DOCUMENT_ACCESS_SNAPSHOT_CHANGED') {
@@ -1 +1 @@
1
- {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/tools/result.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/tools/result.ts"],"names":[],"mappings":"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"}
@@ -21,7 +21,10 @@
21
21
 
22
22
  Признак неоднозначности выводится из уже объявленного у инструмента: `sideEffect !== 'none'`
23
23
  и не объявлена идемпотентность. Тогда на **5xx** и на **обрыв связи** уходит ответ вида
24
- `OUTCOME_UNKNOWN` — без совета повторить и с указанием, чем свериться.
24
+ `OUTCOME_UNKNOWN` — с указанием, чем свериться. Для запуска песочницы после потери ответа
25
+ повтори `besales_sandbox_run_start` с теми же аргументами и тем же `request_key` из
26
+ `requestIdentity`: сервер вернёт тот же прогон. Новый ключ не создавай. Для остальных
27
+ неидемпотентных операций повтор запрещён до сверки состояния.
25
28
 
26
29
  ⚠️ **Идемпотентность объявляется явно, умолчание — худшее.** Правило «все `*_upsert`
27
30
  идемпотентны» неверно: без идентификатора они уходят в создание.
@@ -14,6 +14,8 @@
14
14
  изменение маршрутизации, запуск GetCourse-волны и финализация промпта находятся обычным русским
15
15
  запросом без знания технического имени.
16
16
 
17
+ Запрос «создать агента промпт написать» находит создание агента.
18
+
17
19
  `besales_help_get({uri})` возвращает индекс. Параметр `section` отдаёт один раздел, `full=true` —
18
20
  весь документ. Ответы содержат version/source/complete; неоднозначный раздел не выбирается молча.
19
21
 
@@ -84,8 +84,8 @@ Telegram неизвестен, сначала сверь профиль номе
84
84
  ядро вернёт прежний ответ, профиль второй раз не изменится и суточный предел смен не тратится.
85
85
  При неизвестном исходе новый ключ автоматически не создавай.
86
86
 
87
- Ссылка настройки номера (`…_setup_link`) в этой пачке не выпускается: маршрута
88
- `telegram-personal-setup-sessions` в ядре нет, это отдельная задача ядра.
87
+ Для подключения номеров в существующий канал используй `…_connect_link`; план прокси
88
+ и защищённый ввод описаны ниже.
89
89
 
90
90
  Ограничения, ручная жалоба и чтение её исхода описаны в
91
91
  [документе апелляции](telegram-personal-restrictions.md). Перед жалобой покажи человеку
@@ -98,3 +98,30 @@ Telegram неизвестен, сначала сверь профиль номе
98
98
  проверяет, что снятие обязательного согласия в Zod или опубликованной схеме ломает именованное
99
99
  утверждение теста. `scripts/telegram-personal-profile-mutants.mjs` делает то же для запрета
100
100
  двух режимов ников сразу (в Zod и в опубликованной схеме) и для имени заголовка ключа.
101
+
102
+ ## Прокси личного Telegram
103
+
104
+ `besales_platform_telegram_personal_proxy_import_link` выдаёт человеку одноразовую ссылку
105
+ до `expires_at`: логины и пароли вводятся на защищённой странице после входа, не в чате.
106
+ `besales_platform_telegram_personal_proxy_import_status` читает по `channel_id` и `session_id`
107
+ только состояние и счётчики, без строк прокси. Оба маршрута требуют `manage:channels`.
108
+ `besales_platform_telegram_personal_proxy_delete` удаляет свободный прокси по `proxy_id`;
109
+ 409 `TELEGRAM_PROXY_NOT_EMPTY` — сначала переключите номера на другой прокси.
110
+ `besales_platform_telegram_personal_account_proxy_change` переключает номер (`account_id`)
111
+ на существующий `proxy_id`. Оба действия требуют `manage:channels` и явное
112
+ `explicit_confirmation:true`; номер при переключении переподключится.
113
+ Для смены обязательны стабильный `action_id` (UUID) и явный `country_change_confirmed`
114
+ (boolean без умолчания). Повтор — с тем же ключом и аргументами. Успех только
115
+ `state=SUCCEEDED`; `UNKNOWN`/`PENDING` не подтверждают исход.
116
+
117
+ Общий запас пространства и подключение номеров доступны через десять дополнительных
118
+ инструментов: `proxy_stock_list`, `proxy_stock_import_link`, `proxy_stock_import_status`,
119
+ `proxy_stock_delete`, `proxy_stock_check`, `proxy_stock_check_all`, `proxies`,
120
+ `proxy_take_from_stock`, `proxy_return_to_stock`, `connect_link` с общей приставкой
121
+ `besales_platform_telegram_personal_`. Чтение списков — `read:channels`, изменения и статус
122
+ импорта — `manage:channels`; проверяется свежая роль создателя ключа MCP.
123
+ Ссылка `connect_link` работает только с существующим каналом. План пары или страны только
124
+ заполняет страницу: коды и пароль 2FA вводит человек после входа. Пары сохраняют исходный
125
+ `proxy_id`, адрес обратно в id не разрешается. Переносы требуют стабильный `action_id` в
126
+ `Idempotency-Key`; `count` считает прокси, под номера выбирай `proxy_ids` по местам.
127
+ Подробный договор и порядок действий — [прокси личного Telegram](telegram-personal-proxies.md).
@@ -0,0 +1,135 @@
1
+ # Прокси личного Telegram
2
+
3
+ Мост выдаёт ссылку для массовой загрузки, читает итог, удаляет свободный прокси и переключает
4
+ свой номер на существующий прокси пула. Для этих маршрутов нужен `manage:channels`.
5
+ `workspace_id` необязателен: используется выбранная рабочая область; `channel_id` обязателен.
6
+
7
+ `besales_platform_telegram_personal_proxy_import_link` (профиль `platform`) создаёт сессию
8
+ и возвращает `session_id`, `setup_page_url`, `expires_at`. Отдай ссылку человеку: он входит
9
+ в приложение и вставляет строки прокси с логинами и паролями на защищённой странице, не в чате.
10
+ Ссылка одноразовая, живёт до `expires_at`. `setup_ref` и строки прокси мост не выдаёт.
11
+ Выдача ссылки ещё не означает загрузку прокси; автоматически создавать новую после обрыва нельзя.
12
+
13
+ `besales_platform_telegram_personal_proxy_import_status` (профили `readonly`, `platform`)
14
+ принимает `channel_id`, `session_id`, возвращает `sessionId`, `status`, `expiresAt`, `summary`
15
+ со счётчиками `total`, `pending`, `accepted`, `duplicates`, `invalid`, `checkFailed`, `rejected`,
16
+ `registered`. Только эти поля проходят в ответ, без строк и endpoint. `AWAITING_INPUT` ждёт
17
+ ввода, `SUBMITTING`/`PROCESSING` ещё в работе, `UNKNOWN` требует повторного чтения, `COMPLETED`
18
+ означает завершённую обработку (см. счётчики), `EXPIRED`/`CANCELLED` — сессия закрыта.
19
+
20
+ `besales_platform_telegram_personal_proxy_delete` (профиль `platform`) принимает `channel_id`,
21
+ `proxy_id` и обязательное `explicit_confirmation:true`. Покажи человеку прокси и канал и получи
22
+ явное согласие: удаление необратимо. Ответ ядра 204 превращается в `{ "deleted": true }`.
23
+ 409 `TELEGRAM_PROXY_NOT_EMPTY`: сначала переключите номера на другой прокси. 404
24
+ `TELEGRAM_PROXY_NOT_FOUND`: проверь канал и идентификатор в приложении. 503 не означает удаления.
25
+
26
+ `besales_platform_telegram_personal_account_proxy_change` (профиль `platform`) принимает
27
+ `channel_id`, `account_id`, `proxy_id`, `action_id` (UUID), `country_change_confirmed` (boolean)
28
+ и обязательное `explicit_confirmation:true`. Номер переподключится: покажи человеку номер
29
+ и целевой прокси и получи согласие. Смена страны — отдельное явное решение без умолчания;
30
+ `false` передаётся буквально и не повышается автоматически до `true`.
31
+ Создай `action_id` один раз на намерение, сохраняй его и аргументы при повторе.
32
+ Тело ядра — строго `{ actionId, proxyId, countryChangeConfirmed }`; подтверждение в него не входит.
33
+ Ответ — квитанция `{ message, action_id, state, code?, retry_after_ms? }`.
34
+ Успех только при `state=SUCCEEDED`; `UNKNOWN`/`PENDING` не подтверждают переключение,
35
+ `FAILED`/`EXPIRED` — отказ. Соблюдай `retry_after_ms`; новый ключ автоматически не создавай.
36
+
37
+ Все схемы строгие: лишние поля, логины, пароли, `host`, `port`, строки импорта и camelCase
38
+ вместо входных snake_case отвергаются до HTTP. `edit-proxy` через MCP не реализован.
39
+ Проверки реестра — `telegram-personal-proxies.spec.ts`, снятие подтверждения в обеих схемах
40
+ для удаления и переключения также включено в `scripts/telegram-personal-proxy-mutants.mjs`.
41
+
42
+ Четыре прежних инструмента сохраняют свой договор при добавлении общего запаса.
43
+
44
+ ## Общий запас пространства
45
+
46
+ Запас принадлежит выбранному пространству. Один прокси обслуживает номера одного канала;
47
+ переносится целиком. `workspace_id` необязателен, как у остальных инструментов моста.
48
+ Чтение требует `read:channels`. Изменения и статус импорта требуют `manage:channels`:
49
+ ключ вида MCP, живой создатель и его свежая роль `CHANNEL_MANAGE`; ядро пишет аудит перед
50
+ вызовом фермы. Выдача ссылки подключения проверяет роль на канал и не вызывает ферму.
51
+
52
+ Все имена в таблице начинаются с `besales_platform_telegram_personal_`.
53
+
54
+ | Суффикс | Назначение | Обязательные аргументы |
55
+ | --- | --- | --- |
56
+ | `proxy_stock_list` | Список запаса | — |
57
+ | `proxy_stock_import_link` | Ссылка загрузки в запас | — |
58
+ | `proxy_stock_import_status` | Состояние и счётчики импорта | `session_id` |
59
+ | `proxy_stock_delete` | Удалить из запаса | `proxy_id`, `explicit_confirmation:true` |
60
+ | `proxy_stock_check` | Проверить один прокси запаса | `proxy_id` |
61
+ | `proxy_stock_check_all` | Поставить весь запас на проверку | — |
62
+ | `proxies` | Список прокси канала | `channel_id` |
63
+ | `proxy_take_from_stock` | Забрать в канал целые прокси | `channel_id`, `action_id`, один способ выбора |
64
+ | `proxy_return_to_stock` | Вернуть свободный прокси | `channel_id`, `proxy_id`, `action_id` |
65
+ | `connect_link` | Ссылка подключения в существующий канал | `channel_id` |
66
+
67
+ Читающие инструменты входят также в `readonly` (включая статус импорта); остальные — в
68
+ `platform`. Проверка здоровья меняет состояние и не входит в `readonly`.
69
+
70
+ У списков одинаковые фильтры: `status` (`ACTIVE`, `CHECKING`, `ERROR`, `INACTIVE`),
71
+ `country_code` (две заглавные буквы), `search` (до 200 знаков), `cursor` (UUID),
72
+ `limit` (1–100, сервер по умолчанию 50). В HTTP страна передаётся как `countryCode`.
73
+ `nextCursor` продолжает список; `counts`, `freeProxies`, `countryCounts`, `freeCountryCounts`
74
+ считаются по всему пулу без фильтров. `occupiedSlots` учитывает настоящую занятость,
75
+ `accountsCount` не показывает свободные места. Данные о стране — [IPinfo](https://ipinfo.io).
76
+
77
+ Ссылка импорта возвращает только `session_id`, `setup_page_url`, `expires_at`: логин и пароль
78
+ вводятся человеком после входа на защищённой странице, до 50 строк, 1–3 номера на прокси.
79
+ Статус возвращает только состояние и счётчики, без строк. Ссылки не обрезаются и не пишутся
80
+ в журнал. При потере ответа автоматически новую ссылку не создавай. `202 CHECKING` означает
81
+ ожидание проверки; `queued` у проверки всех — число поставленных в очередь, не рабочих прокси.
82
+
83
+ ## Забрать и вернуть
84
+
85
+ `proxy_take_from_stock` принимает ровно одну форму выбора:
86
+
87
+ - `proxy_ids`: 1–50 разных UUID;
88
+ - `count`: 1–50, необязательная `country_code` ограничивает выбор страной.
89
+
90
+ `count` — число прокси, а не мест. У прокси 1–3 места (`maxAccounts`). Под N номеров сначала
91
+ вычти места явных пар и свободные места канала, затем выбери конкретные свободные ACTIVE
92
+ прокси запаса по местам. При выборе страны учитывай только её. Сумма `maxAccounts` должна
93
+ покрыть недостачу; если не покрывает, перенос не вызывай. Для шести номеров и двух прокси
94
+ по три места передай оба `proxy_ids`, не `count:6`.
95
+
96
+ Оба переноса требуют стабильный `action_id` (UUID), который идёт только заголовком
97
+ `Idempotency-Key`. Взятие передаёт `{proxyIds}` либо `{count,countryCode?}`; возврат — без тела.
98
+ Явного `explicit_confirmation` эти операции не принимают. Забрать — всё или ничего:
99
+ `TELEGRAM_PROXY_STOCK_NOT_ENOUGH` и `TELEGRAM_PROXY_STOCK_REFUSED` не переносят ни одного
100
+ прокси. После устранения причины отказа можно повторить прежний ключ. Успех с тем же ключом
101
+ возвращает прежний результат. `IDEMPOTENCY_REQUEST_MISMATCH` не обходи новым ключом.
102
+ При 503 исход неизвестен: повтори тот же ключ и аргументы, новый автоматически не создавай.
103
+
104
+ Вернуть можно только свободный прокси без номеров, броней и операций.
105
+ `TELEGRAM_PROXY_NOT_EMPTY` требует освободить его или дождаться операции;
106
+ `TELEGRAM_PROXY_ADDRESS_IN_USE` при возврате означает, что адрес уже в запасе: предложи
107
+ удалить этот прокси из канала. Прямого переноса между каналами нет — только через запас.
108
+ Удаление из запаса необратимо и требует отдельного согласия `explicit_confirmation:true`;
109
+ при занятой операции повтори позже. `204` подтверждает удаление, 503 его не подтверждает.
110
+
111
+ ## Подключение с планом
112
+
113
+ `connect_link` требует существующий `channel_id`. Необязательный `proxy_plan` имеет ровно
114
+ одну форму: `{pairs:[{phone,proxy_id}]}` либо `{country_code}`. Без плана страница открывается
115
+ для обычного выбора. Телефоны пар — E.164, 1–50 пар, телефоны разные, один прокси не больше
116
+ трёх раз. Строгая проверка вложенных объектов выполняется до HTTP. В ядро идут `channelId`,
117
+ `proxyPlan.pairs[].proxyId` либо `proxyPlan.countryCode`; исходные идентификаторы сохраняются.
118
+
119
+ План только заполняет страницу. Ссылка ничего не бронирует, не переносит и не подключает.
120
+ Человек входит, проверяет пары и вводит коды Telegram и пароль 2FA на странице, не в чате.
121
+ Ответ содержит только `setup_page_url`, `expires_at` и инструкции, без `setup_ref` и плана.
122
+ Пары берут прокси канала либо запаса пространства. При старте страница проверяет наличие,
123
+ состояние и места; прокси запаса забираются одним атомарным вызовом со списком id.
124
+
125
+ Пара держится за исходный `proxy_id`: адрес служит только для показа, обратного разрешения
126
+ адреса нет. Совпадение адресов не подменяет id. Пропавший id блокирует старт до правки
127
+ человеком; правка адреса снимает id, удаление адреса делает строку автоматической только
128
+ по его решению. Явная пара молча не переназначается. Итог — `…_accounts`.
129
+ Для уже подключённого номера сначала забери нужный прокси из запаса, затем используй
130
+ `…_account_proxy_change` с отдельным подтверждением переподключения.
131
+
132
+ Проверки нового набора находятся в `telegram-proxy-stock.spec.ts`, прежнего — в
133
+ `telegram-personal-proxies.spec.ts`. Скрипт `scripts/telegram-personal-proxy-mutants.mjs`
134
+ проверяет строгий ввод, согласие, стабильные заголовки, наличие маршрута, запрет усечения,
135
+ две формы выбора, форму плана и обязательный канал.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@besales/mcp",
3
- "version": "1.0.0-beta.5",
3
+ "version": "1.0.0-beta.7",
4
4
  "description": "Model Context Protocol server for Besales",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/be-sales/mcp#readme",
@@ -0,0 +1,171 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+
6
+ const suite = 'src/tools/definitions/telegram-personal-proxies.spec.ts';
7
+ const tool = 'src/tools/definitions/telegram-personal-proxies.ts';
8
+ const temporary = mkdtempSync(join(tmpdir(), 'telegram-proxy-mutants-'));
9
+ function run(pattern, name, suitePath = suite) {
10
+ const output = join(temporary, name + '.json');
11
+ const result = spawnSync(process.execPath, [
12
+ 'node_modules/vitest/vitest.mjs', 'run', suitePath,
13
+ '--maxWorkers=1', '--reporter=json', '--outputFile=' + output,
14
+ ...(pattern ? ['--testNamePattern', pattern] : []),
15
+ ], { encoding: 'utf8', timeout: 180000 });
16
+ const report = JSON.parse(readFileSync(output, 'utf8'));
17
+ return { result, report };
18
+ }
19
+ function replaceOnce(text, anchor, replacement) {
20
+ if (text.split(anchor).length !== 2) throw new Error('MUTATION_ANCHOR_NOT_UNIQUE');
21
+ return text.replace(anchor, replacement);
22
+ }
23
+ try {
24
+ const baseline = run(undefined, 'baseline');
25
+ if (baseline.result.status !== 0 || baseline.report.numPassedTests === 0) {
26
+ throw new Error('BASELINE_FAILED\n' + baseline.result.stdout + baseline.result.stderr);
27
+ }
28
+ console.log('BASELINE PASS ' + baseline.report.numPassedTests);
29
+ for (const [suffix, description] of [
30
+ ['proxy_delete', 'Явное согласие человека на удаление прокси.'],
31
+ ['account_proxy_change', 'Явное согласие человека: номер переподключится.'],
32
+ ]) {
33
+ for (const target of ['runtime', 'published']) {
34
+ const file = target === 'runtime' ? tool : 'src/schemas/mcp-tools.json';
35
+ const name = suffix + '-without-confirmation-' + target;
36
+ const pattern = suffix + ': без явного true отказ до HTTP';
37
+ const original = readFileSync(file, 'utf8');
38
+ try {
39
+ let mutated;
40
+ if (target === 'runtime') {
41
+ const anchor = `explicit_confirmation: z.literal(true).describe('${description}')`;
42
+ mutated = replaceOnce(original, anchor,
43
+ `explicit_confirmation: z.literal(true).optional().describe('${description}')`);
44
+ } else {
45
+ const registry = JSON.parse(original);
46
+ const schema = registry.tools.find((entry) =>
47
+ entry.name === 'besales_platform_telegram_personal_' + suffix,
48
+ ).inputSchema;
49
+ if (!schema.required.includes('explicit_confirmation')) throw new Error('MUTATION_ANCHOR_NOT_UNIQUE');
50
+ schema.required = schema.required.filter((field) => field !== 'explicit_confirmation');
51
+ mutated = JSON.stringify(registry, null, 2) + '\n';
52
+ }
53
+ writeFileSync(file, mutated);
54
+ const { result, report } = run(pattern, name);
55
+ // Убит только утверждением именованного теста; ошибка загрузки — INFRA_FAILURE.
56
+ const failures = report.testResults.flatMap((entry) => entry.assertionResults).filter((test) =>
57
+ test.status === 'failed' && test.fullName.includes(pattern) &&
58
+ test.failureMessages.some((message) =>
59
+ message.includes('AssertionError') ||
60
+ /^Error: promise resolved .* instead of rejecting/su.test(message),
61
+ ),
62
+ );
63
+ if (result.status === 0 || result.signal || failures.length === 0) {
64
+ throw new Error('SURVIVED_OR_INFRA_FAILURE:' + name + '\n' + result.stdout + result.stderr);
65
+ }
66
+ console.log('KILLED ' + name + ' ' + JSON.stringify(failures.map((test) => test.fullName)));
67
+ } finally {
68
+ writeFileSync(file, original);
69
+ }
70
+ }
71
+ }
72
+ const stockSuite = 'src/tools/definitions/telegram-proxy-stock.spec.ts';
73
+ const stockFile = 'src/tools/definitions/telegram-proxy-stock.ts';
74
+ const connectFile = 'src/tools/definitions/telegram-personal-connect.ts';
75
+ const apiClientFile = 'src/http/api-client.ts';
76
+ const resultFile = 'src/tools/result.ts';
77
+ const publishedFile = 'src/schemas/mcp-tools.json';
78
+ const stockBaseline = run(undefined, 'stock-baseline', stockSuite);
79
+ if (stockBaseline.result.status !== 0 || stockBaseline.report.numPassedTests === 0) {
80
+ throw new Error('BASELINE_FAILED\n' + stockBaseline.result.stdout + stockBaseline.result.stderr);
81
+ }
82
+ console.log('STOCK BASELINE PASS ' + stockBaseline.report.numPassedTests);
83
+ function publishedMutation(suffix, change) {
84
+ return (original) => {
85
+ const registry = JSON.parse(original);
86
+ const schema = registry.tools.find((entry) => entry.name === 'besales_platform_telegram_personal_' + suffix).inputSchema;
87
+ change(schema);
88
+ return JSON.stringify(registry, null, 2) + '\n';
89
+ };
90
+ }
91
+ function inTool(original, suffix, anchor, replacement) {
92
+ const start = original.indexOf("name: 'besales_platform_telegram_personal_" + suffix + "'");
93
+ if (start < 0) throw new Error('MUTATION_ANCHOR_NOT_UNIQUE');
94
+ const next = original.indexOf(' defineTool({', start);
95
+ const end = next < 0 ? original.length : next;
96
+ return original.slice(0, start) + replaceOnce(original.slice(start, end), anchor, replacement) + original.slice(end);
97
+ }
98
+ const mutations = [
99
+ ['stock-loose-schema', stockFile, 'proxy_stock_import_link: строгая схема отвергает секреты до HTTP',
100
+ (original) => inTool(original, 'proxy_stock_import_link', 'schema: z.object(workspace).strict()', 'schema: z.object(workspace).passthrough()')],
101
+ ['stock-delete-without-confirmation-runtime', stockFile, 'proxy_stock_delete: без явного true отказ до HTTP',
102
+ (original) => replaceOnce(original, "explicit_confirmation: z.literal(true).describe('Явное согласие человека на удаление прокси из запаса.')", "explicit_confirmation: z.literal(true).optional().describe('Явное согласие человека на удаление прокси из запаса.')")],
103
+ ['stock-delete-without-confirmation-published', publishedFile, 'proxy_stock_delete: без явного true отказ до HTTP',
104
+ publishedMutation('proxy_stock_delete', (schema) => { schema.required = schema.required.filter((field) => field !== 'explicit_confirmation'); })],
105
+ ...['proxy_take_from_stock', 'proxy_return_to_stock'].map((suffix) => [
106
+ suffix + '-changed-key', tool, suffix + ': повтор сохраняет настоящий заголовок и тело',
107
+ (original) => inTool(original, suffix, 'idempotencyKey: input.action_id', "idempotencyKey: '00000000-0000-4000-8000-000000000099'"),
108
+ ]),
109
+ ...['proxy_take_from_stock', 'proxy_return_to_stock'].map((suffix) => [
110
+ suffix + '-wrong-key-header', tool, suffix + ': повтор сохраняет настоящий заголовок и тело',
111
+ (original) => inTool(original, suffix, "idempotencyKeyHeader: 'X-Idempotency-Key'", "idempotencyKeyHeader: 'Idempotency-Key'"),
112
+ ]),
113
+ ['stock-details-at-top-level', apiClientFile, 'PROXY_STOCK_NOT_ENOUGH: доступность из details видна в тексте',
114
+ (original) => replaceOnce(original, "...proxyStockErrorDetails(asRecord(source?.['details']), code)", '...proxyStockErrorDetails(source, code)')],
115
+ ['stock-available-dropped', apiClientFile, 'PROXY_STOCK_NOT_ENOUGH: доступность из details видна в тексте',
116
+ (original) => replaceOnce(original, '? { available } : {}', '? {} : {}')],
117
+ ['stock-items-dropped', apiClientFile, 'PROXY_STOCK_REFUSED: причины из details видны по каждому id',
118
+ (original) => replaceOnce(original, 'return { items };', 'return {};')],
119
+ ['stock-unknown-reason-exposed', apiClientFile, 'PROXY_STOCK_REFUSED: причины из details видны по каждому id',
120
+ (original) => replaceOnce(original, "['NOT_FOUND', 'NOT_READY', 'BUSY', 'ADDRESS_IN_USE'].includes(reason)", 'true')],
121
+ ['stock-visible-reasons-dropped', resultFile, 'PROXY_STOCK_REFUSED: причины из details видны по каждому id',
122
+ (original) => replaceOnce(original, 'for (const item of details.items ?? []) parts.push(`${item.proxyId}: ${item.reason}.`);', '')],
123
+ ['stock-requested-dropped', apiClientFile, 'отказы подключения: available, requested и files читаются из details закрытым набором',
124
+ (original) => replaceOnce(original, '? { requested } : {}', '? {} : {}')],
125
+ ['stock-files-dropped', apiClientFile, 'отказы подключения: available, requested и files читаются из details закрытым набором',
126
+ (original) => replaceOnce(original, 'return { files };', 'return {};')],
127
+ ['stock-route-removed', 'src/schemas/mcp-v2-route-map.json', 'содержит ровно десять новых маршрутов',
128
+ (original) => JSON.stringify(JSON.parse(original).filter((entry) => entry.tool !== 'besales_platform_telegram_personal_connect_link'), null, 2) + '\n'],
129
+ ['stock-link-truncatable', stockFile, 'proxy_stock_import_link: ссылка neverTruncate',
130
+ (original) => replaceOnce(original, 'const resultPolicy = { neverTruncate: true, maxResultBytes: 16 * 1024 }', 'const resultPolicy = { neverTruncate: false, maxResultBytes: 16 * 1024 }')],
131
+ ['connect-link-truncatable', connectFile, 'connect_link: ссылка neverTruncate',
132
+ (original) => replaceOnce(original, 'resultPolicy: { neverTruncate: true, maxResultBytes: 16 * 1024 }', 'resultPolicy: { neverTruncate: false, maxResultBytes: 16 * 1024 }')],
133
+ ['plan-two-forms-runtime', connectFile, 'план: строгая форма',
134
+ (original) => replaceOnce(original, "z.object({ country_code: z.string().regex(/^[A-Z]{2}$/u) }).strict()", "z.object({ country_code: z.string().regex(/^[A-Z]{2}$/u) }).passthrough()")],
135
+ ['plan-two-forms-published', publishedFile, 'план: строгая форма',
136
+ publishedMutation('connect_link', (schema) => {
137
+ const plan = schema.properties.proxy_plan;
138
+ plan.anyOf = plan.oneOf;
139
+ delete plan.oneOf;
140
+ for (const form of plan.anyOf) delete form.additionalProperties;
141
+ })],
142
+ ['plan-without-channel-runtime', connectFile, 'план: строгая форма',
143
+ (original) => replaceOnce(original, 'channel_id: uuidSchema,', 'channel_id: uuidSchema.optional(),')],
144
+ ['plan-without-channel-published', publishedFile, 'план: строгая форма',
145
+ publishedMutation('connect_link', (schema) => { schema.required = []; })],
146
+ ['take-without-selection-runtime', tool, 'take: ровно одна форма',
147
+ (original) => replaceOnce(original, ': input.count === undefined)', ': false)')],
148
+ ['take-without-selection-published', publishedFile, 'take: ровно одна форма',
149
+ publishedMutation('proxy_take_from_stock', (schema) => { delete schema.oneOf; })],
150
+ ];
151
+ for (const [name, file, pattern, mutate] of mutations) {
152
+ const original = readFileSync(file, 'utf8');
153
+ try {
154
+ writeFileSync(file, mutate(original));
155
+ const { result, report } = run(pattern, name, stockSuite);
156
+ const failures = report.testResults.flatMap((entry) => entry.assertionResults).filter((test) =>
157
+ test.status === 'failed' && test.fullName.includes(pattern) &&
158
+ test.failureMessages.some((message) => message.includes('AssertionError') || /^Error: promise resolved .* instead of rejecting/su.test(message)),
159
+ );
160
+ if (result.status === 0 || result.signal || failures.length === 0) {
161
+ throw new Error('SURVIVED_OR_INFRA_FAILURE:' + name + '\n' + result.stdout + result.stderr);
162
+ }
163
+ console.log('KILLED ' + name + ' ' + JSON.stringify(failures.map((test) => test.fullName)));
164
+ } finally {
165
+ writeFileSync(file, original);
166
+ }
167
+ }
168
+
169
+ } finally {
170
+ rmSync(temporary, { recursive: true, force: true });
171
+ }