@besales/mcp 0.40.0 → 0.42.0

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 (41) hide show
  1. package/README.md +54 -9
  2. package/dist/auth/oauth-client.d.ts +31 -1
  3. package/dist/auth/oauth-client.js +37 -2
  4. package/dist/auth/oauth-client.js.map +1 -1
  5. package/dist/cli.js +13 -1
  6. package/dist/cli.js.map +1 -1
  7. package/dist/instructions/server-instructions.d.ts +1 -1
  8. package/dist/instructions/server-instructions.js +4 -0
  9. package/dist/instructions/server-instructions.js.map +1 -1
  10. package/dist/schemas/mcp-tools.json +350 -8
  11. package/dist/tools/definitions/agent-design.d.ts +7 -7
  12. package/dist/tools/definitions/broadcast-analytics.d.ts +3 -3
  13. package/dist/tools/definitions/broadcast-analytics.js +1 -0
  14. package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
  15. package/dist/tools/definitions/broadcast-mailing-variants.d.ts +2 -0
  16. package/dist/tools/definitions/broadcast-mailing-variants.js +5 -0
  17. package/dist/tools/definitions/broadcast-mailing-variants.js.map +1 -1
  18. package/dist/tools/definitions/follow-up-funnel-test.d.ts +19 -0
  19. package/dist/tools/definitions/follow-up-funnel-test.js +141 -0
  20. package/dist/tools/definitions/follow-up-funnel-test.js.map +1 -0
  21. package/dist/tools/definitions/follow-up.d.ts +2 -2
  22. package/dist/tools/definitions/getcourse-cold-welcome.d.ts +18 -0
  23. package/dist/tools/definitions/getcourse-cold-welcome.js +77 -4
  24. package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
  25. package/dist/tools/definitions/knowledge.d.ts +2 -2
  26. package/dist/tools/definitions/link-tracking.d.ts +5 -0
  27. package/dist/tools/definitions/link-tracking.js +78 -0
  28. package/dist/tools/definitions/link-tracking.js.map +1 -1
  29. package/dist/tools/definitions/platform-setup.d.ts +5 -5
  30. package/dist/tools/definitions/shared.d.ts +10 -10
  31. package/dist/tools/definitions.d.ts +50 -18
  32. package/dist/tools/definitions.js +2 -0
  33. package/dist/tools/definitions.js.map +1 -1
  34. package/dist/tools/registry-mapping-cases-core.js +23 -0
  35. package/dist/tools/registry-mapping-cases-core.js.map +1 -1
  36. package/dist/tools/result.js +6 -1
  37. package/dist/tools/result.js.map +1 -1
  38. package/dist/types/api-contract.gen.d.ts +24684 -0
  39. package/dist/types/api-contract.gen.js +6 -0
  40. package/dist/types/api-contract.gen.js.map +1 -0
  41. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "title": "besales-mcp Tool Definitions",
4
- "version": "1.2.0-draft",
5
- "lastUpdated": "2026-08-17",
4
+ "version": "1.3.0-draft",
5
+ "lastUpdated": "2026-08-18",
6
6
  "description": "MCP tool schemas для besales-mcp npm package. Active v1.5 set содержит PromptHub/ICP/Sandbox/Knowledge external-execution operations и stateless Platform Setup Bridge direct tools. 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.",
@@ -8850,6 +8850,114 @@
8850
8850
  }
8851
8851
  }
8852
8852
  },
