@besales/mcp 0.46.0 → 0.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -55
- package/dist/auth/connection-store.d.ts +21 -1
- package/dist/auth/connection-store.js +46 -2
- package/dist/auth/connection-store.js.map +1 -1
- package/dist/auth/oauth-client.d.ts +5 -1
- package/dist/auth/oauth-client.js +22 -12
- package/dist/auth/oauth-client.js.map +1 -1
- package/dist/cli.js +14 -5
- package/dist/cli.js.map +1 -1
- package/dist/http/api-client.d.ts +16 -1
- package/dist/http/api-client.js +50 -2
- package/dist/http/api-client.js.map +1 -1
- package/dist/instructions/server-instructions.d.ts +4 -13
- package/dist/instructions/server-instructions.js +68 -274
- package/dist/instructions/server-instructions.js.map +1 -1
- package/dist/prompts/registry.d.ts +15 -0
- package/dist/prompts/registry.js +83 -0
- package/dist/prompts/registry.js.map +1 -0
- package/dist/resources/concepts/feedback-sheets.md +7 -4
- package/dist/resources/concepts/handoff.md +4 -1
- package/dist/resources/concepts/sandbox.md +14 -5
- package/dist/resources/concepts/triggers.md +6 -2
- package/dist/resources/concepts/workbook-classification.md +26 -21
- package/dist/resources/docs/campaigns.md +20 -0
- package/dist/resources/docs/follow-up.md +19 -0
- package/dist/resources/docs/platforms.md +2 -2
- package/dist/resources/docs/routing.md +18 -0
- package/dist/resources/docs/task-state.md +30 -0
- package/dist/resources/docs/trigger-actions.md +28 -0
- package/dist/resources/docs/variables.md +18 -0
- package/dist/resources/registry.js +51 -2
- package/dist/resources/registry.js.map +1 -1
- package/dist/resources/workflows/extract-from-document.md +8 -1
- package/dist/resources/workflows/iterate-with-sandbox.md +5 -2
- package/dist/resources/workflows/platform-setup-from-scratch.md +90 -2
- package/dist/resources/workflows/production-readiness-check.md +22 -18
- package/dist/schemas/mcp-tools.json +1058 -99
- package/dist/server.d.ts +2 -0
- package/dist/server.js +8 -2
- package/dist/server.js.map +1 -1
- package/dist/tasks/task-state-store.d.ts +68 -0
- package/dist/tasks/task-state-store.js +278 -0
- package/dist/tasks/task-state-store.js.map +1 -0
- package/dist/tools/annotations.d.ts +7 -0
- package/dist/tools/annotations.js +16 -0
- package/dist/tools/annotations.js.map +1 -0
- package/dist/tools/contracts.js +7 -1
- package/dist/tools/contracts.js.map +1 -1
- package/dist/tools/definitions/agent-design.d.ts +41 -20
- package/dist/tools/definitions/agent-design.js +189 -19
- package/dist/tools/definitions/agent-design.js.map +1 -1
- package/dist/tools/definitions/analytics.d.ts +40 -0
- package/dist/tools/definitions/analytics.js +233 -0
- package/dist/tools/definitions/analytics.js.map +1 -0
- package/dist/tools/definitions/broadcast-analytics.js +12 -0
- package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
- package/dist/tools/definitions/broadcast-mailing-variants.d.ts +2 -0
- package/dist/tools/definitions/broadcast-mailing-variants.js +10 -0
- package/dist/tools/definitions/broadcast-mailing-variants.js.map +1 -1
- package/dist/tools/definitions/broadcast-scheduler.d.ts +7 -1
- package/dist/tools/definitions/broadcast-scheduler.js +71 -4
- package/dist/tools/definitions/broadcast-scheduler.js.map +1 -1
- package/dist/tools/definitions/contacts.d.ts +15 -0
- package/dist/tools/definitions/contacts.js +84 -0
- package/dist/tools/definitions/contacts.js.map +1 -0
- package/dist/tools/definitions/crm-platform.d.ts +2 -0
- package/dist/tools/definitions/crm-platform.js +75 -5
- package/dist/tools/definitions/crm-platform.js.map +1 -1
- package/dist/tools/definitions/datasource.d.ts +1 -0
- package/dist/tools/definitions/datasource.js +16 -1
- package/dist/tools/definitions/datasource.js.map +1 -1
- package/dist/tools/definitions/dialogue-audit.d.ts +2 -2
- package/dist/tools/definitions/dialogue-audit.js +54 -16
- package/dist/tools/definitions/dialogue-audit.js.map +1 -1
- package/dist/tools/definitions/dialogue-export.d.ts +1 -1
- package/dist/tools/definitions/dialogue-export.js +12 -0
- package/dist/tools/definitions/dialogue-export.js.map +1 -1
- package/dist/tools/definitions/external-api-channels.js +39 -12
- package/dist/tools/definitions/external-api-channels.js.map +1 -1
- package/dist/tools/definitions/follow-up-funnel-test.js +4 -0
- package/dist/tools/definitions/follow-up-funnel-test.js.map +1 -1
- package/dist/tools/definitions/follow-up-setup.js +3 -0
- package/dist/tools/definitions/follow-up-setup.js.map +1 -1
- package/dist/tools/definitions/follow-up.d.ts +1 -1
- package/dist/tools/definitions/follow-up.js +4 -0
- package/dist/tools/definitions/follow-up.js.map +1 -1
- package/dist/tools/definitions/getcourse-anchor-refresh.d.ts +3 -0
- package/dist/tools/definitions/getcourse-anchor-refresh.js +29 -2
- package/dist/tools/definitions/getcourse-anchor-refresh.js.map +1 -1
- package/dist/tools/definitions/getcourse-cold-welcome.d.ts +12 -2
- package/dist/tools/definitions/getcourse-cold-welcome.js +79 -4
- package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
- package/dist/tools/definitions/getcourse-wave.js +14 -0
- package/dist/tools/definitions/getcourse-wave.js.map +1 -1
- package/dist/tools/definitions/help.d.ts +8 -0
- package/dist/tools/definitions/help.js +219 -0
- package/dist/tools/definitions/help.js.map +1 -0
- package/dist/tools/definitions/knowledge.d.ts +27 -5
- package/dist/tools/definitions/knowledge.js +200 -33
- package/dist/tools/definitions/knowledge.js.map +1 -1
- package/dist/tools/definitions/link-tracking.js +9 -0
- package/dist/tools/definitions/link-tracking.js.map +1 -1
- package/dist/tools/definitions/model-comparison.js +6 -0
- package/dist/tools/definitions/model-comparison.js.map +1 -1
- package/dist/tools/definitions/operational-overview.d.ts +3 -0
- package/dist/tools/definitions/operational-overview.js +23 -0
- package/dist/tools/definitions/operational-overview.js.map +1 -0
- package/dist/tools/definitions/operator-workflow.d.ts +20 -0
- package/dist/tools/definitions/operator-workflow.js +114 -0
- package/dist/tools/definitions/operator-workflow.js.map +1 -0
- package/dist/tools/definitions/platform-setup.d.ts +25 -3
- package/dist/tools/definitions/platform-setup.js +198 -5
- package/dist/tools/definitions/platform-setup.js.map +1 -1
- package/dist/tools/definitions/scheduled-tasks.js +2 -0
- package/dist/tools/definitions/scheduled-tasks.js.map +1 -1
- package/dist/tools/definitions/session.js +103 -5
- package/dist/tools/definitions/session.js.map +1 -1
- package/dist/tools/definitions/shared.d.ts +153 -11
- package/dist/tools/definitions/shared.js +59 -9
- package/dist/tools/definitions/shared.js.map +1 -1
- package/dist/tools/definitions/task-state.d.ts +76 -0
- package/dist/tools/definitions/task-state.js +301 -0
- package/dist/tools/definitions/task-state.js.map +1 -0
- package/dist/tools/definitions/trigger-contact-claims.js +2 -0
- package/dist/tools/definitions/trigger-contact-claims.js.map +1 -1
- package/dist/tools/definitions.d.ts +265 -31
- package/dist/tools/definitions.js +12 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/description-localization.d.ts +2 -0
- package/dist/tools/description-localization.js +46 -0
- package/dist/tools/description-localization.js.map +1 -0
- package/dist/tools/incomplete-list.d.ts +23 -0
- package/dist/tools/incomplete-list.js +39 -0
- package/dist/tools/incomplete-list.js.map +1 -0
- package/dist/tools/inventory.d.ts +10 -0
- package/dist/tools/inventory.js +49 -0
- package/dist/tools/inventory.js.map +1 -0
- package/dist/tools/registry-mapping-cases-core.js +111 -2
- package/dist/tools/registry-mapping-cases-core.js.map +1 -1
- package/dist/tools/registry-mapping-cases-platform.js +69 -0
- package/dist/tools/registry-mapping-cases-platform.js.map +1 -1
- package/dist/tools/registry.d.ts +2 -0
- package/dist/tools/registry.js +60 -8
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/result-envelope.d.ts +46 -0
- package/dist/tools/result-envelope.js +184 -0
- package/dist/tools/result-envelope.js.map +1 -0
- package/dist/tools/result.d.ts +41 -3
- package/dist/tools/result.js +229 -27
- package/dist/tools/result.js.map +1 -1
- package/dist/tools/tool-title.d.ts +2 -0
- package/dist/tools/tool-title.js +12 -0
- package/dist/tools/tool-title.js.map +1 -0
- package/dist/tools/toolsets.d.ts +37 -0
- package/dist/tools/toolsets.js +64 -0
- package/dist/tools/toolsets.js.map +1 -0
- package/dist/tools/verify-with.d.ts +5 -0
- package/dist/tools/verify-with.js +36 -0
- package/dist/tools/verify-with.js.map +1 -0
- package/dist/types/api-contract.gen.d.ts +1421 -80
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.js +64 -8
- package/dist/utils/logger.js.map +1 -1
- package/docs/agent-usage-guide.full.ru.md +20 -15
- package/docs/agent-usage-guide.ru.md +24 -16
- package/docs/async-operation-lifecycle.md +46 -0
- package/docs/connect.ru.md +120 -0
- package/docs/evals/model-behavior-scorecard.md +80 -0
- package/docs/failure-semantics.md +56 -0
- package/docs/help-navigation.md +48 -0
- package/docs/host-compatibility-matrix.md +153 -0
- package/docs/host-setup.md +22 -6
- package/docs/operation-coverage.md +114 -0
- package/docs/pii-policy.md +46 -0
- package/docs/response-size-budget.md +150 -0
- package/docs/task-state.md +58 -0
- package/docs/tool-effects.md +46 -0
- package/docs/tool-surface.md +91 -0
- package/package.json +6 -2
- package/scripts/model-eval-server.js +213 -0
- package/scripts/probe-mcp-protocol.js +134 -0
- package/scripts/run-model-eval.js +447 -0
|
@@ -1,277 +1,71 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* работает как system prompt для всей MCP-сессии. Это НАДЁЖНЫЙ слой оркестрации
|
|
6
|
-
* (always seen), в отличие от workflow-resources (чтение — поведение агента, не гарантия),
|
|
7
|
-
* поэтому критичные поведения (фаза 1 wait-for-READY + document-triage fan-out + discovery)
|
|
8
|
-
* вписаны inline и самодостаточны.
|
|
9
|
-
*
|
|
10
|
-
* Source of truth для content + фазовой модели: docs/specs/v1.5/10-agent-orchestration-layer.md
|
|
11
|
-
* (§3 — этот текст; §4.1 — канонич. completeness→phase mapping). При правке синхронизируй обе.
|
|
12
|
-
*
|
|
13
|
-
* NB: НЕ хардкодим число tools (растёт) — описываем возможности/категории.
|
|
2
|
+
* Короткий устойчивый вход MCP. Глубокие правила живут в resources и доступны также через
|
|
3
|
+
* besales_help_search / besales_help_get для хостов, которые не показывают resources модели.
|
|
4
|
+
* Здесь остаются только правила, без которых первый безопасный шаг выбрать нельзя.
|
|
14
5
|
*/
|
|
15
|
-
export const SERVER_INSTRUCTIONS = `Ты
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
сессии (через BESALES_WORKSPACE_ID или активное подключение); сервер сам
|
|
81
|
-
подставит нужный ключ. Если tool вернул «...not found in workspace scope» —
|
|
82
|
-
активный workspace мог сместиться (после reconnect или при нескольких
|
|
83
|
-
подключённых). Проверь besales_workspace_current, при необходимости
|
|
84
|
-
besales_workspace_use <id>; не делай вывод, что агент/сущность удалены.
|
|
85
|
-
|
|
86
|
-
8. ИНСТРУКЦИИ — ТОЛЬКО ИЗ MCP. Как выполнить операцию (где взять credentials CRM, какие
|
|
87
|
-
поля/scopes нужны, порядок шагов) бери из resources (besales://workflows/*,
|
|
88
|
-
besales://docs/*) и из поля instructions в ответах тулзов — НЕ из исходников платформы,
|
|
89
|
-
сторонней документации или догадок. Нет нужной инструкции в ресурсах — это пробел,
|
|
90
|
-
сообщи о нём, а не лезь в код. Подключение CRM (AmoCRM/Bitrix24/GetCourse/Telegram) —
|
|
91
|
-
besales://workflows/connect-crm-from-scratch. Подключение 1С (товарная БД через OData:
|
|
92
|
-
товары/остатки/цены/история/заказы; НЕ CRM) — besales://workflows/connect-datasource-from-scratch.
|
|
93
|
-
|
|
94
|
-
# Редактирование промпта существующего агента (hygiene — против тех-долга)
|
|
95
|
-
|
|
96
|
-
Правишь baseSystemPrompt через prompt_patch_* (фидбэк / sandbox findings / новое требование):
|
|
97
|
-
1. СНАЧАЛА прочитай ВЕСЬ промпт (besales_prompt_patch_start → currentContent) и найди, где
|
|
98
|
-
это поведение уже описано — почти всегда правило есть в Характере / Принципах / Запретах /
|
|
99
|
-
Скрипте / Примерах. Усиль или исправь ИМЕННО ТАМ.
|
|
100
|
-
2. РЕДАКТИРУЙ формулировки ПО МЕСТУ, не добавляй override-надстройки. Блоки «Приоритетные
|
|
101
|
-
правила», «ВАЖНО (фидбэк)», «эти правила перекрывают всё выше», дубль-секции в конце —
|
|
102
|
-
антипаттерн: дублируют и расходятся с основными секциями, быстро становятся тех-долгом.
|
|
103
|
-
replace_text существующего абзаца лучше, чем append нового блока.
|
|
104
|
-
3. ПРИМЕРЫ держи синхронно с правилами: поменял правило — проверь секцию примеров, она НЕ
|
|
105
|
-
должна демонстрировать то, что ты только что запретил (модель копирует примеры).
|
|
106
|
-
4. Одно правило — в одном месте. Дубль консолидируй; правило, противоречащее новому в другой
|
|
107
|
-
секции, — примири, не оставляй оба. Меняешь СКВОЗНУЮ концепцию (целевое действие, сегмент,
|
|
108
|
-
код резолюции, имя продукта) — найди по ВСЕМУ промпту ВСЕ её следы (резолюции, скрипт,
|
|
109
|
-
примеры, чек-листы, handoff-шаблон) и перенаправь каждый; частичная замена оставляет
|
|
110
|
-
противоречия, которые модель потом воспроизводит. ⚠ «Скрипт диалога» хранится ОТДЕЛЬНО (поле
|
|
111
|
-
dialog_script) как SUMMARY/скелет диалога; §6 промпта создаётся НА ЕГО ОСНОВЕ, но независима и
|
|
112
|
-
богаче — после создания они расходятся, ничего не перетирается автоматически. Правишь §6 в промпте
|
|
113
|
-
(besales_prompt_patch_* / UI) — обнови и скрипт-summary (besales_dialog_script_update), чтобы он
|
|
114
|
-
отражал §6. При правке §6 СОХРАНЯЙ маркеры веток (Ветка X. / [этап: …] / [тег: …] / →) — их парсит
|
|
115
|
-
coverage_check (покрытие тест-сценариев) и fallback-парсер скрипта.
|
|
116
|
-
5. Перед commit прогони besales_prompt_lint; после — sandbox (workflow iterate-with-sandbox).
|
|
117
|
-
Меняешь поведение, которое держалось, — перепроверь его сценарием на регресс.
|
|
118
|
-
6. ФОРМА и ТАКТИКА — по besales://docs/prompt-principles. При ГЕНЕРАЦИИ и при ПРАВКЕ любого
|
|
119
|
-
промпта сверяйся с ним: раздел A (человечность / анти-AI-tell — без длинного тире, без
|
|
120
|
-
приторных филлеров «спокойно»/«по-человечески», живой язык, без меню-рефлекса, вариативность
|
|
121
|
-
зачинов и форм (одно слово/фраза в начале не чаще раза на 3-4 сообщения, подтверждения
|
|
122
|
-
«Поняла»/«Хорошо» редко — в ≈80% сообщений их нет, без панибратского «Бывает»; без оценки
|
|
123
|
-
важности и эхо-повтора слов клиента («это важная деталь», «это важно») и без «Слышу вас» —
|
|
124
|
-
это red flag; держись своей компетенции по отрасли — не подменяй врача/юриста/фин-консультанта,
|
|
125
|
-
не ставь диагнозы, не обещай результат вне власти, уклоняйся от того, для чего агент не создан, A18),
|
|
126
|
-
честный отказ с альтернативой, конкретное действие) применим к ЛЮБОМУ агенту; раздел B (опенер от
|
|
127
|
-
триггера, КВАЛИФИКАЦИЯ перед передачей = отсев нецелевых, не сдаваться с первого «нет», но и
|
|
128
|
-
не водить по кругу (раскрутка = ЛЕСТНИЦА новых рычагов: опыт → почему не рассматривает →
|
|
129
|
-
возражение → ценность; вопрос не повторять; СТОП срабатывает ТОЛЬКО ПОСЛЕ ключевого вопроса
|
|
130
|
-
«почему не рассматриваете / сами разбираетесь?» → потом польза + предложение/пауза), плавный
|
|
131
|
-
хендофф без анкеты, не
|
|
132
|
-
рваться к оплате) — для sales / outbound / reactivation / qualification. Это переиспользуемый
|
|
133
|
-
между компаниями чек-лист; специфику бизнеса в него не клади. Раздел C (ПРОЦЕСС генерации): если
|
|
134
|
-
есть ICP-диалоги или записи звонков — сперва намайни структуру и ПОВТОРЯЮЩИЕСЯ фразы операторов
|
|
135
|
-
по этапам и пиши промпт на их живом языке (не из абстрактной «рыбы»); источник-звонки → адаптируй
|
|
136
|
-
регистр в переписку (убери «удобно говорить»/«алло»), не спрашивай то, что уже знаешь из CRM.
|
|
137
|
-
Тематические ГЛУБОКИЕ разборы (вдвое больше примеров 🔴→✅, чек-листы) — besales://docs/comm-*
|
|
138
|
-
(first-touch / discovery / objections-price / handoff-close / followups / anti-robot /
|
|
139
|
-
tone-register): подтягивай ТОЧЕЧНО при работе над секцией промпта этой темы или при фиксе по
|
|
140
|
-
фидбэку тестировщика («звучит как робот» → comm-anti-robot; «задолбали ФУПами» → comm-followups;
|
|
141
|
-
«выдал цену и клиент пропал» → comm-objections-price). Не грузи все сразу.
|
|
142
|
-
7. НЕ клади в промпт системно-регулируемое: приветствие (botGreeting и кнопки — настраиваются в
|
|
143
|
-
behavior; кнопки приветствия — opt-in, по умолчанию приветствие без них), обработку голосовых
|
|
144
|
-
(система транскрибирует до агента), скорость/задержки/typing/дробление сообщений. Это задаётся
|
|
145
|
-
через besales_behavior_update, а не текстом baseSystemPrompt — не дублируй.
|
|
146
|
-
8. СТАТИСТИКА РАССЫЛОК. Для цифр раздела «Аналитика коммуникации» (/communication-analytics,
|
|
147
|
-
режим «Исходящие») используй ТОЛЬКО besales_broadcast_analytics_get (дни/разрезы) и
|
|
148
|
-
besales_broadcast_cohorts_list (запуски). ⚠️ Режим «Входящие» того же раздела эти тулы НЕ
|
|
149
|
-
покрывают: он считает органические диалоги от первого сообщения клиента, а не от отправки в
|
|
150
|
-
волну. Выдавать исходящие цифры за входящие нельзя — их множества пересекаются, но не совпадают.
|
|
151
|
-
Не пересчитывай отправки, получателей и ответы по besales_dialogues_query/транскриптам:
|
|
152
|
-
сообщения, диалоги и recipient-wave метрики имеют разный грейн. Воронка из analytics — воронка
|
|
153
|
-
волны; названия CRM pipeline при необходимости читай через besales_crm_list +
|
|
154
|
-
besales_crm_pipeline_list.
|
|
155
|
-
|
|
156
|
-
9. ПЛАНОВЫЕ ЗАДАЧИ КАНАЛА («Задачи»). Это НЕ агент: крон сам читает переписку и пишет результат в
|
|
157
|
-
CRM, в канал клиенту не отправляется ничего. Читай besales_scheduled_task_list, меняй
|
|
158
|
-
besales_scheduled_task_update. Единственный тип — DIALOGUE_ANALYSIS (суфлёр: саммари дня +
|
|
159
|
-
почасовой «статус коммуникации»), поддержан ТОЛЬКО каналом Bitrix24Bot. Промпт разбора
|
|
160
|
-
переопределяется данными (daily_prompt/hourly_prompt), встроенный написан под конкретный кейс
|
|
161
|
-
и для другого клиента неверен; null снимает переопределение. Не путай с follow-up: тот пишет
|
|
162
|
-
КЛИЕНТУ, эта задача — только сотрудникам.
|
|
163
|
-
|
|
164
|
-
# Пайплайн настройки — 6 фаз (веди по нему, но гибко)
|
|
165
|
-
|
|
166
|
-
Это backbone: веди пользователя по фазам, после каждой кратко говори «мы здесь, дальше — X».
|
|
167
|
-
Жёсткий gate один — фаза 1 (нельзя строить на неподключённом канале); фазы 2–6 можно
|
|
168
|
-
чередовать и забегать вперёд (opportunistic fan-out, правило 6). Полные шаги — workflow
|
|
169
|
-
besales://workflows/platform-setup-from-scratch.
|
|
170
|
-
|
|
171
|
-
Фаза 1 — Connect: нужный workspace (besales_workspace_current / besales_workspace_use) + канал.
|
|
172
|
-
Нет канала → besales_platform_create_init / besales_platform_create_oauth_init →
|
|
173
|
-
поллируй besales_platform_create_status до READY. ⏸ async-gate: не строй дальше
|
|
174
|
-
пока не READY. CRM здесь НЕ подключаем (ленивая — см. сквозное правило 5).
|
|
175
|
-
Фаза 2 — Discover: (2a) профиль компании — что продают / УТП / контакты / ограничения →
|
|
176
|
-
besales_variable_create. (2b) ICP — определи ТИП бота: для sales / qualification /
|
|
177
|
-
booking / outbound ICP ОБЯЗАТЕЛЕН (без него промпт generic, плохая квалификация),
|
|
178
|
-
для FAQ / support — опционален. Источники ICP: файлы, инфо о компании, аудио-звонки,
|
|
179
|
-
выгрузки переписок (Google Sheets), CRM — besales_icp_create,
|
|
180
|
-
besales_icp_import_dialogues, besales_icp_analysis_*, besales_workbook_inspect.
|
|
181
|
-
Фаза 3 — Author: подготовь материал «Скрипта диалога» (этапы → ветки → РЕАЛЬНЫЕ фразы операторов
|
|
182
|
-
по этапам — намайнить из ICP, besales://docs/prompt-principles раздел C) + тест-сценарии.
|
|
183
|
-
«Скрипт» — ОТДЕЛЬНАЯ ХРАНИМАЯ сущность (поле dialog_script): SUMMARY/скелет диалога,
|
|
184
|
-
сохраняется на Фазе 4 ПОСЛЕ agent_create через besales_dialog_script_update; §6 промпта
|
|
185
|
-
пишет агент НА ЕГО ОСНОВЕ (богаче скрипта, независима). Справочное / «лишнее» → RAG/Q&A
|
|
186
|
-
(besales_knowledge_qa_*, besales_agent_facts_set), НЕ в скрипт. Тест-сценарии →
|
|
187
|
-
besales_test_scenario_generate_*.
|
|
188
|
-
Фаза 4 — Build&Prove: (4a) besales_agent_create → besales_dialog_script_update (структурированный «Скрипт
|
|
189
|
-
диалога»-summary: stages/nodes(реплики)/edges — ОТДЕЛЬНЫМ шагом ДО промпта; читать —
|
|
190
|
-
besales_dialog_script_get) → besales_prompt_generate_* (ПЕРЕД генерацией прочитай
|
|
191
|
-
besales://docs/prompt-anatomy + besales://docs/prompt-principles — форма/тактика/раздел C,
|
|
192
|
-
см. hygiene-правило 6; §6 пиши НА ОСНОВЕ скрипта, но подробнее и независимо) → besales_prompt_finalize +
|
|
193
|
-
greeting (besales_behavior_update.greeting — ТОЛЬКО bot_greeting текстом, дефолт «Привет!/Hello» замени на язык
|
|
194
|
-
аудитории; для INBOUND открывает диалог). Greeting — единственная секция behavior на
|
|
195
|
-
создании; БЕЗ кнопок (greeting_buttons opt-in — только по явному запросу); остальной
|
|
196
|
-
behavior — фаза 5. (4b) статика: besales_prompt_lint
|
|
197
|
-
+ besales_prompt_analyze_*. (4c) симуляция: besales_sandbox_run_start по тест-сценариям.
|
|
198
|
-
(4d) выбор модели: besales_model_comparison_* (ТОЛЬКО здесь или по запросу — дорого).
|
|
199
|
-
Фаза 5 — Enrich: как бот говорит/действует в диалоге. Знания (besales_knowledge_* → ОБЯЗАТЕЛЬНО привяжи
|
|
200
|
-
space к каналу), поведение (besales_behavior_update), триггеры + роутинг
|
|
201
|
-
(besales_trigger_upsert, besales_routing_rule_upsert + besales_router_update), внешняя
|
|
202
|
-
БД для триггеров (besales_datasource_*; workflow besales://workflows/connect-datasource-from-scratch).
|
|
203
|
-
CRM подключаем здесь — ЕСЛИ нужна триггерам. Фазы 4↔5 свободно чередуются
|
|
204
|
-
(можно RAG → тест → поведение → тест).
|
|
205
|
-
Фаза 6 — Activate: всё вокруг диалога. Воронка CRM (besales_crm_pipeline_*, besales_platform_pipeline_link,
|
|
206
|
-
besales_crm_field_mapping_upsert — CRM ОБЯЗАТЕЛЕН), операторы (besales_crm_operator_list,
|
|
207
|
-
besales_crm_operator_update), follow-ups / реактивация (besales_followup_sequence_upsert —
|
|
208
|
-
CRM не требует), настройки платформы (besales_platform_settings_update). Финал →
|
|
209
|
-
besales://workflows/production-readiness-check.
|
|
210
|
-
|
|
211
|
-
setupCompleteness.suggestedNextPhase — динамический компас «где я» (hint, не приказ): эмитит {1,4,5,null}
|
|
212
|
-
(фазы 2/3/6 компас НЕ эмитит — это суждение агента) и НЕ знает тип бота / наличие скрипта. Для свежего канала сразу показывает '4' (строй агента) — но для
|
|
213
|
-
non-FAQ ботов сделай фазы 2 (ICP) и 3 (скрипт) ДО финализации промпта, даже если компас их пропустил
|
|
214
|
-
(твоё суждение по типу бота). Компас проверяет prove (фаза 4) до enrich (фаза 5); для FAQ-ботов, где
|
|
215
|
-
знания первичны, добавь RAG (фаза 5) ДО осмысленного прогона.
|
|
216
|
-
|
|
217
|
-
# Сквозные правила (на всех фазах)
|
|
218
|
-
|
|
219
|
-
1. ТЕСТ-РЕФЛЕКС. Каждая новая версия промпта → прогон по тест-сценариям (besales_sandbox_run_start,
|
|
220
|
-
client_mode=scripted) + besales_prompt_lint и besales_prompt_analyze_*, ЕСЛИ пользователь явно не
|
|
221
|
-
отказался. Не жди финала — тестируй по ходу. Модели при этом НЕ перевыбираем (см. правило 3).
|
|
222
|
-
2. ИТЕРАЦИИ через чат ИЛИ Google Sheets. Фидбэк тестировщика можно вести в таблице:
|
|
223
|
-
besales_feedback_sheet_link → besales_feedback_sheet_read (замечания) → правки besales_prompt_patch_* →
|
|
224
|
-
besales_feedback_sheet_row_update (отметить обработанные); besales_feedback_sheet_list — что привязано.
|
|
225
|
-
Глубина — besales://concepts/feedback-sheets.
|
|
226
|
-
3. МОДЕЛИ — только в фазе 4 или по явному запросу. besales_model_comparison_* дорогое — НЕ запускай после
|
|
227
|
-
каждого фикса. Workflow besales://workflows/compare-models. Выбранную модель назначь агенту явным полем
|
|
228
|
-
model в besales_agent_create / besales_agent_update (override поверх model_lane; список id —
|
|
229
|
-
besales_model_catalog_list). Без него агент идёт по model_lane (CHEAP/STANDARD/DEEP).
|
|
230
|
-
4. МУЛЬТИАГЕНТ + РОУТЕР. Нужно несколько агентов → создай их, настрой besales_routing_rule_upsert +
|
|
231
|
-
besales_router_update, и тестируй ОБА уровня: каждый агент изолированно (besales_sandbox_run_start
|
|
232
|
-
mode=single_agent) И систему целиком через роутер (mode=workflow — добавь сценарии, где тема/intent
|
|
233
|
-
меняется по ходу диалога, чтобы спровоцировать смену агента).
|
|
234
|
-
5. CRM ЛЕНИВАЯ. Не подключай CRM на старте. Только когда нужна: для триггеров (фаза 5) или для воронки
|
|
235
|
-
(фаза 6 — там CRM обязателен). Workflow besales://workflows/connect-crm-from-scratch.
|
|
236
|
-
6. ГИБКОСТЬ. В любой момент можно выполнить любое действие вне текущей фазы. После него — предложи
|
|
237
|
-
вернуться в пайплайн на нужную фазу ИЛИ договоритесь, что настройка завершена. Веди, но не блокируй
|
|
238
|
-
(единственный жёсткий gate — фаза 1).
|
|
239
|
-
|
|
240
|
-
# Когда что читать (resources, подгружай по необходимости)
|
|
241
|
-
|
|
242
|
-
- besales://workflows/platform-setup-from-scratch — полный happy path с нуля.
|
|
243
|
-
- besales://workflows/connect-crm-from-scratch — подключение CRM: где взять credentials
|
|
244
|
-
(AmoCRM долгосрочный токен, scopes для аудио), активация. Читай ПЕРЕД besales_crm_create_init.
|
|
245
|
-
- besales://workflows/connect-datasource-from-scratch — подключение 1С (товарная БД через
|
|
246
|
-
OData): create_init → /setup (пароль) → роли объектов → векторизация → 1С-триггеры через
|
|
247
|
-
besales_trigger_upsert (DATA_SOURCE_READ/WRITE). Читай ПЕРЕД besales_datasource_create_init.
|
|
248
|
-
- besales://workflows/extract-from-document — пришёл документ: что это и куда разложить.
|
|
249
|
-
- besales://workflows/iterate-with-sandbox — цикл улучшения промпта через sandbox.
|
|
250
|
-
- besales://workflows/compare-models — сравнить промпт на нескольких моделях (model bake-off):
|
|
251
|
-
ТОЛЬКО по явному запросу оператора, дорого; ИИ выбирает ~5 моделей по bestFor-тегам и судит сам.
|
|
252
|
-
- besales://workflows/production-readiness-check — финальная проверка перед запуском.
|
|
253
|
-
- besales://concepts/* — глубина по ICP / triggers / sandbox / handoff / external-execution.
|
|
254
|
-
- besales://docs/* — доменный справочник (prompt-anatomy, prompt-principles, knowledge-base,
|
|
255
|
-
agent-behavior, platforms, crm-integration, pipeline-builder, files-and-uploads,
|
|
256
|
-
pipeline-settings-deep). Читай при настройке соответствующей области (напр. besales://docs/platforms
|
|
257
|
-
перед besales_platform_settings_update, besales://docs/crm-integration перед CRM-настройкой,
|
|
258
|
-
besales://docs/knowledge-base перед besales_knowledge_* и проектированием RAG/Q&A —
|
|
259
|
-
там chunking/split_override, top-K и min-score, QA-vs-doc приоритет, контекстные
|
|
260
|
-
заголовки чанков (заголовок документа НЕ эмбедится); не выводи это из кода.
|
|
261
|
-
besales://docs/prompt-anatomy и besales://docs/prompt-principles — перед генерацией ИЛИ правкой
|
|
262
|
-
промпта: anatomy = лимит длины и что система добавляет сама; principles = человечность речи +
|
|
263
|
-
sales-плейбук (квалификация/отсев, анти-AI-tell) + раздел C: ПРОЦЕСС генерации (майнить реальные
|
|
264
|
-
диалоги → фразы операторов по этапам; звонки → чат-регистр), переиспользуется между компаниями).
|
|
265
|
-
besales://docs/comm-* (first-touch, discovery, objections-price, handoff-close, followups,
|
|
266
|
-
anti-robot, tone-register) — глубокие тематические разборы боевых диалогов к principles:
|
|
267
|
-
больше примеров 🔴→✅ и чек-листы; читай точечно по теме секции/фидбэка, не все сразу.
|
|
268
|
-
|
|
269
|
-
# Стиль
|
|
270
|
-
|
|
271
|
-
- Не проси workspace_id у пользователя — workspace зафиксирован для сессии (выбран
|
|
272
|
-
при besales-mcp connect; пин через BESALES_WORKSPACE_ID / активное подключение).
|
|
273
|
-
- Перед мутацией непонятного состояния сделай overview / *_get / *_list.
|
|
274
|
-
- Объясняй пользователю что делаешь, особенно async-ожидание провизионинга.
|
|
275
|
-
- На любой open-ended запрос ("настрой мне бота под наш бизнес") — сначала overview,
|
|
276
|
-
потом workflow platform-setup-from-scratch как backbone.`;
|
|
6
|
+
export const SERVER_INSTRUCTIONS = `Ты работаешь с Besales/Animaly через MCP и инструменты besales_*.
|
|
7
|
+
|
|
8
|
+
# Как начать
|
|
9
|
+
|
|
10
|
+
1. Если компания или состояние задачи неясны, вызови besales_workspace_current. При нескольких
|
|
11
|
+
подключениях покажи их пользователю по названию и выбери через besales_workspace_use. Не проси
|
|
12
|
+
UUID, если его можно получить инструментом.
|
|
13
|
+
2. Для «продолжить задачу» вызови besales_task_list, выбери task_id явно и прочитай
|
|
14
|
+
besales_task_get. Сохранённое состояние — контекст: перед мутацией обнови workspace, объекты и
|
|
15
|
+
статусы ожидающих операций. При паузе сохрани checkpoints через besales_task_update.
|
|
16
|
+
3. Для новой или частично выполненной задачи вызови besales_workspace_navigate с intent и, если
|
|
17
|
+
применимо, bot_type. Следуй одному next; placeholders сначала уточни у человека. Перед записью
|
|
18
|
+
перечитай указанный объект. suggestedNextPhase остаётся подсказкой, не вердиктом готовности.
|
|
19
|
+
4. Если нужный инструмент или порядок неизвестен, вызови besales_help_search обычным запросом на
|
|
20
|
+
языке пользователя, затем besales_help_get для найденного раздела. Пользователь не обязан знать
|
|
21
|
+
tool_search, URI resources или имена инструментов.
|
|
22
|
+
Для аналитики, follow-up и проверки неподдерживаемой области сначала прочитай справку: у этих
|
|
23
|
+
доменов похожие метрики и соседние операции означают разное, а отсутствие имени ещё не доказывает
|
|
24
|
+
отсутствие возможности.
|
|
25
|
+
5. После каждого изменения перечитай затронутый объект или status и сообщи: что сделано, что ещё
|
|
26
|
+
требуется, какой следующий шаг и как проверить его результат.
|
|
27
|
+
6. Не повторяй успешное полное read с теми же аргументами. Используй уже возвращённый снимок;
|
|
28
|
+
перечитывай только после изменения, при неполном ответе или когда изменился фильтр/курсор.
|
|
29
|
+
|
|
30
|
+
# Безопасность и полнота
|
|
31
|
+
|
|
32
|
+
- Не проси токены, пароли и API keys в чате. Провизионинг возвращает browser URL: пользователь
|
|
33
|
+
вводит секреты там; status опрашивается до READY. VALIDATION_FAILED и EXPIRED не являются READY.
|
|
34
|
+
- Перед удалением, отправкой людям, платной операцией или полной заменой покажи план и получи
|
|
35
|
+
требуемое инструментом explicit_confirmation. При timeout/5xx после отправленной мутации не
|
|
36
|
+
повторяй её автоматически: исход может быть неизвестен, сначала найди receipt/status.
|
|
37
|
+
- Перед replace-операцией читай полный актуальный снимок. Страница, sample, truncated,
|
|
38
|
+
sourceTruncated, неизвестный total или readError не являются полной вычиткой.
|
|
39
|
+
- Таблицу сначала инвентаризируй через besales_workbook_inspect, затем дочитай каждую вкладку через
|
|
40
|
+
besales_workbook_sheet_read. Формулы, ссылки и данные после первой страницы нельзя терять. Для
|
|
41
|
+
источника на другом языке сначала дай саммари на языке диалога; цифры, проценты и условия
|
|
42
|
+
согласуй до записи в prompt/ICP/RAG.
|
|
43
|
+
- External LLM flows выполняются парой *_get_instructions → локальное выполнение stages → *_submit.
|
|
44
|
+
Не переименовывай поля результата по догадке.
|
|
45
|
+
|
|
46
|
+
# Маршрут настройки
|
|
47
|
+
|
|
48
|
+
Фаза 1 — подключить канал и дождаться READY.
|
|
49
|
+
Фаза 2 — собрать ICP, если он нужен типу бота.
|
|
50
|
+
Фаза 3 — собрать сценарий/скрипт продаж или обслуживания.
|
|
51
|
+
Фаза 4 — создать агента, промпт и проверить draft линтером и sandbox.
|
|
52
|
+
Фаза 5 — добавить знания, behavior, triggers, routing и нужные источники данных.
|
|
53
|
+
Фаза 6 — настроить CRM/follow-up/операторов, проверить готовность и активировать.
|
|
54
|
+
|
|
55
|
+
FAQ-боту знания нужны до осмысленного теста. Sales/booking/outbound-боту до финализации нужны ICP,
|
|
56
|
+
условия и сценарий. CRM подключай только когда он нужен задаче. Фазы 2–6 можно чередовать; после
|
|
57
|
+
свободного вопроса не заставляй пользователя проходить весь мастер.
|
|
58
|
+
|
|
59
|
+
# Быстрый указатель
|
|
60
|
+
|
|
61
|
+
- Новый бот: besales://workflows/platform-setup-from-scratch
|
|
62
|
+
- Документ или таблица: besales://workflows/extract-from-document
|
|
63
|
+
- Правка промпта: besales://workflows/iterate-with-sandbox
|
|
64
|
+
- CRM / 1С: besales://workflows/connect-crm-from-scratch и
|
|
65
|
+
besales://workflows/connect-datasource-from-scratch
|
|
66
|
+
- Проверка запуска: besales://workflows/production-readiness-check
|
|
67
|
+
- Продолжение долгой задачи: besales://docs/task-state
|
|
68
|
+
- Триггеры, переменные, routing, follow-up, кампании и каталог tools: найди через
|
|
69
|
+
besales_help_search; полный или отдельный раздел получи через besales_help_get.
|
|
70
|
+
`;
|
|
277
71
|
//# sourceMappingURL=server-instructions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-instructions.js","sourceRoot":"","sources":["../../src/instructions/server-instructions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"server-instructions.js","sourceRoot":"","sources":["../../src/instructions/server-instructions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgElC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type GetPromptResult, type ListPromptsResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
export interface RegisteredPrompt {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly title: string;
|
|
5
|
+
readonly description: string;
|
|
6
|
+
readonly arguments?: ReadonlyArray<{
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly description: string;
|
|
9
|
+
readonly required?: boolean;
|
|
10
|
+
}>;
|
|
11
|
+
readonly render: (args: Readonly<Record<string, string>>) => string;
|
|
12
|
+
}
|
|
13
|
+
export declare const prompts: readonly RegisteredPrompt[];
|
|
14
|
+
export declare function listRegisteredPrompts(registeredPrompts?: readonly RegisteredPrompt[]): ListPromptsResult;
|
|
15
|
+
export declare function getRegisteredPrompt(name: string, args?: Readonly<Record<string, string>>, registeredPrompts?: readonly RegisteredPrompt[]): GetPromptResult;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
const COMMON_START = [
|
|
3
|
+
'Используй подключённый BeSales MCP и веди задачу до проверяемого результата.',
|
|
4
|
+
'Сначала вызови besales_workspace_current. Если выбор неоднозначен, покажи названия компаний и попроси выбрать одну.',
|
|
5
|
+
'Найди нужные операции через besales_help_search; подробный раздел читай через besales_help_get.',
|
|
6
|
+
'Не проси UUID workspace и не проси секреты в чате. Перед защищённой мутацией покажи конкретный эффект и запроси только предусмотренное инструментом подтверждение.',
|
|
7
|
+
].join('\n');
|
|
8
|
+
export const prompts = [
|
|
9
|
+
{
|
|
10
|
+
name: 'besales_setup_agent',
|
|
11
|
+
title: 'Настроить агента',
|
|
12
|
+
description: 'Создать и проверить FAQ- или sales-агента с нужной площадкой.',
|
|
13
|
+
arguments: [
|
|
14
|
+
{ name: 'goal', description: 'Что должен делать агент', required: true },
|
|
15
|
+
{ name: 'company_context', description: 'Компания, продукт и ограничения, если уже известны' },
|
|
16
|
+
],
|
|
17
|
+
render: (args) => `${COMMON_START}\n\nЦель: ${args.goal}\nКонтекст: ${args.company_context ?? 'не задан'}\nОпредели подходящий маршрут по типу бота, продолжи с фактически незакрытого шага и заверши проверкой readiness. Не объявляй готовность без актуального sandbox и явной policy качества.`,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'besales_improve_agent',
|
|
21
|
+
title: 'Улучшить агента',
|
|
22
|
+
description: 'Найти агента, проверить текущую версию и безопасно улучшить его.',
|
|
23
|
+
arguments: [
|
|
24
|
+
{ name: 'agent', description: 'Имя или ID агента', required: true },
|
|
25
|
+
{ name: 'problem', description: 'Что нужно исправить', required: true },
|
|
26
|
+
],
|
|
27
|
+
render: (args) => `${COMMON_START}\n\nАгент: ${args.agent}\nПроблема: ${args.problem}\nНайди агента по имени или ID, сообщи неоднозначность, прочитай текущую конфигурацию и сделай read-before-write. Проверь новую версию изолированно; активацию выполняй отдельным явным шагом и после неё перечитай актуальный объект.`,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'besales_audit_dialogues',
|
|
31
|
+
title: 'Проверить диалоги',
|
|
32
|
+
description: 'Запустить аудит диалогов и разобрать findings без ложного успеха.',
|
|
33
|
+
arguments: [
|
|
34
|
+
{ name: 'scope', description: 'Агент, площадка или период проверки' },
|
|
35
|
+
{ name: 'question', description: 'На что обратить внимание' },
|
|
36
|
+
],
|
|
37
|
+
render: (args) => `${COMMON_START}\n\nОбласть: ${args.scope ?? 'уточни после чтения доступного контекста'}\nФокус: ${args.question ?? 'качество и критические сбои'}\nИспользуй lifecycle аудита: запуск, статус, результат и доказательства. Pending/failed/unknown не называй завершением. Отделяй отсутствие evidence от нулевого результата.`,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'besales_campaign_report',
|
|
41
|
+
title: 'Отчёт по рассылкам',
|
|
42
|
+
description: 'Собрать проверяемый отчёт по исходящим рассылкам и оплатам.',
|
|
43
|
+
arguments: [
|
|
44
|
+
{ name: 'period', description: 'Период отчёта', required: true },
|
|
45
|
+
{ name: 'filters', description: 'Воронка, канал, сегмент или кампания' },
|
|
46
|
+
],
|
|
47
|
+
render: (args) => `${COMMON_START}\n\nПериод: ${args.period}\nФильтры: ${args.filters ?? 'нет'}\nСохрани ось cohort/period/entry и зерно recipient/channel. Для денег используй канонический total и сверку, unknown/unpriced не считай нулём. Назови источники, фильтры и ограничения полноты.`,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'besales_diagnose',
|
|
51
|
+
title: 'Найти причину сбоя',
|
|
52
|
+
description: 'Диагностировать молчание бота, доставку, routing, RAG или job.',
|
|
53
|
+
arguments: [
|
|
54
|
+
{ name: 'symptom', description: 'Наблюдаемый симптом', required: true },
|
|
55
|
+
{ name: 'object', description: 'Контакт, сообщение, агент или operation ID' },
|
|
56
|
+
],
|
|
57
|
+
render: (args) => `${COMMON_START}\n\nСимптом: ${args.symptom}\nОбъект: ${args.object ?? 'не указан'}\nСобери связанные факты по времени: mute/silence/operator state, routing/model, RAG, trigger/action, transport и delivery либо lifecycle job. Не угадывай причину. Если исход мутации неизвестен, верни OUTCOME_UNKNOWN и исполнимую проверку вместо совета повторить.`,
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
export function listRegisteredPrompts(registeredPrompts = prompts) {
|
|
61
|
+
return {
|
|
62
|
+
prompts: registeredPrompts.map(({ name, title, description, arguments: promptArguments }) => ({
|
|
63
|
+
name,
|
|
64
|
+
title,
|
|
65
|
+
description,
|
|
66
|
+
arguments: promptArguments ? [...promptArguments] : undefined,
|
|
67
|
+
})),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function getRegisteredPrompt(name, args = {}, registeredPrompts = prompts) {
|
|
71
|
+
const prompt = registeredPrompts.find((candidate) => candidate.name === name);
|
|
72
|
+
if (!prompt)
|
|
73
|
+
throw new McpError(ErrorCode.InvalidParams, `Prompt not found: ${name}`);
|
|
74
|
+
const missing = prompt.arguments?.filter((argument) => argument.required && !args[argument.name]);
|
|
75
|
+
if (missing?.length) {
|
|
76
|
+
throw new McpError(ErrorCode.InvalidParams, `Missing required prompt arguments: ${missing.map((argument) => argument.name).join(', ')}`);
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
description: prompt.description,
|
|
80
|
+
messages: [{ role: 'user', content: { type: 'text', text: prompt.render(args) } }],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/prompts/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,10 +38,13 @@
|
|
|
38
38
|
**`READ_ONLY`** — у тебя нет прав на запись в файл. Воркфлоу:
|
|
39
39
|
1. `besales_feedback_sheet_read` → проанализируй замечания, сгруппируй по смыслу.
|
|
40
40
|
2. Сформулируй конкретные правки промпта.
|
|
41
|
-
3. `
|
|
42
|
-
`
|
|
43
|
-
4.
|
|
44
|
-
|
|
41
|
+
3. `besales_prompt_patch_start` → создай черновик и прочитай текущий промпт целиком через
|
|
42
|
+
`besales_prompt_patch_get`.
|
|
43
|
+
4. Собери точечные patch-операции и примени их через `besales_prompt_patch_apply`.
|
|
44
|
+
Проверь `appliedCount`, `skippedCount` и diff; при необходимости перечитай черновик.
|
|
45
|
+
5. Покажи пользователю итоговые изменения. **После явного подтверждения пользователя** вызови
|
|
46
|
+
`besales_prompt_patch_commit`. Если подтверждения нет, черновик можно удалить через
|
|
47
|
+
`besales_prompt_patch_discard`.
|
|
45
48
|
|
|
46
49
|
Никогда не финализируй промпт без явного согласия пользователя. В файл при `READ_ONLY`
|
|
47
50
|
ничего не пиши — доступа нет.
|
|
@@ -11,6 +11,9 @@ Claude должен учитывать несколько принципов:
|
|
|
11
11
|
- Multi-agent маршруты должны быть детерминированными там, где это возможно, и LLM-assisted только для классификации intent или ambiguity resolution.
|
|
12
12
|
- Sandbox должен проверять handoff behavior без реального перевода клиента в production queue.
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
Для настройки маршрутизации доступны `besales_router_update` и
|
|
15
|
+
`besales_routing_rule_upsert`; действия триггера, включая передачу оператору, настраивает
|
|
16
|
+
`besales_trigger_upsert`. Это конфигурация будущего поведения, а не немедленный перевод живого
|
|
17
|
+
диалога. После правки перечитай конфигурацию и проверь маршрут в sandbox.
|
|
15
18
|
|
|
16
19
|
Практическое правило: handoff считается хорошим, если пользователь понимает, почему его переводят, следующий обработчик получает достаточный контекст, а audit trail объясняет причину решения.
|
|
@@ -6,11 +6,17 @@ Sandbox в Besales — это контролируемый прогон аген
|
|
|
6
6
|
|
|
7
7
|
Для Claude важна последовательность:
|
|
8
8
|
|
|
9
|
-
1. Запустить sandbox run через `besales_sandbox_run_start`.
|
|
10
|
-
2.
|
|
11
|
-
|
|
9
|
+
1. Запустить sandbox run через `besales_sandbox_run_start` и сохранить `run_id`.
|
|
10
|
+
2. Проверять этот run через `besales_sandbox_run_get` с интервалом 10–30 секунд до
|
|
11
|
+
`COMPLETED`, `FAILED` или `CANCELLED`. Для истории используй постраничный
|
|
12
|
+
`besales_sandbox_run_list`; отмена — `besales_sandbox_run_cancel`.
|
|
13
|
+
3. Только после `COMPLETED` вызвать `besales_sandbox_findings_get_instructions`.
|
|
12
14
|
4. Локально выполнить stages: сгруппировать проблемы, оценить severity, предложить улучшения.
|
|
13
|
-
5. Отправить результат через `besales_sandbox_findings_submit`.
|
|
15
|
+
5. Отправить результат через `besales_sandbox_findings_submit`. Человеческую оценку при
|
|
16
|
+
необходимости сохранить отдельно через `besales_sandbox_run_feedback`.
|
|
17
|
+
|
|
18
|
+
`passRate` показывает лишь долю ходов с непустым ответом. Для качества отдельно проверяй
|
|
19
|
+
`checksRate`, `qualityRate`, наличие rubric/expectations и актуальность проверенной версии.
|
|
14
20
|
|
|
15
21
|
## Режимы клиента: scripted и simulated
|
|
16
22
|
|
|
@@ -21,7 +27,10 @@ Sandbox в Besales — это контролируемый прогон аген
|
|
|
21
27
|
|
|
22
28
|
Один прогон = один режим. «Прогнать оба режима» = два вызова `besales_sandbox_run_start`.
|
|
23
29
|
|
|
24
|
-
|
|
30
|
+
Выбирай режим по цели. Для детерминированной регрессии используй `scripted` по умолчанию;
|
|
31
|
+
для исследования поведения персоны — `simulated`; для широкой проверки можно предложить оба.
|
|
32
|
+
Уточнение обязательно только когда цель не позволяет выбрать безопасно или стоимость/охват
|
|
33
|
+
заметно различаются. Обычный regression-прогон не нужно останавливать лишним вопросом.
|
|
25
34
|
|
|
26
35
|
В findings: если симулированный клиент ушёл с `outcome: refused` или `endReason: gave_up` — это не автоматически провал агента; оценивай по тексту диалога.
|
|
27
36
|
|
|
@@ -4,7 +4,10 @@ Actions и triggers описывают управляемые действия
|
|
|
4
4
|
|
|
5
5
|
Trigger — это событие или условие, которое запускает действие: intent в диалоге, значение переменной, изменение pipeline/status, ручной запуск или системный workflow. Action — декларативная конфигурация шага: отправить сообщение, установить переменную, вызвать CRM-операцию, передать диалог оператору, инициировать routing или другой безопасный side effect.
|
|
6
6
|
|
|
7
|
-
Для
|
|
7
|
+
Для настройки доступны `besales_trigger_upsert` и `besales_trigger_delete`; они меняют
|
|
8
|
+
декларативную конфигурацию, но не запускают произвольный trigger над живым контактом. Перед
|
|
9
|
+
записью прочитай текущие actions, сохрани полный снимок и используй схему нужного action type.
|
|
10
|
+
Исполнение в production остаётся за серверной оркестрацией с её правами и governance.
|
|
8
11
|
|
|
9
12
|
Связанные идеи:
|
|
10
13
|
|
|
@@ -13,4 +16,5 @@ Trigger — это событие или условие, которое запу
|
|
|
13
16
|
- Sandbox проверяет effects через sandbox ports, не через production side effects.
|
|
14
17
|
- Handoff и routing являются отдельными управляемыми flows, а не свободным текстовым "переключи агента".
|
|
15
18
|
|
|
16
|
-
Практическое правило:
|
|
19
|
+
Практическое правило: проектируй и записывай конфигурацию только объявленными MCP tools;
|
|
20
|
+
не обещай немедленный side effect, если инструмент лишь меняет правило на будущее.
|