@besales/mcp 0.1.0 → 0.12.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 (94) hide show
  1. package/README.md +272 -17
  2. package/dist/auth/connection-store.d.ts +58 -0
  3. package/dist/auth/connection-store.js +208 -0
  4. package/dist/auth/connection-store.js.map +1 -0
  5. package/dist/auth/oauth-client.d.ts +27 -2
  6. package/dist/auth/oauth-client.js +62 -11
  7. package/dist/auth/oauth-client.js.map +1 -1
  8. package/dist/auth/session-workspace.d.ts +2 -0
  9. package/dist/auth/session-workspace.js +20 -0
  10. package/dist/auth/session-workspace.js.map +1 -0
  11. package/dist/auth/token-storage.d.ts +19 -5
  12. package/dist/auth/token-storage.js +11 -6
  13. package/dist/auth/token-storage.js.map +1 -1
  14. package/dist/cli.d.ts +2 -7
  15. package/dist/cli.js +111 -33
  16. package/dist/cli.js.map +1 -1
  17. package/dist/http/api-client.d.ts +4 -13
  18. package/dist/http/api-client.js +18 -18
  19. package/dist/http/api-client.js.map +1 -1
  20. package/dist/index.d.ts +8 -6
  21. package/dist/index.js +3 -2
  22. package/dist/index.js.map +1 -1
  23. package/dist/instructions/server-instructions.d.ts +15 -0
  24. package/dist/instructions/server-instructions.js +245 -0
  25. package/dist/instructions/server-instructions.js.map +1 -0
  26. package/dist/package-metadata.js +7 -1
  27. package/dist/package-metadata.js.map +1 -1
  28. package/dist/resources/concepts/feedback-sheets.md +77 -0
  29. package/dist/resources/concepts/sandbox.md +13 -0
  30. package/dist/resources/concepts/workbook-classification.md +241 -0
  31. package/dist/resources/docs/agent-behavior.md +393 -0
  32. package/dist/resources/docs/crm-integration.md +535 -0
  33. package/dist/resources/docs/files-and-uploads.md +295 -0
  34. package/dist/resources/docs/knowledge-base.md +521 -0
  35. package/dist/resources/docs/pipeline-builder.md +221 -0
  36. package/dist/resources/docs/pipeline-settings-deep.md +221 -0
  37. package/dist/resources/docs/platforms.md +513 -0
  38. package/dist/resources/docs/prompt-anatomy.md +298 -0
  39. package/dist/resources/docs/prompt-principles.md +390 -0
  40. package/dist/resources/registry.js +34 -12
  41. package/dist/resources/registry.js.map +1 -1
  42. package/dist/resources/workflows/compare-models.md +46 -0
  43. package/dist/resources/workflows/connect-crm-from-scratch.md +89 -0
  44. package/dist/resources/workflows/connect-datasource-from-scratch.md +92 -0
  45. package/dist/resources/workflows/extract-from-document.md +36 -0
  46. package/dist/resources/workflows/iterate-with-sandbox.md +31 -0
  47. package/dist/resources/workflows/platform-setup-from-scratch.md +113 -0
  48. package/dist/resources/workflows/production-readiness-check.md +41 -0
  49. package/dist/schemas/mcp-tools.json +2638 -184
  50. package/dist/server.js +2 -0
  51. package/dist/server.js.map +1 -1
  52. package/dist/tools/definitions/agent-design.d.ts +215 -0
  53. package/dist/tools/definitions/agent-design.js +644 -0
  54. package/dist/tools/definitions/agent-design.js.map +1 -0
  55. package/dist/tools/definitions/crm-platform.d.ts +211 -0
  56. package/dist/tools/definitions/crm-platform.js +1070 -0
  57. package/dist/tools/definitions/crm-platform.js.map +1 -0
  58. package/dist/tools/definitions/datasource.d.ts +40 -0
  59. package/dist/tools/definitions/datasource.js +196 -0
  60. package/dist/tools/definitions/datasource.js.map +1 -0
  61. package/dist/tools/definitions/knowledge.d.ts +215 -0
  62. package/dist/tools/definitions/knowledge.js +782 -0
  63. package/dist/tools/definitions/knowledge.js.map +1 -0
  64. package/dist/tools/definitions/model-comparison.d.ts +25 -0
  65. package/dist/tools/definitions/model-comparison.js +101 -0
  66. package/dist/tools/definitions/model-comparison.js.map +1 -0
  67. package/dist/tools/definitions/platform-setup.d.ts +412 -0
  68. package/dist/tools/definitions/platform-setup.js +741 -0
  69. package/dist/tools/definitions/platform-setup.js.map +1 -0
  70. package/dist/tools/definitions/session.d.ts +11 -0
  71. package/dist/tools/definitions/session.js +86 -0
  72. package/dist/tools/definitions/session.js.map +1 -0
  73. package/dist/tools/definitions/shared.d.ts +742 -0
  74. package/dist/tools/definitions/shared.js +773 -0
  75. package/dist/tools/definitions/shared.js.map +1 -0
  76. package/dist/tools/definitions.d.ts +873 -88
  77. package/dist/tools/definitions.js +14 -856
  78. package/dist/tools/definitions.js.map +1 -1
  79. package/dist/tools/registry.d.ts +3 -1
  80. package/dist/tools/registry.js +90 -11
  81. package/dist/tools/registry.js.map +1 -1
  82. package/dist/tools/result.d.ts +1 -1
  83. package/dist/tools/result.js +12 -4
  84. package/dist/tools/result.js.map +1 -1
  85. package/dist/utils/logger.js +2 -1
  86. package/dist/utils/logger.js.map +1 -1
  87. package/docs/host-setup.md +34 -15
  88. package/package.json +2 -2
  89. package/scripts/install-claude-desktop.js +89 -11
  90. package/scripts/mock-api-server.js +1 -1
  91. package/scripts/mock-credentials.js +49 -6
  92. package/dist/types/api-contract.gen.d.ts +0 -6975
  93. package/dist/types/api-contract.gen.js +0 -6
  94. package/dist/types/api-contract.gen.js.map +0 -1
@@ -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`): SUMMARY/скелет диалога,
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. «Скрипт диалога» → промпт (скрипт-summary ПЕРВЫМ, отдельным шагом):
65
+ а) построй структуру скрипта (этапы/ветки/реплики/переходы) → `besales_dialog_script_update`
66
+ (поле `dialog_script` — SUMMARY/скелет; читать/сверять — `besales_dialog_script_get`);
67
+ б) промпт: `besales_prompt_generate_get_instructions` → локально выполни стадии →
68
+ `besales_prompt_generate_submit` → `besales_prompt_finalize` (§6 пиши НА ОСНОВЕ скрипта, но подробнее и независимо). Структура — `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-привязка).