8853
+ {
8854
+ "name": "besales_followup_funnel_test_plan",
8855
+ "description": "Построить и ЗАМОРОЗИТЬ план «Теста воронки» для контакта, ничего не отправляя. Вызов платный: динамические шаги генерируются LLM. Возвращает compact-план и runId; показывай человеку все тексты, транспорты, блокировки, исключённые цепочки и truncated ДО запуска. Scope: mcp:funnel-test.",
8856
+ "inputSchema": {
8857
+ "type": "object",
8858
+ "required": [
8859
+ "chat_user_id"
8860
+ ],
8861
+ "additionalProperties": false,
8862
+ "properties": {
8863
+ "workspace_id": {
8864
+ "type": "string",
8865
+ "format": "uuid",
8866
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
8867
+ },
8868
+ "chat_user_id": {
8869
+ "type": "string",
8870
+ "format": "uuid",
8871
+ "description": "Контакт, который получит сообщения только после отдельного start."
8872
+ },
8873
+ "funnel_id": {
8874
+ "type": "string",
8875
+ "format": "uuid",
8876
+ "description": "Персональная воронка; без неё планируются все цепочки платформы."
8877
+ }
8878
+ }
8879
+ }
8880
+ },
8881
+ {
8882
+ "name": "besales_followup_funnel_test_start",
8883
+ "description": "Запустить ТОЛЬКО замороженный runId из besales_followup_funnel_test_plan. ОТПРАВЛЯЕТ НАСТОЯЩИЕ сообщения живому человеку с паузой 15 секунд; отправку нельзя отозвать. Требует explicit_confirmation=true и непустой confirmation_reason после показа compact-плана. Scope: mcp:funnel-test.",
8884
+ "inputSchema": {
8885
+ "type": "object",
8886
+ "required": [
8887
+ "run_id",
8888
+ "explicit_confirmation",
8889
+ "confirmation_reason"
8890
+ ],
8891
+ "additionalProperties": false,
8892
+ "properties": {
8893
+ "workspace_id": {
8894
+ "type": "string",
8895
+ "format": "uuid",
8896
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
8897
+ },
8898
+ "run_id": {
8899
+ "type": "string",
8900
+ "format": "uuid",
8901
+ "description": "runId, возвращённый plan tool; тексты не пересобираются."
8902
+ },
8903
+ "explicit_confirmation": {
8904
+ "type": "boolean",
8905
+ "const": true,
8906
+ "description": "Явное подтверждение отправки реальных сообщений живому человеку."
8907
+ },
8908
+ "confirmation_reason": {
8909
+ "type": "string",
8910
+ "minLength": 1,
8911
+ "maxLength": 500,
8912
+ "description": "Почему оператор подтвердил запуск после просмотра замороженного плана; MCP safety gate, в backend не отправляется."
8913
+ }
8914
+ }
8915
+ }
8916
+ },
8917
+ {
8918
+ "name": "besales_followup_funnel_test_status",
8919
+ "description": "Получить состояние замороженного теста воронки: PENDING/RUNNING/COMPLETED/CANCELLED/FAILED, число заклеймленных пунктов, исходы sent/unverified/failed/skipped и stalled. Claim берётся ДО транспорта, поэтому dispatchedCount не равен доказанной доставке. Scope: mcp:funnel-test.",
8920
+ "inputSchema": {
8921
+ "type": "object",
8922
+ "required": [
8923
+ "run_id"
8924
+ ],
8925
+ "additionalProperties": false,
8926
+ "properties": {
8927
+ "workspace_id": {
8928
+ "type": "string",
8929
+ "format": "uuid",
8930
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
8931
+ },
8932
+ "run_id": {
8933
+ "type": "string",
8934
+ "format": "uuid"
8935
+ }
8936
+ }
8937
+ }
8938
+ },
8939
+ {
8940
+ "name": "besales_followup_funnel_test_cancel",
8941
+ "description": "Остановить тест воронки со СЛЕДУЮЩЕГО касания. Уже заклеймленный пункт может дойти до транспорта, поэтому после cancel проверь status; отмена PENDING-плана безопасна и ничего не отправляет. Scope: mcp:funnel-test.",
8942
+ "inputSchema": {
8943
+ "type": "object",
8944
+ "required": [
8945
+ "run_id"
8946
+ ],
8947
+ "additionalProperties": false,
8948
+ "properties": {
8949
+ "workspace_id": {
8950
+ "type": "string",
8951
+ "format": "uuid",
8952
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
8953
+ },
8954
+ "run_id": {
8955
+ "type": "string",
8956
+ "format": "uuid"
8957
+ }
8958
+ }
8959
+ }
8960
+ },
8853
8961
  {
8854
8962
  "name": "besales_scheduled_task_list",
8855
8963
  "description": "Read-only список плановых задач канала (модуль «Задачи»). Единственный тип — DIALOGUE_ANALYSIS (суфлёр: саммари дня + почасовой «Статус коммуникации»). Scope: mcp:platform-setup.",
@@ -9220,6 +9328,25 @@
9220
9328
  ],
9221
9329
  "format": "uuid",
9222
9330
  "description": "Платформа запуска по умолчанию; подставляется, если на запуске не передана."
