@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.
- package/CHANGELOG.md +101 -1
- package/README.md +26 -4
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +22 -0
- package/dist/cli.js.map +1 -1
- package/dist/resources/docs/agent-behavior.md +3 -1
- package/dist/resources/docs/pipeline-builder.md +6 -2
- package/dist/resources/docs/prompt-principles.md +31 -1
- package/dist/resources/registry.js +1 -0
- package/dist/resources/registry.js.map +1 -1
- package/dist/resources/workflows/audit-dialogues.md +77 -0
- package/dist/resources/workflows/compare-models.md +1 -1
- package/dist/schemas/mcp-tools.json +4816 -1559
- package/dist/skills/besales-dialogue-audit/SKILL.md +27 -0
- package/dist/skills/install-skill.d.ts +7 -0
- package/dist/skills/install-skill.js +33 -0
- package/dist/skills/install-skill.js.map +1 -0
- package/dist/tools/definitions/crm-platform.d.ts +1 -0
- package/dist/tools/definitions/crm-platform.js +5 -0
- package/dist/tools/definitions/crm-platform.js.map +1 -1
- package/dist/tools/definitions/dialogue-export.d.ts +22 -0
- package/dist/tools/definitions/dialogue-export.js +147 -0
- package/dist/tools/definitions/dialogue-export.js.map +1 -0
- package/dist/tools/definitions/external-api-channels.d.ts +14 -0
- package/dist/tools/definitions/external-api-channels.js +102 -0
- package/dist/tools/definitions/external-api-channels.js.map +1 -0
- package/dist/tools/definitions/knowledge.d.ts +1 -1
- package/dist/tools/definitions/model-comparison.js +2 -1
- package/dist/tools/definitions/model-comparison.js.map +1 -1
- package/dist/tools/definitions/platform-setup.d.ts +60 -4
- package/dist/tools/definitions/platform-setup.js +181 -1
- package/dist/tools/definitions/platform-setup.js.map +1 -1
- package/dist/tools/definitions/shared.d.ts +31 -4
- package/dist/tools/definitions/shared.js +24 -6
- package/dist/tools/definitions/shared.js.map +1 -1
- package/dist/tools/definitions.d.ts +96 -5
- package/dist/tools/definitions.js +4 -0
- package/dist/tools/definitions.js.map +1 -1
- package/docs/host-setup.md +4 -4
- 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 →
|
|
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 (
|
|
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 |
|
|
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
|
|
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
|
|
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":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAA2B,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
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
|
-
| `
|
|
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
|
-
|
|
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
|
-
набор по умолчанию). До **
|
|
23
|
+
набор по умолчанию). До **18 моделей** и **20 диалогов**, если оператор просит
|
|
24
24
|
больше. Возвращает `run_id`.
|
|
25
25
|
|
|
26
26
|
3. **`besales_model_comparison_get`** `{ agent_id, run_id }` — поллируй до
|