@besales/mcp 0.1.0 → 0.11.1
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 +272 -17
- package/dist/auth/connection-store.d.ts +58 -0
- package/dist/auth/connection-store.js +208 -0
- package/dist/auth/connection-store.js.map +1 -0
- package/dist/auth/oauth-client.d.ts +27 -2
- package/dist/auth/oauth-client.js +62 -11
- package/dist/auth/oauth-client.js.map +1 -1
- package/dist/auth/session-workspace.d.ts +2 -0
- package/dist/auth/session-workspace.js +20 -0
- package/dist/auth/session-workspace.js.map +1 -0
- package/dist/auth/token-storage.d.ts +19 -5
- package/dist/auth/token-storage.js +11 -6
- package/dist/auth/token-storage.js.map +1 -1
- package/dist/cli.d.ts +2 -7
- package/dist/cli.js +111 -33
- package/dist/cli.js.map +1 -1
- package/dist/http/api-client.d.ts +4 -13
- package/dist/http/api-client.js +18 -18
- package/dist/http/api-client.js.map +1 -1
- package/dist/index.d.ts +8 -6
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/instructions/server-instructions.d.ts +15 -0
- package/dist/instructions/server-instructions.js +243 -0
- package/dist/instructions/server-instructions.js.map +1 -0
- package/dist/package-metadata.js +7 -1
- package/dist/package-metadata.js.map +1 -1
- package/dist/resources/concepts/feedback-sheets.md +77 -0
- package/dist/resources/concepts/sandbox.md +13 -0
- package/dist/resources/concepts/workbook-classification.md +241 -0
- package/dist/resources/docs/agent-behavior.md +393 -0
- package/dist/resources/docs/crm-integration.md +535 -0
- package/dist/resources/docs/files-and-uploads.md +295 -0
- package/dist/resources/docs/knowledge-base.md +521 -0
- package/dist/resources/docs/pipeline-builder.md +221 -0
- package/dist/resources/docs/pipeline-settings-deep.md +221 -0
- package/dist/resources/docs/platforms.md +513 -0
- package/dist/resources/docs/prompt-anatomy.md +298 -0
- package/dist/resources/docs/prompt-principles.md +289 -0
- package/dist/resources/registry.js +34 -12
- package/dist/resources/registry.js.map +1 -1
- package/dist/resources/workflows/compare-models.md +46 -0
- package/dist/resources/workflows/connect-crm-from-scratch.md +89 -0
- package/dist/resources/workflows/connect-datasource-from-scratch.md +92 -0
- package/dist/resources/workflows/extract-from-document.md +36 -0
- package/dist/resources/workflows/iterate-with-sandbox.md +31 -0
- package/dist/resources/workflows/platform-setup-from-scratch.md +113 -0
- package/dist/resources/workflows/production-readiness-check.md +41 -0
- package/dist/schemas/mcp-tools.json +2636 -182
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/definitions/agent-design.d.ts +215 -0
- package/dist/tools/definitions/agent-design.js +643 -0
- package/dist/tools/definitions/agent-design.js.map +1 -0
- package/dist/tools/definitions/crm-platform.d.ts +211 -0
- package/dist/tools/definitions/crm-platform.js +1070 -0
- package/dist/tools/definitions/crm-platform.js.map +1 -0
- package/dist/tools/definitions/datasource.d.ts +40 -0
- package/dist/tools/definitions/datasource.js +196 -0
- package/dist/tools/definitions/datasource.js.map +1 -0
- package/dist/tools/definitions/knowledge.d.ts +215 -0
- package/dist/tools/definitions/knowledge.js +782 -0
- package/dist/tools/definitions/knowledge.js.map +1 -0
- package/dist/tools/definitions/model-comparison.d.ts +25 -0
- package/dist/tools/definitions/model-comparison.js +101 -0
- package/dist/tools/definitions/model-comparison.js.map +1 -0
- package/dist/tools/definitions/platform-setup.d.ts +412 -0
- package/dist/tools/definitions/platform-setup.js +738 -0
- package/dist/tools/definitions/platform-setup.js.map +1 -0
- package/dist/tools/definitions/session.d.ts +11 -0
- package/dist/tools/definitions/session.js +86 -0
- package/dist/tools/definitions/session.js.map +1 -0
- package/dist/tools/definitions/shared.d.ts +742 -0
- package/dist/tools/definitions/shared.js +773 -0
- package/dist/tools/definitions/shared.js.map +1 -0
- package/dist/tools/definitions.d.ts +873 -88
- package/dist/tools/definitions.js +14 -856
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/registry.d.ts +3 -1
- package/dist/tools/registry.js +90 -11
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/result.d.ts +1 -1
- package/dist/tools/result.js +12 -4
- package/dist/tools/result.js.map +1 -1
- package/dist/utils/logger.js +2 -1
- package/dist/utils/logger.js.map +1 -1
- package/docs/host-setup.md +34 -15
- package/package.json +2 -2
- package/scripts/install-claude-desktop.js +89 -11
- package/scripts/mock-api-server.js +1 -1
- package/scripts/mock-credentials.js +49 -6
- package/dist/types/api-contract.gen.d.ts +0 -6975
- package/dist/types/api-contract.gen.js +0 -6
- package/dist/types/api-contract.gen.js.map +0 -1
|
@@ -1,19 +1,41 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
2
|
import { getResourceContracts } from '../tools/contracts.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
'besales://concepts/
|
|
7
|
-
'besales://concepts/
|
|
8
|
-
'besales://concepts/
|
|
3
|
+
// URI → относительный путь от `src/resources/` (включая подпапку).
|
|
4
|
+
// concepts/* — справочники паттернов; workflows/* — orchestration-маршруты (v1.5 Increment 6a).
|
|
5
|
+
const resourceFilesByUri = {
|
|
6
|
+
'besales://concepts/icp': 'concepts/icp.md',
|
|
7
|
+
'besales://concepts/triggers': 'concepts/triggers.md',
|
|
8
|
+
'besales://concepts/sandbox': 'concepts/sandbox.md',
|
|
9
|
+
'besales://concepts/handoff': 'concepts/handoff.md',
|
|
10
|
+
'besales://concepts/external-execution': 'concepts/external-execution.md',
|
|
11
|
+
'besales://concepts/feedback-sheets': 'concepts/feedback-sheets.md',
|
|
12
|
+
'besales://concepts/workbook-classification': 'concepts/workbook-classification.md',
|
|
13
|
+
'besales://workflows/platform-setup-from-scratch': 'workflows/platform-setup-from-scratch.md',
|
|
14
|
+
'besales://workflows/connect-crm-from-scratch': 'workflows/connect-crm-from-scratch.md',
|
|
15
|
+
'besales://workflows/connect-datasource-from-scratch': 'workflows/connect-datasource-from-scratch.md',
|
|
16
|
+
'besales://workflows/extract-from-document': 'workflows/extract-from-document.md',
|
|
17
|
+
'besales://workflows/iterate-with-sandbox': 'workflows/iterate-with-sandbox.md',
|
|
18
|
+
'besales://workflows/compare-models': 'workflows/compare-models.md',
|
|
19
|
+
'besales://workflows/production-readiness-check': 'workflows/production-readiness-check.md',
|
|
20
|
+
// v1.5 Increment 6b — doc-bridge глав ai-prompt-builder (копии, source of truth в ai-aniomaly).
|
|
21
|
+
'besales://docs/prompt-anatomy': 'docs/prompt-anatomy.md',
|
|
22
|
+
'besales://docs/knowledge-base': 'docs/knowledge-base.md',
|
|
23
|
+
'besales://docs/agent-behavior': 'docs/agent-behavior.md',
|
|
24
|
+
'besales://docs/platforms': 'docs/platforms.md',
|
|
25
|
+
'besales://docs/crm-integration': 'docs/crm-integration.md',
|
|
26
|
+
'besales://docs/pipeline-builder': 'docs/pipeline-builder.md',
|
|
27
|
+
'besales://docs/files-and-uploads': 'docs/files-and-uploads.md',
|
|
28
|
+
'besales://docs/pipeline-settings-deep': 'docs/pipeline-settings-deep.md',
|
|
29
|
+
// Дистиллят принципов промптинга (человечность + sales-плейбук), переиспользуется между компаниями.
|
|
30
|
+
'besales://docs/prompt-principles': 'docs/prompt-principles.md',
|
|
9
31
|
};
|
|
10
|
-
function
|
|
11
|
-
return new URL(
|
|
32
|
+
function resourceUrl(relativePath) {
|
|
33
|
+
return new URL(`./${relativePath}`, import.meta.url);
|
|
12
34
|
}
|
|
13
35
|
function createResource(contract) {
|
|
14
|
-
const
|
|
15
|
-
if (!
|
|
16
|
-
throw new Error(`
|
|
36
|
+
const relativePath = resourceFilesByUri[contract.uri];
|
|
37
|
+
if (!relativePath) {
|
|
38
|
+
throw new Error(`Resource file mapping not found: ${contract.uri}`);
|
|
17
39
|
}
|
|
18
40
|
return {
|
|
19
41
|
uri: contract.uri,
|
|
@@ -24,7 +46,7 @@ function createResource(contract) {
|
|
|
24
46
|
return {
|
|
25
47
|
uri: contract.uri,
|
|
26
48
|
mimeType: contract.mimeType,
|
|
27
|
-
text: await readFile(
|
|
49
|
+
text: await readFile(resourceUrl(relativePath), 'utf-8'),
|
|
28
50
|
};
|
|
29
51
|
},
|
|
30
52
|
};
|
|
@@ -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,MAAM,
|
|
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,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;CAChE,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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Workflow: Compare models (model bake-off)
|
|
2
|
+
|
|
3
|
+
Прогон одного и того же набора диалогов промпта агента на **нескольких моделях
|
|
4
|
+
сразу** — чтобы понять, какая модель лучше для этого промпта.
|
|
5
|
+
|
|
6
|
+
**Когда:** фаза 4 пайплайна (Build & Prove) ИЛИ по явному запросу оператора («сравни
|
|
7
|
+
модели», «на какой модели лучше»). Операция **дорогая** (N моделей × M диалогов × ~10
|
|
8
|
+
ходов) — **не запускай после каждого фикса промпта** (тест-рефлекс гоняет тест-сценарии,
|
|
9
|
+
а НЕ перевыбор модели).
|
|
10
|
+
|
|
11
|
+
## Маршрут
|
|
12
|
+
|
|
13
|
+
1. **`besales_model_catalog_list`** — каталог моделей с `bestFor`-тегами «когда что
|
|
14
|
+
лучше», `tier` (budget/balanced/premium) и `available` (доступен ли провайдер
|
|
15
|
+
сейчас). Выбери **~5 моделей** под use-case агента (продажи → живой тон;
|
|
16
|
+
рассуждение → reasoning-модели; дёшево/много → budget). `defaultModelIds` —
|
|
17
|
+
разумный набор по умолчанию, если оператор не назвал модели.
|
|
18
|
+
- `available=false` → провайдер не настроен. grok/deepseek/gemini/qwen идут
|
|
19
|
+
через OpenRouter (нужен `OPENROUTER_API_KEY` на стороне prompt-services).
|
|
20
|
+
|
|
21
|
+
2. **`besales_model_comparison_run_start`** `{ agent_id, models?, dialogue_count? }`
|
|
22
|
+
— запуск (async). По умолчанию `dialogue_count=5`; `models` опционально (тогда
|
|
23
|
+
набор по умолчанию). До **10 моделей** и **20 диалогов**, если оператор просит
|
|
24
|
+
больше. Возвращает `run_id`.
|
|
25
|
+
|
|
26
|
+
3. **`besales_model_comparison_get`** `{ agent_id, run_id }` — поллируй до
|
|
27
|
+
`status=COMPLETED`. По каждой модели: диалоги + детерминированные метрики
|
|
28
|
+
(относительная стоимость в кредитах, длина ответа, completion-rate, wall-clock).
|
|
29
|
+
|
|
30
|
+
4. **Суди сам.** Прочитай диалоги + метрики и реши, какая модель лучше — по
|
|
31
|
+
**качеству диалога** (живость, следование промпту, отсутствие слива/робота) и
|
|
32
|
+
**метрикам** (дешевле/быстрее при равном качестве). Ответь оператору с
|
|
33
|
+
**аргументами и конкретными выдержками** из диалогов.
|
|
34
|
+
|
|
35
|
+
5. **`besales_model_comparison_eval_submit`** — зафиксируй вердикт: `winner`,
|
|
36
|
+
`rationale`, по каждой модели `success_score` (0-100), сильные/слабые стороны,
|
|
37
|
+
`excerpts`. Сохраняется (replace при повторе) для будущего UI. Ты всё равно
|
|
38
|
+
отвечаешь оператору в чате — submit просто фиксирует структуру.
|
|
39
|
+
|
|
40
|
+
## Важно
|
|
41
|
+
|
|
42
|
+
- Это **internal-операция**: prompt-services сам гоняет модели-кандидаты (ты НЕ
|
|
43
|
+
выполняешь стадии локально, в отличие от prompt/analyze external-пар).
|
|
44
|
+
- Персоны генерируются один раз и реюзаются между моделями; меняется только модель
|
|
45
|
+
агента, «клиент» фиксирован — честное сравнение.
|
|
46
|
+
- Реальный USD-расход прогона виден в costs ai-aniomaly (cost-callback).
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Workflow: Connect CRM From Scratch
|
|
2
|
+
|
|
3
|
+
Операционные шаги подключения CRM через MCP-провизионинг (Setup URL pattern). Это
|
|
4
|
+
**source of truth** для «как получить credentials конкретной CRM» — НЕ ищи эти шаги в
|
|
5
|
+
исходниках платформы. Доменная модель CRM (сущности, lifecycle, field-mapping) —
|
|
6
|
+
`besales://docs/crm-integration`.
|
|
7
|
+
|
|
8
|
+
> ⚠️ Секреты вводит ПОЛЬЗОВАТЕЛЬ на `setup_page_url` в браузере, минуя чат/LLM. Никогда не
|
|
9
|
+
> проси токены/секретные ключи в чат. Несекретные поля (поддомен, публичный client_id)
|
|
10
|
+
> тоже вводятся на setup-странице — не проси их у пользователя в чат, просто дай ссылку.
|
|
11
|
+
|
|
12
|
+
## Общий цикл (любая CRM)
|
|
13
|
+
|
|
14
|
+
1. `besales_crm_create_init({ crm_type })` → отдаёт `setup_ref` + `setup_page_url` +
|
|
15
|
+
`required_secret_fields`.
|
|
16
|
+
2. Дай пользователю `setup_page_url`, перечисли что подготовить (см. по типу ниже), и
|
|
17
|
+
попроси заполнить **все поля на странице**.
|
|
18
|
+
3. Поллируй `besales_crm_create_status({ setup_ref })`: `AWAITING_USER` → `VALIDATING` →
|
|
19
|
+
`READY` (`crm_id`) | `VALIDATION_FAILED` (`error_message` — пусть повторит) | `EXPIRED`
|
|
20
|
+
(новый init).
|
|
21
|
+
4. После `READY` — активация (см. «Активация» ниже).
|
|
22
|
+
|
|
23
|
+
Ordering-инвариант: CRM должна быть `READY` (и активной) прежде чем настраивать pipelines /
|
|
24
|
+
field-mapping / operators.
|
|
25
|
+
|
|
26
|
+
## AMOCRM — подключение по долгосрочному токену
|
|
27
|
+
|
|
28
|
+
> Через MCP AmoCRM подключается **долгосрочным токеном** (long-lived token), а НЕ
|
|
29
|
+
> OAuth-redirect. Поэтому callback/redirect настраивать не нужно — всё берётся из одной
|
|
30
|
+
> интеграции в аккаунте AmoCRM.
|
|
31
|
+
|
|
32
|
+
Что пользователь делает в AmoCRM (один раз):
|
|
33
|
+
|
|
34
|
+
1. **Настройки → Интеграции → «+ Создать интеграцию» → «Создать внешнюю интеграцию»**
|
|
35
|
+
(приватная, для своего аккаунта).
|
|
36
|
+
2. Имя любое (напр. `Besales`). Redirect URL — любой `https://` (напр. `https://app.besales.ai`):
|
|
37
|
+
для долгосрочного токена он не используется, но поле обязательное.
|
|
38
|
+
3. **Доступы (scopes) — выдать пошире.** Обязательно: сделки, контакты, **события/звонки** —
|
|
39
|
+
без доступа к звонкам не сработает выгрузка аудио-диалогов (`besales_workbook_extract_amocrm_leads`
|
|
40
|
+
→ `besales_icp_import_dialogues` и извлечение записей звонков).
|
|
41
|
+
4. Сохранить. На вкладке **«Ключи и доступы»** появятся 4 значения:
|
|
42
|
+
|
|
43
|
+
| Значение в AmoCRM | Поле | Тип |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| Поддомен аккаунта (`<name>.amocrm.ru`) | `sub_domain` | несекретное |
|
|
46
|
+
| ID интеграции | `client_id` | несекретное |
|
|
47
|
+
| Секретный ключ | `client_secret` | **секрет** |
|
|
48
|
+
| Долгосрочный токен (кнопка «Долгосрочный токен») | `long_access_token` | **секрет** |
|
|
49
|
+
|
|
50
|
+
Все 4 пользователь вводит на `setup_page_url`. `READY` для AmoCRM = креды сохранены и
|
|
51
|
+
**токен онлайн-проверен** живым запросом к аккаунту (битый токен → `VALIDATION_FAILED`).
|
|
52
|
+
|
|
53
|
+
Уникальность: один AmoCRM на workspace (`(workspaceId, AMOCRM)`).
|
|
54
|
+
|
|
55
|
+
## BITRIX24 — подключение
|
|
56
|
+
|
|
57
|
+
Несекретные: `domain` (`<portal>.bitrix24.ru`), `client_id`. Секрет: `client_secret`.
|
|
58
|
+
После `READY` Bitrix24 требует **ручной установки local-app в портале** (завершается
|
|
59
|
+
вебхуком на стороне Bitrix24) — предупреди пользователя об этом follow-up шаге.
|
|
60
|
+
|
|
61
|
+
## GETCOURSE — подключение
|
|
62
|
+
|
|
63
|
+
Несекретное: `account_domain` (`school.getcourse.ru`, опц. `managed_tag_prefix`).
|
|
64
|
+
Секрет: `school_api_key` (опц. `legacy_api_key`). `READY` = read-only API-проба прошла.
|
|
65
|
+
|
|
66
|
+
## TELEGRAM (Forum CRM) — подключение
|
|
67
|
+
|
|
68
|
+
Несекретное: `forum_group_id` (ID форум-группы). Секрет: `crm_bot_token`. `READY` =
|
|
69
|
+
`getMe` бота прошёл.
|
|
70
|
+
|
|
71
|
+
## Активация
|
|
72
|
+
|
|
73
|
+
CRM создаётся в `status` и работает (sync воронок, выгрузка звонков, запись лидов) только
|
|
74
|
+
когда она **активна**. На workspace активна одна CRM за раз.
|
|
75
|
+
|
|
76
|
+
- **Auto:** если в workspace нет другой активной CRM, провизионинг активирует подключённую
|
|
77
|
+
CRM сам на `READY` (после успешной live-валидации). Дополнительных шагов не нужно.
|
|
78
|
+
- **Явно / переключение:** `besales_crm_activate({ crm_id })` — активирует указанную CRM и
|
|
79
|
+
**деактивирует остальные** в этом workspace. Используй когда уже есть активная CRM и нужно
|
|
80
|
+
переключиться, либо чтобы повторно включить CRM, авто-отключённую по ошибке авторизации
|
|
81
|
+
(`401/403`). ⚠️ Это деактивирует текущую активную — предупреди пользователя перед вызовом.
|
|
82
|
+
|
|
83
|
+
## Что дальше (CRM READY + активна)
|
|
84
|
+
|
|
85
|
+
Pipelines: `besales_crm_pipeline_list` / `besales_crm_pipeline_create`,
|
|
86
|
+
`besales_platform_pipeline_link`. Маппинг полей: `besales_crm_field_mapping_get` /
|
|
87
|
+
`besales_crm_field_mapping_upsert`. Операторы: `besales_crm_operator_list` /
|
|
88
|
+
`besales_crm_operator_update`. Глубина — `besales://docs/crm-integration`,
|
|
89
|
+
`besales://docs/pipeline-builder`, `besales://docs/pipeline-settings-deep`.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Workflow: Connect Data Source (1С) From Scratch
|
|
2
|
+
|
|
3
|
+
Операционные шаги подключения источника данных **1С** через MCP-провизионинг (Setup URL
|
|
4
|
+
pattern). Это **source of truth** для «как подключить 1С и научить агента читать/писать в
|
|
5
|
+
неё» — НЕ ищи эти шаги в исходниках платформы.
|
|
6
|
+
|
|
7
|
+
1С — это **товарная БД** (категория «БД»), доступ через **OData**: товары, остатки, цены,
|
|
8
|
+
история покупок, заказы. Это НЕ CRM (покупатели/сделки остаются в AmoCRM/Bitrix24).
|
|
9
|
+
|
|
10
|
+
> ⚠️ Пароль пользователя 1С вводит ПОЛЬЗОВАТЕЛЬ на `setup_page_url` в браузере, минуя
|
|
11
|
+
> чат/LLM. Никогда не проси пароль/секреты в чат. Несекретные поля (URL/логин/имя) тоже
|
|
12
|
+
> можно ввести на setup-странице — просто дай ссылку.
|
|
13
|
+
|
|
14
|
+
## Подключение (создание connection)
|
|
15
|
+
|
|
16
|
+
1. `besales_datasource_create_init({ data_source_type: 'ONE_C' })` → отдаёт `setup_ref` +
|
|
17
|
+
`setup_page_url` + `required_secret_fields` (`password`) + `required_non_secret_fields`
|
|
18
|
+
(`name`, `base_url`, `username`; опц. `proxy_url`). `fields` в init опционально (pre-fill).
|
|
19
|
+
2. Дай пользователю `setup_page_url` и попроси заполнить **все поля на странице**:
|
|
20
|
+
- `name` — имя подключения (любое, напр. «Основная база 1С»).
|
|
21
|
+
- `base_url` — URL публикации OData, напр. `https://host:port/<публикация>/odata/standard.odata/`.
|
|
22
|
+
- `username` — пользователь 1С (Basic Auth) с правами на чтение (для записи — на запись).
|
|
23
|
+
- `password` — **секрет**, только на setup-странице.
|
|
24
|
+
- `proxy_url` — опц., если 1С за приватной сетью/туннелем (см. «Доступ к сети» ниже).
|
|
25
|
+
3. Поллируй `besales_datasource_create_status({ setup_ref })`: `AWAITING_USER` → `VALIDATING`
|
|
26
|
+
→ `READY` (`data_source_id`) | `VALIDATION_FAILED` (`error_message` — пусть повторит) |
|
|
27
|
+
`EXPIRED` (новый init).
|
|
28
|
+
|
|
29
|
+
> 1С часто за VPN/приватной сетью → health на finalize **best-effort**: `READY` = «подключение
|
|
30
|
+
> создано», а живую достижимость смотри `besales_datasource_health` / `besales_datasource_list`.
|
|
31
|
+
|
|
32
|
+
Ordering-инвариант: connection `READY` прежде чем назначать роли / включать векторизацию /
|
|
33
|
+
строить 1С-триггеры.
|
|
34
|
+
|
|
35
|
+
## Доступ к сети (частый блокер)
|
|
36
|
+
|
|
37
|
+
Платформа ходит в 1С **исходящим HTTPS-запросом** к OData-URL — она НЕ заходит в сеть клиента
|
|
38
|
+
(VPN на стороне платформы не нужен). Чтобы запрос дошёл:
|
|
39
|
+
- OData-URL должен быть **достижим из интернета** (публичный домен/IP + порт), либо через
|
|
40
|
+
туннель/обратный прокси (тогда `proxy_url` указывает на него).
|
|
41
|
+
- Клиент **вайтлистит исходящий IP платформы** (egress IP прод-окружения). Если health=false —
|
|
42
|
+
почти всегда это сеть: URL недоступен снаружи или IP не в whitelist.
|
|
43
|
+
|
|
44
|
+
## Назначение ролей объектам
|
|
45
|
+
|
|
46
|
+
1. `besales_datasource_catalogs({ data_source_id })` → объекты из `$metadata`
|
|
47
|
+
(`external_code`, `display_name`, `kind`: catalog/document/register).
|
|
48
|
+
2. `besales_datasource_role_assign({ data_source_id, role, external_code, display_name })` —
|
|
49
|
+
one-role-per-object (прежние роли объекта снимаются). Роли:
|
|
50
|
+
- `PRODUCT_CATALOG` — каталог товаров (можно векторизовать, см. ниже).
|
|
51
|
+
- `STOCK` / `PRICE` — регистры остатков/цен. Передай `metadata.register.virtualTable`
|
|
52
|
+
(`Balance` — текущие, `SliceLast` — срез последних).
|
|
53
|
+
- `ORDER` — документ «Заказ покупателя» (для записи). `CUSTOMER` — история. `OTHER`.
|
|
54
|
+
3. `besales_datasource_catalog_roles({ data_source_id })` → проверить назначенные роли +
|
|
55
|
+
флаг `vectorized`.
|
|
56
|
+
|
|
57
|
+
## Векторизация каталога товаров (семантический поиск)
|
|
58
|
+
|
|
59
|
+
`besales_datasource_vectorize({ data_source_id, catalog_external_code, enabled: true })` —
|
|
60
|
+
включает семантический поиск по каталогу (роль `PRODUCT_CATALOG` обязательна, подключение
|
|
61
|
+
`ACTIVE`): синк в Pinecone. `enabled: false` — удаление векторов. Нужно, когда товаров много
|
|
62
|
+
и поиск по точному `$filter` не годится («покажи что-то для дома до 5000»).
|
|
63
|
+
|
|
64
|
+
## Чтение/запись в диалоге — это ДЕЙСТВИЯ ТРИГГЕРОВ (не tools агента)
|
|
65
|
+
|
|
66
|
+
Финальный шаг «агент реально читает/пишет 1С в разговоре» настраивается через **существующий**
|
|
67
|
+
`besales_trigger_upsert` (НЕ через `besales_datasource_*`). У агента ровно 3 attachable tool
|
|
68
|
+
(`run_trigger`/`send_pic`/`call_qa`) — 1С-логика живёт внутри действий триггера. Форма действия:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
besales_trigger_upsert({ platform_id, agent_id, name, condition, actions: [{
|
|
72
|
+
actionType: 'DATA_SOURCE_READ', // или 'DATA_SOURCE_WRITE'
|
|
73
|
+
dataSourceReadConfig: { // или dataSourceWriteConfig
|
|
74
|
+
connectionId: '<data_source_id>',
|
|
75
|
+
catalogRole: 'STOCK', // PRODUCT_CATALOG/STOCK/PRICE/CUSTOMER/...
|
|
76
|
+
catalogExternalCode: '<external_code>',
|
|
77
|
+
filterTemplate: [ { field, op, valueTemplate } ] // READ: фильтр (поддержка {phone}/{{var}})
|
|
78
|
+
// WRITE: вместо filterTemplate → fieldMappings: [ { field, valueTemplate } ]
|
|
79
|
+
}
|
|
80
|
+
}] })
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Backend строго валидирует (anti-IDOR + обязательность конфига): кривой/отсутствующий
|
|
84
|
+
`dataSourceReadConfig`/`WriteConfig` → `400` (не молча теряется). Бизнес-примеры: триггер
|
|
85
|
+
«ПроверкаНаличия» (READ STOCK+PRICE), «ИсторияПокупок» (READ CUSTOMER, фильтр `{phone}`),
|
|
86
|
+
«ОформлениеЗаказа» (WRITE ORDER).
|
|
87
|
+
|
|
88
|
+
## Управление
|
|
89
|
+
|
|
90
|
+
`besales_datasource_list` (status/enabled/base_url), `besales_datasource_health` (live OData),
|
|
91
|
+
`besales_datasource_enable({ enabled })` (вкл/выкл подключение — выключенное не используется
|
|
92
|
+
действиями триггеров, даже если 1С доступна).
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Workflow: Extract From Document (fan-out)
|
|
2
|
+
|
|
3
|
+
Пользователь дал документ (xlsx / Google Sheets / текст / PDF). **Один источник часто питает
|
|
4
|
+
несколько целей сразу** — не клади «только в одно место». Это продуктивный discovery, а не
|
|
5
|
+
блокирующий шаг фазы 2 (Discover).
|
|
6
|
+
|
|
7
|
+
## Шаг 1 — Осмотр
|
|
8
|
+
|
|
9
|
+
- xlsx / Google Sheets: `besales_workbook_inspect` (вкладки, заголовки, типы колонок).
|
|
10
|
+
- Иначе: прочитай содержимое и классифицируй сам.
|
|
11
|
+
- Глубже про таксономию вкладок — concept `besales://concepts/workbook-classification`.
|
|
12
|
+
|
|
13
|
+
## Шаг 2 — Триаж и fan-out
|
|
14
|
+
|
|
15
|
+
Реши что внутри (часто несколько типов одновременно) и разложи параллельно:
|
|
16
|
+
|
|
17
|
+
| Что в документе | Куда (инструменты) |
|
|
18
|
+
|---|---|
|
|
19
|
+
| FAQ / вопросы-ответы | `besales_knowledge_qa_create` (+ опц. `besales_qa_generation_get_instructions` / `besales_qa_generation_submit` для авто-draft) |
|
|
20
|
+
| Прайс / каталог / таблица | `besales_knowledge_table_link` либо `besales_workbook_to_knowledge_document` |
|
|
21
|
+
| Продуктовый / бизнес-текст | `besales_knowledge_document_upload` |
|
|
22
|
+
| Brand-guide / tone / persona | ICP tone (`besales_icp_create`) + `besales_behavior_update` |
|
|
23
|
+
| Выгрузка диалогов из CRM (amoCRM) | `besales_workbook_extract_amocrm_leads` → `besales_icp_import_dialogues` → `besales_icp_import_status` |
|
|
24
|
+
| Значения (имя компании, телефон, часы) | `besales_variable_create` |
|
|
25
|
+
| Общий PDF / договор / политика / непонятный тип (fallback) | `besales_knowledge_document_upload` — дефолт, если ничего выше не подошло |
|
|
26
|
+
|
|
27
|
+
## Шаг 3 — Привязка knowledge к каналу
|
|
28
|
+
|
|
29
|
+
Если что-то ушло в knowledge — не забудь создать/привязать space:
|
|
30
|
+
`besales_knowledge_space_create` → `besales_knowledge_space_channel_link_upsert`.
|
|
31
|
+
|
|
32
|
+
## Принцип
|
|
33
|
+
|
|
34
|
+
Документ редко = «одна сущность». Прайс-лист несёт и таблицу для RAG, и переменные
|
|
35
|
+
(контакты), и иногда tone. Раскладывай по всем релевантным целям за один проход.
|
|
36
|
+
Затем возвращайся в `besales://workflows/platform-setup-from-scratch`.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Workflow: Iterate With Sandbox
|
|
2
|
+
|
|
3
|
+
Цикл улучшения агента (промпт / behavior / triggers) через прогон на тест-сценариях.
|
|
4
|
+
Это **петля**, а не финальный шаг — повторяй пока качество не стабилизируется.
|
|
5
|
+
|
|
6
|
+
## Цикл
|
|
7
|
+
|
|
8
|
+
1. **Прогон.** `besales_sandbox_run_start` (на ICP test scenarios / personas).
|
|
9
|
+
2. **Анализ findings (external execution).**
|
|
10
|
+
- `besales_sandbox_findings_get_instructions` → локально проанализируй прогон →
|
|
11
|
+
`besales_sandbox_findings_submit`.
|
|
12
|
+
- Для персонажных симуляций: `besales_simulation_findings_get_instructions` /
|
|
13
|
+
`besales_simulation_findings_submit`.
|
|
14
|
+
- Ты видишь ICP/ТЗ контекст и умнее internal-модели — давай конкретные findings.
|
|
15
|
+
3. **Правки.**
|
|
16
|
+
- Промпт: `besales_prompt_patch_start` → `besales_prompt_patch_get` →
|
|
17
|
+
`besales_prompt_patch_apply` → `besales_prompt_patch_commit`
|
|
18
|
+
(откат — `besales_prompt_patch_discard`). После commit прогони `besales_prompt_lint`.
|
|
19
|
+
- Поведение/действия: `besales_behavior_update` / `besales_trigger_upsert`.
|
|
20
|
+
4. **Повторный прогон** `besales_sandbox_run_start` → сравни с предыдущим.
|
|
21
|
+
|
|
22
|
+
## Когда останавливаться
|
|
23
|
+
|
|
24
|
+
- Findings ниже порога серьёзности и нет регрессий между прогонами.
|
|
25
|
+
- Ключевые ICP-сценарии проходят.
|
|
26
|
+
- Не гонись за идеалом — после стабилизации иди в
|
|
27
|
+
`besales://workflows/production-readiness-check`.
|
|
28
|
+
|
|
29
|
+
## Глубина
|
|
30
|
+
|
|
31
|
+
Concept `besales://concepts/sandbox` — что именно тестирует sandbox и какие сценарии.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Workflow: Platform Setup From Scratch
|
|
2
|
+
|
|
3
|
+
Backbone happy-path настройки с нуля по **6-фазной модели** (1 Connect · 2 Discover · 3 Author ·
|
|
4
|
+
4 Build&Prove · 5 Enrich · 6 Activate). Веди пользователя по фазам, после каждой говори «мы здесь,
|
|
5
|
+
дальше — X». Фазы — **ориентир, не жёсткий конвейер**: жёсткий gate один (фаза 1 — нельзя строить
|
|
6
|
+
на неподключённом канале); фазы 2–6 можно чередовать и забегать вперёд (document fan-out).
|
|
7
|
+
Канонич. фазовая модель + completeness→phase mapping живут в serverInstructions; здесь —
|
|
8
|
+
операционные шаги с именами инструментов.
|
|
9
|
+
|
|
10
|
+
## Шаг 0 — Ориентация (всегда)
|
|
11
|
+
|
|
12
|
+
1. `besales_workspace_overview` → прочитай `setupCompleteness` и `suggestedNextPhase`.
|
|
13
|
+
2. Если workspace частично настроен — **не начинай с нуля**, продолжи с `suggestedNextPhase`.
|
|
14
|
+
3. Убедись, что выбран нужный workspace (`besales_workspace_current`; при необходимости
|
|
15
|
+
`besales_workspace_use`).
|
|
16
|
+
|
|
17
|
+
## Фаза 1 — Connect (async gate ⏸)
|
|
18
|
+
|
|
19
|
+
Если `channelsConnected === 0` (или нужен новый канал):
|
|
20
|
+
|
|
21
|
+
- API-key канал (TelegramBot/Wazzup/Salebot/SmsGorod/VKon/GetCourse/WebWidget/Bitrix24Bot):
|
|
22
|
+
`besales_platform_create_init` → покажи пользователю `setup_page_url` (секреты он вводит
|
|
23
|
+
в браузере) → поллируй `besales_platform_create_status` по `setup_ref` до `READY`.
|
|
24
|
+
- OAuth канал (Instagram/Avito): `besales_platform_create_oauth_init` → покажи `auth_url` →
|
|
25
|
+
поллируй `besales_platform_create_status` до `READY`.
|
|
26
|
+
|
|
27
|
+
**Не строй дальше пока статус не `READY`.** `VALIDATION_FAILED` → покажи `error_message`,
|
|
28
|
+
повтори ввод. `EXPIRED` → новый init. **CRM здесь НЕ подключаем** — она ленивая (фаза 5/6).
|
|
29
|
+
|
|
30
|
+
## Фаза 2 — Discover (профиль компании + ICP)
|
|
31
|
+
|
|
32
|
+
**(2a) Профиль компании.** Собери: что продают / УТП / контакты / ограничения. Значения
|
|
33
|
+
(имя компании, телефон) → `besales_variable_create` (доступны в промпте как `{{{name}}}`).
|
|
34
|
+
|
|
35
|
+
**(2b) ICP — сначала определи ТИП бота:**
|
|
36
|
+
- **sales / qualification / booking / outbound / продажи** → ICP **ОБЯЗАТЕЛЕН**. Без него
|
|
37
|
+
промпт generic, квалификация лидов плохая. Не финализируй промпт (фаза 4) пока нет ICP.
|
|
38
|
+
Нет данных — спроси про ЦА / боли / возражения ИЛИ импортируй из диалогов.
|
|
39
|
+
- **FAQ / support / справочный** → ICP опционален; не навязывай.
|
|
40
|
+
|
|
41
|
+
Источники ICP — файлы, инфо о компании, аудио-звонки, выгрузки переписок (Google Sheets), CRM:
|
|
42
|
+
`besales_icp_create` (+ `besales_icp_import_dialogues` → `besales_icp_import_status`, затем пара
|
|
43
|
+
`besales_icp_analysis_get_instructions` / `besales_icp_analysis_submit`). Таблицы — всегда
|
|
44
|
+
`besales_workbook_inspect` первым (правило 6). **Документ от пользователя?** → workflow
|
|
45
|
+
`besales://workflows/extract-from-document` (fan-out). Discovery продуктивен — не блокирует.
|
|
46
|
+
|
|
47
|
+
## Фаза 3 — Author (скрипт + тест-сценарии)
|
|
48
|
+
|
|
49
|
+
Подготовь материал, который дальше расходится:
|
|
50
|
+
1. **«Скрипт диалога»** — теперь ОТДЕЛЬНАЯ ХРАНИМАЯ сущность (поле `dialog_script` = source of truth),
|
|
51
|
+
сохраняется на Фазе 4 ПОСЛЕ `agent_create` через `besales_dialog_script_update`; §6 промпта
|
|
52
|
+
рендерится ИЗ неё детерминированно. Если есть ICP-диалоги / звонки — намайни реальные фразы операторов
|
|
53
|
+
по этапам (`besales://docs/prompt-principles` раздел C), на их живом языке, не из абстрактной «рыбы».
|
|
54
|
+
2. **Справочное / «лишнее»** (факты, прайс, регламент) → RAG/Q&A, НЕ в промпт:
|
|
55
|
+
`besales_knowledge_qa_*`, `besales_agent_facts_set` (+ `besales_facts_classify_and_migrate`).
|
|
56
|
+
3. **Тест-сценарии** для будущих прогонов → `besales_test_scenario_generate_get_instructions` /
|
|
57
|
+
`besales_test_scenario_generate_submit`.
|
|
58
|
+
|
|
59
|
+
## Фаза 4 — Build & Prove (агент + промпт + доказан тестами + модель)
|
|
60
|
+
|
|
61
|
+
Требует фазу 1 `READY`:
|
|
62
|
+
|
|
63
|
+
1. `besales_agent_create` (на READY-канале).
|
|
64
|
+
2. «Скрипт диалога» → промпт (скрипт ПЕРВЫМ, отдельным шагом):
|
|
65
|
+
а) построй структуру скрипта (этапы/ветки/реплики/переходы) → `besales_dialog_script_update`
|
|
66
|
+
(поле `dialog_script` = source of truth; §6 рендерится из него; читать/сверять — `besales_dialog_script_get`);
|
|
67
|
+
б) промпт: `besales_prompt_generate_get_instructions` → локально выполни стадии →
|
|
68
|
+
`besales_prompt_generate_submit` → `besales_prompt_finalize` (§6 = render скрипта). Структура — `besales://docs/prompt-anatomy`.
|
|
69
|
+
3. `besales_behavior_update` — приветствие: ТОЛЬКО `bot_greeting` текстом, БЕЗ кнопок (дефолт
|
|
70
|
+
«Привет!/Hello» → язык аудитории; для INBOUND открывает диалог). `greeting_buttons` opt-in — лишь
|
|
71
|
+
по явному запросу; остальной behavior (persona/тон/typing) — фаза Enrich. `besales://docs/agent-behavior`.
|
|
72
|
+
4. **Статика:** `besales_prompt_lint` + анализ `besales_prompt_analyze_get_instructions` /
|
|
73
|
+
`besales_prompt_analyze_submit`.
|
|
74
|
+
5. **Симуляция:** `besales_sandbox_run_start` по тест-сценариям (фаза 3) → findings → правки.
|
|
75
|
+
Глубже — `besales://workflows/iterate-with-sandbox`.
|
|
76
|
+
6. **Выбор модели (только здесь или по запросу — дорого):** `besales://workflows/compare-models`
|
|
77
|
+
(`besales_model_catalog_list` → `besales_model_comparison_run_start` → `_get` → `_eval_submit`).
|
|
78
|
+
|
|
79
|
+
## Фаза 5 — Enrich (знания + поведение + действия; чередуется с фазой 4)
|
|
80
|
+
|
|
81
|
+
- **Знания (RAG):** `besales_file_upload_request` → `besales_file_upload_status`;
|
|
82
|
+
`besales_knowledge_space_create` → наполни (`besales_knowledge_document_upload` /
|
|
83
|
+
`besales_knowledge_qa_create` / `besales_knowledge_table_link` / `besales_knowledge_website_add`) →
|
|
84
|
+
**обязательно** привяжи space к каналу: `besales_knowledge_space_channel_link_upsert`
|
|
85
|
+
(иначе агент knowledge «не видит» — частая ошибка). Глубина — `besales://docs/knowledge-base`.
|
|
86
|
+
- **Поведение:** `besales_behavior_update` (тонкая настройка тона/фильтров).
|
|
87
|
+
- **Триггеры + роутинг:** `besales_trigger_upsert`; multi-agent — `besales_routing_rule_upsert` +
|
|
88
|
+
`besales_router_update` (тестируй каждого агента и систему — см. serverInstructions, правило 4).
|
|
89
|
+
- **Внешняя БД (1С) для триггеров:** `besales://workflows/connect-datasource-from-scratch`
|
|
90
|
+
(`besales_datasource_*`; чтение/запись через триггеры DATA_SOURCE_READ/WRITE, не тулы агента).
|
|
91
|
+
- **CRM подключаем здесь — ЕСЛИ нужна триггерам** (`besales://workflows/connect-crm-from-scratch`).
|
|
92
|
+
- Каждая новая версия промпта → тест-рефлекс (serverInstructions, правило 1).
|
|
93
|
+
|
|
94
|
+
## Фаза 6 — Activate (воронка + операторы + follow-ups + настройки)
|
|
95
|
+
|
|
96
|
+
«Вокруг диалога» — обычно когда ядро уже работает:
|
|
97
|
+
- **Воронка CRM (CRM ОБЯЗАТЕЛЕН):** `besales_crm_pipeline_list` / `besales_crm_pipeline_create`,
|
|
98
|
+
`besales_platform_pipeline_link`, `besales_crm_field_mapping_upsert`.
|
|
99
|
+
- **Операторы:** `besales_crm_operator_list` / `besales_crm_operator_update`.
|
|
100
|
+
- **Follow-ups / реактивация** (CRM не требует): `besales_followup_sequence_upsert`.
|
|
101
|
+
- **Настройки платформы:** `besales_platform_settings_update` / `besales_pipeline_settings_update`.
|
|
102
|
+
|
|
103
|
+
## Финал
|
|
104
|
+
|
|
105
|
+
→ workflow `besales://workflows/production-readiness-check`. Затем предложи: вернуться к доработке
|
|
106
|
+
любой фазы или зафиксировать, что настройка завершена.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
**Компас:** `suggestedNextPhase` эмитит `{1,4,5,null}` и НЕ знает тип бота — для свежего канала
|
|
111
|
+
сразу показывает `'4'`. Для non-FAQ ботов сделай фазы 2 (ICP) и 3 (скрипт) ДО финализации промпта,
|
|
112
|
+
даже если компас их пропустил. Сквозные правила (тест-рефлекс, Sheets-feedback, модели→фаза 4,
|
|
113
|
+
мультиагент+роутер, ленивая CRM, гибкость) — в serverInstructions.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Workflow: Production Readiness Check
|
|
2
|
+
|
|
3
|
+
Финальная проверка перед запуском бота. Опирается на `besales_workspace_overview` →
|
|
4
|
+
`setupCompleteness`. Формируй список «готово / недоделано», не блокируй жёстко —
|
|
5
|
+
часть пунктов опциональна по бизнес-цели.
|
|
6
|
+
|
|
7
|
+
## Шаг 1 — Снимок
|
|
8
|
+
|
|
9
|
+
`besales_workspace_overview` → читай `setupCompleteness`. При необходимости детали:
|
|
10
|
+
`besales_platform_context_get` (по конкретному каналу), `besales_agent_list`.
|
|
11
|
+
|
|
12
|
+
## Чеклист (по `setupCompleteness`, поля camelCase)
|
|
13
|
+
|
|
14
|
+
**Блокирующее (должно быть):**
|
|
15
|
+
- `channelsConnected ≥ 1` и нет залипших `channelsPending`. Канал `isActive` + AI включён.
|
|
16
|
+
- `hasAnchorAgent` — агент существует, с непустым промптом (проверь `besales_prompt_lint`)
|
|
17
|
+
и приветствием (`besales_behavior_update`).
|
|
18
|
+
|
|
19
|
+
**Сильно рекомендуется:**
|
|
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` не блокирует.
|
|
29
|
+
|
|
30
|
+
**По бизнес-цели (опционально — НЕ «недоделано» если не нужно):**
|
|
31
|
+
- Triggers / follow-ups: `besales_trigger_upsert` / `besales_followup_sequence_upsert`.
|
|
32
|
+
- CRM: `crmConnected`, pipelines привязаны (`besales_platform_pipeline_link`),
|
|
33
|
+
field-mapping (`besales_crm_field_mapping_get`), операторы (`besales_crm_operator_list`).
|
|
34
|
+
|
|
35
|
+
## Шаг 2 — Отчёт пользователю
|
|
36
|
+
|
|
37
|
+
Покажи «✅ готово / ⚠️ стоит доделать / ⏭️ опционально». Для каждого ⚠️ — какой инструмент
|
|
38
|
+
закрывает пробел. Не запускай молча — дай пользователю решение.
|
|
39
|
+
|
|
40
|
+
> Доменная глубина: `besales://docs/platforms` (готовность канала), `besales://docs/crm-integration`
|
|
41
|
+
> (CRM-настройка), `besales://docs/knowledge-base` (RAG-привязка).
|