9331
+ },
9332
+ "cold_welcome_channels": {
9333
+ "type": "array",
9334
+ "items": {
9335
+ "type": "string",
9336
+ "enum": [
9337
+ "Site",
9338
+ "Email",
9339
+ "SMS",
9340
+ "Telegram",
9341
+ "Facebook",
9342
+ "VK",
9343
+ "Chatium",
9344
+ "WhatsApp",
9345
+ "Viber",
9346
+ "MAX"
9347
+ ]
9348
+ },
9349
+ "description": "Каналы «Первого сообщения»: ОГРАНИЧЕНИЕ поверх канона выбора транспорта — канон считается целиком, затем его результат фильтруется этим списком. Пусто = не ограничивать. НЕ путать с волновым default_channels."
9223
9350
  }
9224
9351
  }
9225
9352
  }
@@ -9357,6 +9484,25 @@
9357
9484
  ],
9358
9485
  "format": "uuid",
9359
9486
  "description": "Платформа запуска по умолчанию; подставляется, если на запуске не передана."
9487
+ },
9488
+ "cold_welcome_channels": {
9489
+ "type": "array",
9490
+ "items": {
9491
+ "type": "string",
9492
+ "enum": [
9493
+ "Site",
9494
+ "Email",
9495
+ "SMS",
9496
+ "Telegram",
9497
+ "Facebook",
9498
+ "VK",
9499
+ "Chatium",
9500
+ "WhatsApp",
9501
+ "Viber",
9502
+ "MAX"
9503
+ ]
9504
+ },
9505
+ "description": "Каналы «Первого сообщения»: ОГРАНИЧЕНИЕ поверх канона выбора транспорта — канон считается целиком, затем его результат фильтруется этим списком. Пусто = не ограничивать. НЕ путать с волновым default_channels."
9360
9506
  }
9361
9507
  },
9362
9508
  "if": {
@@ -9452,6 +9598,30 @@
9452
9598
  }
9453
9599
  }
9454
9600
  }
9601
+ },
9602
+ "channels": {
9603
+ "type": "array",
9604
+ "items": {
9605
+ "type": "string",
9606
+ "enum": [
9607
+ "Site",
9608
+ "Email",
9609
+ "SMS",
9610
+ "Telegram",
9611
+ "Facebook",
9612
+ "VK",
9613
+ "Chatium",
9614
+ "WhatsApp",
9615
+ "Viber",
9616
+ "MAX"
9617
+ ]
9618
+ },
9619
+ "description": "Каналы «Первого сообщения» на этом запуске: ОГРАНИЧЕНИЕ поверх канона. Ключ не передан — берётся дефолт рассылки; ПУСТОЙ массив — «на этом запуске без ограничения»; список — он. null отвергается."
9620
+ },
9621
+ "mailing_variant_id": {
9622
+ "type": "string",
9623
+ "format": "uuid",
9624
+ "description": "Рассылка — источник каналов по умолчанию и «Платформы по умолчанию»."
9455
9625
  }
9456
9626
  }
9457
9627
  }
@@ -9548,6 +9718,25 @@
9548
9718
  ]
9549
9719
  },
9550
9720
  "description": "Поля сделки, проставляемые ПОСЛЕ успешной отправки (ключ — числовой fieldId). Ключ не передан — берутся дефолты рассылки; передан ПУСТОЙ объект — явное «на этом запуске без полей»."
9721
+ },
9722
+ "channels": {
9723
+ "type": "array",
9724
+ "items": {
9725
+ "type": "string",
9726
+ "enum": [
9727
+ "Site",
9728
+ "Email",
9729
+ "SMS",
9730
+ "Telegram",
9731
+ "Facebook",
9732
+ "VK",
9733
+ "Chatium",
9734
+ "WhatsApp",
9735
+ "Viber",
9736
+ "MAX"
9737
+ ]
9738
+ },
9739
+ "description": "Каналы «Первого сообщения» на этом запуске: ОГРАНИЧЕНИЕ поверх канона. Ключ не передан — берётся дефолт рассылки; ПУСТОЙ массив — «на этом запуске без ограничения»; список — он. null отвергается."
9551
9740
  }
9552
9741
  }
9553
9742
  }
@@ -9641,6 +9830,25 @@
9641
9830
  "type": "boolean",
9642
9831
  "const": true,
9643
9832
  "description": "Подтверждение пользователя. Обязательно: отправку нельзя отозвать."
