@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
@@ -29,9 +29,8 @@ KnowledgeDocument / ICP samples). Структура файла у разных
29
29
  Для Google Sheets — сразу шаг 2 с URL.
30
30
 
31
31
  Для xlsx:
32
- 1. Залей файл через **существующий files endpoint** (`POST /api/v2/files` с
33
- multipart) — это **не** workbook MCP tool, это общий files upload.
34
- 2. В ответе получишь `storedFileId`.
32
+ 1. Вызови `besales_file_upload_request` и передай человеку полученный browser upload URL.
33
+ 2. После загрузки проверь `besales_file_upload_status`; из результата возьми `storedFileId`.
35
34
 
36
35
  Сам workbook MCP **не** загружает файлы — он только инспектирует уже
37
36
  загруженные. Это разделение позволяет переиспользовать SourceWorkbook для
@@ -55,6 +54,13 @@ besales_workbook_inspect({
55
54
  `hyperlinkStats[]` (per-column число amoCRM lead/contact ссылок),
56
55
  `truncated` (применён ли лимит).
57
56
 
57
+ `inspect` — только инвентаризация и sample. Для Google Sheets точный total может быть
58
+ неизвестен (`rowCount`/`columnCount = null`, `dimensionsKnown=false`). `readError` означает
59
+ ошибку чтения конкретного листа, а не пустой лист. Дочитывай нужные страницы через
60
+ `besales_workbook_sheet_read`: для каждого `columnOffset` пройди строки до
61
+ `scanUpperBoundRowCount`, затем сбрось `rowOffset` в 0 и перейди к `nextColumnOffset` до
62
+ `scanUpperBoundColumnCount`. Пустая страница внутри этой области не означает конец листа.
63
+
58
64
  **Если Google Sheets вернул 403 (`error: google_sheets_not_shared`)** — покажи
59
65
  пользователю `serviceAccountEmail` из response и попроси расшарить таблицу
60
66
  на этот email (Viewer достаточно для чтения). Без этого никакие операции не
@@ -100,22 +106,20 @@ besales_workbook_inspect({
100
106
  2 + router?». По его ответу — либо `besales_agent_create` + `besales_router_update`
101
107
  + `besales_trigger_upsert`, либо склей в один промпт.
102
108
 
103
- ## Шаг 5 — Извлечение lead_ids из диалог-индекса (regex локально)
109
+ ## Шаг 5 — Извлечение lead_ids из диалог-индекса
104
110
 
105
- Для `dialogue_corpus_with_amocrm_links` — **не зови отдельный MCP tool**. Данные
106
- уже в `inspect` response (`sampleRows[][]`). Прогони regex по `cell.value`,
107
- `cell.hyperlink`, `cell.formula`:
111
+ Для `dialogue_corpus_with_amocrm_links` вызови
112
+ `besales_workbook_extract_amocrm_leads`: он читает вкладку целиком до явного hard cap и
113
+ возвращает координаты найденных ссылок. Не извлекай полный набор из `inspect.sampleRows`.
108
114
 
109
115
  ```
110
116
  /https?:\/\/[\w-]+\.amocrm\.ru\/leads\/detail\/(\d+)/ → leadId
111
117
  /https?:\/\/[\w-]+\.amocrm\.ru\/contacts\/detail\/(\d+)/ → contactId
112
118
  ```
113
119
 
114
- Поддерживается любой amoCRM поддомен (`aslzar`, `acme-crm`, и т.д.). Если в
115
- inspect-sample слишком мало строк — попроси `inspect` повторно с большим
116
- `sample_rows_per_sheet` (до 50). Если и этого мало — обрати внимание что для
117
- больших таблиц извлечение в полном объёме сейчас не покрыто отдельным
118
- helper-tool'ом; в Phase 1 это покрывается доступным sample'ом.
120
+ Поддерживается любой amoCRM поддомен (`aslzar`, `acme-crm`, и т.д.). Если
121
+ `truncated=true`, сообщи о hard cap и не называй результат полным. Для иных правил и ссылок
122
+ используй общее постраничное чтение `besales_workbook_sheet_read`.
119
123
 
120
124
  ## Шаг 6 — `besales_workbook_to_knowledge_document` (bulk knowledge)
121
125
 
@@ -158,7 +162,7 @@ path** (потому что названия вкладок содержат к
158
162
  Для `product_knowledge_compact` НЕ зови `besales_workbook_to_knowledge_document`.
159
163
  Вместо этого:
160
164
 
161
- 1. Прочитай sample вкладки из `inspect` response.
165
+ 1. Дочитай вкладку через `besales_workbook_sheet_read`; sample из inspect недостаточен.
162
166
  2. Сам сделай LLM-выжимку: возьми ключевые факты, сожми в markdown ≤8k chars.
163
167
  Формат:
164
168
  ```
@@ -176,8 +180,8 @@ path** (потому что названия вкладок содержат к
176
180
  После того как все вкладки разобраны:
177
181
 
178
182
  ```
179
- PATCH /api/v2/workspaces/:wsId/workbooks/:id/classification
180
- body: {
183
+ besales_workbook_classification_update({
184
+ workbook_id: "<uuid>",
181
185
  classification: [
182
186
  { sheetTitle: "Свод", detectedKind: "metadata_summary", destination: "ignored" },
183
187
  { sheetTitle: "Все разговоры", detectedKind: "dialogue_corpus_with_amocrm_links",
@@ -188,7 +192,7 @@ body: {
188
192
  destination: "knowledge_document", mappedEntityId: "<kd-id>" },
189
193
  { sheetTitle: "Задачи", detectedKind: "tasks_log", destination: "ignored" }
190
194
  ]
191
- }
195
+ })
192
196
  ```
193
197
 
194
198
  Это даёт audit trail («откуда взялся этот факт») и позволяет потом
@@ -196,7 +200,7 @@ body: {
196
200
 
197
201
  ## Шаг 9 — Архивация (когда больше не нужен)
198
202
 
199
- `POST /api/v2/workspaces/:wsId/workbooks/:id/archive` — soft delete.
203
+ `besales_workbook_archive({workbook_id, explicit_confirmation: true})` — soft delete.
200
204
  KnowledgeDocument'ы остаются (благодаря `onDelete: SetNull`), просто теряют
201
205
  ссылку на workbook. Hard delete для SourceWorkbook не предусмотрен —
202
206
  provenance не должна теряться.
@@ -205,7 +209,8 @@ provenance не должна теряться.
205
209
 
206
210
  > Заказчик прислал `Сухбатлар тахлили 100+100-2.xlsx` (7 вкладок).
207
211
 
208
- 1. User загружает xlsx через `/api/v2/files` → `storedFileId = abc123`.
212
+ 1. `besales_file_upload_request` → пользователь загружает xlsx в браузере →
213
+ `besales_file_upload_status` возвращает `storedFileId = abc123`.
209
214
  2. `besales_workbook_inspect({stored_file_id: "abc123"})` →
210
215
  - `workbook.id = wb-1` создан
211
216
  - 7 вкладок: Свод (6 строк), Все разговоры (435 строк), Плохие (101),
@@ -218,7 +223,7 @@ provenance не должна теряться.
218
223
  - Критерии → `behavior_rules` (2 параллельные колонки!)
219
224
  - Регламенты → `product_knowledge_bulk` (53k chars)
220
225
  - Задачи → `tasks_log` (ignore)
221
- 4. Regex по sampleRows[Все разговоры].column[2] → 124 leadId.
226
+ 4. `besales_workbook_extract_amocrm_leads` по вкладке «Все разговоры» → 124 leadId.
222
227
  5. `besales_icp_import_dialogues mode=audio audio_source_type=amocrm_leads` с
223
228
  этими leadId.
224
229
  6. `AskUserQuestion`: «В Критериях вижу 2 параллельных набора правил (звонок 1
@@ -228,7 +233,7 @@ provenance не должна теряться.
228
233
  8. `besales_workbook_to_knowledge_document({workbook_id: "wb-1",
229
234
  sheet_title: "Регламенты продаж", namespace: "aslzar-product-knowledge"})`.
230
235
  9. `besales_agent_update` — добавить knowledge_space_id в `knowledge_space_ids` агента (UUID, не cleanNamespace).
231
- 10. `PATCH /workbooks/wb-1/classification` — зафиксировать решения.
236
+ 10. `besales_workbook_classification_update` — зафиксировать решения.
232
237
 
233
238
  ## Что НЕ делать
234
239
 
@@ -237,5 +242,5 @@ provenance не должна теряться.
237
242
  каждый запрос инференса. Большие материалы → в KnowledgeDocument.
238
243
  - ❌ Не создавай агентов / промпты / документы без подтверждения user'а для
239
244
  high-impact операций (новый агент, router rule).
240
- - ❌ Не пытайся найти tool типа `besales_workbook_to_facts` — его нет. Compact
245
+ - ❌ Для записи compact facts нет отдельного workbook-tool. Используй
241
246
  knowledge ты сам сжимаешь LLM-вызовом и кладёшь через `besales_agent_facts_set`.
@@ -0,0 +1,20 @@
1
+ # Рассылки и кампании
2
+
3
+ ## Подготовка
4
+
5
+ Разделяй сущности: mailing variant хранит текст, schedule — правило отбора и время, launch/run —
6
+ конкретный запуск, cohort — снимок аудитории запуска. Доступный набор операций всегда сверяй с
7
+ `besales://docs/tools-catalog`.
8
+
9
+ ## Аналитика
10
+
11
+ `besales_broadcast_analytics_get` — канонический исходящий отчёт; `besales_broadcast_cohorts_list`
12
+ — перечень запусков. Сохраняй оси cohort/period/entry и зерно recipient/channel. Не считай число
13
+ сообщений числом людей и не выдавай исходящую аналитику за входящую.
14
+
15
+ ## Запись и запуск
16
+
17
+ Если линия предоставляет mailing/schedule tools, сначала создай выключенную конфигурацию, затем
18
+ получи preview, проверь ограничения, окно, каналы и дедуп, и только после явного подтверждения
19
+ включай или запускай. При pause/timeout/UNKNOWN сначала читай run/status; повтор может написать
20
+ человеку второй раз.
@@ -0,0 +1,19 @@
1
+ # Follow-up и дожимы
2
+
3
+ ## Чтение
4
+
5
+ Начни с `besales_followup_sequence_list`. Для редактирования одной цепочки запроси её полный config;
6
+ список без config — только инвентаризация. Статистика шага — `besales_followup_step_stats`, реакции
7
+ — `besales_followup_reactions`.
8
+
9
+ ## Изменение
10
+
11
+ `besales_followup_sequence_upsert` заменяет конфигурацию цепочки целиком. Сохрани все существующие
12
+ шаги, условия и exclusions. Клонирование — `besales_followup_sequence_clone`; наличие отдельной
13
+ правки текста шага проверяй по динамическому каталогу текущей линии.
14
+
15
+ ## Безопасная проверка
16
+
17
+ Перед отправкой живому человеку используй funnel-test plan, если его инструменты есть в каталоге,
18
+ покажи transports, тексты, skip reasons и truncated, затем запускай только с явным подтверждением.
19
+ Timeout или UNKNOWN не разрешает повторную отправку без status.
@@ -6,9 +6,9 @@
6
6
 
7
7
  ## 1. Назначение
8
8
 
9
- `Platform` — это «канал», через который бот общается с пользователями. Каждая платформа — один внешний account/bot/instance. Animaly поддерживает **11 типов** платформ (`PlatformType`): Telegram Bot, Telegram Personal, Wazzup (WhatsApp), Avito, Instagram DM, VKontakte, SmsGorod (SMS), Web Widget, Bitrix24 Bot, Salebot и **GetCourse**.
9
+ `Platform` — это «канал», через который бот общается с пользователями. Каждая платформа — один внешний account/bot/instance. Animaly поддерживает **13 типов** платформ (`PlatformType`): Telegram Bot, Telegram Personal, Wazzup (WhatsApp), Avito, Instagram DM, VKontakte, SmsGorod (SMS), Web Widget, Bitrix24 Bot, Salebot, **GetCourse**, Telephony и External API.
10
10
 
11
- > Ранее в обзорной части документации фигурировало «10 каналов» — это устаревшая цифра. GetCourse — отдельный полноценный адаптер с собственным контроллером (`/api/getcourse/webhook/:platformId/:secret/...`), и его нужно учитывать при настройке.
11
+ > Старые цифры «10» и «11» устарели. GetCourse, Telephony и External API — самостоятельные значения `PlatformType`. Наличие типа в runtime не означает, что MCP умеет провизионировать его: актуальный поддерживаемый набор возвращает схема `besales_platform_create_init`.
12
12
 
13
13
  ## 2. Общая структура `Platform`
14
14
 
@@ -0,0 +1,18 @@
1
+ # Маршрутизация агентов
2
+
3
+ ## Контекст
4
+
5
+ Сначала прочитай `besales_platform_context_get` и список агентов площадки. Routing нужен, когда
6
+ входящий диалог должен выбирать между несколькими агентами; одиночному агенту отдельное правило
7
+ не добавляй без причины.
8
+
9
+ ## Настройка
10
+
11
+ Правило создаётся или обновляется через `besales_routing_rule_upsert`, затем состояние роутера —
12
+ через `besales_router_update`. Условие, приоритет, fallback и активность проверяй по ответу
13
+ контекста, не по памяти предыдущей сессии.
14
+
15
+ ## Проверка
16
+
17
+ Тестируй каждого агента отдельно и систему целиком в workflow sandbox со сценариями, где тема
18
+ меняется по ходу диалога. Успех одного агента не доказывает правильный выбор роутером.
@@ -0,0 +1,30 @@
1
+ # Состояние длительной задачи
2
+
3
+ `besales-mcp` хранит задачи локально в `~/.besales-mcp/tasks-v1.json`. Claude Desktop, Claude Code
4
+ и Codex на одной машине под одним OS-аккаунтом видят один набор. Автоматической синхронизации между
5
+ компьютерами нет. В файл нельзя помещать credentials, setup-секреты и исходные диалоги.
6
+
7
+ ## Жизненный цикл
8
+
9
+ 1. Создай задачу через `besales_task_create`: зафиксируй цель, ограничения, ссылки на объекты,
10
+ checkpoints, ожидающие операции и следующее действие человека.
11
+ 2. При паузе обнови её через `besales_task_update` с текущим `expected_version`.
12
+ 3. Для «продолжить» вызови `besales_task_list`, выбери `task_id` явно и прочитай
13
+ `besales_task_get`. Самая свежая запись не выбирается автоматически.
14
+ 4. Перед новой мутацией вызови `besales_workspace_current`, перечитай объекты из `object_refs` и
15
+ статусы `pending_operations`. Сохранённое состояние — контекст, а не доказательство.
16
+ 5. Заверши задачу через `besales_task_close`. Удали локальную запись через `besales_task_delete`
17
+ только с точной версией и `explicit_confirmation=true`.
18
+
19
+ Статусы: `ACTIVE`, `COMPLETED`, `CANCELLED`, `EXPIRED`. Только `ACTIVE` можно менять. По умолчанию
20
+ TTL равен 30 дням; допустимо 1–180. Истёкшая запись остаётся видимой до явного удаления.
21
+
22
+ ## Конкуренция и неизвестный исход
23
+
24
+ Каждая запись имеет монотонную `version`. Конфликт `TASK_VERSION_CONFLICT` означает, что другая
25
+ сессия уже изменила задачу: перечитай её и согласуй свежий payload. Межпроцессная блокировка и
26
+ атомарная замена файла не дают двум сессиям принять одну старую версию.
27
+
28
+ Для `OUTCOME_UNKNOWN` сохрани `idempotency_key`, `object_ref` и `verify_with`. Не повторяй мутацию
29
+ автоматически: сначала найди receipt или status. Setup URL и состояние async job остаются своими
30
+ сущностями и не заменяют общую задачу.
@@ -0,0 +1,28 @@
1
+ # Триггеры и действия
2
+
3
+ ## С чего начать
4
+
5
+ Прочитай `besales_platform_context_get`: он возвращает триггеры и полный набор их actions. Для
6
+ изменения одного действия сохрани остальные и передай полный массив только с
7
+ `replace_actions=true`. Неполный или усечённый снимок нельзя использовать для замены.
8
+
9
+ ## Конфигурация действия
10
+
11
+ У каждого `actionType` свой ключ конфига. Не угадывай его: вызови
12
+ `besales_trigger_action_catalog_get` с нужным `action_type`. Ответ содержит текущую JSON-схему,
13
+ минимальный валидный пример, точное имя config-поля, имя relation в ответе, зависимости, эффект
14
+ и способ проверки. В ответе API имя связи может отличаться от имени входа; MCP нормализует
15
+ известные пары.
16
+
17
+ ## Запись и проверка
18
+
19
+ Создание/правка — `besales_trigger_upsert`, удаление — `besales_trigger_delete`. Внешние действия,
20
+ отправка, CRM, operator handoff и полная замена требуют явного подтверждения по схеме инструмента.
21
+ После записи перечитай `besales_platform_context_get` и сравни actionType, порядок, enabled и весь
22
+ конфиг. `run_once_per_contact` и `allow_repeated_calls` — разные оси.
23
+
24
+ ## Ошибки
25
+
26
+ 400 по неизвестному полю означает несовпадение схемы, а не повод перебрать названия. Отсутствие
27
+ конфига у обязательного действия должно останавливать запись. Для одноразового trigger право
28
+ контакта проверяется через claim tools только когда они есть в динамическом каталоге линии.
@@ -0,0 +1,18 @@
1
+ # Переменные
2
+
3
+ ## Область и выбор
4
+
5
+ `besales_variable_list` читает переменные в scope WORKSPACE или CHANNEL. Используй пагинацию до
6
+ явного завершения и выбирай по имени; UUID нужен только следующему инструменту. CHANNEL требует
7
+ scope_id конкретной площадки.
8
+
9
+ ## Операции
10
+
11
+ - `besales_variable_get` — полный объект.
12
+ - `besales_variable_create` — новая переменная.
13
+ - `besales_variable_update` — правка выбранной переменной.
14
+ - `besales_variable_delete` — удаление с подтверждением.
15
+ - `besales_agent_variable_overrides_get` — полный снимок overrides агента перед заменой.
16
+
17
+ После записи перечитай объект. Не смешивай workspace variables `{{{name}}}` и channel custom
18
+ variables `{name}`; overrides агента заменяются полным набором.
@@ -1,5 +1,8 @@
1
1
  import { readFile } from 'node:fs/promises';
2
- import { getResourceContracts } from '../tools/contracts.js';
2
+ import { getActiveToolContracts, getResourceContracts, } from '../tools/contracts.js';
3
+ import { isEnvelopeEnabled, shapeResourceText } from '../tools/result-envelope.js';
4
+ import { toolInventoryCategoryKey } from '../tools/inventory.js';
5
+ import { readPackageVersion } from '../package-metadata.js';
3
6
  // URI → относительный путь от `src/resources/` (включая подпапку).
4
7
  // concepts/* — справочники паттернов; workflows/* — orchestration-маршруты (v1.5 Increment 6a).
5
8
  const resourceFilesByUri = {
@@ -27,6 +30,12 @@ const resourceFilesByUri = {
27
30
  'besales://docs/pipeline-builder': 'docs/pipeline-builder.md',
28
31
  'besales://docs/files-and-uploads': 'docs/files-and-uploads.md',
29
32
  'besales://docs/pipeline-settings-deep': 'docs/pipeline-settings-deep.md',
33
+ 'besales://docs/trigger-actions': 'docs/trigger-actions.md',
34
+ 'besales://docs/variables': 'docs/variables.md',
35
+ 'besales://docs/routing': 'docs/routing.md',
36
+ 'besales://docs/follow-up': 'docs/follow-up.md',
37
+ 'besales://docs/campaigns': 'docs/campaigns.md',
38
+ 'besales://docs/task-state': 'docs/task-state.md',
30
39
  // Дистиллят принципов промптинга (человечность + sales-плейбук), переиспользуется между компаниями.
31
40
  'besales://docs/prompt-principles': 'docs/prompt-principles.md',
32
41
  // Тематические comm-скиллы — глубокие разборы боевых диалогов (Партии 1+3, разметка Антона).
@@ -40,10 +49,46 @@ const resourceFilesByUri = {
40
49
  'besales://docs/comm-anti-robot': 'docs/comm-anti-robot.md',
41
50
  'besales://docs/comm-tone-register': 'docs/comm-tone-register.md',
42
51
  };
52
+ const TOOL_CATALOG_URI = 'besales://docs/tools-catalog';
53
+ function renderToolCatalog() {
54
+ const grouped = new Map();
55
+ for (const tool of getActiveToolContracts()) {
56
+ const category = toolInventoryCategoryKey(tool.name);
57
+ const entries = grouped.get(category) ?? [];
58
+ entries.push({ name: tool.name, description: tool.description.split(/(?<=[.!?])\s/u)[0] ?? '' });
59
+ grouped.set(category, entries);
60
+ }
61
+ const sections = [...grouped.entries()]
62
+ .sort(([left], [right]) => left.localeCompare(right))
63
+ .map(([category, entries]) => `## ${category}\n\n${entries.map((tool) => `- \`${tool.name}\` — ${tool.description}`).join('\n')}`);
64
+ return [
65
+ '# Каталог инструментов Besales MCP',
66
+ '',
67
+ `Версия пакета: ${readPackageVersion()}. Инструментов: ${getActiveToolContracts().length}.`,
68
+ '',
69
+ 'Каталог построен из фактически публикуемого MCP-контракта. Для поиска по задаче используй `besales_help_search`.',
70
+ '',
71
+ ...sections,
72
+ '',
73
+ ].join('\n');
74
+ }
43
75
  function resourceUrl(relativePath) {
44
76
  return new URL(`./${relativePath}`, import.meta.url);
45
77
  }
46
78
  function createResource(contract) {
79
+ if (contract.uri === TOOL_CATALOG_URI) {
80
+ return {
81
+ ...contract,
82
+ async read() {
83
+ const text = renderToolCatalog();
84
+ return {
85
+ uri: contract.uri,
86
+ mimeType: contract.mimeType,
87
+ text: isEnvelopeEnabled() ? shapeResourceText(contract.uri, text) : text,
88
+ };
89
+ },
90
+ };
91
+ }
47
92
  const relativePath = resourceFilesByUri[contract.uri];
48
93
  if (!relativePath) {
49
94
  throw new Error(`Resource file mapping not found: ${contract.uri}`);
@@ -54,10 +99,14 @@ function createResource(contract) {
54
99
  description: contract.description,
55
100
  mimeType: contract.mimeType,
56
101
  async read() {
102
+ const text = await readFile(resourceUrl(relativePath), 'utf-8');
57
103
  return {
58
104
  uri: contract.uri,
59
105
  mimeType: contract.mimeType,
60
- text: await readFile(resourceUrl(relativePath), 'utf-8'),
106
+ // Справочник отдаётся целиком, одним чтением: самый тяжёлый весит 105 КБ. Потолок
107
+ // здесь — сеть безопасности от дальнейшего роста, а не инструмент сжатия: добрать
108
+ // отрезанное нечем, поэтому срабатывание означает «файл пора разделить».
109
+ text: isEnvelopeEnabled() ? shapeResourceText(contract.uri, text) : text,
61
110
  };
62
111
  },
63
112
  };
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/resources/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C,OAAO,EAAE,oBAAoB,EAAyB,MAAM,uBAAuB,CAAC;AAMpF,mEAAmE;AACnE,gGAAgG;AAChG,MAAM,kBAAkB,GAAqC;IAC3D,wBAAwB,EAAE,iBAAiB;IAC3C,6BAA6B,EAAE,sBAAsB;IACrD,4BAA4B,EAAE,qBAAqB;IACnD,4BAA4B,EAAE,qBAAqB;IACnD,uCAAuC,EAAE,gCAAgC;IACzE,oCAAoC,EAAE,6BAA6B;IACnE,4CAA4C,EAAE,qCAAqC;IACnF,iDAAiD,EAAE,0CAA0C;IAC7F,qCAAqC,EAAE,8BAA8B;IACrE,8CAA8C,EAAE,uCAAuC;IACvF,qDAAqD,EACnD,8CAA8C;IAChD,2CAA2C,EAAE,oCAAoC;IACjF,0CAA0C,EAAE,mCAAmC;IAC/E,oCAAoC,EAAE,6BAA6B;IACnE,gDAAgD,EAAE,yCAAyC;IAC3F,gGAAgG;IAChG,+BAA+B,EAAE,wBAAwB;IACzD,+BAA+B,EAAE,wBAAwB;IACzD,+BAA+B,EAAE,wBAAwB;IACzD,0BAA0B,EAAE,mBAAmB;IAC/C,gCAAgC,EAAE,yBAAyB;IAC3D,iCAAiC,EAAE,0BAA0B;IAC7D,kCAAkC,EAAE,2BAA2B;IAC/D,uCAAuC,EAAE,gCAAgC;IACzE,oGAAoG;IACpG,kCAAkC,EAAE,2BAA2B;IAC/D,6FAA6F;IAC7F,kGAAkG;IAClG,sCAAsC;IACtC,iCAAiC,EAAE,0BAA0B;IAC7D,+BAA+B,EAAE,wBAAwB;IACzD,sCAAsC,EAAE,+BAA+B;IACvE,mCAAmC,EAAE,4BAA4B;IACjE,+BAA+B,EAAE,wBAAwB;IACzD,gCAAgC,EAAE,yBAAyB;IAC3D,mCAAmC,EAAE,4BAA4B;CAClE,CAAC;AAEF,SAAS,WAAW,CAAC,YAAoB;IACvC,OAAO,IAAI,GAAG,CAAC,KAAK,YAAY,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CAAC,QAA0B;IAChD,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAEtD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,OAAO;QACL,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,KAAK,CAAC,IAAI;YACR,OAAO;gBACL,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,IAAI,EAAE,MAAM,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;aACzD,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAyB,oBAAoB,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/resources/registry.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,11 @@
6
6
 
7
7
  ## Шаг 1 — Осмотр
8
8
 
9
- - xlsx / Google Sheets: `besales_workbook_inspect` (вкладки, заголовки, типы колонок).
9
+ - xlsx: `besales_file_upload_request` → browser upload → `besales_file_upload_status` →
10
+ `besales_workbook_inspect`.
11
+ - Google Sheets: `besales_workbook_inspect` по URL.
12
+ - Inspect показывает инвентаризацию и sample. Нужные вкладки дочитай через
13
+ `besales_workbook_sheet_read`; `readError` не означает пустой лист.
10
14
  - Иначе: прочитай содержимое и классифицируй сам.
11
15
  - Глубже про таксономию вкладок — concept `besales://concepts/workbook-classification`.
12
16
 
@@ -34,3 +38,6 @@
34
38
  Документ редко = «одна сущность». Прайс-лист несёт и таблицу для RAG, и переменные
35
39
  (контакты), и иногда tone. Раскладывай по всем релевантным целям за один проход.
36
40
  Затем возвращайся в `besales://workflows/platform-setup-from-scratch`.
41
+
42
+ Перед записью результатов сохрани решения через `besales_workbook_classification_update`.
43
+ Архивируй исходник только по просьбе пользователя через `besales_workbook_archive`.
@@ -5,8 +5,10 @@
5
5
 
6
6
  ## Цикл
7
7
 
8
- 1. **Прогон.** `besales_sandbox_run_start` (на ICP test scenarios / personas).
9
- 2. **Анализ findings (external execution).**
8
+ 1. **Прогон.** `besales_sandbox_run_start` (на ICP test scenarios / personas), сохрани
9
+ `run_id`. Проверяй `besales_sandbox_run_get` каждые 10–30 секунд до терминального статуса;
10
+ при отмене вызови `besales_sandbox_run_cancel` и проверь тот же run повторно.
11
+ 2. **Анализ findings (external execution, только после `COMPLETED`).**
10
12
  - `besales_sandbox_findings_get_instructions` → локально проанализируй прогон →
11
13
  `besales_sandbox_findings_submit`.
12
14
  - Для персонажных симуляций: `besales_simulation_findings_get_instructions` /
@@ -23,6 +25,7 @@
23
25
 
24
26
  - Findings ниже порога серьёзности и нет регрессий между прогонами.
25
27
  - Ключевые ICP-сценарии проходят.
28
+ - `checksRate` и `qualityRate` проверены отдельно; один `passRate` не доказывает качество.
26
29
  - Не гонись за идеалом — после стабилизации иди в
27
30
  `besales://workflows/production-readiness-check`.
28
31
 
@@ -9,7 +9,8 @@ Backbone happy-path настройки с нуля по **6-фазной мод
9
9
 
10
10
  ## Шаг 0 — Ориентация (всегда)
11
11
 
12
- 1. `besales_workspace_overview` → прочитай `setupCompleteness` и `suggestedNextPhase`.
12
+ 1. `besales_workspace_navigate` с `intent=CREATE_BOT` и известным `bot_type` → получи один
13
+ адресный следующий шаг. Для полного снимка используй `besales_workspace_overview`.
13
14
  2. Если workspace частично настроен — **не начинай с нуля**, продолжи с `suggestedNextPhase`.
14
15
  3. Убедись, что выбран нужный workspace (`besales_workspace_current`; при необходимости
15
16
  `besales_workspace_use`).
@@ -65,13 +66,17 @@ Backbone happy-path настройки с нуля по **6-фазной мод
65
66
  а) построй структуру скрипта (этапы/ветки/реплики/переходы) → `besales_dialog_script_update`
66
67
  (поле `dialog_script` — SUMMARY/скелет; читать/сверять — `besales_dialog_script_get`);
67
68
  б) промпт: `besales_prompt_generate_get_instructions` → локально выполни стадии →
68
- `besales_prompt_generate_submit` → `besales_prompt_finalize` (§6 пиши НА ОСНОВЕ скрипта, но подробнее и независимо). Структура — `besales://docs/prompt-anatomy`.
69
+ `besales_prompt_generate_submit`. До `besales_prompt_finalize` передай полученный текст как
70
+ `candidate_prompt` в `besales_sandbox_run_start` с `mode=single_agent`; после COMPLETED + findings
71
+ сверь `testedConfiguration.promptContentHash` и только затем активируй отдельным finalize.
72
+ §6 пиши НА ОСНОВЕ скрипта, но подробнее и независимо. Структура — `besales://docs/prompt-anatomy`.
69
73
  3. `besales_behavior_update` — приветствие: ТОЛЬКО `bot_greeting` текстом, БЕЗ кнопок (дефолт
70
74
  «Привет!/Hello» → язык аудитории; для INBOUND открывает диалог). `greeting_buttons` opt-in — лишь
71
75
  по явному запросу; остальной behavior (persona/тон/typing) — фаза Enrich. `besales://docs/agent-behavior`.
72
76
  4. **Статика:** `besales_prompt_lint` + анализ `besales_prompt_analyze_get_instructions` /
73
77
  `besales_prompt_analyze_submit`.
74
78
  5. **Симуляция:** `besales_sandbox_run_start` по тест-сценариям (фаза 3) → findings → правки.
79
+ Черновик проверяй через `candidate_prompt`: это не меняет ответы работающего бота.
75
80
  Глубже — `besales://workflows/iterate-with-sandbox`.
76
81
  6. **Выбор модели (только здесь или по запросу — дорого):** `besales://workflows/compare-models`
77
82
  (`besales_model_catalog_list` → `besales_model_comparison_run_start` → `_get` → `_eval_submit`).
@@ -111,3 +116,86 @@ Backbone happy-path настройки с нуля по **6-фазной мод
111
116
  сразу показывает `'4'`. Для non-FAQ ботов сделай фазы 2 (ICP) и 3 (скрипт) ДО финализации промпта,
112
117
  даже если компас их пропустил. Сквозные правила (тест-рефлекс, Sheets-feedback, модели→фаза 4,
113
118
  мультиагент+роутер, ленивая CRM, гибкость) — в serverInstructions.
119
+
120
+ ## Маршруты обычных задач
121
+
122
+ Шесть фаз выше нужны для новой настройки. Свободный вопрос или точечная правка не запускают
123
+ полный мастер. Каждый маршрут начинается с `besales_workspace_current`, затем выбирает объект
124
+ обычным именем и заканчивается перечитыванием либо lifecycle-status.
125
+
126
+ ### Новый FAQ-бот
127
+
128
+ 1. Предусловие: канал `READY`; получить `platform,agent_summaries,readiness` через
129
+ `besales_platform_context_get`.
130
+ 2. Собрать темы ответов и ограничения; ICP предложить, но не делать gate.
131
+ 3. Создать агента, положить факты в Q&A/RAG, сгенерировать prompt и greeting.
132
+ 4. Создать FAQ-сценарии, выполнить sandbox, получить findings.
133
+ 5. Завершение: привязка агента/knowledge видна в context, run `COMPLETED`, quality policy
134
+ выполнена. Иначе назвать конкретный следующий tool и аргументы.
135
+
136
+ ### Новый sales-бот
137
+
138
+ Тот же путь, но до финализации обязательны релевантный ICP и скрипт диалога. CRM нужна только
139
+ если задача включает сделку, поля или стадии. Наличие строки CRM не доказывает live authorization:
140
+ проверить setup status/health и фактические pipelines.
141
+
142
+ ### Правка работающего агента
143
+
144
+ 1. `besales_agent_list(query=...)`; при нескольких совпадениях показать их и остановить выбор.
145
+ 2. `besales_agent_get`/`besales_prompt_patch_get` и полный относящийся к записи снимок.
146
+ 3. Изменить draft или одиночным `besales_prompt_batch_start` с idempotency key.
147
+ 4. Протестировать версию изолированно; commit/finalize — отдельный шаг.
148
+ 5. Перечитать agent/version. `skippedCount > 0`, lint failure или stale test не являются успехом.
149
+
150
+ ### Документ → знания, правила или ICP
151
+
152
+ Использовать `besales://workflows/extract-from-document`. Inspect/sample не равны полной вычитке.
153
+ Для другого языка сначала перечислить листы/разделы и дать саммари на языке диалога. Чтение
154
+ продолжается; перед записью чисел, процентов и условий получить подтверждение, если человек их
155
+ ещё не согласовал. Завершение: source fingerprint, сохранённая classification, созданные IDs и
156
+ повторное чтение связей.
157
+
158
+ ### CRM или 1С
159
+
160
+ CRM: `besales://workflows/connect-crm-from-scratch`; 1С/data source:
161
+ `besales://workflows/connect-datasource-from-scratch`. Browser setup поллится до `READY`.
162
+ После записи проверить live health/catalog/pipeline, а не только существование строки.
163
+
164
+ ### Follow-up
165
+
166
+ Прочитать полный config последовательности и ограничения площадки, затем
167
+ `besales_followup_sequence_upsert`. Проверить повторным list и статистикой шагов. Сезонная пауза,
168
+ disabled draft и отсутствие ожидаемого запуска различаются; closed dialogue не получает касаний.
169
+
170
+ ### Подготовка и проверка рассылки
171
+
172
+ Сначала preview/dry-run и полный список ошибок/контактов, потом явное подтверждение фактической
173
+ отправки. Сохранить `idempotency_key` до вызова, затем поллить соответствующий status. При
174
+ `OUTCOME_UNKNOWN` искать запуск по receipt/key и не повторять отправку.
175
+
176
+ ### Исходящая аналитика
177
+
178
+ `besales_broadcast_analytics_get`: передать период, `view=cohort|period|entry` и нужное зерно.
179
+ `summary.totals` — канонический общий итог денег; multichannel rows не суммировать повторно.
180
+ Исходящие метрики не доказывают отсутствие входящих сообщений.
181
+
182
+ ### Бот молчит или не доставил
183
+
184
+ 1. Выбрать контакт/сообщение по обычным данным; если MCP-пути чтения нет, честно назвать
185
+ unsupported и перейти в UI, не угадывать причину.
186
+ 2. По времени проверить mute/silence/operator status, routing/model, RAG evidence,
187
+ trigger/action execution, transport и delivery receipt.
188
+ 3. Отсутствие evidence назвать «не найдено свидетельство», а не нулём.
189
+ 4. Завершение — одна доказанная причина либо перечень точных недостающих данных.
190
+
191
+ ### Аудит
192
+
193
+ `besales://workflows/audit-dialogues`: start → status → result/findings. Pending/failed/unknown
194
+ не становятся success; доказательства маскируются и не копируются без необходимости.
195
+
196
+ ### Продолжение после ошибки
197
+
198
+ 401 → reconnect конкретного workspace; 403 → добавить названный scope, сохранив прежние;
199
+ 410 → новый get_instructions; 422 → исправить поля; 429 → ждать `retryAfter`; timeout/5xx
200
+ неидемпотентной мутации → `OUTCOME_UNKNOWN`, receipt/status/list. Перед продолжением перечитать
201
+ объект и права: сохранённый план не заменяет свежую проверку.
@@ -1,31 +1,35 @@
1
1
  # Workflow: Production Readiness Check
2
2
 
3
- Финальная проверка перед запуском бота. Опирается на `besales_workspace_overview` →
4
- `setupCompleteness`. Формируй список «готово / недоделано», не блокируй жёстко —
5
- часть пунктов опциональна по бизнес-цели.
3
+ Финальная проверка перед запуском бота. Workspace overview нужен для выбора площадки, но
4
+ `besales_agent_readiness_get` проверяет конкретного агента. Сейчас API не фиксирует полную
5
+ версию зависимых настроек и возвращает `NOT_PROVEN`, даже если промпт и quality evidence
6
+ актуальны. Не обещай, что повтор sandbox даст `READY`. Часть бизнес-возможностей остаётся опциональной.
6
7
 
7
8
  ## Шаг 1 — Снимок
8
9
 
9
- `besales_workspace_overview` → читай `setupCompleteness`. При необходимости детали:
10
- `besales_platform_context_get` (по конкретному каналу), `besales_agent_list`.
10
+ `besales_workspace_overview` → выбери канал → `besales_agent_list` → выбери агента →
11
+ `besales_agent_readiness_get`. Для drill-down используй `besales_platform_context_get`.
11
12
 
12
- ## Чеклист (по `setupCompleteness`, поля camelCase)
13
+ ## Чеклист (по readiness выбранного агента)
13
14
 
14
15
  **Блокирующее (должно быть):**
15
- - `channelsConnected ≥ 1` и нет залипших `channelsPending`. Канал `isActive` + AI включён.
16
- - `hasAnchorAgent` — агент существует, с непустым промптом (проверь `besales_prompt_lint`)
17
- и приветствием (`besales_behavior_update`).
16
+
17
+ - `channelActive`, `aiEnabled`, `promptConfigured`, `promptHashInvariant`, `greetingConfigured`.
18
+ - `knowledgeLinked`: все объявленные namespace существуют в workspace.
19
+ - `icp.passed`: ICP обязателен для sales/qualification/reactivation.
20
+ - `sandbox.status=COMPLETED`, `configurationCurrent=true`, `findingsStatus=SUBMITTED`,
21
+ `qualityRate ≥ policy.minQualityRate`, `checksRate ≥ policy.minChecksRate` и есть expectations.
22
+ Сейчас `configurationCurrent=null`: `promptAndAgentCurrent` проверяет только промпт и запись
23
+ агента, а `unverifiedDependencies` перечисляет непроверенные зависимости. Это блокирует общий
24
+ положительный вердикт, даже при `promptAndAgentCurrent=true`.
18
25
 
19
26
  **Сильно рекомендуется:**
20
- - `hasKnowledge` И `knowledgeLinkedToChannel` — knowledge не просто загружен, а **привязан**
21
- к каналу (`besales_knowledge_space_channel_link_upsert`). «Загружен но не связан» = агент не видит.
22
- - `lastSandboxRunAt` не null — прогонялся sandbox, findings закрыты
23
- (см. `besales://workflows/iterate-with-sandbox`).
24
-
25
- **По типу бота:**
26
- - **sales / qualification / booking** → `hasIcp` должен быть true. Для таких ботов ICP —
27
- не опция, а условие качества (без него промпт generic). Если false — это «недоделано».
28
- - **FAQ / support** → ICP опционален, `hasIcp=false` не блокирует.
27
+ - `passRate` — только живучесть. Даже 1.0 не заменяет quality/checks/findings.
28
+ - `crmAuthorization=NOT_EVALUATED` означает, что live-доступ CRM надо проверить отдельно,
29
+ когда CRM входит в цель запуска.
30
+
31
+ `NOT_PROVEN` — нормальный честный исход. Выполни адресные пункты `missing`, затем перечитай
32
+ readiness: сохранённый ответ не заменяет свежую проверку объекта и прав.
29
33
 
30
34
  **По бизнес-цели (опционально — НЕ «недоделано» если не нужно):**
31
35
  - Triggers / follow-ups: `besales_trigger_upsert` / `besales_followup_sequence_upsert`.