@besales/mcp 0.45.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.
- package/README.md +96 -55
- package/dist/auth/connection-store.d.ts +21 -1
- package/dist/auth/connection-store.js +46 -2
- package/dist/auth/connection-store.js.map +1 -1
- package/dist/auth/oauth-client.d.ts +5 -1
- package/dist/auth/oauth-client.js +22 -12
- package/dist/auth/oauth-client.js.map +1 -1
- package/dist/cli.js +14 -5
- package/dist/cli.js.map +1 -1
- package/dist/http/api-client.d.ts +16 -1
- package/dist/http/api-client.js +50 -2
- package/dist/http/api-client.js.map +1 -1
- package/dist/instructions/server-instructions.d.ts +4 -13
- package/dist/instructions/server-instructions.js +68 -274
- package/dist/instructions/server-instructions.js.map +1 -1
- package/dist/prompts/registry.d.ts +15 -0
- package/dist/prompts/registry.js +83 -0
- package/dist/prompts/registry.js.map +1 -0
- package/dist/resources/concepts/feedback-sheets.md +7 -4
- package/dist/resources/concepts/handoff.md +4 -1
- package/dist/resources/concepts/sandbox.md +14 -5
- package/dist/resources/concepts/triggers.md +6 -2
- package/dist/resources/concepts/workbook-classification.md +26 -21
- package/dist/resources/docs/campaigns.md +20 -0
- package/dist/resources/docs/crm-integration.md +3 -1
- package/dist/resources/docs/follow-up.md +19 -0
- package/dist/resources/docs/platforms.md +2 -2
- package/dist/resources/docs/routing.md +18 -0
- package/dist/resources/docs/task-state.md +30 -0
- package/dist/resources/docs/trigger-actions.md +28 -0
- package/dist/resources/docs/variables.md +18 -0
- package/dist/resources/registry.js +51 -2
- package/dist/resources/registry.js.map +1 -1
- package/dist/resources/workflows/compare-models.md +4 -3
- package/dist/resources/workflows/connect-crm-from-scratch.md +8 -0
- package/dist/resources/workflows/extract-from-document.md +8 -1
- package/dist/resources/workflows/iterate-with-sandbox.md +5 -2
- package/dist/resources/workflows/platform-setup-from-scratch.md +90 -2
- package/dist/resources/workflows/production-readiness-check.md +22 -18
- package/dist/schemas/mcp-tools.json +1537 -177
- package/dist/server.d.ts +2 -0
- package/dist/server.js +8 -2
- package/dist/server.js.map +1 -1
- package/dist/tasks/task-state-store.d.ts +68 -0
- package/dist/tasks/task-state-store.js +278 -0
- package/dist/tasks/task-state-store.js.map +1 -0
- package/dist/tools/annotations.d.ts +7 -0
- package/dist/tools/annotations.js +16 -0
- package/dist/tools/annotations.js.map +1 -0
- package/dist/tools/contracts.js +7 -1
- package/dist/tools/contracts.js.map +1 -1
- package/dist/tools/definitions/agent-design.d.ts +49 -20
- package/dist/tools/definitions/agent-design.js +192 -19
- package/dist/tools/definitions/agent-design.js.map +1 -1
- package/dist/tools/definitions/analytics.d.ts +40 -0
- package/dist/tools/definitions/analytics.js +233 -0
- package/dist/tools/definitions/analytics.js.map +1 -0
- package/dist/tools/definitions/broadcast-analytics.d.ts +5 -4
- package/dist/tools/definitions/broadcast-analytics.js +26 -4
- package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
- package/dist/tools/definitions/broadcast-mailing-variants.d.ts +2 -0
- package/dist/tools/definitions/broadcast-mailing-variants.js +10 -0
- package/dist/tools/definitions/broadcast-mailing-variants.js.map +1 -1
- package/dist/tools/definitions/broadcast-scheduler.d.ts +20 -1
- package/dist/tools/definitions/broadcast-scheduler.js +134 -8
- package/dist/tools/definitions/broadcast-scheduler.js.map +1 -1
- package/dist/tools/definitions/contacts.d.ts +15 -0
- package/dist/tools/definitions/contacts.js +84 -0
- package/dist/tools/definitions/contacts.js.map +1 -0
- package/dist/tools/definitions/crm-platform.d.ts +2 -0
- package/dist/tools/definitions/crm-platform.js +95 -5
- package/dist/tools/definitions/crm-platform.js.map +1 -1
- package/dist/tools/definitions/datasource.d.ts +1 -0
- package/dist/tools/definitions/datasource.js +16 -1
- package/dist/tools/definitions/datasource.js.map +1 -1
- package/dist/tools/definitions/dialogue-audit.d.ts +2 -2
- package/dist/tools/definitions/dialogue-audit.js +54 -16
- package/dist/tools/definitions/dialogue-audit.js.map +1 -1
- package/dist/tools/definitions/dialogue-export.d.ts +1 -1
- package/dist/tools/definitions/dialogue-export.js +12 -0
- package/dist/tools/definitions/dialogue-export.js.map +1 -1
- package/dist/tools/definitions/external-api-channels.js +39 -12
- package/dist/tools/definitions/external-api-channels.js.map +1 -1
- package/dist/tools/definitions/follow-up-funnel-test.js +4 -0
- package/dist/tools/definitions/follow-up-funnel-test.js.map +1 -1
- package/dist/tools/definitions/follow-up-setup.js +3 -0
- package/dist/tools/definitions/follow-up-setup.js.map +1 -1
- package/dist/tools/definitions/follow-up.d.ts +1 -1
- package/dist/tools/definitions/follow-up.js +6 -0
- package/dist/tools/definitions/follow-up.js.map +1 -1
- package/dist/tools/definitions/getcourse-anchor-refresh.d.ts +3 -0
- package/dist/tools/definitions/getcourse-anchor-refresh.js +29 -2
- package/dist/tools/definitions/getcourse-anchor-refresh.js.map +1 -1
- package/dist/tools/definitions/getcourse-cold-welcome.d.ts +20 -2
- package/dist/tools/definitions/getcourse-cold-welcome.js +128 -7
- package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
- package/dist/tools/definitions/getcourse-wave.js +14 -0
- package/dist/tools/definitions/getcourse-wave.js.map +1 -1
- package/dist/tools/definitions/help.d.ts +8 -0
- package/dist/tools/definitions/help.js +219 -0
- package/dist/tools/definitions/help.js.map +1 -0
- package/dist/tools/definitions/knowledge.d.ts +27 -5
- package/dist/tools/definitions/knowledge.js +200 -33
- package/dist/tools/definitions/knowledge.js.map +1 -1
- package/dist/tools/definitions/link-tracking.js +31 -0
- package/dist/tools/definitions/link-tracking.js.map +1 -1
- package/dist/tools/definitions/model-comparison.js +12 -3
- package/dist/tools/definitions/model-comparison.js.map +1 -1
- package/dist/tools/definitions/operational-overview.d.ts +3 -0
- package/dist/tools/definitions/operational-overview.js +23 -0
- package/dist/tools/definitions/operational-overview.js.map +1 -0
- package/dist/tools/definitions/operator-workflow.d.ts +20 -0
- package/dist/tools/definitions/operator-workflow.js +114 -0
- package/dist/tools/definitions/operator-workflow.js.map +1 -0
- package/dist/tools/definitions/platform-setup.d.ts +54 -3
- package/dist/tools/definitions/platform-setup.js +211 -5
- package/dist/tools/definitions/platform-setup.js.map +1 -1
- package/dist/tools/definitions/scheduled-tasks.js +2 -0
- package/dist/tools/definitions/scheduled-tasks.js.map +1 -1
- package/dist/tools/definitions/session.js +103 -5
- package/dist/tools/definitions/session.js.map +1 -1
- package/dist/tools/definitions/shared.d.ts +272 -10
- package/dist/tools/definitions/shared.js +154 -8
- package/dist/tools/definitions/shared.js.map +1 -1
- package/dist/tools/definitions/task-state.d.ts +76 -0
- package/dist/tools/definitions/task-state.js +301 -0
- package/dist/tools/definitions/task-state.js.map +1 -0
- package/dist/tools/definitions/trigger-contact-claims.d.ts +7 -0
- package/dist/tools/definitions/trigger-contact-claims.js +60 -0
- package/dist/tools/definitions/trigger-contact-claims.js.map +1 -0
- package/dist/tools/definitions.d.ts +334 -35
- package/dist/tools/definitions.js +14 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/description-localization.d.ts +2 -0
- package/dist/tools/description-localization.js +46 -0
- package/dist/tools/description-localization.js.map +1 -0
- package/dist/tools/incomplete-list.d.ts +23 -0
- package/dist/tools/incomplete-list.js +39 -0
- package/dist/tools/incomplete-list.js.map +1 -0
- package/dist/tools/inventory.d.ts +10 -0
- package/dist/tools/inventory.js +49 -0
- package/dist/tools/inventory.js.map +1 -0
- package/dist/tools/registry-mapping-cases-core.js +122 -4
- package/dist/tools/registry-mapping-cases-core.js.map +1 -1
- package/dist/tools/registry-mapping-cases-platform.js +69 -0
- package/dist/tools/registry-mapping-cases-platform.js.map +1 -1
- package/dist/tools/registry.d.ts +2 -0
- package/dist/tools/registry.js +60 -8
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/result-envelope.d.ts +46 -0
- package/dist/tools/result-envelope.js +184 -0
- package/dist/tools/result-envelope.js.map +1 -0
- package/dist/tools/result.d.ts +41 -3
- package/dist/tools/result.js +229 -27
- package/dist/tools/result.js.map +1 -1
- package/dist/tools/tool-title.d.ts +2 -0
- package/dist/tools/tool-title.js +12 -0
- package/dist/tools/tool-title.js.map +1 -0
- package/dist/tools/toolsets.d.ts +37 -0
- package/dist/tools/toolsets.js +64 -0
- package/dist/tools/toolsets.js.map +1 -0
- package/dist/tools/trigger-action-config.js +4 -0
- package/dist/tools/trigger-action-config.js.map +1 -1
- package/dist/tools/verify-with.d.ts +5 -0
- package/dist/tools/verify-with.js +36 -0
- package/dist/tools/verify-with.js.map +1 -0
- package/dist/types/api-contract.gen.d.ts +2612 -332
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.js +64 -8
- package/dist/utils/logger.js.map +1 -1
- package/docs/agent-usage-guide.full.ru.md +21 -15
- package/docs/agent-usage-guide.ru.md +24 -16
- package/docs/async-operation-lifecycle.md +46 -0
- package/docs/connect.ru.md +120 -0
- package/docs/evals/model-behavior-scorecard.md +80 -0
- package/docs/failure-semantics.md +56 -0
- package/docs/help-navigation.md +48 -0
- package/docs/host-compatibility-matrix.md +153 -0
- package/docs/host-setup.md +22 -6
- package/docs/operation-coverage.md +114 -0
- package/docs/pii-policy.md +46 -0
- package/docs/response-size-budget.md +150 -0
- package/docs/task-state.md +58 -0
- package/docs/tool-effects.md +46 -0
- package/docs/tool-surface.md +91 -0
- package/package.json +6 -2
- package/scripts/model-eval-server.js +213 -0
- package/scripts/probe-mcp-protocol.js +134 -0
- 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.
|
|
33
|
-
|
|
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 из диалог-индекса
|
|
109
|
+
## Шаг 5 — Извлечение lead_ids из диалог-индекса
|
|
104
110
|
|
|
105
|
-
Для `dialogue_corpus_with_amocrm_links`
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
116
|
-
|
|
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.
|
|
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
|
-
|
|
180
|
-
|
|
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
|
-
`
|
|
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.
|
|
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.
|
|
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. `
|
|
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
|
-
- ❌
|
|
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
|
+
человеку второй раз.
|
|
@@ -206,7 +206,9 @@ enum CrmType {
|
|
|
206
206
|
|
|
207
207
|
Чтобы сообщения от бота отображались в карточке сделки AmoCRM, нужен **отдельный Amojo-канал** (`chats.amojo.amocrm.ru`). AmoCRM требует обращения в техподдержку для получения `channelId` + `channelSecretKey`. Без этого канала бот может управлять сделкой, но переписка не появится в карточке.
|
|
208
208
|
|
|
209
|
-
|
|
209
|
+
**Заявку отдаёт бэкенд — `besales_crm_amocrm_channel_registration`.** Тул возвращает адрес вебхука воркспейса и готовый текст письма в поддержку AmoCRM (форма письма задана их документацией: 14 пронумерованных ответов), плюс `placeholders` — места, которые заполняет человек (номер учётной записи, Id интеграции, скриншот). Пересылай текст **дословно** и не собирай адрес сам: письмо регистрирует у AmoCRM адрес, на который потом идут входящие, поэтому пересказ или самодельный адрес дают канал, смотрящий не туда, — и заметно это становится только пропажей сообщений. Ту же заявку показывает страница AmoCRM в интерфейсе (`GET /api/amo-crm/channel-registration`) — источник один, копий текста нет.
|
|
210
|
+
|
|
211
|
+
Полученные от поддержки `channelId` + `channelSecretKey` привязываются в интерфейсе: `POST /api/amo-crm/channel-connect`. Через MCP этого шага нет.
|
|
210
212
|
|
|
211
213
|
Чтобы сообщения от бота отображались в карточке сделки AmoCRM:
|
|
212
214
|
|
|
@@ -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 поддерживает **
|
|
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
|
-
>
|
|
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
|
-
|
|
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,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/resources/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,12 +15,13 @@
|
|
|
15
15
|
сейчас). Выбери **~5 моделей** под use-case агента (продажи → живой тон;
|
|
16
16
|
рассуждение → reasoning-модели; дёшево/много → budget). `defaultModelIds` —
|
|
17
17
|
разумный набор по умолчанию, если оператор не назвал модели.
|
|
18
|
-
- `available=false` → провайдер не настроен.
|
|
19
|
-
через OpenRouter (
|
|
18
|
+
- `available=false` → провайдер не настроен. GLM и prefixed Qwen (`qwen/*`) идут
|
|
19
|
+
через OpenRouter (`OPENROUTER_API_KEY`), а `qwen3.8-flash` — напрямую через
|
|
20
|
+
Alibaba DashScope (`DASHSCOPE_API_KEY`) на стороне prompt-services.
|
|
20
21
|
|
|
21
22
|
2. **`besales_model_comparison_run_start`** `{ agent_id, models?, dialogue_count? }`
|
|
22
23
|
— запуск (async). По умолчанию `dialogue_count=5`; `models` опционально (тогда
|
|
23
|
-
набор по умолчанию). До **
|
|
24
|
+
набор по умолчанию). До **23 моделей** и **20 диалогов**, если оператор просит
|
|
24
25
|
больше. Возвращает `run_id`.
|
|
25
26
|
|
|
26
27
|
3. **`besales_model_comparison_get`** `{ agent_id, run_id }` — поллируй до
|
|
@@ -52,6 +52,14 @@ field-mapping / operators.
|
|
|
52
52
|
|
|
53
53
|
Уникальность: один AmoCRM на workspace (`(workspaceId, AMOCRM)`).
|
|
54
54
|
|
|
55
|
+
**Follow-up шаг — переписка в карточке сделки.** `READY` даёт управление сделками и контактами,
|
|
56
|
+
но сообщения бота в карточке НЕ появятся, пока AmoCRM не зарегистрирует чат-канал: `channelId`
|
|
57
|
+
и `channelSecretKey` выдаёт только их техподдержка, по письму заданной формы. Адрес вебхука и
|
|
58
|
+
готовый текст письма отдаёт `besales_crm_amocrm_channel_registration` — пересылай их человеку
|
|
59
|
+
дословно, адрес сам не собирай. Ключи от поддержки он привяжет в интерфейсе
|
|
60
|
+
(`POST /api/amo-crm/channel-connect`); через MCP этого шага нет. Предупреди об этом шаге сразу,
|
|
61
|
+
как о local-app у Bitrix24, — иначе клиент считает настройку законченной, а переписки не видит.
|
|
62
|
+
|
|
55
63
|
## BITRIX24 — подключение
|
|
56
64
|
|
|
57
65
|
Несекретные: `domain` (`<portal>.bitrix24.ru`), `client_id`. Секрет: `client_secret`.
|
|
@@ -6,7 +6,11 @@
|
|
|
6
6
|
|
|
7
7
|
## Шаг 1 — Осмотр
|
|
8
8
|
|
|
9
|
-
- xlsx
|
|
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
|
-
|
|
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. `
|
|
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
|
|
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
|
+
объект и права: сохранённый план не заменяет свежую проверку.
|