9833
+ },
9834
+ "channels": {
9835
+ "type": "array",
9836
+ "items": {
9837
+ "type": "string",
9838
+ "enum": [
9839
+ "Site",
9840
+ "Email",
9841
+ "SMS",
9842
+ "Telegram",
9843
+ "Facebook",
9844
+ "VK",
9845
+ "Chatium",
9846
+ "WhatsApp",
9847
+ "Viber",
9848
+ "MAX"
9849
+ ]
9850
+ },
9851
+ "description": "Каналы «Первого сообщения» на ВЕСЬ пакет: ограничение поверх канона. Ключ не передан — дефолт рассылки; ПУСТОЙ массив — без ограничения; список — он. Фиксируется снимком на старте пакета: правка рассылки между сегментами его не меняет."
9644
9852
  }
9645
9853
  }
9646
9854
  }
@@ -9739,6 +9947,86 @@
9739
9947
  }
9740
9948
  }
9741
9949
  },
9950
+ {
9951
+ "name": "besales_getcourse_contacts_import",
9952
+ "description": "Импорт контактов GetCourse СПИСКОМ (без файла): заводит или обновляет их в базе платформы, чтобы по ним можно было запускать «Нашу отправку». НИЧЕГО НЕ ОТПРАВЛЯЕТ. Нужен ровно тогда, когда preview показал notInBase > 0: отправке нужен ChatUser, иначе контакт получает исход SKIPPED_NOT_IN_BASE. Матчинг существующих — по contact_id. Идёт фоном, вернётся jobId. Гейт «один активный импорт на воркспейс» общий с волнами и пакетами: 409 = идёт другой импорт, а не сбой. Максимум 5000 контактов. Scope: launch:campaigns.",
9953
+ "inputSchema": {
9954
+ "type": "object",
9955
+ "required": [
9956
+ "platform_id",
9957
+ "contacts"
9958
+ ],
9959
+ "additionalProperties": false,
9960
+ "properties": {
9961
+ "workspace_id": {
9962
+ "type": "string",
9963
+ "format": "uuid",
9964
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
9965
+ },
9966
+ "platform_id": {
9967
+ "type": "string",
9968
+ "format": "uuid",
9969
+ "description": "UUID платформы GetCourse."
9970
+ },
9971
+ "contacts": {
9972
+ "type": "array",
9973
+ "minItems": 1,
9974
+ "maxItems": 5000,
9975
+ "description": "Строки импорта. Ключи — имена колонок экспорта GetCourse (snake_case), их читает тот же разбор, что и файл.",
9976
+ "items": {
9977
+ "type": "object",
9978
+ "required": [
9979
+ "contact_id"
9980
+ ],
9981
+ "additionalProperties": false,
9982
+ "properties": {
9983
+ "contact_id": {
9984
+ "type": "string",
9985
+ "pattern": "^\\d+$",
9986
+ "description": "getcourse_user_id."
9987
+ },
9988
+ "deal_id": {
9989
+ "type": "string",
9990
+ "pattern": "^\\d+$",
9991
+ "description": "Пин сделки."
9992
+ },
9993
+ "dialog_id": {
9994
+ "type": "string",
9995
+ "pattern": "^\\d+$",
9996
+ "description": "resp_id, нужен board-режиму."
9997
+ },
9998
+ "transport": {
9999
+ "type": "string",
10000
+ "maxLength": 50
10001
+ },
10002
+ "email": {
10003
+ "type": "string",
10004
+ "format": "email",
10005
+ "maxLength": 320
10006
+ },
10007
+ "phone": {
10008
+ "type": "string",
10009
+ "maxLength": 64
10010
+ },
10011
+ "first_name": {
10012
+ "type": "string",
10013
+ "maxLength": 200,
10014
+ "description": "Влияет на текст: обращение подставляется системным {greeting}, и у контакта без имени обращения не будет вовсе."
10015
+ },
10016
+ "last_name": {
10017
+ "type": "string",
10018
+ "maxLength": 200
10019
+ }
10020
+ }
10021
+ }
10022
+ },
10023
+ "check_messenger_presence": {
10024
+ "type": "boolean",
10025
+ "description": "default true — отсеивает контакты без Telegram/MAX/VK. API-вызов на КАЖДЫЙ контакт, поэтому на тысячах строк заметно дольше."
10026
+ }
10027
+ }
10028
+ }
10029
+ },
9742
10030
  {
9743
10031
  "name": "besales_broadcast_launches_list",
9744
10032
  "description": "История запусков рассылок одним списком: наша отправка (cold_welcome, со снимком текста и разбивкой исходов) и волны по файлу (wave).",
@@ -10097,7 +10385,7 @@
10097
10385
  },
