@besales/mcp 0.46.0 → 0.47.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 (182) hide show
  1. package/README.md +96 -55
  2. package/dist/auth/connection-store.d.ts +21 -1
  3. package/dist/auth/connection-store.js +46 -2
  4. package/dist/auth/connection-store.js.map +1 -1
  5. package/dist/auth/oauth-client.d.ts +5 -1
  6. package/dist/auth/oauth-client.js +22 -12
  7. package/dist/auth/oauth-client.js.map +1 -1
  8. package/dist/cli.js +14 -5
  9. package/dist/cli.js.map +1 -1
  10. package/dist/http/api-client.d.ts +16 -1
  11. package/dist/http/api-client.js +50 -2
  12. package/dist/http/api-client.js.map +1 -1
  13. package/dist/instructions/server-instructions.d.ts +4 -13
  14. package/dist/instructions/server-instructions.js +68 -274
  15. package/dist/instructions/server-instructions.js.map +1 -1
  16. package/dist/prompts/registry.d.ts +15 -0
  17. package/dist/prompts/registry.js +83 -0
  18. package/dist/prompts/registry.js.map +1 -0
  19. package/dist/resources/concepts/feedback-sheets.md +7 -4
  20. package/dist/resources/concepts/handoff.md +4 -1
  21. package/dist/resources/concepts/sandbox.md +14 -5
  22. package/dist/resources/concepts/triggers.md +6 -2
  23. package/dist/resources/concepts/workbook-classification.md +26 -21
  24. package/dist/resources/docs/campaigns.md +20 -0
  25. package/dist/resources/docs/follow-up.md +19 -0
  26. package/dist/resources/docs/platforms.md +2 -2
  27. package/dist/resources/docs/routing.md +18 -0
  28. package/dist/resources/docs/task-state.md +30 -0
  29. package/dist/resources/docs/trigger-actions.md +28 -0
  30. package/dist/resources/docs/variables.md +18 -0
  31. package/dist/resources/registry.js +51 -2
  32. package/dist/resources/registry.js.map +1 -1
  33. package/dist/resources/workflows/extract-from-document.md +8 -1
  34. package/dist/resources/workflows/iterate-with-sandbox.md +5 -2
  35. package/dist/resources/workflows/platform-setup-from-scratch.md +90 -2
  36. package/dist/resources/workflows/production-readiness-check.md +22 -18
  37. package/dist/schemas/mcp-tools.json +1058 -99
  38. package/dist/server.d.ts +2 -0
  39. package/dist/server.js +8 -2
  40. package/dist/server.js.map +1 -1
  41. package/dist/tasks/task-state-store.d.ts +68 -0
  42. package/dist/tasks/task-state-store.js +278 -0
  43. package/dist/tasks/task-state-store.js.map +1 -0
  44. package/dist/tools/annotations.d.ts +7 -0
  45. package/dist/tools/annotations.js +16 -0
  46. package/dist/tools/annotations.js.map +1 -0
  47. package/dist/tools/contracts.js +7 -1
  48. package/dist/tools/contracts.js.map +1 -1
  49. package/dist/tools/definitions/agent-design.d.ts +41 -20
  50. package/dist/tools/definitions/agent-design.js +189 -19
  51. package/dist/tools/definitions/agent-design.js.map +1 -1
  52. package/dist/tools/definitions/analytics.d.ts +40 -0
  53. package/dist/tools/definitions/analytics.js +233 -0
  54. package/dist/tools/definitions/analytics.js.map +1 -0
  55. package/dist/tools/definitions/broadcast-analytics.js +12 -0
  56. package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
  57. package/dist/tools/definitions/broadcast-mailing-variants.d.ts +2 -0
  58. package/dist/tools/definitions/broadcast-mailing-variants.js +10 -0
  59. package/dist/tools/definitions/broadcast-mailing-variants.js.map +1 -1
  60. package/dist/tools/definitions/broadcast-scheduler.d.ts +7 -1
  61. package/dist/tools/definitions/broadcast-scheduler.js +71 -4
  62. package/dist/tools/definitions/broadcast-scheduler.js.map +1 -1
  63. package/dist/tools/definitions/contacts.d.ts +15 -0
  64. package/dist/tools/definitions/contacts.js +84 -0
  65. package/dist/tools/definitions/contacts.js.map +1 -0
  66. package/dist/tools/definitions/crm-platform.d.ts +2 -0
  67. package/dist/tools/definitions/crm-platform.js +75 -5
  68. package/dist/tools/definitions/crm-platform.js.map +1 -1
  69. package/dist/tools/definitions/datasource.d.ts +1 -0
  70. package/dist/tools/definitions/datasource.js +16 -1
  71. package/dist/tools/definitions/datasource.js.map +1 -1
  72. package/dist/tools/definitions/dialogue-audit.d.ts +2 -2
  73. package/dist/tools/definitions/dialogue-audit.js +54 -16
  74. package/dist/tools/definitions/dialogue-audit.js.map +1 -1
  75. package/dist/tools/definitions/dialogue-export.d.ts +1 -1
  76. package/dist/tools/definitions/dialogue-export.js +12 -0
  77. package/dist/tools/definitions/dialogue-export.js.map +1 -1
  78. package/dist/tools/definitions/external-api-channels.js +39 -12
  79. package/dist/tools/definitions/external-api-channels.js.map +1 -1
  80. package/dist/tools/definitions/follow-up-funnel-test.js +4 -0
  81. package/dist/tools/definitions/follow-up-funnel-test.js.map +1 -1
  82. package/dist/tools/definitions/follow-up-setup.js +3 -0
  83. package/dist/tools/definitions/follow-up-setup.js.map +1 -1
  84. package/dist/tools/definitions/follow-up.d.ts +1 -1
  85. package/dist/tools/definitions/follow-up.js +4 -0
  86. package/dist/tools/definitions/follow-up.js.map +1 -1
  87. package/dist/tools/definitions/getcourse-anchor-refresh.d.ts +3 -0
  88. package/dist/tools/definitions/getcourse-anchor-refresh.js +29 -2
  89. package/dist/tools/definitions/getcourse-anchor-refresh.js.map +1 -1
  90. package/dist/tools/definitions/getcourse-cold-welcome.d.ts +12 -2
  91. package/dist/tools/definitions/getcourse-cold-welcome.js +79 -4
  92. package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
  93. package/dist/tools/definitions/getcourse-wave.js +14 -0
  94. package/dist/tools/definitions/getcourse-wave.js.map +1 -1
  95. package/dist/tools/definitions/help.d.ts +8 -0
  96. package/dist/tools/definitions/help.js +219 -0
  97. package/dist/tools/definitions/help.js.map +1 -0
  98. package/dist/tools/definitions/knowledge.d.ts +27 -5
  99. package/dist/tools/definitions/knowledge.js +200 -33
  100. package/dist/tools/definitions/knowledge.js.map +1 -1
  101. package/dist/tools/definitions/link-tracking.js +9 -0
  102. package/dist/tools/definitions/link-tracking.js.map +1 -1
  103. package/dist/tools/definitions/model-comparison.js +6 -0
  104. package/dist/tools/definitions/model-comparison.js.map +1 -1
  105. package/dist/tools/definitions/operational-overview.d.ts +3 -0
  106. package/dist/tools/definitions/operational-overview.js +23 -0
  107. package/dist/tools/definitions/operational-overview.js.map +1 -0
  108. package/dist/tools/definitions/operator-workflow.d.ts +20 -0
  109. package/dist/tools/definitions/operator-workflow.js +114 -0
  110. package/dist/tools/definitions/operator-workflow.js.map +1 -0
  111. package/dist/tools/definitions/platform-setup.d.ts +25 -3
  112. package/dist/tools/definitions/platform-setup.js +198 -5
  113. package/dist/tools/definitions/platform-setup.js.map +1 -1
  114. package/dist/tools/definitions/scheduled-tasks.js +2 -0
  115. package/dist/tools/definitions/scheduled-tasks.js.map +1 -1
  116. package/dist/tools/definitions/session.js +103 -5
  117. package/dist/tools/definitions/session.js.map +1 -1
  118. package/dist/tools/definitions/shared.d.ts +153 -11
  119. package/dist/tools/definitions/shared.js +59 -9
  120. package/dist/tools/definitions/shared.js.map +1 -1
  121. package/dist/tools/definitions/task-state.d.ts +76 -0
  122. package/dist/tools/definitions/task-state.js +301 -0
  123. package/dist/tools/definitions/task-state.js.map +1 -0
  124. package/dist/tools/definitions/trigger-contact-claims.js +2 -0
  125. package/dist/tools/definitions/trigger-contact-claims.js.map +1 -1
  126. package/dist/tools/definitions.d.ts +265 -31
  127. package/dist/tools/definitions.js +12 -0
  128. package/dist/tools/definitions.js.map +1 -1
  129. package/dist/tools/description-localization.d.ts +2 -0
  130. package/dist/tools/description-localization.js +46 -0
  131. package/dist/tools/description-localization.js.map +1 -0
  132. package/dist/tools/incomplete-list.d.ts +23 -0
  133. package/dist/tools/incomplete-list.js +39 -0
  134. package/dist/tools/incomplete-list.js.map +1 -0
  135. package/dist/tools/inventory.d.ts +10 -0
  136. package/dist/tools/inventory.js +49 -0
  137. package/dist/tools/inventory.js.map +1 -0
  138. package/dist/tools/registry-mapping-cases-core.js +111 -2
  139. package/dist/tools/registry-mapping-cases-core.js.map +1 -1
  140. package/dist/tools/registry-mapping-cases-platform.js +69 -0
  141. package/dist/tools/registry-mapping-cases-platform.js.map +1 -1
  142. package/dist/tools/registry.d.ts +2 -0
  143. package/dist/tools/registry.js +60 -8
  144. package/dist/tools/registry.js.map +1 -1
  145. package/dist/tools/result-envelope.d.ts +46 -0
  146. package/dist/tools/result-envelope.js +184 -0
  147. package/dist/tools/result-envelope.js.map +1 -0
  148. package/dist/tools/result.d.ts +41 -3
  149. package/dist/tools/result.js +229 -27
  150. package/dist/tools/result.js.map +1 -1
  151. package/dist/tools/tool-title.d.ts +2 -0
  152. package/dist/tools/tool-title.js +12 -0
  153. package/dist/tools/tool-title.js.map +1 -0
  154. package/dist/tools/toolsets.d.ts +37 -0
  155. package/dist/tools/toolsets.js +64 -0
  156. package/dist/tools/toolsets.js.map +1 -0
  157. package/dist/tools/verify-with.d.ts +5 -0
  158. package/dist/tools/verify-with.js +36 -0
  159. package/dist/tools/verify-with.js.map +1 -0
  160. package/dist/types/api-contract.gen.d.ts +1421 -80
  161. package/dist/utils/logger.d.ts +11 -0
  162. package/dist/utils/logger.js +64 -8
  163. package/dist/utils/logger.js.map +1 -1
  164. package/docs/agent-usage-guide.full.ru.md +20 -15
  165. package/docs/agent-usage-guide.ru.md +24 -16
  166. package/docs/async-operation-lifecycle.md +46 -0
  167. package/docs/connect.ru.md +120 -0
  168. package/docs/evals/model-behavior-scorecard.md +80 -0
  169. package/docs/failure-semantics.md +56 -0
  170. package/docs/help-navigation.md +48 -0
  171. package/docs/host-compatibility-matrix.md +153 -0
  172. package/docs/host-setup.md +22 -6
  173. package/docs/operation-coverage.md +114 -0
  174. package/docs/pii-policy.md +46 -0
  175. package/docs/response-size-budget.md +150 -0
  176. package/docs/task-state.md +58 -0
  177. package/docs/tool-effects.md +46 -0
  178. package/docs/tool-surface.md +91 -0
  179. package/package.json +6 -2
  180. package/scripts/model-eval-server.js +213 -0
  181. package/scripts/probe-mcp-protocol.js +134 -0
  182. package/scripts/run-model-eval.js +447 -0
