@besales/mcp 0.19.0 → 0.28.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 (40) hide show
  1. package/CHANGELOG.md +101 -1
  2. package/README.md +26 -4
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +22 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/resources/docs/agent-behavior.md +3 -1
  7. package/dist/resources/docs/pipeline-builder.md +6 -2
  8. package/dist/resources/docs/prompt-principles.md +31 -1
  9. package/dist/resources/registry.js +1 -0
  10. package/dist/resources/registry.js.map +1 -1
  11. package/dist/resources/workflows/audit-dialogues.md +77 -0
  12. package/dist/resources/workflows/compare-models.md +1 -1
  13. package/dist/schemas/mcp-tools.json +4816 -1559
  14. package/dist/skills/besales-dialogue-audit/SKILL.md +27 -0
  15. package/dist/skills/install-skill.d.ts +7 -0
  16. package/dist/skills/install-skill.js +33 -0
  17. package/dist/skills/install-skill.js.map +1 -0
  18. package/dist/tools/definitions/crm-platform.d.ts +1 -0
  19. package/dist/tools/definitions/crm-platform.js +5 -0
  20. package/dist/tools/definitions/crm-platform.js.map +1 -1
  21. package/dist/tools/definitions/dialogue-export.d.ts +22 -0
  22. package/dist/tools/definitions/dialogue-export.js +147 -0
  23. package/dist/tools/definitions/dialogue-export.js.map +1 -0
  24. package/dist/tools/definitions/external-api-channels.d.ts +14 -0
  25. package/dist/tools/definitions/external-api-channels.js +102 -0
  26. package/dist/tools/definitions/external-api-channels.js.map +1 -0
  27. package/dist/tools/definitions/knowledge.d.ts +1 -1
  28. package/dist/tools/definitions/model-comparison.js +2 -1
  29. package/dist/tools/definitions/model-comparison.js.map +1 -1
  30. package/dist/tools/definitions/platform-setup.d.ts +60 -4
  31. package/dist/tools/definitions/platform-setup.js +181 -1
  32. package/dist/tools/definitions/platform-setup.js.map +1 -1
  33. package/dist/tools/definitions/shared.d.ts +31 -4
  34. package/dist/tools/definitions/shared.js +24 -6
  35. package/dist/tools/definitions/shared.js.map +1 -1
  36. package/dist/tools/definitions.d.ts +96 -5
  37. package/dist/tools/definitions.js +4 -0
  38. package/dist/tools/definitions.js.map +1 -1
  39. package/docs/host-setup.md +4 -4
  40. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -13,7 +13,107 @@ and the project aims to follow [Semantic Versioning](https://semver.org/).
13
13
 
14
14
  The tool counts below are derived from `src/schemas/mcp-tools.json`
15
15
  (`tools.length`) at each milestone commit and are asserted in
16
- `src/tools/registry.spec.ts`. The active toolset grew from 18 → 131.
16
+ `src/tools/registry.spec.ts`. The active toolset grew from 18 → 138.
17
+
18
+ ## [Unreleased]
19
+
20
+ ### Changed
21
+
22
+ - `besales_crm_pipeline_status_update` получил optional `is_system_managed` —
23
+ master-переключатель «Управляется системой» из Pipeline Builder UI. Локальные настройки
24
+ статуса не вызывают пустой PATCH во внешний CRM. Tool count не изменился.
25
+
26
+ - `besales_getcourse_wave_import` синхронизирован с аналитикой запусков: `funnel` теперь явно
27
+ означает каноническую бизнес-воронку, а имя конкретного запуска передаётся отдельно через
28
+ `cohort_label`. Добавлены `message_variant`, `found_count` и per-contact timestamps
29
+ `segment_entered_at` / legacy `lead_last_active_at`; все поля валидируются и маппятся в v2 API.
30
+ Tool count не изменился.
31
+
32
+ ## 0.26.0
33
+
34
+ - `product_code` валидируется zod-паттерном `^[^\s/]+# Changelog
35
+
36
+ All notable changes to `@besales/mcp` are documented in this file.
37
+
38
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
39
+ and the project aims to follow [Semantic Versioning](https://semver.org/).
40
+
41
+ > **Versioning.** Under 0.x SemVer a breaking change bumps the minor version (not
42
+ > major). Minors have carried breaking changes: `0.2.0` removed deprecated MCP tool
43
+ > shapes (Phase B hard break, 2026-05-27); `0.3.0` removed the `CredentialReader` /
44
+ > `CredentialStorage` exports and `ToolApiClient.getStoredWorkspaceId()`.
45
+ > `package.json` tracks the latest released version.
46
+
47
+ The tool counts below are derived from `src/schemas/mcp-tools.json`
48
+ (`tools.length`) at each milestone commit and are asserted in
49
+ `src/tools/registry.spec.ts`. The active toolset grew from 18 → 138.
50
+
51
+ (после `.trim()`, чтобы не быть строже бэкенда на краевых пробелах); `pattern` продублирован в обеих копиях `mcp-tools.json` и в OpenAPI-контракте. Поведенческий тест в `registry.spec.ts`.
52
+
53
+ - `besales_getcourse_wave_import`: новые опциональные поля `product_code` / `product_name` — привязывают воронку волны к продукту справочника «воронка → продукт» (аналитика рассылок). Правило create-if-absent: уже замапленная воронка НЕ перезаписывается, конфликты возвращаются в `productMapping` ответа. `product_code` требует `funnel`; `product_name` без кода → 400. Не путать с `preflight.product_title` (сверка оплат).
54
+
55
+ ## [0.25.0] — 2026-07-09
56
+
57
+ ### Added
58
+
59
+ - **`output_config.response_mode` в `besales_agent_update` — «тихий режим» агента (tool count unchanged, 143).**
60
+ Новое поле `response_mode: TEXT | SILENT` (backend `AgentChat.responseMode`): SILENT-агент
61
+ не отправляет ответы в канал, но полностью выполняет триггеры/действия (CRM, заметки,
62
+ вебхуки; исключение — `GETCOURSE_SEND_PAYMENT_LINK`, у тихого агента пропускается целиком,
63
+ включая создание заказа в GetCourse). Неотправленные ответы сохраняются в истории чата
64
+ с пометкой «[Тихий режим — не отправлено]». Правки: Zod `agentOutputConfigSchema` +
65
+ `mapOutputConfigInput` + advertisement в `mcp-tools.json` (обе копии синхронно, codegen
66
+ не запускался). Read-back — `responseMode` в `Agent` (`besales_agent_list` /
67
+ `besales_platform_context_get`).
68
+
69
+ ## [0.24.0] — 2026-07-06
70
+
71
+ ### Added
72
+
73
+ - **`besales_agent_clone` — deep-clone AgentChat на той же платформе (142 → 143 tools).**
74
+ Зеркало GUI-кнопки «клонировать»: `POST /api/v2/platforms/:platformId/agents/:agentId/clone`,
75
+ scope `mcp:platform-setup`. Копирует baseSystemPrompt (+prompt-линковку NULL → PromptHub
76
+ bootstrap), knowledge namespaces, модель/tools/переменные, ICP-линки и ВСЕ триггеры+действия;
77
+ НЕ копирует routing rules и per-platform `AgentBehavior` (клон инертен до привязки к роутеру).
78
+ cross-platform не поддержан. Increment 21.
79
+ - **`besales_getcourse_wave_import.check_messenger_presence` (optional, default TRUE) — 0 new tools.**
80
+ На Шаге 1 отсеивает контакты без мессенджера (Telegram/Max/VK): не импортируются и не уходят в
81
+ волну (число — в `contactsSkippedNoMessenger`). Проверка = API-вызов на КАЖДЫЙ контакт, запуск
82
+ синхронно ждёт Шаг 1 → для БОЛЬШИХ когорт (сотни) риск таймаута клиента: тогда `false` + сначала
83
+ backfill `POST /chat-users/import/getcourse-refresh-messengers`. Contract↔zod parity.
84
+
85
+ ## [0.21.0] — 2026-06-26
86
+
87
+ ### Added
88
+
89
+ - **External API channel provisioning — 4 direct tools (134 → 138 tools).**
90
+ `besales_external_api_channel_create` / `_rotate_key` / `_rotate_secret` / `_update` —
91
+ провижининг открытого партнёрского relay-канала `ExternalApi` через MCP (зеркало
92
+ `besales_crm_activate`): direct POST/PATCH на `/api/v2/workspaces/:workspaceId/external-api-channels`,
93
+ scope `mcp:platform-setup`, `defaultWorkspaceId`. `create` возвращает `{ channelId, apiKey,
94
+ webhookSecret, ingestPath }` — apiKey (Bearer входящих партнёра) и webhookSecret (HMAC-подпись
95
+ наших колбэков) показываются ОДИН раз; `_rotate_key` / `_rotate_secret` перевыпускают их (старое
96
+ инвалидируется немедленно); `_update` меняет несекретные `callback_url` / `source_channel`.
97
+ Канал также провиженится из UI (front-aniomaly `AddPlatformPage` / `PlatformPage`) и принимает
98
+ входящие на `POST /api/v2/channels/:channelId/messages` (Bearer bsl-ключ) → AI → HMAC-колбэк
99
+ (`message.reply`; проактивный follow-up — `message.followup` без `requestId`). Новый
100
+ `src/tools/definitions/external-api-channels.ts` + записи в `mcp-tools.json`; contract↔zod parity
101
+ (`registry.spec.ts` / `server.spec.ts` → 138).
102
+
103
+ ## [0.20.0] — 2026-06-25
104
+
105
+ ### Added
106
+
107
+ - **`besales_agent_variable_overrides_get` — read-only текущие перезаписи переменных агента (133 → 134 tools).**
108
+ `GET /platforms/:platformId/agents/:agentId/variable-overrides` (workspace-scoped) → `{ workspaceOverrides[],
109
+ customOverrides[] }`: для каждой перезаписи — id переменной + `name` + `type` + `overrideValue`.
110
+ `workspaceOverrides` — перезаписи `WorkspaceVariable` (референс `{{{name}}}`), `customOverrides` —
111
+ платформенной `CustomVariable` (`{name}`). Закрывает асимметрию: перезаписи через MCP можно было
112
+ ЗАПИСАТЬ (`besales_agent_update.agent_variable_overrides` / `agent_workspace_variable_overrides`), но не
113
+ ПРОЧИТАТЬ (read-back существовал только GUI-эндпоинтом под `JwtAuthGuard`). Эти поля заменяют набор
114
+ ЦЕЛИКОМ (`replaceForAgent` = delete отсутствующих + upsert присланных), поэтому read-back обязателен,
115
+ чтобы не затереть уже выставленную перезапись (напр. `registration_link`): прочитал → добавил новые →
116
+ переотправил весь набор. Backend: `getAgentVariableOverrides` в `platform-setup-adapter` (+spec).
17
117
 
18
118
  ## [0.18.0] — 2026-06-23
19
119
 
package/README.md CHANGED
@@ -279,7 +279,7 @@ connect each once and pin sessions via `BESALES_WORKSPACE_ID` (or switch the
279
279
  global default with `besales-mcp use <id>`) — see
280
280
  [Multiple Workspaces](#multiple-workspaces).
281
281
 
282
- ## Available tools (128 tools by category)
282
+ ## Available tools (143 tools by category)
283
283
 
284
284
  Counts are derived from `src/schemas/mcp-tools.json` (`summary.tools_by_category`)
285
285
  and asserted in `src/tools/registry.spec.ts`:
@@ -291,7 +291,7 @@ and asserted in `src/tools/registry.spec.ts`:
291
291
  | Prompt generation / analysis / lint / patch sessions | 13 | `besales_prompt_*`, `besales_qa_generation_*` external pairs |
292
292
  | Sandbox / simulation / test-scenario generation | 7 | `besales_sandbox_*`, `besales_simulation_*`, `besales_test_scenario_*` |
293
293
  | Model comparison (bake-off) | 4 | `besales_model_catalog_list` + `besales_model_comparison_run_start` / `_get` / `_eval_submit` (on-demand multi-model prompt comparison) |
294
- | Agent / router / triggers / behavior / facts | 13 | Platform Setup Bridge (incl. `besales_behavior_update`, `besales_pipeline_settings_update`, `besales_platform_settings_update`) + `besales_facts_*` |
294
+ | Agent / router / triggers / behavior / facts | 14 | Platform Setup Bridge (incl. `besales_agent_clone`, `besales_behavior_update`, `besales_pipeline_settings_update`, `besales_platform_settings_update`) + `besales_facts_*` |
295
295
  | Knowledge — spaces | 6 | `besales_knowledge_space_*` |
296
296
  | Knowledge — documents | 4 | incl. `besales_knowledge_document_upload` |
297
297
  | Knowledge — Q&A | 7 | CRUD + semantic search + move |
@@ -308,6 +308,7 @@ and asserted in `src/tools/registry.spec.ts`:
308
308
  | Files | 3 | `besales_file_upload_request` + status + list |
309
309
  | Context / overview / audit | 3 | `besales_workspace_overview`, `besales_platform_context_get`, `besales_audit_revert` |
310
310
  | Session / workspace binding | 2 | `besales_workspace_use`, `besales_workspace_current` (in-memory per-session, local — no backend) |
311
+ | Dialogue audit | 2 | `besales_dialogues_query`, `besales_dialogue_transcript` — read-only transcript + trigger-action evidence |
311
312
 
312
313
  Recent capabilities:
313
314
 
@@ -328,7 +329,11 @@ Recent capabilities:
328
329
 
329
330
  ## Resources
330
331
 
331
- The package exposes 7 MCP concept resources:
332
+ The package exposes 31 MCP resources. The dialogue-audit workflow is:
333
+
334
+ - `besales://workflows/audit-dialogues`
335
+
336
+ The seven base concept resources are:
332
337
 
333
338
  - `besales://concepts/icp`
334
339
  - `besales://concepts/triggers`
@@ -344,7 +349,24 @@ Inspect them locally:
344
349
  yarn dlx @modelcontextprotocol/inspector node bin/besales-mcp.js
345
350
  ```
346
351
 
347
- The Inspector should show 128 tools and 23 resources.
352
+ The Inspector should show 143 tools and 31 resources.
353
+
354
+ ## Codex Dialogue Audit Skill
355
+
356
+ Install the packaged read-only audit skill on Anton's machine:
357
+
358
+ ```bash
359
+ npx -y @besales/mcp install-skill besales-dialogue-audit
360
+ ```
361
+
362
+ Restart Codex after installation. To update an existing copy:
363
+
364
+ ```bash
365
+ npx -y @besales/mcp install-skill besales-dialogue-audit --force
366
+ ```
367
+
368
+ The skill uses only `besales_dialogues_query` and `besales_dialogue_transcript`,
369
+ follows `besales://workflows/audit-dialogues`, and never mutates agents or CRM data.
348
370
 
349
371
  ## Claude Desktop
350
372
 
package/dist/cli.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { ConnectionStore } from './auth/connection-store.js';
2
2
  import { type OAuthConnectResult } from './auth/oauth-client.js';
3
3
  import { startMcpServer } from './server.js';
4
+ import { type InstallSkillOptions } from './skills/install-skill.js';
4
5
  export interface CliIo {
5
6
  readonly log: (message: string) => void;
6
7
  readonly error: (message: string) => void;
@@ -12,6 +13,7 @@ export interface CliDeps {
12
13
  readonly oauthClient?: OAuthConnector;
13
14
  readonly store?: ConnectionStore;
14
15
  readonly startMcpServer?: typeof startMcpServer;
16
+ readonly installCodexSkill?: (name: string, options?: InstallSkillOptions) => Promise<string>;
15
17
  }
16
18
  export declare function getHelpText(version?: string): string;
17
19
  export declare function runCli(argv?: readonly string[], io?: CliIo, deps?: CliDeps): Promise<number>;
package/dist/cli.js CHANGED
@@ -2,6 +2,7 @@ import { ConnectionStore } from './auth/connection-store.js';
2
2
  import { OauthClient } from './auth/oauth-client.js';
3
3
  import { readPackageVersion } from './package-metadata.js';
4
4
  import { startMcpServer } from './server.js';
5
+ import { installCodexSkill } from './skills/install-skill.js';
5
6
  import { maskApiKey } from './utils/mask.js';
6
7
  const defaultIo = {
7
8
  log: (message) => console.log(message),
@@ -20,6 +21,8 @@ Usage:
20
21
  besales-mcp disconnect Disconnect the active workspace
21
22
  besales-mcp disconnect <id> Disconnect one workspace
22
23
  besales-mcp disconnect --all Disconnect every workspace
24
+ besales-mcp install-skill <name> Install a packaged skill into Codex
25
+ besales-mcp install-skill <name> --force Update an installed skill
23
26
  besales-mcp --help Show help
24
27
  besales-mcp --version Show version
25
28
 
@@ -40,6 +43,7 @@ export async function runCli(argv = process.argv.slice(2), io = defaultIo, deps
40
43
  });
41
44
  const store = deps.store ?? new ConnectionStore();
42
45
  const runMcpServer = deps.startMcpServer ?? startMcpServer;
46
+ const runSkillInstaller = deps.installCodexSkill ?? installCodexSkill;
43
47
  if (command === '--help' || command === '-h') {
44
48
  io.log(getHelpText());
45
49
  return 0;
@@ -48,6 +52,9 @@ export async function runCli(argv = process.argv.slice(2), io = defaultIo, deps
48
52
  io.log(readPackageVersion());
49
53
  return 0;
50
54
  }
55
+ if (command === 'install-skill') {
56
+ return installSkillCommand(argv[1], argv.includes('--force'), io, runSkillInstaller);
57
+ }
51
58
  if (command && STORAGE_COMMANDS.has(command)) {
52
59
  // Миграция legacy-пары ДО любой записи в index — иначе connect для второго
53
60
  // воркспейса перезатёр бы ещё не мигрированный первый.
@@ -73,6 +80,21 @@ export async function runCli(argv = process.argv.slice(2), io = defaultIo, deps
73
80
  await runMcpServer({ stdio: true });
74
81
  return 0;
75
82
  }
83
+ async function installSkillCommand(name, force, io, installer) {
84
+ if (!name || name === '--force') {
85
+ io.error('Usage: besales-mcp install-skill <name> [--force]');
86
+ return 1;
87
+ }
88
+ try {
89
+ const destination = await installer(name, { force });
90
+ io.log(`Installed ${name} to ${destination}. Restart Codex to load it.`);
91
+ return 0;
92
+ }
93
+ catch (error) {
94
+ io.error(error instanceof Error ? error.message : String(error));
95
+ return 1;
96
+ }
97
+ }
76
98
  async function connectCommand(io, oauthClient, store) {
77
99
  const { apiKey, workspaceId } = await oauthClient.connect();
78
100
  await store.addOrReplace(workspaceId, apiKey);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -79,6 +79,7 @@
79
79
 
80
80
  "skipTaskCreationOnCallOperator": false,
81
81
  "anonymizationEnabled": false,
82
+ "contactNamePersonalizationMode": "OFF",
82
83
  "anonymizationDisabledTypes": [],
83
84
 
84
85
  "goOffline": "0"
@@ -208,7 +209,8 @@
208
209
  | `followUpWaitingReturn` | -1 | На сколько часов отключить follow-up после оператора. `-1` = не отключать, `0` = навсегда, `1`–`24` — часы. |
209
210
  | `skipTaskCreationOnCallOperator` | false | Если `true` — при `call_operator` система **только** меняет ответственного на оператора, без постановки задачи в CRM. Полезно, когда workflow в CRM ведётся через статусы воронки, а не через task'ы, и лишние «висящие» задачи на оператора засоряют его список дел. |
210
211
  | `anonymizationEnabled` | false | Обратимая PII-анонимизация LLM-пайплайна (per-platform). Если `true` — реальные имя/телефон/email клиента вырезаются из сообщений перед отправкой в LLM (заменяются токенами) и подставляются обратно в ответе и в аргументах tool-call (например, поля CRM). Ставится через секцию `privacy: { anonymization_enabled }` в `besales_behavior_update`. |
211
- | `anonymizationDisabledTypes` | `[]` | Типы PII, выключенные из анонимизации (при `anonymizationEnabled=true` отдаются в LLM **реальными**). OFF-список: пусто = скрывать всё. Имя дробится на части — исключив `FIRST_NAME`, отдаёшь реальное имя в LLM, и модель склоняет его в нужный падеж сама. Значения: `FIRST_NAME`/`LAST_NAME`/`PATRONYMIC`/`PERSON`/`PHONE`/`EMAIL`/`INN`/`PASSPORT`/`CARD`/`DATE_OF_BIRTH`/`ACCOUNT`/`SNILS`/`OGRN`/`OGRNIP`/`SOCIAL_ID` (СНИЛС/ОГРН/ОГРНИП — по контрольной сумме; SOCIAL_ID — VK/Telegram/Max @-хэндлы и ссылки на профиль). Ставится через `privacy: { anonymization_disabled_types }`. ⚠️ Выключение типа — осознанная передача данных провайдеру модели. |
212
+ | `contactNamePersonalizationMode` | `OFF` | Режим безопасного обращения по подтверждённому имени: `OFF`, `SHADOW` или `ENABLED`. Реальное имя остаётся скрытым; модель получает только стабильный semantic token. Ставится через `privacy: { contact_name_personalization_mode }`. |
213
+ | `anonymizationDisabledTypes` | `[]` | OFF-список прочих PII, которые при включённой анонимизации осознанно отдаются модели реальными. Имена/фамилии/отчества выключить нельзя. Значения: `PHONE`/`EMAIL`/`INN`/`PASSPORT`/`CARD`/`DATE_OF_BIRTH`/`ACCOUNT`/`SNILS`/`OGRN`/`OGRNIP`/`SOCIAL_ID`. Ставится через `privacy: { anonymization_disabled_types }`. |
212
214
 
213
215
  ## 9. Обработка медиа от пользователя
214
216
 
@@ -109,12 +109,16 @@
109
109
 
110
110
  Альтернативный механизм автоперехода — на уровне самого статуса: `null` или ID статуса, в который перейти при получении сообщения от пользователя. Может конфликтовать с `PipelineSettings.incomingMoveToStatus` — приоритет за `PipelineSettings`.
111
111
 
112
- ### `CrmPipelineStatus.isBotActive` и `isOperatorAvailable`
112
+ ### `CrmPipelineStatus.isSystemManaged`, `isBotActive` и `isOperatorAvailable`
113
113
 
114
- Не часть Pipeline Builder, но влияют на работу:
114
+ Эти поля хранятся на статусе и редактируются в Pipeline Builder:
115
+ - `isSystemManaged=false` → master-гейт выключен: статус не управляется системой, а UI считает бота и оператора неактивными независимо от дочерних флагов.
115
116
  - `isBotActive=false` → бот молчит на этом этапе.
116
117
  - `isOperatorAvailable=false` → оператор не может быть подключён через `CALL_OPERATOR`.
117
118
 
119
+ Через MCP эти поля меняются в `besales_crm_pipeline_status_update` как
120
+ `is_system_managed`, `is_bot_active` и `is_operator_available`.
121
+
118
122
  ## 5. PlatformPipeline — связь платформы с воронками
119
123
 
120
124
  Платформа может работать с **несколькими воронками** одной CRM (например, одна для лидов, другая для текущих клиентов):
@@ -16,7 +16,10 @@
16
16
  > пополнение 2026-06-16 (A34-A38, B40, C8-C9): A34-A37/B40/C8 — из gap-анализа трёх референс-промптов
17
17
  > (Ksamata reactivation, used-equipment Avito-inbound, jewelry inbound), провенанс
18
18
  > `docs/dialog-corpus/deep/candidates-2026-06-16-reference-prompts.md`; A38 (эмодзи) и C9 (few-shot
19
- > на каждом языке агента) — из боевых правок Aslzar-бота.
19
+ > на каждом языке агента) — из боевых правок Aslzar-бота. Пополнение 2026-06-25 (B41, B42, C10) — из
20
+ > сессии Ksamata reactivation (qwen-max ВСЁ РАВНО сливал на 1-м возражении): неплатёжеспособность как
21
+ > отрабатываемое возражение (≠ отказ), лид без боли / из любопытства (≠ тупик), единый close-гейт без
22
+ > конкурирующих exit-скриптов.
20
23
  > Часть пунктов раздела A дополнительно ловится автоматически линтером
21
24
  > (`besales_prompt_lint` / при finalize/commit) — но промпт должен соответствовать им by design,
22
25
  > не полагайся только на линтер.
@@ -638,6 +641,23 @@ A11 (markdown) и A30 (чистота). В реплику клиенту не д
638
641
  - ❌ оплативший «не могу найти курс в кабинете» → агент начинает квалифицировать или диагностировать
639
642
  - ✅ «передаю в отдел заботы, свяжутся и разберутся с доступом» (без диагностики и без «ваш вопрос передан»)
640
643
 
644
+ **B41. «Не могу платить / маленькая пенсия / нет денег сейчас» — НЕ отказ, а самое отрабатываемое возражение.**
645
+ Модель часто путает «не могу заплатить» (решаемо) с «платить не буду / только бесплатное» (отказ) и сразу
646
+ прощается — это слив. На жёсткую неплатёжеспособность не закрывай и не отсылай «досмотреть / подумать»:
647
+ предложи рассрочку, помесячную или совместную с близкими оплату ЛИБО передай человеку, чтобы разобрать
648
+ варианты оплаты. Отказ по деньгам — только принципиальное «платно в принципе не планирую», а не «дорого /
649
+ не потяну сейчас». (Расширяет B8: B8 — про мягкую подачу цены, B41 — про КЛАССИФИКАЦИЮ «нет денег» как НЕ-отказа.)
650
+ - ❌ «Понимаю, ситуация непростая. Рекомендую досмотреть, будут вопросы — пишите.» (слив на «не могу платить»)
651
+ - ✅ «Понимаю. Сумму можно разбить — рассрочка, помесячно, многие оформляют вместе с близкими. Хотите, коллега коротко разберёт удобный вариант?»
652
+
653
+ **B42. Лид без острой боли («здоров / ничего не болит / зашёл из любопытства / для профилактики») — НЕ тупик.**
654
+ Отсутствие жалобы модель читает как «продавать нечего» и сама уходит в прощание — это слив. Любопытство и
655
+ профилактика — валидный интерес: не выходи, зайди новым углом (что показалось новым/полезным; для себя или
656
+ для близких; профилактика как мотив). Не сворачивай реактивацию/квалификацию только потому, что человека
657
+ сейчас ничего не беспокоит. (Расширяет B7: B7 — про «нет/всё хорошо» на квалификацию, B42 — про «нет БОЛИ/нужды».)
658
+ - ❌ «Раз всё в норме — не буду задерживать, будут вопросы пишите, хорошего вечера!» (слив на «здоров/любопытство»)
659
+ - ✅ «Здорово следить за собой ещё до проблем — это и есть профилактика. А что показалось самым полезным? Для себя или, может, кому-то из близких актуально?»
660
+
641
661
  ## Раздел C. Процесс генерации (как писать промпт, а не только что писать)
642
662
 
643
663
  Эти правила — для того, кто СОЗДАЁТ промпт (Claude), а не для самого агента.
@@ -705,6 +725,16 @@ ONCE_STRICT — первый ответ дословный, дальше мяг
705
725
  (`adapt_to_user_language`), продублируй ключевые few-shot (опенер без зачина, без эха, один вопрос,
706
726
  корректный отказ) на КАЖДОМ активном языке — иначе дисциплина держится только в языке примеров.
707
727
 
728
+ **C10. Закрытие диалога — ОДНО авторитетное решение «закрыть vs продолжать», без конкурирующих exit-скриптов
729
+ в промпте.** Главный рецидив сливов: рядом с правилом «не сдавайся» лежит дословный прощальный шаблон (или
730
+ мягкий сигнал ошибочно отнесён к «закрыть»), и модель тянет именно exit. Сделай бинарный гейт ВЫШЕ остальных
731
+ правил раздела: «закрыть» — узкий ЯВНЫЙ список (принципиальный отказ от платного / «не пишите» / N безуспешных
732
+ заходов), всё прочее → «продолжать», по умолчанию «продолжать». Перечисли ПОИМЁННО каждое мягкое «нет» как
733
+ «продолжать» (включая «не сейчас», «присматриваюсь», «не могу платить» → B41, «здоров / из любопытства» → B42).
734
+ И вычисти дубль-exit: ни одного дословного прощального текста рядом с «не сливайся» — модель эхоит его на любом
735
+ пограничном вводе. (Класс багов: ПРОМПТ-ФИКС №1/2/4 Ksamata — «не сдавайся» сосуществовало со встроенным
736
+ прощальным скриптом, и exit перебивал; чинилось только удалением дубль-exit + поимённым перечислением мягких «нет».)
737
+
708
738
  ---
709
739
 
710
740
  ### Что НЕ кладём в промпт по этим принципам
@@ -11,6 +11,7 @@ const resourceFilesByUri = {
11
11
  'besales://concepts/feedback-sheets': 'concepts/feedback-sheets.md',
12
12
  'besales://concepts/workbook-classification': 'concepts/workbook-classification.md',
13
13
  'besales://workflows/platform-setup-from-scratch': 'workflows/platform-setup-from-scratch.md',
14
+ 'besales://workflows/audit-dialogues': 'workflows/audit-dialogues.md',
14
15
  'besales://workflows/connect-crm-from-scratch': 'workflows/connect-crm-from-scratch.md',
15
16
  'besales://workflows/connect-datasource-from-scratch': 'workflows/connect-datasource-from-scratch.md',
16
17
  'besales://workflows/extract-from-document': 'workflows/extract-from-document.md',
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/resources/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C,OAAO,EAAE,oBAAoB,EAAyB,MAAM,uBAAuB,CAAC;AAMpF,mEAAmE;AACnE,gGAAgG;AAChG,MAAM,kBAAkB,GAAqC;IAC3D,wBAAwB,EAAE,iBAAiB;IAC3C,6BAA6B,EAAE,sBAAsB;IACrD,4BAA4B,EAAE,qBAAqB;IACnD,4BAA4B,EAAE,qBAAqB;IACnD,uCAAuC,EAAE,gCAAgC;IACzE,oCAAoC,EAAE,6BAA6B;IACnE,4CAA4C,EAAE,qCAAqC;IACnF,iDAAiD,EAAE,0CAA0C;IAC7F,8CAA8C,EAAE,uCAAuC;IACvF,qDAAqD,EACnD,8CAA8C;IAChD,2CAA2C,EAAE,oCAAoC;IACjF,0CAA0C,EAAE,mCAAmC;IAC/E,oCAAoC,EAAE,6BAA6B;IACnE,gDAAgD,EAAE,yCAAyC;IAC3F,gGAAgG;IAChG,+BAA+B,EAAE,wBAAwB;IACzD,+BAA+B,EAAE,wBAAwB;IACzD,+BAA+B,EAAE,wBAAwB;IACzD,0BAA0B,EAAE,mBAAmB;IAC/C,gCAAgC,EAAE,yBAAyB;IAC3D,iCAAiC,EAAE,0BAA0B;IAC7D,kCAAkC,EAAE,2BAA2B;IAC/D,uCAAuC,EAAE,gCAAgC;IACzE,oGAAoG;IACpG,kCAAkC,EAAE,2BAA2B;IAC/D,6FAA6F;IAC7F,kGAAkG;IAClG,sCAAsC;IACtC,iCAAiC,EAAE,0BAA0B;IAC7D,+BAA+B,EAAE,wBAAwB;IACzD,sCAAsC,EAAE,+BAA+B;IACvE,mCAAmC,EAAE,4BAA4B;IACjE,+BAA+B,EAAE,wBAAwB;IACzD,gCAAgC,EAAE,yBAAyB;IAC3D,mCAAmC,EAAE,4BAA4B;CAClE,CAAC;AAEF,SAAS,WAAW,CAAC,YAAoB;IACvC,OAAO,IAAI,GAAG,CAAC,KAAK,YAAY,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CAAC,QAA0B;IAChD,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAEtD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,OAAO;QACL,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,KAAK,CAAC,IAAI;YACR,OAAO;gBACL,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,IAAI,EAAE,MAAM,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;aACzD,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAyB,oBAAoB,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/resources/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C,OAAO,EAAE,oBAAoB,EAAyB,MAAM,uBAAuB,CAAC;AAMpF,mEAAmE;AACnE,gGAAgG;AAChG,MAAM,kBAAkB,GAAqC;IAC3D,wBAAwB,EAAE,iBAAiB;IAC3C,6BAA6B,EAAE,sBAAsB;IACrD,4BAA4B,EAAE,qBAAqB;IACnD,4BAA4B,EAAE,qBAAqB;IACnD,uCAAuC,EAAE,gCAAgC;IACzE,oCAAoC,EAAE,6BAA6B;IACnE,4CAA4C,EAAE,qCAAqC;IACnF,iDAAiD,EAAE,0CAA0C;IAC7F,qCAAqC,EAAE,8BAA8B;IACrE,8CAA8C,EAAE,uCAAuC;IACvF,qDAAqD,EACnD,8CAA8C;IAChD,2CAA2C,EAAE,oCAAoC;IACjF,0CAA0C,EAAE,mCAAmC;IAC/E,oCAAoC,EAAE,6BAA6B;IACnE,gDAAgD,EAAE,yCAAyC;IAC3F,gGAAgG;IAChG,+BAA+B,EAAE,wBAAwB;IACzD,+BAA+B,EAAE,wBAAwB;IACzD,+BAA+B,EAAE,wBAAwB;IACzD,0BAA0B,EAAE,mBAAmB;IAC/C,gCAAgC,EAAE,yBAAyB;IAC3D,iCAAiC,EAAE,0BAA0B;IAC7D,kCAAkC,EAAE,2BAA2B;IAC/D,uCAAuC,EAAE,gCAAgC;IACzE,oGAAoG;IACpG,kCAAkC,EAAE,2BAA2B;IAC/D,6FAA6F;IAC7F,kGAAkG;IAClG,sCAAsC;IACtC,iCAAiC,EAAE,0BAA0B;IAC7D,+BAA+B,EAAE,wBAAwB;IACzD,sCAAsC,EAAE,+BAA+B;IACvE,mCAAmC,EAAE,4BAA4B;IACjE,+BAA+B,EAAE,wBAAwB;IACzD,gCAAgC,EAAE,yBAAyB;IAC3D,mCAAmC,EAAE,4BAA4B;CAClE,CAAC;AAEF,SAAS,WAAW,CAAC,YAAoB;IACvC,OAAO,IAAI,GAAG,CAAC,KAAK,YAAY,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CAAC,QAA0B;IAChD,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAEtD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,OAAO;QACL,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,KAAK,CAAC,IAAI;YACR,OAAO;gBACL,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,IAAI,EAAE,MAAM,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;aACzD,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAyB,oBAAoB,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC"}
@@ -0,0 +1,77 @@
1
+ # Аудит production-диалогов
2
+
3
+ ## Цель
4
+
5
+ Read-only разбор реальных переписок через `besales_dialogues_query` и
6
+ `besales_dialogue_transcript`: найти ошибки агента, доказуемо сопоставить их с
7
+ выполненными trigger-actions и подготовить изменения правил и regression-кейсы.
8
+ Ничего в агенте, CRM или платформе этот workflow не меняет.
9
+
10
+ ## Выборка
11
+
12
+ 1. Если пользователь не задал период, возьми последние 7 суток и явно укажи это в отчёте.
13
+ 2. Для общего аудита фильтруй по периоду, платформам и `has_messages=true`.
14
+ 3. Для аудита созданных заявок добавь:
15
+ - `action_type=["GETCOURSE_CREATE_DEAL"]`;
16
+ - `action_success=true`;
17
+ - `action_execution_mode="production"`.
18
+ `GETCOURSE_SEND_PAYMENT_LINK` проверяй отдельной выборкой как коммерческий side effect:
19
+ он может работать с существующим заказом и не доказывает создание новой заявки.
20
+ 4. Обойди все страницы `besales_dialogues_query` по `cursor`. Не выдавай первую страницу
21
+ за полную выборку.
22
+ 5. Для каждого `conversationId` дочитай все страницы `besales_dialogue_transcript`.
23
+ Объединяй `turns` и `triggerExecutions`; `turn.messageId` связывает реплику с действием.
24
+
25
+ Action-фильтр применяется к действию на сообщении внутри заданного окна дат. Это позволяет
26
+ отличить заявку периода от старого действия в длинном диалоге.
27
+
28
+ ## Что считать созданной заявкой
29
+
30
+ - `GETCOURSE_CREATE_DEAL`, `success=true`, `resultSummary.skipped=false` и есть
31
+ `dealNumber` или `dealId` — подтверждённое создание.
32
+ - `executionMode=test` — симуляция, в production-статистику не включать.
33
+ - `resultSummary.skipped=true` — идемпотентный пропуск, новую заявку не считать.
34
+ - Успешное действие без безопасного идентификатора — факт выполнения подтверждён, но создание
35
+ пометь `REVIEW`, не додумывай результат.
36
+ - Сырой result намеренно не доступен. Не пытайся получить его прямым SQL.
37
+
38
+ ## Классификация
39
+
40
+ Каждому подтверждённому действию присвой один итог:
41
+
42
+ | Итог | Когда |
43
+ |---|---|
44
+ | `JUSTIFIED` | Новый потенциальный клиент выражает релевантный интерес, готовность обсуждать продукт/условия или просит следующий коммерческий шаг. |
45
+ | `FALSE_POSITIVE` | Действующий/оплативший ученик решает доступ, обучение, материалы, домашнее задание, расписание, возврат или иную поддержку без новой покупки. |
46
+ | `REVIEW` | Контекста недостаточно, намерение смешанное либо действие не подтверждено идентификатором. |
47
+
48
+ Дополнительно поставь тип обращения: `NEW_SALES`, `EXISTING_CUSTOMER_SUPPORT`,
49
+ `ACCESS_PROBLEM`, `TECH_SUPPORT`, `BILLING_SUPPORT`, `OTHER`.
50
+
51
+ ## Доказательства
52
+
53
+ - Приведи 1-3 коротких фрагмента клиента с `sentAt` и `messageId`.
54
+ - Укажи trigger name, action type, action time и deal number/id, если они есть.
55
+ - Отделяй наблюдаемый факт от вывода модели.
56
+ - Не выводи телефоны, email, токены и внешние идентификаторы без необходимости.
57
+ - Не утверждай, что оператор написал сообщение: `isAi=false` означает оператор ИЛИ
58
+ историческое сообщение бота.
59
+
60
+ ## Масштаб
61
+
62
+ - До 200 диалогов анализируй все.
63
+ - Более 200: если пользователь явно просит весь массив — анализируй весь массив батчами;
64
+ иначе возьми стратифицированную выборку по платформе и trigger name, назови размер выборки
65
+ и не экстраполируй абсолютные числа на всю совокупность.
66
+
67
+ ## Формат отчёта
68
+
69
+ 1. **Охват:** период, платформы, фильтры, найдено/прочитано/не удалось прочитать.
70
+ 2. **Итог:** confirmed actions, justified, false positives, review, false-positive rate.
71
+ 3. **Ошибочные заявки:** таблица `conversationId | action | deal | тип | решение | доказательство`.
72
+ 4. **Пограничные случаи:** отдельная таблица `REVIEW`.
73
+ 5. **Повторяющиеся причины:** паттерны, частота только по фактически разобранной выборке.
74
+ 6. **Изменения:** конкретные правила промпта/триггера, но без автоматического применения.
75
+ 7. **Regression-кейсы:** входной контекст, ожидаемая реакция агента и запрещённое действие.
76
+
77
+ Нулевой результат тоже фиксируй: какие фильтры применялись и что именно не найдено.
@@ -20,7 +20,7 @@
20
20
 
21
21
  2. **`besales_model_comparison_run_start`** `{ agent_id, models?, dialogue_count? }`
22
22
  — запуск (async). По умолчанию `dialogue_count=5`; `models` опционально (тогда
23
- набор по умолчанию). До **16 моделей** и **20 диалогов**, если оператор просит
23
+ набор по умолчанию). До **18 моделей** и **20 диалогов**, если оператор просит
24
24
  больше. Возвращает `run_id`.
25
25
 
26
26
  3. **`besales_model_comparison_get`** `{ agent_id, run_id }` — поллируй до