10098
10386
  {
10099
10387
  "name": "besales_tracked_link_create",
10100
- "description": "Завести трекинговую ссылку: имя, слаг и целевой http(s)-адрес. В ответе приходит placeholder {{link:slug}} — вставляй его в тексты вместо сырого URL, иначе переход не попадёт в аналитику. Слаг НЕИЗМЕНЯЕМ (он уходит в отправленные сообщения) и уникален в workspace; 409 значит, что слаг занят живой ИЛИ архивной ссылкой — архивную восстанавливают besales_tracked_link_update(restore=true), а не заводят новую. Scope: mcp:platform-setup. ⚠️ В тексты вставляется поле placeholder из ответа ДОСЛОВНО, а не собранный вручную токен: неточный слаг вырежется и клиент получит фразу без ссылки.",
10388
+ "description": "Завести трекинговую ссылку: имя, слаг и целевой http(s)-адрес. В ответе приходит placeholder {{link:slug}} — вставляй его в тексты вместо сырого URL, иначе переход не попадёт в аналитику. Слаг НЕИЗМЕНЯЕМ (он уходит в отправленные сообщения) и уникален в workspace; 409 значит, что слаг занят живой ИЛИ архивной ссылкой — архивную восстанавливают besales_tracked_link_update(restore=true), а не заводят новую. Scope: mcp:platform-setup. ⚠️ В тексты вставляется поле placeholder из ответа ДОСЛОВНО, а не собранный вручную токен: неточный слаг вырежется и клиент получит фразу без ссылки. ⭐ Целевой адрес может быть ШАБЛОНОМ с переменными контакта в значениях query-параметров (?email={email}&param1={getcourseUserId}) — подставляются они при ОТПРАВКЕ через placeholder, поэтому персональные данные в текст сообщения не попадают, человек видит только короткий код. В анонимном staticUrl переменные вычищаются: за ним нет конкретного человека.",
10101
10389
  "inputSchema": {
10102
10390
  "type": "object",
10103
10391
  "required": [
@@ -10126,7 +10414,7 @@
10126
10414
  "target_url": {
10127
10415
  "type": "string",
10128
10416
  "maxLength": 2048,
10129
- "description": "Абсолютный http(s)-адрес, куда ведёт ссылка. Только http/https.",
10417
+ "description": "Абсолютный http(s)-адрес, куда ведёт ссылка. Только http/https. В ЗНАЧЕНИЯ query-параметров можно подставлять переменные контакта: {firstName}, {lastName}, {fullName}, {username}, {email}, {phone}, {getcourseUserId}, {getcourseDealId} — например ?email={email}&param1={getcourseUserId}&autologin=1. Переменная обязана составлять ЦЕЛОЕ значение параметра; в хосте, пути, фрагменте, имени параметра или вперемешку с текстом она отвергается 400-й. Пустое у контакта значение убирает параметр из адреса целиком.",
10130
10418
  "pattern": "^https?://"
10131
10419
  },
10132
10420
  "product_code": {
@@ -10139,7 +10427,7 @@
10139
10427
  },
10140
10428
  {
10141
10429
  "name": "besales_tracked_link_update",
10142
- "description": "Изменить название, целевой адрес или код продукта ссылки либо снять её из архива (restore=true). Требуется хотя бы одно изменяемое поле. ⚠️ Правка target_url действует ТОЛЬКО ВПЕРЁД: персональные коды, уже ушедшие людям, остаются на СТАРОМ адресе (каждая выдача хранит снимок адреса на момент отправки, резолвер читает его), новые выдачи получат новый адрес, анонимный staticUrl переключится сразу. Перенаправить тех, кому ссылка уже отправлена, правкой НЕЛЬЗЯ — нужна новая ссылка в новом тексте. Поля ответа сюда не копируются: slug неизменяем, archivedAt не поле записи (архивация — besales_tracked_link_archive), счётчики и placeholder только читаются. Scope: mcp:platform-setup.",
10430
+ "description": "Изменить название, целевой адрес или код продукта ссылки либо снять её из архива (restore=true). Требуется хотя бы одно изменяемое поле. ⚠️ Правка target_url действует ТОЛЬКО ВПЕРЁД: персональные коды, уже ушедшие людям, остаются на СТАРОМ адресе (каждая выдача хранит снимок адреса на момент отправки, резолвер читает его), новые выдачи получат новый адрес, анонимный staticUrl переключится сразу. Перенаправить тех, кому ссылка уже отправлена, правкой НЕЛЬЗЯ — нужна новая ссылка в новом тексте. Поля ответа сюда не копируются: slug неизменяем, archivedAt не поле записи (архивация — besales_tracked_link_archive), счётчики и placeholder только читаются. Scope: mcp:platform-setup. ⭐ Целевой адрес поддерживает те же переменные контакта в значениях query-параметров, что и создание. Правка адреса действует только ВПЕРЁД: уже отправленные персональные коды остаются на прежней цели, staticUrl переключается сразу.",
10143
10431
  "inputSchema": {
10144
10432
  "type": "object",
10145
10433
  "required": [
@@ -10165,7 +10453,7 @@
10165
10453
  "target_url": {
10166
10454
  "type": "string",
10167
10455
  "maxLength": 2048,
10168
- "description": "Новый абсолютный http(s)-адрес. Действует только вперёд: уже отправленные персональные коды остаются на прежней цели (там снимок адреса).",
10456
+ "description": "Абсолютный http(s)-адрес, куда ведёт ссылка. Только http/https. В ЗНАЧЕНИЯ query-параметров можно подставлять переменные контакта: {firstName}, {lastName}, {fullName}, {username}, {email}, {phone}, {getcourseUserId}, {getcourseDealId} — например ?email={email}&param1={getcourseUserId}&autologin=1. Переменная обязана составлять ЦЕЛОЕ значение параметра; в хосте, пути, фрагменте, имени параметра или вперемешку с текстом она отвергается 400-й. Пустое у контакта значение убирает параметр из адреса целиком.",
10169
10457
  "pattern": "^https?://"
10170
10458
  },
10171
10459
  "product_code": {
@@ -10275,6 +10563,48 @@
10275
10563
  }
10276
10564
  }
10277
10565
  }
10566
+ },
10567
+ {
10568
+ "name": "besales_link_domain_get",
10569
+ "description": "Домен коротких ссылок воркспейса и зоны, доступные для назначения. domain=null означает, что используется общий домен платформы (он же defaultBaseUrl). ПУСТОЙ список zones означает, что выбор домена на платформе не настроен — назначить нельзя, и это не ошибка запроса: зона появляется только после того, как для неё подняты wildcard-запись DNS и wildcard-сертификат. Scope: mcp:platform-setup. ⚠️ Смена домена влияет только на НОВЫЕ ссылки: короткий адрес собирается в момент отправки и вшит в уже разосланные сообщения навсегда.",
10570
+ "inputSchema": {
10571
+ "type": "object",
10572
+ "required": [],
10573
+ "additionalProperties": false,
10574
+ "properties": {
10575
+ "workspace_id": {
10576
+ "type": "string",
10577
+ "format": "uuid",
10578
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
10579
+ }
10580
+ }
10581
+ }
10582
+ },
10583
+ {
10584
+ "name": "besales_link_domain_set",
10585
+ "description": "Назначить воркспейсу домен коротких ссылок (<имя>.<зона>) или вернуть его на общий домен платформы (domain=null). Зону бери из besales_link_domain_get — свой список зон не выдумывай, он зависит от поднятой инфраструктуры. Scope: mcp:platform-setup. ⚠️ Выбранное имя закрепляется за воркспейсом НАВСЕГДА: сброс возвращает на общий домен, но имя не освобождает — отдать его другому клиенту нельзя, иначе письма прежнего владельца открывались бы на чужом бренде. Вернуться на собственное прежнее имя можно. ⚠️ Уже отправленные ссылки продолжают работать на прежнем адресе; вставленные вручную staticUrl не переписываются — перевставь их из besales_tracked_link_list. 400 — домен не прошёл правила (зона, формат имени, xn--, занятое служебное имя), 409 — хост занят другим воркспейсом.",
10586
+ "inputSchema": {
10587
+ "type": "object",
10588
+ "required": [
10589
+ "domain"
10590
+ ],
10591
+ "additionalProperties": false,
10592
+ "properties": {
10593
+ "workspace_id": {
10594
+ "type": "string",
10595
+ "format": "uuid",
10596
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
10597
+ },
10598
+ "domain": {
10599
+ "type": [
10600
+ "string",
10601
+ "null"
10602
+ ],
10603
+ "maxLength": 253,
10604
+ "description": "Хост без схемы и пути, ровно один уровень под разрешённой зоной (ksamata.besales.pro). Имя: 3–24 символа латиницей, цифры и дефис внутри, не начинается с xn--. null возвращает воркспейс на общий домен платформы."
10605
+ }
10606
+ }
10607
+ }
10278
10608
  }
10279
10609
  ],
10280
10610
  "resources": [
@@ -10466,7 +10796,7 @@
10466
10796
  }
10467
10797
  ],
10468
10798
  "summary": {
10469
- "total_tools": 193,
10799
+ "total_tools": 200,
10470
10800
  "tools_by_category": {
10471
10801
  "getcourse_wave": 10,
10472
10802
  "files_upload": 3,
@@ -10505,9 +10835,11 @@
10505
10835
  "broadcast_analytics": 2,
10506
10836
  "scheduled_tasks": 2,
10507
10837
  "follow_up_read": 3,
10838
+ "follow_up_funnel_test": 4,
10508
10839
  "dialogue_audit": 6,
10509
10840
  "link_tracking": 6,
10510
- "dialogue_audit_external": 2
10841
+ "dialogue_audit_external": 2,
10842
+ "link_tracking_domain": 2
10511
10843
  },
10512
10844
  "external_execution_pairs": [
10513
10845
  "besales_icp_analysis_get_instructions / submit",
@@ -10700,6 +11032,12 @@
10700
11032
  "newly_added_in_followup_reactions": [
10701
11033
  "besales_followup_reactions"
10702
11034
  ],
11035
+ "newly_added_in_followup_funnel_test": [
11036
+ "besales_followup_funnel_test_plan",
11037
+ "besales_followup_funnel_test_start",
11038
+ "besales_followup_funnel_test_status",
11039
+ "besales_followup_funnel_test_cancel"
11040
+ ],
10703
11041
  "newly_added_in_link_tracking": [
10704
11042
  "besales_tracked_link_list",
10705
11043
  "besales_tracked_link_create",
@@ -10707,6 +11045,10 @@
10707
11045
  "besales_tracked_link_archive",
10708
11046
  "besales_tracked_link_breakdown",
10709
11047
  "besales_tracked_link_clicks"
11048
+ ],
11049
+ "newly_added_in_link_tracking_domain": [
11050
+ "besales_link_domain_get",
11051
+ "besales_link_domain_set"
10710
11052
  ]
10711
11053
  }
10712
11054
  }
@@ -5,17 +5,17 @@ export declare const agentDesignTools: (import("./shared.js").ToolDefinition<{
5
5
  description?: string | undefined;
6
6
  }> | import("./shared.js").ToolDefinition<{
7
7
  icp_id: string;
8
- mode: "text" | "audio";
8
+ mode: "audio" | "text";
9
9
  outcome_filter: ("won" | "lost" | "in_progress")[];
10
10
  days_ago: number;
11
11
  anonymize: boolean;
12
12
  crm_connection_id?: string | undefined;
13
13
  gdpr_confirmed?: boolean | undefined;
14
- audio_source_type?: "amocrm_leads" | "xlsx_upload" | "onlinepbx_direct" | "bitrix_openlines" | undefined;
14
+ audio_source_type?: "xlsx_upload" | "amocrm_leads" | "onlinepbx_direct" | "bitrix_openlines" | undefined;
15
15
  audio_source_config?: {
16
16
  [x: string]: unknown;
17
17
  } | undefined;
18
- language?: "ru-RU" | "uz-UZ" | "kk-KZ" | "auto" | undefined;
18
+ language?: "auto" | "ru-RU" | "uz-UZ" | "kk-KZ" | undefined;
19
19
  }> | import("./shared.js").ToolDefinition<{
20
20
  run_id: string;
21
21
  }> | import("./shared.js").ToolDefinition<{
@@ -91,12 +91,12 @@ export declare const agentDesignTools: (import("./shared.js").ToolDefinition<{
91
91
  }> | import("./shared.js").ToolDefinition<{
92
92
  agent_id: string;
93
93
  version_id: string;
94
- modes: ("grammar" | "structure" | "industry" | "contradictions" | "completeness")[];
94
+ modes: ("grammar" | "industry" | "structure" | "completeness" | "contradictions")[];
95
95
  }> | import("./shared.js").ToolDefinition<{
96
96
  agent_id: string;
97
97
  operation_id: string;
98
98
  stages: {
99
- name: "grammar" | "structure" | "industry" | "aggregation";
99
+ name: "grammar" | "industry" | "structure" | "aggregation";
100
100
  output: {
101
101
  [x: string]: unknown;
102
102
  };
@@ -131,7 +131,7 @@ export declare const agentDesignTools: (import("./shared.js").ToolDefinition<{
131
131
  run_id: string;
132
132
  operation_id: string;
133
133
  findings: {
134
- category: "hallucination" | "wrong_action" | "wrong_routing" | "missed_trigger" | "wrong_pipeline_transition" | "rag_miss" | "bad_tone" | "other";
134
+ category: "other" | "hallucination" | "wrong_action" | "bad_tone" | "wrong_routing" | "missed_trigger" | "wrong_pipeline_transition" | "rag_miss";
135
135
  severity: "low" | "medium" | "critical";
136
136
  message: string;
137
137
  scenario_id?: string | undefined;
@@ -145,7 +145,7 @@ export declare const agentDesignTools: (import("./shared.js").ToolDefinition<{
145
145
  agent_id: string;
146
146
  operation_id: string;
147
147
  findings: {
148
- category: "hallucination" | "wrong_action" | "bad_tone" | "other" | "missed_context" | "contradiction" | "off_topic";
148
+ category: "other" | "hallucination" | "wrong_action" | "bad_tone" | "missed_context" | "contradiction" | "off_topic";
149
149
  severity: "low" | "medium" | "critical";
150
150
  message: string;
151
151
  dialogue_id?: string | undefined;
@@ -3,7 +3,7 @@ export declare const broadcastAnalyticsTools: (import("./shared.js").ToolDefinit
3
3
  mode: "all" | "days" | "range";
4
4
  view: "cohort" | "period";
5
5
  date?: string | undefined;
6
- channel?: "Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX" | "UNKNOWN" | undefined;
6
+ channel?: "UNKNOWN" | "Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX" | undefined;
7
7
  import_job_id?: string | undefined;
8
8
  page?: number | undefined;
9
9
  page_size?: number | undefined;
@@ -28,7 +28,7 @@ export declare const broadcastAnalyticsTools: (import("./shared.js").ToolDefinit
28
28
  product?: string | string[] | undefined;
29
29
  product_mode?: "none" | undefined;
30
30
  freshness?: "0-7" | "8-14" | "15-30" | "31+" | ("0-7" | "8-14" | "15-30" | "31+")[] | undefined;
31
- channels?: "Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX" | "UNKNOWN" | ("Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX" | "UNKNOWN")[] | undefined;
31
+ channels?: "UNKNOWN" | "Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX" | ("UNKNOWN" | "Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX")[] | undefined;
32
32
  }> | import("./shared.js").ToolDefinition<{
33
33
  mode: "all" | "days" | "range";
34
34
  view: "cohort" | "period";
@@ -45,7 +45,7 @@ export declare const broadcastAnalyticsTools: (import("./shared.js").ToolDefinit
45
45
  product?: string | string[] | undefined;
46
46
  product_mode?: "none" | undefined;
47
47
  freshness?: "0-7" | "8-14" | "15-30" | "31+" | ("0-7" | "8-14" | "15-30" | "31+")[] | undefined;
48
- channels?: "Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX" | "UNKNOWN" | ("Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX" | "UNKNOWN")[] | undefined;
48
+ channels?: "UNKNOWN" | "Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX" | ("UNKNOWN" | "Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX")[] | undefined;
49
49
  }>)[];
50
50
  export declare const broadcastLaunchTools: import("./shared.js").ToolDefinition<{
51
51
  workspace_id?: string | undefined;
@@ -488,6 +488,7 @@ export const broadcastLaunchTools = [
488
488
  enhanceResponse: (response) => withInstructions(response, [
489
489
  'История запусков ОБОИХ механизмов: kind=cold_welcome — наша отправка (messageSnapshot = что реально ушло), kind=wave — волна по файлу (текст доставляет процесс школы).',
490
490
  'status=failed у cold_welcome означает и обрыв процесса: прогон не финализировал себя. outcomes — разбивка «почему не ушло».',
491
+ 'В outcomes чинится оператором: SKIPPED_NO_ANCHOR (нет даты эфира), SKIPPED_TEXT_TOO_LONG (текст длиннее лимита после подстановки), SKIPPED_UNRESOLVED_VARS (переменные текста без значения), SKIPPED_BOT_SILENCED (бот выключен у контакта), SKIPPED_NOT_IN_BASE (контакта нет в базе — сначала импорт файла). Отметка приветствия у них не сгорала — после починки повторный запуск их доберёт.',
491
492
  ]),
492
493
  }),
493
494
  ];