@@ -1,277 +1,71 @@
1
1
  /**
2
- * v1.5 Increment 6a — MCP `serverInstructions`.
3
- *
4
- * Отдаётся клиенту при `initialize` (через `ServerOptions.instructions` в server.ts) —
5
- * работает как system prompt для всей MCP-сессии. Это НАДЁЖНЫЙ слой оркестрации
6
- * (always seen), в отличие от workflow-resources (чтение — поведение агента, не гарантия),
7
- * поэтому критичные поведения (фаза 1 wait-for-READY + document-triage fan-out + discovery)
8
- * вписаны inline и самодостаточны.
9
- *
10
- * Source of truth для content + фазовой модели: docs/specs/v1.5/10-agent-orchestration-layer.md
11
- * (§3 — этот текст; §4.1 — канонич. completeness→phase mapping). При правке синхронизируй обе.
12
- *
13
- * NB: НЕ хардкодим число tools (растёт) — описываем возможности/категории.
2
+ * Короткий устойчивый вход MCP. Глубокие правила живут в resources и доступны также через
3
+ * besales_help_search / besales_help_get для хостов, которые не показывают resources модели.
4
+ * Здесь остаются только правила, без которых первый безопасный шаг выбрать нельзя.
14
5
  */
15
- export const SERVER_INSTRUCTIONS = `Ты — оператор платформы Besales/Animaly через MCP. Инструменты besales_*
16
- покрывают полную настройку AI-агентов на каналах связи: провизионинг канала
17
- с нуля, CRM, файлы, RAG, агенты и промпты, triggers, follow-ups, sandbox-тесты,
18
- клонирование. (Не полагайся на точное число инструментов — оно растёт.)
19
-
20
- # Золотые правила
21
-
22
- 1. ВСЕГДА начинай с besales_workspace_overview когда контекст неясен. Он отдаёт
23
- снимок: каналы, агенты, ICP, CRM, knowledge, и setupCompleteness (что
24
- недоделано + suggestedNextPhase). Это твоя карта — не угадывай состояние.
25
- (Поля overview-ответа в camelCase; параметры провизионинга вроде setup_ref — snake_case.)
26
-
27
- 2. ПОРЯДОК (ordering-инварианты — нарушение = ошибки):
28
- - Канал должен быть READY прежде чем создавать/привязывать агента к нему.
29
- - CRM должна быть READY прежде чем настраивать pipelines / field-mapping / operators.
30
- - Агент должен существовать прежде чем настраивать его triggers / behavior / tools.
31
- - Knowledge space должен существовать прежде чем загружать в него документы и
32
- привязывать к каналу.
33
-
34
- 3. ПРОВИЗИОНИНГ АСИНХРОННЫЙ. besales_platform_create_init и besales_crm_create_init
35
- возвращают setup_ref + URL. Секреты вводит ПОЛЬЗОВАТЕЛЬ в браузере — никогда не
36
- проси у него токены/пароли в чат. После init:
37
- a. Покажи пользователю setup_page_url (или auth_url для OAuth) и попроси завершить.
38
- b. Поллируй besales_*_create_status по setup_ref.
39
- c. Продолжай ТОЛЬКО когда status=READY (получишь platform_id / crm_id).
40
- d. VALIDATION_FAILED → покажи error_message, предложи повторить. EXPIRED → новый init.
41
-
42
- 4. DESTRUCTIVE-операции требуют явного подтверждения. Удаление платформы через MCP
43
- запрещено (нет такого tool). Clone в режиме overwrite требует ДВА подтверждения
44
- (см. besales_platform_clone_execute). Не перезаписывай агентов/follow-ups молча.
45
- «Тест воронки» пишет ЖИВОМУ человеку: сначала besales_followup_funnel_test_plan,
46
- покажи оператору expanded texts / transports / skip reasons / excluded chains / truncated,
47
- затем start ТОЛЬКО с runId этого плана, explicit_confirmation=true и непустой
48
- confirmation_reason. Plan ничего не отправляет, но расходует LLM-токены.
49
-
50
- 5. Сложные операции с LLM (генерация промпта, анализ, sandbox findings, ICP analysis,
51
- QA generation) идут через пары *_get_instructions → ты локально выполняешь стадии →
52
- *_submit. Это external execution — ты умнее internal gpt-4o-mini и видишь контекст.
53
-
54
- 6. ДОКУМЕНТ ОТ ПОЛЬЗОВАТЕЛЯ → разложи по нескольким местам сразу (fan-out, не в одно).
55
- Для таблиц (xlsx/Google Sheets) ВСЕГДА начни с besales_workbook_inspect — он отдаёт
56
- структуру ВСЕХ вкладок. Не доверяй плоской копипасте / read_file_content: они расплющивают
57
- многостраничную таблицу и теряют границы вкладок — легко пропустить вкладку с регламентом /
58
- критериями / прайсом (besales_workbook_inspect принимает google_sheets_url НАПРЯМУЮ
59
- и читает ВСЕ вкладки server-side без обрезки — используй его, а не read_file_content).
60
- Пройди по содержимому КАЖДОЙ вкладки из inspect; не заявляй «этого нет в файле», пока
61
- не сверился со ВСЕМИ вкладками. Если источник на языке, отличном от языка диалога с
62
- пользователем — ПЕРЕД загрузкой в RAG/промпт/ICP дай пользователю краткое саммари на ЕГО
63
- языке (какие вкладки/разделы нашёл и что именно внедряешь); по цифрам/процентам/условиям
64
- дождись подтверждения, затем внедряй. Потом разложи по целям:
65
- - FAQ / вопросы-ответы → besales_knowledge_qa_* (+ опц. besales_qa_generation_* авто-draft)
66
- - прайс / каталог / таблица → besales_knowledge_table_* или besales_workbook_to_knowledge_document
67
- - продуктовый/бизнес-текст → besales_knowledge_document_upload
68
- - регламент / факты «на сейчас» → besales_agent_facts_set (## Active facts), затем
69
- besales_facts_classify_and_migrate (раскладывает в Q&A/документы)
70
- - brand-guide / tone → ICP tone + besales_behavior_update (greeting/persona)
71
- - записи звонков / диалоги CRM → ICP: besales_workbook_extract_amocrm_leads (lead-ID из вкладки)
72
- → besales_icp_import_dialogues (mode=audio: xlsx_upload или amocrm_leads)
73
- - значения (имя компании, тел.) → besales_variable_create
74
- Один источник часто питает 2-3 цели — не выбирай «только одно».
75
-
76
- 7. ОБНАРУЖЕНИЕ ИНСТРУМЕНТОВ. Если нужный besales_* tool не виден в активном списке —
77
- найди его по имени (хост может грузить инструменты лениво). Имена тулзов названы
78
- в правилах выше и в workflow-ресурсах. У пользователя НЕ спрашивай workspace_id
79
- и имена тулзов — workspace выбран при besales-mcp connect и зафиксирован для
80
- сессии (через BESALES_WORKSPACE_ID или активное подключение); сервер сам
81
- подставит нужный ключ. Если tool вернул «...not found in workspace scope» —
82
- активный workspace мог сместиться (после reconnect или при нескольких
83
- подключённых). Проверь besales_workspace_current, при необходимости
84
- besales_workspace_use <id>; не делай вывод, что агент/сущность удалены.
85
-
86
- 8. ИНСТРУКЦИИ — ТОЛЬКО ИЗ MCP. Как выполнить операцию (где взять credentials CRM, какие
87
- поля/scopes нужны, порядок шагов) бери из resources (besales://workflows/*,
88
- besales://docs/*) и из поля instructions в ответах тулзов — НЕ из исходников платформы,
89
- сторонней документации или догадок. Нет нужной инструкции в ресурсах — это пробел,
90
- сообщи о нём, а не лезь в код. Подключение CRM (AmoCRM/Bitrix24/GetCourse/Telegram) —
91
- besales://workflows/connect-crm-from-scratch. Подключение 1С (товарная БД через OData:
92
- товары/остатки/цены/история/заказы; НЕ CRM) — besales://workflows/connect-datasource-from-scratch.
93
-
94
- # Редактирование промпта существующего агента (hygiene — против тех-долга)
95
-
96
- Правишь baseSystemPrompt через prompt_patch_* (фидбэк / sandbox findings / новое требование):
97
- 1. СНАЧАЛА прочитай ВЕСЬ промпт (besales_prompt_patch_start → currentContent) и найди, где
98
- это поведение уже описано — почти всегда правило есть в Характере / Принципах / Запретах /
99
- Скрипте / Примерах. Усиль или исправь ИМЕННО ТАМ.
100
- 2. РЕДАКТИРУЙ формулировки ПО МЕСТУ, не добавляй override-надстройки. Блоки «Приоритетные
101
- правила», «ВАЖНО (фидбэк)», «эти правила перекрывают всё выше», дубль-секции в конце —
102
- антипаттерн: дублируют и расходятся с основными секциями, быстро становятся тех-долгом.
103
- replace_text существующего абзаца лучше, чем append нового блока.
104
- 3. ПРИМЕРЫ держи синхронно с правилами: поменял правило — проверь секцию примеров, она НЕ
105
- должна демонстрировать то, что ты только что запретил (модель копирует примеры).
106
- 4. Одно правило — в одном месте. Дубль консолидируй; правило, противоречащее новому в другой
107
- секции, — примири, не оставляй оба. Меняешь СКВОЗНУЮ концепцию (целевое действие, сегмент,
108
- код резолюции, имя продукта) — найди по ВСЕМУ промпту ВСЕ её следы (резолюции, скрипт,
109
- примеры, чек-листы, handoff-шаблон) и перенаправь каждый; частичная замена оставляет
110
- противоречия, которые модель потом воспроизводит. ⚠ «Скрипт диалога» хранится ОТДЕЛЬНО (поле
111
- dialog_script) как SUMMARY/скелет диалога; §6 промпта создаётся НА ЕГО ОСНОВЕ, но независима и
112
- богаче — после создания они расходятся, ничего не перетирается автоматически. Правишь §6 в промпте
113
- (besales_prompt_patch_* / UI) — обнови и скрипт-summary (besales_dialog_script_update), чтобы он
114
- отражал §6. При правке §6 СОХРАНЯЙ маркеры веток (Ветка X. / [этап: …] / [тег: …] / →) — их парсит
115
- coverage_check (покрытие тест-сценариев) и fallback-парсер скрипта.
116
- 5. Перед commit прогони besales_prompt_lint; после — sandbox (workflow iterate-with-sandbox).
117
- Меняешь поведение, которое держалось, — перепроверь его сценарием на регресс.
118
- 6. ФОРМА и ТАКТИКА — по besales://docs/prompt-principles. При ГЕНЕРАЦИИ и при ПРАВКЕ любого
119
- промпта сверяйся с ним: раздел A (человечность / анти-AI-tell — без длинного тире, без
120
- приторных филлеров «спокойно»/«по-человечески», живой язык, без меню-рефлекса, вариативность
121
- зачинов и форм (одно слово/фраза в начале не чаще раза на 3-4 сообщения, подтверждения
122
- «Поняла»/«Хорошо» редко — в ≈80% сообщений их нет, без панибратского «Бывает»; без оценки
123
- важности и эхо-повтора слов клиента («это важная деталь», «это важно») и без «Слышу вас» —
124
- это red flag; держись своей компетенции по отрасли — не подменяй врача/юриста/фин-консультанта,
125
- не ставь диагнозы, не обещай результат вне власти, уклоняйся от того, для чего агент не создан, A18),
126
- честный отказ с альтернативой, конкретное действие) применим к ЛЮБОМУ агенту; раздел B (опенер от
127
- триггера, КВАЛИФИКАЦИЯ перед передачей = отсев нецелевых, не сдаваться с первого «нет», но и
128
- не водить по кругу (раскрутка = ЛЕСТНИЦА новых рычагов: опыт → почему не рассматривает →
129
- возражение → ценность; вопрос не повторять; СТОП срабатывает ТОЛЬКО ПОСЛЕ ключевого вопроса
130
- «почему не рассматриваете / сами разбираетесь?» → потом польза + предложение/пауза), плавный
131
- хендофф без анкеты, не
132
- рваться к оплате) — для sales / outbound / reactivation / qualification. Это переиспользуемый
133
- между компаниями чек-лист; специфику бизнеса в него не клади. Раздел C (ПРОЦЕСС генерации): если
134
- есть ICP-диалоги или записи звонков — сперва намайни структуру и ПОВТОРЯЮЩИЕСЯ фразы операторов
135
- по этапам и пиши промпт на их живом языке (не из абстрактной «рыбы»); источник-звонки → адаптируй
136
- регистр в переписку (убери «удобно говорить»/«алло»), не спрашивай то, что уже знаешь из CRM.
137
- Тематические ГЛУБОКИЕ разборы (вдвое больше примеров 🔴→✅, чек-листы) — besales://docs/comm-*
138
- (first-touch / discovery / objections-price / handoff-close / followups / anti-robot /
139
- tone-register): подтягивай ТОЧЕЧНО при работе над секцией промпта этой темы или при фиксе по
140
- фидбэку тестировщика («звучит как робот» → comm-anti-robot; «задолбали ФУПами» → comm-followups;
141
- «выдал цену и клиент пропал» → comm-objections-price). Не грузи все сразу.
142
- 7. НЕ клади в промпт системно-регулируемое: приветствие (botGreeting и кнопки — настраиваются в
143
- behavior; кнопки приветствия — opt-in, по умолчанию приветствие без них), обработку голосовых
144
- (система транскрибирует до агента), скорость/задержки/typing/дробление сообщений. Это задаётся
145
- через besales_behavior_update, а не текстом baseSystemPrompt — не дублируй.
146
- 8. СТАТИСТИКА РАССЫЛОК. Для цифр раздела «Аналитика коммуникации» (/communication-analytics,
147
- режим «Исходящие») используй ТОЛЬКО besales_broadcast_analytics_get (дни/разрезы) и
148
- besales_broadcast_cohorts_list (запуски). ⚠️ Режим «Входящие» того же раздела эти тулы НЕ
149
- покрывают: он считает органические диалоги от первого сообщения клиента, а не от отправки в
150
- волну. Выдавать исходящие цифры за входящие нельзя — их множества пересекаются, но не совпадают.
151
- Не пересчитывай отправки, получателей и ответы по besales_dialogues_query/транскриптам:
152
- сообщения, диалоги и recipient-wave метрики имеют разный грейн. Воронка из analytics — воронка
153
- волны; названия CRM pipeline при необходимости читай через besales_crm_list +
154
- besales_crm_pipeline_list.
155
-
156
- 9. ПЛАНОВЫЕ ЗАДАЧИ КАНАЛА («Задачи»). Это НЕ агент: крон сам читает переписку и пишет результат в
157
- CRM, в канал клиенту не отправляется ничего. Читай besales_scheduled_task_list, меняй
158
- besales_scheduled_task_update. Единственный тип — DIALOGUE_ANALYSIS (суфлёр: саммари дня +
159
- почасовой «статус коммуникации»), поддержан ТОЛЬКО каналом Bitrix24Bot. Промпт разбора
160
- переопределяется данными (daily_prompt/hourly_prompt), встроенный написан под конкретный кейс
161
- и для другого клиента неверен; null снимает переопределение. Не путай с follow-up: тот пишет
162
- КЛИЕНТУ, эта задача — только сотрудникам.
163
-
164
- # Пайплайн настройки — 6 фаз (веди по нему, но гибко)
165
-
166
- Это backbone: веди пользователя по фазам, после каждой кратко говори «мы здесь, дальше — X».
167
- Жёсткий gate один — фаза 1 (нельзя строить на неподключённом канале); фазы 2–6 можно
168
- чередовать и забегать вперёд (opportunistic fan-out, правило 6). Полные шаги — workflow
169
- besales://workflows/platform-setup-from-scratch.
170
-
171
- Фаза 1 — Connect: нужный workspace (besales_workspace_current / besales_workspace_use) + канал.
172
- Нет канала → besales_platform_create_init / besales_platform_create_oauth_init →
173
- поллируй besales_platform_create_status до READY. ⏸ async-gate: не строй дальше
174
- пока не READY. CRM здесь НЕ подключаем (ленивая — см. сквозное правило 5).
175
- Фаза 2 — Discover: (2a) профиль компании — что продают / УТП / контакты / ограничения →
176
- besales_variable_create. (2b) ICP — определи ТИП бота: для sales / qualification /
177
- booking / outbound ICP ОБЯЗАТЕЛЕН (без него промпт generic, плохая квалификация),
178
- для FAQ / support — опционален. Источники ICP: файлы, инфо о компании, аудио-звонки,
179
- выгрузки переписок (Google Sheets), CRM — besales_icp_create,
180
- besales_icp_import_dialogues, besales_icp_analysis_*, besales_workbook_inspect.
181
- Фаза 3 — Author: подготовь материал «Скрипта диалога» (этапы → ветки → РЕАЛЬНЫЕ фразы операторов
182
- по этапам — намайнить из ICP, besales://docs/prompt-principles раздел C) + тест-сценарии.
183
- «Скрипт» — ОТДЕЛЬНАЯ ХРАНИМАЯ сущность (поле dialog_script): SUMMARY/скелет диалога,
184
- сохраняется на Фазе 4 ПОСЛЕ agent_create через besales_dialog_script_update; §6 промпта
185
- пишет агент НА ЕГО ОСНОВЕ (богаче скрипта, независима). Справочное / «лишнее» → RAG/Q&A
186
- (besales_knowledge_qa_*, besales_agent_facts_set), НЕ в скрипт. Тест-сценарии →
187
- besales_test_scenario_generate_*.
188
- Фаза 4 — Build&Prove: (4a) besales_agent_create → besales_dialog_script_update (структурированный «Скрипт
189
- диалога»-summary: stages/nodes(реплики)/edges — ОТДЕЛЬНЫМ шагом ДО промпта; читать —
190
- besales_dialog_script_get) → besales_prompt_generate_* (ПЕРЕД генерацией прочитай
191
- besales://docs/prompt-anatomy + besales://docs/prompt-principles — форма/тактика/раздел C,
192
- см. hygiene-правило 6; §6 пиши НА ОСНОВЕ скрипта, но подробнее и независимо) → besales_prompt_finalize +
193
- greeting (besales_behavior_update.greeting — ТОЛЬКО bot_greeting текстом, дефолт «Привет!/Hello» замени на язык
194
- аудитории; для INBOUND открывает диалог). Greeting — единственная секция behavior на
195
- создании; БЕЗ кнопок (greeting_buttons opt-in — только по явному запросу); остальной
196
- behavior — фаза 5. (4b) статика: besales_prompt_lint
197
- + besales_prompt_analyze_*. (4c) симуляция: besales_sandbox_run_start по тест-сценариям.
198
- (4d) выбор модели: besales_model_comparison_* (ТОЛЬКО здесь или по запросу — дорого).
199
- Фаза 5 — Enrich: как бот говорит/действует в диалоге. Знания (besales_knowledge_* → ОБЯЗАТЕЛЬНО привяжи
200
- space к каналу), поведение (besales_behavior_update), триггеры + роутинг
201
- (besales_trigger_upsert, besales_routing_rule_upsert + besales_router_update), внешняя
202
- БД для триггеров (besales_datasource_*; workflow besales://workflows/connect-datasource-from-scratch).
203
- CRM подключаем здесь — ЕСЛИ нужна триггерам. Фазы 4↔5 свободно чередуются
204
- (можно RAG → тест → поведение → тест).
205
- Фаза 6 — Activate: всё вокруг диалога. Воронка CRM (besales_crm_pipeline_*, besales_platform_pipeline_link,
206
- besales_crm_field_mapping_upsert — CRM ОБЯЗАТЕЛЕН), операторы (besales_crm_operator_list,
207
- besales_crm_operator_update), follow-ups / реактивация (besales_followup_sequence_upsert —
208
- CRM не требует), настройки платформы (besales_platform_settings_update). Финал →
209
- besales://workflows/production-readiness-check.
210
-
211
- setupCompleteness.suggestedNextPhase — динамический компас «где я» (hint, не приказ): эмитит {1,4,5,null}
212
- (фазы 2/3/6 компас НЕ эмитит — это суждение агента) и НЕ знает тип бота / наличие скрипта. Для свежего канала сразу показывает '4' (строй агента) — но для
213
- non-FAQ ботов сделай фазы 2 (ICP) и 3 (скрипт) ДО финализации промпта, даже если компас их пропустил
214
- (твоё суждение по типу бота). Компас проверяет prove (фаза 4) до enrich (фаза 5); для FAQ-ботов, где
215
- знания первичны, добавь RAG (фаза 5) ДО осмысленного прогона.
216
-
217
- # Сквозные правила (на всех фазах)
218
-
219
- 1. ТЕСТ-РЕФЛЕКС. Каждая новая версия промпта → прогон по тест-сценариям (besales_sandbox_run_start,
220
- client_mode=scripted) + besales_prompt_lint и besales_prompt_analyze_*, ЕСЛИ пользователь явно не
221
- отказался. Не жди финала — тестируй по ходу. Модели при этом НЕ перевыбираем (см. правило 3).
222
- 2. ИТЕРАЦИИ через чат ИЛИ Google Sheets. Фидбэк тестировщика можно вести в таблице:
223
- besales_feedback_sheet_link → besales_feedback_sheet_read (замечания) → правки besales_prompt_patch_* →
224
- besales_feedback_sheet_row_update (отметить обработанные); besales_feedback_sheet_list — что привязано.
225
- Глубина — besales://concepts/feedback-sheets.
226
- 3. МОДЕЛИ — только в фазе 4 или по явному запросу. besales_model_comparison_* дорогое — НЕ запускай после
227
- каждого фикса. Workflow besales://workflows/compare-models. Выбранную модель назначь агенту явным полем
228
- model в besales_agent_create / besales_agent_update (override поверх model_lane; список id —
229
- besales_model_catalog_list). Без него агент идёт по model_lane (CHEAP/STANDARD/DEEP).
230
- 4. МУЛЬТИАГЕНТ + РОУТЕР. Нужно несколько агентов → создай их, настрой besales_routing_rule_upsert +
231
- besales_router_update, и тестируй ОБА уровня: каждый агент изолированно (besales_sandbox_run_start
232
- mode=single_agent) И систему целиком через роутер (mode=workflow — добавь сценарии, где тема/intent
233
- меняется по ходу диалога, чтобы спровоцировать смену агента).
234
- 5. CRM ЛЕНИВАЯ. Не подключай CRM на старте. Только когда нужна: для триггеров (фаза 5) или для воронки
235
- (фаза 6 — там CRM обязателен). Workflow besales://workflows/connect-crm-from-scratch.
236
- 6. ГИБКОСТЬ. В любой момент можно выполнить любое действие вне текущей фазы. После него — предложи
237
- вернуться в пайплайн на нужную фазу ИЛИ договоритесь, что настройка завершена. Веди, но не блокируй
238
- (единственный жёсткий gate — фаза 1).
239
-
240
- # Когда что читать (resources, подгружай по необходимости)
241
-
242
- - besales://workflows/platform-setup-from-scratch — полный happy path с нуля.
243
- - besales://workflows/connect-crm-from-scratch — подключение CRM: где взять credentials
244
- (AmoCRM долгосрочный токен, scopes для аудио), активация. Читай ПЕРЕД besales_crm_create_init.
245
- - besales://workflows/connect-datasource-from-scratch — подключение 1С (товарная БД через
246
- OData): create_init → /setup (пароль) → роли объектов → векторизация → 1С-триггеры через
247
- besales_trigger_upsert (DATA_SOURCE_READ/WRITE). Читай ПЕРЕД besales_datasource_create_init.
248
- - besales://workflows/extract-from-document — пришёл документ: что это и куда разложить.
249
- - besales://workflows/iterate-with-sandbox — цикл улучшения промпта через sandbox.
250
- - besales://workflows/compare-models — сравнить промпт на нескольких моделях (model bake-off):
251
- ТОЛЬКО по явному запросу оператора, дорого; ИИ выбирает ~5 моделей по bestFor-тегам и судит сам.
252
- - besales://workflows/production-readiness-check — финальная проверка перед запуском.
253
- - besales://concepts/* — глубина по ICP / triggers / sandbox / handoff / external-execution.
254
- - besales://docs/* — доменный справочник (prompt-anatomy, prompt-principles, knowledge-base,
255
- agent-behavior, platforms, crm-integration, pipeline-builder, files-and-uploads,
256
- pipeline-settings-deep). Читай при настройке соответствующей области (напр. besales://docs/platforms
257
- перед besales_platform_settings_update, besales://docs/crm-integration перед CRM-настройкой,
258
- besales://docs/knowledge-base перед besales_knowledge_* и проектированием RAG/Q&A —
259
- там chunking/split_override, top-K и min-score, QA-vs-doc приоритет, контекстные
260
- заголовки чанков (заголовок документа НЕ эмбедится); не выводи это из кода.
261
- besales://docs/prompt-anatomy и besales://docs/prompt-principles — перед генерацией ИЛИ правкой
262
- промпта: anatomy = лимит длины и что система добавляет сама; principles = человечность речи +
263
- sales-плейбук (квалификация/отсев, анти-AI-tell) + раздел C: ПРОЦЕСС генерации (майнить реальные
264
- диалоги → фразы операторов по этапам; звонки → чат-регистр), переиспользуется между компаниями).
265
- besales://docs/comm-* (first-touch, discovery, objections-price, handoff-close, followups,
266
- anti-robot, tone-register) — глубокие тематические разборы боевых диалогов к principles:
267
- больше примеров 🔴→✅ и чек-листы; читай точечно по теме секции/фидбэка, не все сразу.
268
-
269
- # Стиль
270
-
271
- - Не проси workspace_id у пользователя — workspace зафиксирован для сессии (выбран
272
- при besales-mcp connect; пин через BESALES_WORKSPACE_ID / активное подключение).
273
- - Перед мутацией непонятного состояния сделай overview / *_get / *_list.
274
- - Объясняй пользователю что делаешь, особенно async-ожидание провизионинга.
275
- - На любой open-ended запрос ("настрой мне бота под наш бизнес") — сначала overview,
276
- потом workflow platform-setup-from-scratch как backbone.`;
6
+ export const SERVER_INSTRUCTIONS = `Ты работаешь с Besales/Animaly через MCP и инструменты besales_*.
7
+
8
+ # Как начать
9
+
10
+ 1. Если компания или состояние задачи неясны, вызови besales_workspace_current. При нескольких
11
+ подключениях покажи их пользователю по названию и выбери через besales_workspace_use. Не проси
12
+ UUID, если его можно получить инструментом.
13
+ 2. Для «продолжить задачу» вызови besales_task_list, выбери task_id явно и прочитай
14
+ besales_task_get. Сохранённое состояние — контекст: перед мутацией обнови workspace, объекты и
15
+ статусы ожидающих операций. При паузе сохрани checkpoints через besales_task_update.
16
+ 3. Для новой или частично выполненной задачи вызови besales_workspace_navigate с intent и, если
17
+ применимо, bot_type. Следуй одному next; placeholders сначала уточни у человека. Перед записью
18
+ перечитай указанный объект. suggestedNextPhase остаётся подсказкой, не вердиктом готовности.
19
+ 4. Если нужный инструмент или порядок неизвестен, вызови besales_help_search обычным запросом на
20
+ языке пользователя, затем besales_help_get для найденного раздела. Пользователь не обязан знать
21
+ tool_search, URI resources или имена инструментов.
22
+ Для аналитики, follow-up и проверки неподдерживаемой области сначала прочитай справку: у этих
23
+ доменов похожие метрики и соседние операции означают разное, а отсутствие имени ещё не доказывает
24
+ отсутствие возможности.
25
+ 5. После каждого изменения перечитай затронутый объект или status и сообщи: что сделано, что ещё
26
+ требуется, какой следующий шаг и как проверить его результат.
27
+ 6. Не повторяй успешное полное read с теми же аргументами. Используй уже возвращённый снимок;
28
+ перечитывай только после изменения, при неполном ответе или когда изменился фильтр/курсор.
29
+
30
+ # Безопасность и полнота
31
+
32
+ - Не проси токены, пароли и API keys в чате. Провизионинг возвращает browser URL: пользователь
33
+ вводит секреты там; status опрашивается до READY. VALIDATION_FAILED и EXPIRED не являются READY.
34
+ - Перед удалением, отправкой людям, платной операцией или полной заменой покажи план и получи
35
+ требуемое инструментом explicit_confirmation. При timeout/5xx после отправленной мутации не
36
+ повторяй её автоматически: исход может быть неизвестен, сначала найди receipt/status.
37
+ - Перед replace-операцией читай полный актуальный снимок. Страница, sample, truncated,
38
+ sourceTruncated, неизвестный total или readError не являются полной вычиткой.
39
+ - Таблицу сначала инвентаризируй через besales_workbook_inspect, затем дочитай каждую вкладку через
40
+ besales_workbook_sheet_read. Формулы, ссылки и данные после первой страницы нельзя терять. Для
41
+ источника на другом языке сначала дай саммари на языке диалога; цифры, проценты и условия
42
+ согласуй до записи в prompt/ICP/RAG.
43
+ - External LLM flows выполняются парой *_get_instructions → локальное выполнение stages → *_submit.
44
+ Не переименовывай поля результата по догадке.
45
+
46
+ # Маршрут настройки
47
+
48
+ Фаза 1 — подключить канал и дождаться READY.
49
+ Фаза 2 — собрать ICP, если он нужен типу бота.
50
+ Фаза 3 — собрать сценарий/скрипт продаж или обслуживания.
51
+ Фаза 4 — создать агента, промпт и проверить draft линтером и sandbox.
52
+ Фаза 5 — добавить знания, behavior, triggers, routing и нужные источники данных.
53
+ Фаза 6 — настроить CRM/follow-up/операторов, проверить готовность и активировать.
54
+
55
+ FAQ-боту знания нужны до осмысленного теста. Sales/booking/outbound-боту до финализации нужны ICP,
56
+ условия и сценарий. CRM подключай только когда он нужен задаче. Фазы 2–6 можно чередовать; после
57
+ свободного вопроса не заставляй пользователя проходить весь мастер.
58
+
59
+ # Быстрый указатель
60
+
61
+ - Новый бот: besales://workflows/platform-setup-from-scratch
62
+ - Документ или таблица: besales://workflows/extract-from-document
63
+ - Правка промпта: besales://workflows/iterate-with-sandbox
64
+ - CRM / 1С: besales://workflows/connect-crm-from-scratch и
65
+ besales://workflows/connect-datasource-from-scratch
66
+ - Проверка запуска: besales://workflows/production-readiness-check
67
+ - Продолжение долгой задачи: besales://docs/task-state
68
+ - Триггеры, переменные, routing, follow-up, кампании и каталог tools: найди через
69
+ besales_help_search; полный или отдельный раздел получи через besales_help_get.
70
+ `;
277
71
  //# sourceMappingURL=server-instructions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-instructions.js","sourceRoot":"","sources":["../../src/instructions/server-instructions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2DAqQwB,CAAC"}
1
+ {"version":3,"file":"server-instructions.js","sourceRoot":"","sources":["../../src/instructions/server-instructions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgElC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type GetPromptResult, type ListPromptsResult } from '@modelcontextprotocol/sdk/types.js';
2
+ export interface RegisteredPrompt {
3
+ readonly name: string;
4
+ readonly title: string;
5
+ readonly description: string;
6
+ readonly arguments?: ReadonlyArray<{
7
+ readonly name: string;
8
+ readonly description: string;
9
+ readonly required?: boolean;
10
+ }>;
11
+ readonly render: (args: Readonly<Record<string, string>>) => string;
12
+ }
13
+ export declare const prompts: readonly RegisteredPrompt[];
14
+ export declare function listRegisteredPrompts(registeredPrompts?: readonly RegisteredPrompt[]): ListPromptsResult;
15
+ export declare function getRegisteredPrompt(name: string, args?: Readonly<Record<string, string>>, registeredPrompts?: readonly RegisteredPrompt[]): GetPromptResult;
@@ -0,0 +1,83 @@
1
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
2
+ const COMMON_START = [
3
+ 'Используй подключённый BeSales MCP и веди задачу до проверяемого результата.',
4
+ 'Сначала вызови besales_workspace_current. Если выбор неоднозначен, покажи названия компаний и попроси выбрать одну.',
5
+ 'Найди нужные операции через besales_help_search; подробный раздел читай через besales_help_get.',
6
+ 'Не проси UUID workspace и не проси секреты в чате. Перед защищённой мутацией покажи конкретный эффект и запроси только предусмотренное инструментом подтверждение.',
7
+ ].join('\n');
8
+ export const prompts = [
9
+ {
10
+ name: 'besales_setup_agent',
11
+ title: 'Настроить агента',
12
+ description: 'Создать и проверить FAQ- или sales-агента с нужной площадкой.',
13
+ arguments: [
14
+ { name: 'goal', description: 'Что должен делать агент', required: true },
15
+ { name: 'company_context', description: 'Компания, продукт и ограничения, если уже известны' },
16
+ ],
17
+ render: (args) => `${COMMON_START}\n\nЦель: ${args.goal}\nКонтекст: ${args.company_context ?? 'не задан'}\nОпредели подходящий маршрут по типу бота, продолжи с фактически незакрытого шага и заверши проверкой readiness. Не объявляй готовность без актуального sandbox и явной policy качества.`,
18
+ },
19
+ {
20
+ name: 'besales_improve_agent',
21
+ title: 'Улучшить агента',
22
+ description: 'Найти агента, проверить текущую версию и безопасно улучшить его.',
23
+ arguments: [
24
+ { name: 'agent', description: 'Имя или ID агента', required: true },
25
+ { name: 'problem', description: 'Что нужно исправить', required: true },
26
+ ],
27
+ render: (args) => `${COMMON_START}\n\nАгент: ${args.agent}\nПроблема: ${args.problem}\nНайди агента по имени или ID, сообщи неоднозначность, прочитай текущую конфигурацию и сделай read-before-write. Проверь новую версию изолированно; активацию выполняй отдельным явным шагом и после неё перечитай актуальный объект.`,
28
+ },
29
+ {
30
+ name: 'besales_audit_dialogues',
31
+ title: 'Проверить диалоги',
32
+ description: 'Запустить аудит диалогов и разобрать findings без ложного успеха.',
33
+ arguments: [
34
+ { name: 'scope', description: 'Агент, площадка или период проверки' },
35
+ { name: 'question', description: 'На что обратить внимание' },
36
+ ],
37
+ render: (args) => `${COMMON_START}\n\nОбласть: ${args.scope ?? 'уточни после чтения доступного контекста'}\nФокус: ${args.question ?? 'качество и критические сбои'}\nИспользуй lifecycle аудита: запуск, статус, результат и доказательства. Pending/failed/unknown не называй завершением. Отделяй отсутствие evidence от нулевого результата.`,
38
+ },
39
+ {
40
+ name: 'besales_campaign_report',
41
+ title: 'Отчёт по рассылкам',
42
+ description: 'Собрать проверяемый отчёт по исходящим рассылкам и оплатам.',
43
+ arguments: [
44
+ { name: 'period', description: 'Период отчёта', required: true },
45
+ { name: 'filters', description: 'Воронка, канал, сегмент или кампания' },
46
+ ],
47
+ render: (args) => `${COMMON_START}\n\nПериод: ${args.period}\nФильтры: ${args.filters ?? 'нет'}\nСохрани ось cohort/period/entry и зерно recipient/channel. Для денег используй канонический total и сверку, unknown/unpriced не считай нулём. Назови источники, фильтры и ограничения полноты.`,
48
+ },
49
+ {
50
+ name: 'besales_diagnose',
51
+ title: 'Найти причину сбоя',
52
+ description: 'Диагностировать молчание бота, доставку, routing, RAG или job.',
53
+ arguments: [
54
+ { name: 'symptom', description: 'Наблюдаемый симптом', required: true },
55
+ { name: 'object', description: 'Контакт, сообщение, агент или operation ID' },
56
+ ],
57
+ render: (args) => `${COMMON_START}\n\nСимптом: ${args.symptom}\nОбъект: ${args.object ?? 'не указан'}\nСобери связанные факты по времени: mute/silence/operator state, routing/model, RAG, trigger/action, transport и delivery либо lifecycle job. Не угадывай причину. Если исход мутации неизвестен, верни OUTCOME_UNKNOWN и исполнимую проверку вместо совета повторить.`,
58
+ },
59
+ ];
60
+ export function listRegisteredPrompts(registeredPrompts = prompts) {
61
+ return {
62
+ prompts: registeredPrompts.map(({ name, title, description, arguments: promptArguments }) => ({
63
+ name,
64
+ title,
65
+ description,
66
+ arguments: promptArguments ? [...promptArguments] : undefined,
67
+ })),
68
+ };
69
+ }
70
+ export function getRegisteredPrompt(name, args = {}, registeredPrompts = prompts) {
71
+ const prompt = registeredPrompts.find((candidate) => candidate.name === name);
72
+ if (!prompt)
73
+ throw new McpError(ErrorCode.InvalidParams, `Prompt not found: ${name}`);
74
+ const missing = prompt.arguments?.filter((argument) => argument.required && !args[argument.name]);
75
+ if (missing?.length) {
76
+ throw new McpError(ErrorCode.InvalidParams, `Missing required prompt arguments: ${missing.map((argument) => argument.name).join(', ')}`);
77
+ }
78
+ return {
79
+ description: prompt.description,
80
+ messages: [{ role: 'user', content: { type: 'text', text: prompt.render(args) } }],
81
+ };
82
+ }
83
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/prompts/registry.ts"],"names":[],"mappings":"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"}
@@ -38,10 +38,13 @@
38
38
  **`READ_ONLY`** — у тебя нет прав на запись в файл. Воркфлоу:
39
39
  1. `besales_feedback_sheet_read` → проанализируй замечания, сгруппируй по смыслу.
40
40
  2. Сформулируй конкретные правки промпта.
41
- 3. `besales_prompt_iterate_get_instructions` — замечания тестировщиков положи в
42
- `feedback.general_comments` и `feedback.selections`.
43
- 4. Локально выполни stages → `besales_prompt_iterate_submit` → покажи пользователю preview.
44
- 5. **Дождись подтверждения пользователя** → `besales_prompt_finalize`.
41
+ 3. `besales_prompt_patch_start` → создай черновик и прочитай текущий промпт целиком через
42
+ `besales_prompt_patch_get`.
43
+ 4. Собери точечные patch-операции и примени их через `besales_prompt_patch_apply`.
44
+ Проверь `appliedCount`, `skippedCount` и diff; при необходимости перечитай черновик.
45
+ 5. Покажи пользователю итоговые изменения. **После явного подтверждения пользователя** вызови
46
+ `besales_prompt_patch_commit`. Если подтверждения нет, черновик можно удалить через
47
+ `besales_prompt_patch_discard`.
45
48
 
46
49
  Никогда не финализируй промпт без явного согласия пользователя. В файл при `READ_ONLY`
47
50
  ничего не пиши — доступа нет.
@@ -11,6 +11,9 @@ Claude должен учитывать несколько принципов:
11
11
  - Multi-agent маршруты должны быть детерминированными там, где это возможно, и LLM-assisted только для классификации intent или ambiguity resolution.
12
12
  - Sandbox должен проверять handoff behavior без реального перевода клиента в production queue.
13
13
 
14
- В рамках Track D нет отдельного MCP tool для универсального handoff. Этот resource нужен как контекст для prompt generation, analysis и sandbox findings. Если пользователь просит улучшить routing/handoff, Claude должен формулировать требования к агенту и подсвечивать, какие проверки нужно прогнать в sandbox, а не вызывать несуществующий hidden action.
14
+ Для настройки маршрутизации доступны `besales_router_update` и
15
+ `besales_routing_rule_upsert`; действия триггера, включая передачу оператору, настраивает
16
+ `besales_trigger_upsert`. Это конфигурация будущего поведения, а не немедленный перевод живого
17
+ диалога. После правки перечитай конфигурацию и проверь маршрут в sandbox.
15
18
 
16
19
  Практическое правило: handoff считается хорошим, если пользователь понимает, почему его переводят, следующий обработчик получает достаточный контекст, а audit trail объясняет причину решения.
@@ -6,11 +6,17 @@ Sandbox в Besales — это контролируемый прогон аген
6
6
 
7
7
  Для Claude важна последовательность:
8
8
 
9
- 1. Запустить sandbox run через `besales_sandbox_run_start`.
10
- 2. Получить или дождаться результатов run в backend/UI.
11
- 3. Вызвать `besales_sandbox_findings_get_instructions`, если нужно проанализировать findings.
9
+ 1. Запустить sandbox run через `besales_sandbox_run_start` и сохранить `run_id`.
10
+ 2. Проверять этот run через `besales_sandbox_run_get` с интервалом 10–30 секунд до
11
+ `COMPLETED`, `FAILED` или `CANCELLED`. Для истории используй постраничный
12
+ `besales_sandbox_run_list`; отмена — `besales_sandbox_run_cancel`.
13
+ 3. Только после `COMPLETED` вызвать `besales_sandbox_findings_get_instructions`.
12
14
  4. Локально выполнить stages: сгруппировать проблемы, оценить severity, предложить улучшения.
13
- 5. Отправить результат через `besales_sandbox_findings_submit`.
15
+ 5. Отправить результат через `besales_sandbox_findings_submit`. Человеческую оценку при
16
+ необходимости сохранить отдельно через `besales_sandbox_run_feedback`.
17
+
18
+ `passRate` показывает лишь долю ходов с непустым ответом. Для качества отдельно проверяй
19
+ `checksRate`, `qualityRate`, наличие rubric/expectations и актуальность проверенной версии.
14
20
 
15
21
  ## Режимы клиента: scripted и simulated
16
22
 
@@ -21,7 +27,10 @@ Sandbox в Besales — это контролируемый прогон аген
21
27
 
22
28
  Один прогон = один режим. «Прогнать оба режима» = два вызова `besales_sandbox_run_start`.
23
29
 
24
- **Правило для Claude:** когда пользователь просит «запусти sandbox / прогон», сначала **уточни режим** — scripted, simulated или оба (по умолчанию предлагай оба). Молча режим не выбирай. Заодно уместно уточнить охват сценариев (все или часть).
30
+ Выбирай режим по цели. Для детерминированной регрессии используй `scripted` по умолчанию;
31
+ для исследования поведения персоны — `simulated`; для широкой проверки можно предложить оба.
32
+ Уточнение обязательно только когда цель не позволяет выбрать безопасно или стоимость/охват
33
+ заметно различаются. Обычный regression-прогон не нужно останавливать лишним вопросом.
25
34
 
26
35
  В findings: если симулированный клиент ушёл с `outcome: refused` или `endReason: gave_up` — это не автоматически провал агента; оценивай по тексту диалога.
27
36
 
@@ -4,7 +4,10 @@ Actions и triggers описывают управляемые действия
4
4
 
5
5
  Trigger — это событие или условие, которое запускает действие: intent в диалоге, значение переменной, изменение pipeline/status, ручной запуск или системный workflow. Action — декларативная конфигурация шага: отправить сообщение, установить переменную, вызвать CRM-операцию, передать диалог оператору, инициировать routing или другой безопасный side effect.
6
6
 
7
- Для Claude Desktop это reference resource, а не action surface. MCP tools из Track D не дают прямой универсальный `run_trigger` tool: пользовательские side effects должны идти через конкретные `/api/v2/*` endpoints и backend governance. Если пользователь просит "добавь триггер", Claude должен использовать это описание как терминологический контекст и перейти к соответствующим UI/API задачам, а не пытаться вызвать скрытый trigger напрямую.
7
+ Для настройки доступны `besales_trigger_upsert` и `besales_trigger_delete`; они меняют
8
+ декларативную конфигурацию, но не запускают произвольный trigger над живым контактом. Перед
9
+ записью прочитай текущие actions, сохрани полный снимок и используй схему нужного action type.
10
+ Исполнение в production остаётся за серверной оркестрацией с её правами и governance.
8
11
 
9
12
  Связанные идеи:
10
13
 
@@ -13,4 +16,5 @@ Trigger — это событие или условие, которое запу
13
16
  - Sandbox проверяет effects через sandbox ports, не через production side effects.
14
17
  - Handoff и routing являются отдельными управляемыми flows, а не свободным текстовым "переключи агента".
15
18
 
16
- Практическое правило: Claude может объяснять и проектировать triggers/actions, но исполнять должен только конкретные MCP tools или backend endpoints, которые явно есть в contract.
19
+ Практическое правило: проектируй и записывай конфигурацию только объявленными MCP tools;
20
+ не обещай немедленный side effect, если инструмент лишь меняет правило на будущее.