@besales/mcp 0.18.0 → 0.25.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.
@@ -0,0 +1,129 @@
1
+ // v1.5 — Экспорт диалогов (dialogue-export). Read-only выборка переписок workspace
2
+ // по фильтрам + транскрипт одного диалога. Scope read:conversations (входит в mcp:*).
3
+ // MCP файлы НЕ пишет — данные возвращаются, вызывающий AI раскладывает по файлам.
4
+ import { z } from 'zod';
5
+ import { defineTool, uuidSchema, withInstructions } from './shared.js';
6
+ const workLogEventSchema = z.enum([
7
+ 'START',
8
+ 'IN_PROCESS',
9
+ 'FINISH_WIN',
10
+ 'FINISH_LOST',
11
+ 'FAILED',
12
+ 'OPERATOR_TAKEOVER',
13
+ 'FINISH_AUTO',
14
+ ]);
15
+ export const dialogueExportTools = [
16
+ defineTool({
17
+ name: 'besales_dialogues_query',
18
+ requiredFields: [],
19
+ defaultWorkspaceId: true,
20
+ schema: z
21
+ .object({
22
+ workspace_id: uuidSchema.optional(),
23
+ // Фильтр по каналам (ChatUser.platformId IN ...).
24
+ platform_ids: z.array(uuidSchema).optional(),
25
+ // Окно активности диалога (по сообщениям), ISO 8601.
26
+ date_from: z.string().datetime().optional(),
27
+ date_to: z.string().datetime().optional(),
28
+ // CRM лид-статусы (ChatUser.leadStatus).
29
+ lead_status: z.array(z.string().min(1)).optional(),
30
+ // Причины деактивации бота (ChatUser.deactivateReason).
31
+ deactivate_reason: z.array(z.string().min(1)).optional(),
32
+ // Фильтр по ПОСЛЕДНЕМУ событию platform_work_logs диалога.
33
+ work_log_event: z.array(workLogEventSchema).optional(),
34
+ // ChatUser.isBotActive.
35
+ ai_enabled: z.boolean().optional(),
36
+ // ChatUser.isFollowUpActive.
37
+ followups_enabled: z.boolean().optional(),
38
+ // true — только с сообщениями; false — только без.
39
+ has_messages: z.boolean().optional(),
40
+ limit: z.number().int().min(1).max(100).optional(),
41
+ cursor: z.string().optional(),
42
+ })
43
+ .strict(),
44
+ createRequest: (input) => {
45
+ const params = new URLSearchParams();
46
+ if (input.platform_ids?.length) {
47
+ params.set('platformIds', input.platform_ids.join(','));
48
+ }
49
+ if (input.date_from) {
50
+ params.set('dateFrom', input.date_from);
51
+ }
52
+ if (input.date_to) {
53
+ params.set('dateTo', input.date_to);
54
+ }
55
+ if (input.lead_status?.length) {
56
+ params.set('leadStatus', input.lead_status.join(','));
57
+ }
58
+ if (input.deactivate_reason?.length) {
59
+ params.set('deactivateReason', input.deactivate_reason.join(','));
60
+ }
61
+ if (input.work_log_event?.length) {
62
+ params.set('workLogEvent', input.work_log_event.join(','));
63
+ }
64
+ if (input.ai_enabled !== undefined) {
65
+ params.set('aiEnabled', String(input.ai_enabled));
66
+ }
67
+ if (input.followups_enabled !== undefined) {
68
+ params.set('followUpsEnabled', String(input.followups_enabled));
69
+ }
70
+ if (input.has_messages !== undefined) {
71
+ params.set('hasMessages', String(input.has_messages));
72
+ }
73
+ if (input.limit !== undefined) {
74
+ params.set('limit', String(input.limit));
75
+ }
76
+ if (input.cursor) {
77
+ params.set('cursor', input.cursor);
78
+ }
79
+ const query = params.toString();
80
+ return {
81
+ method: 'GET',
82
+ path: `/workspaces/${input.workspace_id}/dialogue-export${query ? `?${query}` : ''}`,
83
+ };
84
+ },
85
+ enhanceResponse: (response) => withInstructions(response, [
86
+ 'Манифест подходящих диалогов: { data: DialogueExportItem[], total, cursor }. total — «найдено N диалогов».',
87
+ 'Пагинация: если cursor не null — повтори тот же вызов с этим cursor, пока не соберёшь все диалоги.',
88
+ 'Тексты переписки здесь НЕ отдаются — по каждому conversationId вызывай besales_dialogue_transcript.',
89
+ 'MCP файлы не пишет: сохрани результаты локально сам (по файлу на диалог).',
90
+ ]),
91
+ }),
92
+ defineTool({
93
+ name: 'besales_dialogue_transcript',
94
+ requiredFields: ['conversation_id'],
95
+ // workspace_id только выбирает ключ нужного воркспейса (симметрия с _query на
96
+ // мульти-воркспейс хостах); в path не идёт — backend скоупит по воркспейсу ключа.
97
+ defaultWorkspaceId: true,
98
+ schema: z
99
+ .object({
100
+ workspace_id: uuidSchema.optional(),
101
+ // ID диалога = conversationId из манифеста (ChatUser.id).
102
+ conversation_id: uuidSchema,
103
+ limit: z.number().int().min(1).max(100).optional(),
104
+ cursor: z.string().optional(),
105
+ })
106
+ .strict(),
107
+ createRequest: (input) => {
108
+ const params = new URLSearchParams();
109
+ if (input.limit !== undefined) {
110
+ params.set('limit', String(input.limit));
111
+ }
112
+ if (input.cursor) {
113
+ params.set('cursor', input.cursor);
114
+ }
115
+ const query = params.toString();
116
+ return {
117
+ method: 'GET',
118
+ path: `/dialogue-export/${input.conversation_id}/transcript${query ? `?${query}` : ''}`,
119
+ };
120
+ },
121
+ enhanceResponse: (response) => withInstructions(response, [
122
+ 'Транскрипт диалога: { conversationId, channelType, contactName, turns[], transcriptMarkdown, cursor }.',
123
+ 'Сохрани transcriptMarkdown в ОТДЕЛЬНЫЙ файл на диалог, напр. dialogs/<conversationId>.md.',
124
+ 'Роли реплик: client (клиент) / agent (isAi=true → AI-агент, false → оператор/историческое).',
125
+ 'Если cursor не null — у диалога есть ещё сообщения: повтори с этим cursor. Первая страница содержит заголовок; последующие — только реплики: дописывай их в тот же файл.',
126
+ ]),
127
+ }),
128
+ ];
129
+ //# sourceMappingURL=dialogue-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogue-export.js","sourceRoot":"","sources":["../../../src/tools/definitions/dialogue-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare const externalApiChannelTools: (import("./shared.js").ToolDefinition<{
2
+ callback_url: string;
3
+ workspace_id?: string | undefined;
4
+ name?: string | undefined;
5
+ source_channel?: string | undefined;
6
+ }> | import("./shared.js").ToolDefinition<{
7
+ channel_id: string;
8
+ workspace_id?: string | undefined;
9
+ }> | import("./shared.js").ToolDefinition<{
10
+ channel_id: string;
11
+ workspace_id?: string | undefined;
12
+ callback_url?: string | undefined;
13
+ source_channel?: string | undefined;
14
+ }>)[];
@@ -0,0 +1,102 @@
1
+ // v1.5 — External API channel (партнёрский relay, ChannelType.EXTERNAL_API) provisioning.
2
+ // Прямые тулы (POST/PATCH), зеркало besales_crm_activate. Backend endpoints требуют
3
+ // scope mcp:platform-setup. Секреты (apiKey/webhookSecret) показываются один раз в ответе.
4
+ import { z } from 'zod';
5
+ import { compactObject, defineTool, uuidSchema, withInstructions } from './shared.js';
6
+ export const externalApiChannelTools = [
7
+ defineTool({
8
+ name: 'besales_external_api_channel_create',
9
+ requiredFields: ['callback_url'],
10
+ defaultWorkspaceId: true,
11
+ schema: z
12
+ .object({
13
+ workspace_id: uuidSchema.optional(),
14
+ // Опционально: display-имя канала.
15
+ name: z.string().min(1).max(255).optional(),
16
+ // URL партнёра (HTTPS), куда POST'им ответы AI + follow-up (HMAC-подписанные колбэки).
17
+ callback_url: z.string().url(),
18
+ // Опционально: метка транспорта по умолчанию (telegram|whatsapp|web|...).
19
+ source_channel: z.string().min(1).max(64).optional(),
20
+ })
21
+ .strict(),
22
+ createRequest: (input) => ({
23
+ method: 'POST',
24
+ path: `/workspaces/${input.workspace_id}/external-api-channels`,
25
+ body: compactObject({
26
+ name: input.name,
27
+ callbackUrl: input.callback_url,
28
+ sourceChannel: input.source_channel,
29
+ }),
30
+ }),
31
+ enhanceResponse: (response) => withInstructions(response, [
32
+ 'Канал External API создан. Ответ: { channelId, apiKey, webhookSecret, ingestPath } — apiKey и webhookSecret показываются ОДИН раз, сохрани их.',
33
+ 'apiKey — Bearer-токен партнёра для входящих на ingestPath (POST /api/v2/channels/:channelId/messages). webhookSecret — для HMAC-проверки наших колбэков (заголовок X-Besales-Webhook-Signature: sha256=...).',
34
+ 'Отдай партнёру: ingestUrl (host + ingestPath) + apiKey + webhookSecret. Его callback_url задаётся при создании или обновляется besales_external_api_channel_update.',
35
+ 'При компрометации — besales_external_api_channel_rotate_key / _rotate_secret (старое значение инвалидируется немедленно).',
36
+ ]),
37
+ }),
38
+ defineTool({
39
+ name: 'besales_external_api_channel_rotate_key',
40
+ requiredFields: ['channel_id'],
41
+ defaultWorkspaceId: true,
42
+ schema: z
43
+ .object({
44
+ workspace_id: uuidSchema.optional(),
45
+ channel_id: uuidSchema,
46
+ })
47
+ .strict(),
48
+ createRequest: (input) => ({
49
+ method: 'POST',
50
+ path: `/workspaces/${input.workspace_id}/external-api-channels/${input.channel_id}/rotate-key`,
51
+ }),
52
+ enhanceResponse: (response) => withInstructions(response, [
53
+ 'Выпущен новый apiKey (ответ { apiKey }) — показывается ОДИН раз. Старый ключ ОТОЗВАН немедленно.',
54
+ 'Передай новый apiKey партнёру и убедись, что он обновил его в интеграции — иначе входящие пойдут с 401/403.',
55
+ ]),
56
+ }),
57
+ defineTool({
58
+ name: 'besales_external_api_channel_rotate_secret',
59
+ requiredFields: ['channel_id'],
60
+ defaultWorkspaceId: true,
61
+ schema: z
62
+ .object({
63
+ workspace_id: uuidSchema.optional(),
64
+ channel_id: uuidSchema,
65
+ })
66
+ .strict(),
67
+ createRequest: (input) => ({
68
+ method: 'POST',
69
+ path: `/workspaces/${input.workspace_id}/external-api-channels/${input.channel_id}/rotate-secret`,
70
+ }),
71
+ enhanceResponse: (response) => withInstructions(response, [
72
+ 'Выпущен новый webhookSecret (ответ { webhookSecret }) — показывается ОДИН раз. Старый секрет инвалидирован.',
73
+ 'Партнёр должен обновить секрет для проверки подписи колбэков, иначе наши X-Besales-Webhook-Signature перестанут совпадать.',
74
+ ]),
75
+ }),
76
+ defineTool({
77
+ name: 'besales_external_api_channel_update',
78
+ requiredFields: ['channel_id'],
79
+ defaultWorkspaceId: true,
80
+ schema: z
81
+ .object({
82
+ workspace_id: uuidSchema.optional(),
83
+ channel_id: uuidSchema,
84
+ callback_url: z.string().url().optional(),
85
+ source_channel: z.string().min(1).max(64).optional(),
86
+ })
87
+ .strict(),
88
+ createRequest: (input) => ({
89
+ method: 'PATCH',
90
+ path: `/workspaces/${input.workspace_id}/external-api-channels/${input.channel_id}`,
91
+ body: compactObject({
92
+ callbackUrl: input.callback_url,
93
+ sourceChannel: input.source_channel,
94
+ }),
95
+ }),
96
+ enhanceResponse: (response) => withInstructions(response, [
97
+ 'Несекретные настройки канала обновлены (callback_url / source_channel). Ключ и секрет НЕ меняются — для них rotate-тулы.',
98
+ 'Смена callback_url применяется немедленно: следующие колбэки уйдут на новый URL.',
99
+ ]),
100
+ }),
101
+ ];
102
+ //# sourceMappingURL=external-api-channels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-api-channels.js","sourceRoot":"","sources":["../../../src/tools/definitions/external-api-channels.ts"],"names":[],"mappings":"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"}
@@ -50,7 +50,7 @@ export declare const knowledgeTools: (import("./shared.js").ToolDefinition<{
50
50
  workspace_id?: string | undefined;
51
51
  }> | import("./shared.js").ToolDefinition<{
52
52
  knowledge_space_id: string;
53
- source_kind: "STORED_FILE" | "TEXT";
53
+ source_kind: "TEXT" | "STORED_FILE";
54
54
  workspace_id?: string | undefined;
55
55
  stored_file_id?: string | undefined;
56
56
  content?: string | undefined;
@@ -1,5 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { compactObject, defineTool, uuidSchema, withInstructions } from './shared.js';
3
+ // Зеркало MAX_MODELS в prompt-services model-comparison.constants.ts (размер каталога)
4
+ const MODEL_COMPARISON_MAX_MODELS = 18;
3
5
  // Оценка ИИ по одной модели (eval-submit). Маппится snake→camel в createRequest.
4
6
  const modelEvalPerModelSchema = z.object({
5
7
  model: z.string(),
@@ -23,7 +25,7 @@ export const modelComparisonTools = [
23
25
  enhanceResponse: (response) => withInstructions(response, [
24
26
  'Каталог моделей сравнения: id, label, tier, bestFor-теги «когда что лучше», доступность провайдера, лимиты.',
25
27
  'Выбери ~5 моделей под use-case агента по bestFor; defaultModelIds — разумный набор по умолчанию.',
26
- 'available=false → провайдер не настроен (grok/deepseek/gemini/qwen → OPENROUTER_API_KEY; yandexgpt/aliceai → YANDEX_API_KEY+YANDEX_FOLDER_ID).',
28
+ 'available=false → провайдер не настроен (claude/grok/deepseek/gemini/qwen → OPENROUTER_API_KEY; yandexgpt/aliceai → YANDEX_API_KEY+YANDEX_FOLDER_ID).',
27
29
  ]),
28
30
  }),
29
31
  defineTool({
@@ -32,7 +34,7 @@ export const modelComparisonTools = [
32
34
  schema: z
33
35
  .object({
34
36
  agent_id: uuidSchema,
35
- models: z.array(z.string()).min(1).max(10).optional(),
37
+ models: z.array(z.string()).min(1).max(MODEL_COMPARISON_MAX_MODELS).optional(),
36
38
  dialogue_count: z.number().int().min(1).max(20).optional(),
37
39
  message_direction: z.enum(['INBOUND', 'OUTBOUND']).optional(),
38
40
  })
@@ -1 +1 @@
1
- {"version":3,"file":"model-comparison.js","sourceRoot":"","sources":["../../../src/tools/definitions/model-comparison.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-comparison.js","sourceRoot":"","sources":["../../../src/tools/definitions/model-comparison.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,39 @@ export declare const platformSetupTools: (import("./shared.js").ToolDefinition<{
2
2
  workspace_id?: string | undefined;
3
3
  }> | import("./shared.js").ToolDefinition<{
4
4
  platform_id: string;
5
+ }> | import("./shared.js").ToolDefinition<{
6
+ platform_id: string;
7
+ agent_id: string;
8
+ }> | import("./shared.js").ToolDefinition<{
9
+ platform_id: string;
10
+ crm_id: string;
11
+ channels: string[];
12
+ contacts: {
13
+ contact_id: string;
14
+ deal_id?: string | undefined;
15
+ transport?: string | undefined;
16
+ dialog_id?: string | undefined;
17
+ }[];
18
+ workspace_id?: string | undefined;
19
+ launch_type?: "status" | "board" | "group" | undefined;
20
+ funnel?: string | undefined;
21
+ segment?: string | undefined;
22
+ deal_fields?: Record<string, string | number | boolean | null> | undefined;
23
+ pipeline_id?: number | undefined;
24
+ status_id?: number | undefined;
25
+ group_id?: number | undefined;
26
+ confirm?: boolean | undefined;
27
+ check_messenger_presence?: boolean | undefined;
28
+ preflight?: {
29
+ enabled?: boolean | undefined;
30
+ product_title?: string | undefined;
31
+ product_match_key?: string | undefined;
32
+ offer_id?: number | undefined;
33
+ other_product_active_deal_mode?: "warn" | "block" | "ignore" | undefined;
34
+ } | undefined;
35
+ }> | import("./shared.js").ToolDefinition<{
36
+ job_id: string;
37
+ workspace_id?: string | undefined;
5
38
  }> | import("./shared.js").ToolDefinition<{
6
39
  platform_id: string;
7
40
  name: string;
@@ -17,6 +50,11 @@ export declare const platformSetupTools: (import("./shared.js").ToolDefinition<{
17
50
  workspace_variable_id: string;
18
51
  override_value: string | number | boolean;
19
52
  }[] | undefined;
53
+ }> | import("./shared.js").ToolDefinition<{
54
+ platform_id: string;
55
+ source_agent_id: string;
56
+ name: string;
57
+ display_name?: string | undefined;
20
58
  }> | import("./shared.js").ToolDefinition<{
21
59
  platform_id: string;
22
60
  agent_id: string;
@@ -36,7 +74,7 @@ export declare const platformSetupTools: (import("./shared.js").ToolDefinition<{
36
74
  qa_min_score?: number | undefined;
37
75
  qa_context_limit?: number | undefined;
38
76
  max_response_symbols?: number | undefined;
39
- reasoning_effort?: "low" | "medium" | "minimal" | "high" | "max" | undefined;
77
+ reasoning_effort?: "low" | "medium" | "none" | "minimal" | "high" | "xhigh" | "max" | undefined;
40
78
  verbosity?: "low" | "medium" | "high" | undefined;
41
79
  enable_thinking?: boolean | undefined;
42
80
  timezone?: string | undefined;
@@ -49,6 +87,7 @@ export declare const platformSetupTools: (import("./shared.js").ToolDefinition<{
49
87
  } | undefined;
50
88
  output_config?: {
51
89
  display_name?: string | undefined;
90
+ response_mode?: "TEXT" | "SILENT" | undefined;
52
91
  button_generator?: {
53
92
  enabled?: boolean | undefined;
54
93
  max_buttons?: number | undefined;
@@ -109,6 +148,11 @@ export declare const platformSetupTools: (import("./shared.js").ToolDefinition<{
109
148
  lead_status_pipeline_id?: number | null | undefined;
110
149
  lead_status_id?: number | null | undefined;
111
150
  }[] | undefined;
151
+ conditions?: {
152
+ custom_variable_id: string;
153
+ variable_value: string;
154
+ }[] | undefined;
155
+ condition_logic?: "ALL" | "ANY" | undefined;
112
156
  }> | import("./shared.js").ToolDefinition<{
113
157
  platform_id: string;
114
158
  agent_id: string;
@@ -378,8 +422,8 @@ export declare const platformSetupTools: (import("./shared.js").ToolDefinition<{
378
422
  getcourse_settings?: {
379
423
  account_domain?: string | null | undefined;
380
424
  employee_user_id?: number | null | undefined;
381
- available_transports?: ("Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber")[] | undefined;
382
- default_transport?: "Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | null | undefined;
425
+ available_transports?: ("Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX")[] | undefined;
426
+ default_transport?: "Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX" | null | undefined;
383
427
  departments?: {
384
428
  id: string;
385
429
  label: string;
@@ -390,6 +434,9 @@ export declare const platformSetupTools: (import("./shared.js").ToolDefinition<{
390
434
  getcourse_field_name: string;
391
435
  variable_name: string;
392
436
  }[] | null | undefined;
437
+ target_department_id?: number | null | undefined;
438
+ delivery_check_enabled?: boolean | undefined;
439
+ delivery_field_map?: Record<"Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX", string> | undefined;
393
440
  } | undefined;
394
441
  }> | import("./shared.js").ToolDefinition<{
395
442
  audit_log_id: string;
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { agentOutputConfigSchema, agentRuntimeConfigSchema, agentScopeSchema, agentToolPatchSchema, anyObjectSchema, behaviorErrorHandlingSchema, behaviorGreetingSchema, behaviorMediaHandlingSchema, behaviorMessageFilterSchema, behaviorMessageSplittingSchema, behaviorOperatorScheduleSchema, behaviorPrivacySchema, behaviorTypingBehaviorSchema, behaviorUrlHandlingSchema, compactObject, defineTool, feedbackSheetRowSchema, followUpSequenceTypeSchema, followUpTriggerSchema, mapBehaviorErrorHandlingInput, mapBehaviorGreetingInput, mapBehaviorMediaHandlingInput, mapBehaviorOperatorScheduleInput, mapBehaviorTypingInput, mapBehaviorUrlHandlingInput, mapOutputConfigInput, mapPipelineAutoFinishInput, mapPipelineCrmBehaviorInput, mapPlatformAccessControlInput, mapPlatformBitrix24BotSettingsInput, mapPlatformCrmBehaviorInput, mapPlatformGeneralSettingsInput, mapPlatformGetcourseSettingsInput, mapPlatformInstagramCommentInput, mapPlatformSalebotSettingsInput, mapPlatformSmsgorodSettingsInput, mapPlatformVariablesConfigInput, mapPlatformWidgetMarketingInput, mapRuntimeConfigInput, modelLaneSchema, pipelineAutoFinishSchema, pipelineCrmBehaviorSchema, platformAccessControlSchema, platformBitrix24BotSettingsSchema, platformCrmBehaviorSchema, platformGeneralSettingsSchema, platformGetcourseSettingsSchema, platformInstagramCommentSchema, platformSalebotSettingsSchema, platformSetupConfirmationSchema, platformSmsgorodSettingsSchema, platformVariablesConfigSchema, platformWidgetMarketingSchema, routingRuleLeadStatusSchema, routingStrategySchema, setupConfirmation, triggerScopeSchema, uuidSchema, withInstructions, } from './shared.js';
2
+ import { agentOutputConfigSchema, agentRuntimeConfigSchema, agentScopeSchema, agentToolPatchSchema, anyObjectSchema, behaviorErrorHandlingSchema, behaviorGreetingSchema, behaviorMediaHandlingSchema, behaviorMessageFilterSchema, behaviorMessageSplittingSchema, behaviorOperatorScheduleSchema, behaviorPrivacySchema, behaviorTypingBehaviorSchema, behaviorUrlHandlingSchema, compactObject, defineTool, feedbackSheetRowSchema, followUpSequenceTypeSchema, followUpTriggerSchema, mapBehaviorErrorHandlingInput, mapBehaviorGreetingInput, mapBehaviorMediaHandlingInput, mapBehaviorOperatorScheduleInput, mapBehaviorTypingInput, mapBehaviorUrlHandlingInput, mapOutputConfigInput, mapPipelineAutoFinishInput, mapPipelineCrmBehaviorInput, mapPlatformAccessControlInput, mapPlatformBitrix24BotSettingsInput, mapPlatformCrmBehaviorInput, mapPlatformGeneralSettingsInput, mapPlatformGetcourseSettingsInput, mapPlatformInstagramCommentInput, mapPlatformSalebotSettingsInput, mapPlatformSmsgorodSettingsInput, mapPlatformVariablesConfigInput, mapPlatformWidgetMarketingInput, mapRuntimeConfigInput, modelLaneSchema, pipelineAutoFinishSchema, pipelineCrmBehaviorSchema, platformAccessControlSchema, platformBitrix24BotSettingsSchema, platformCrmBehaviorSchema, platformGeneralSettingsSchema, platformGetcourseSettingsSchema, platformInstagramCommentSchema, platformSalebotSettingsSchema, platformSetupConfirmationSchema, platformSmsgorodSettingsSchema, platformVariablesConfigSchema, platformWidgetMarketingSchema, routingRuleConditionSchema, routingRuleLeadStatusSchema, routingStrategySchema, setupConfirmation, triggerScopeSchema, uuidSchema, withInstructions, } from './shared.js';
3
3
  export const platformSetupTools = [
4
4
  defineTool({
5
5
  name: 'besales_workspace_overview',
@@ -46,6 +46,138 @@ export const platformSetupTools = [
46
46
  path: `/platforms/${input.platform_id}/agents`,
47
47
  }),
48
48
  }),
49
+ defineTool({
50
+ name: 'besales_agent_variable_overrides_get',
51
+ requiredFields: ['platform_id', 'agent_id'],
52
+ schema: z.object({
53
+ platform_id: uuidSchema,
54
+ agent_id: uuidSchema,
55
+ }),
56
+ createRequest: (input) => ({
57
+ method: 'GET',
58
+ path: `/platforms/${input.platform_id}/agents/${input.agent_id}/variable-overrides`,
59
+ }),
60
+ enhanceResponse: (response) => withInstructions(response, [
61
+ 'Read-only: текущие перезаписи переменных агента. `workspaceOverrides[]` — перезаписи WorkspaceVariable ({{{name}}}); `customOverrides[]` — перезаписи платформенной CustomVariable ({name}). Каждая: id переменной + name + type + overrideValue.',
62
+ 'Читай ПЕРЕД besales_agent_update: поля agent_workspace_variable_overrides / agent_variable_overrides заменяют набор ЦЕЛИКОМ (delete отсутствующих + upsert присланных). Чтобы не затереть уже выставленную перезапись (напр. registration_link), переотправь её вместе с новыми.',
63
+ 'Пустой набор → у агента нет перезаписей, он наследует дефолты переменных воркспейса/платформы.',
64
+ ]),
65
+ }),
66
+ defineTool({
67
+ name: 'besales_getcourse_departments_list',
68
+ requiredFields: ['platform_id'],
69
+ schema: z.object({
70
+ platform_id: uuidSchema,
71
+ }),
72
+ createRequest: (input) => ({
73
+ method: 'GET',
74
+ path: `/platforms/${input.platform_id}/getcourse/departments`,
75
+ }),
76
+ enhanceResponse: (response) => withInstructions(response, [
77
+ 'Живой список отделов GetCourse Inbox школы ({ id, title }).',
78
+ 'Используй department.id как target_department_id в besales_platform_settings_update (getcourse_settings) для department-routing.',
79
+ ]),
80
+ }),
81
+ defineTool({
82
+ name: 'besales_getcourse_wave_import',
83
+ requiredFields: ['platform_id', 'crm_id', 'channels', 'contacts'],
84
+ defaultWorkspaceId: true,
85
+ schema: z.object({
86
+ workspace_id: uuidSchema.optional(),
87
+ platform_id: uuidSchema,
88
+ crm_id: uuidSchema,
89
+ launch_type: z.enum(['status', 'board', 'group']).optional(),
90
+ channels: z.array(z.string()).min(1),
91
+ funnel: z.string().max(200).optional(),
92
+ segment: z.string().max(200).optional(),
93
+ deal_fields: z
94
+ .record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()]))
95
+ .optional(),
96
+ pipeline_id: z.number().int().positive().optional(),
97
+ status_id: z.number().int().positive().optional(),
98
+ group_id: z.number().int().positive().optional(),
99
+ contacts: z
100
+ .array(z.object({
101
+ contact_id: z.string(),
102
+ deal_id: z.string().optional(),
103
+ transport: z.string().optional(),
104
+ dialog_id: z.string().optional(),
105
+ }))
106
+ .min(1)
107
+ .max(500),
108
+ confirm: z.boolean().optional(),
109
+ check_messenger_presence: z.boolean().optional(),
110
+ preflight: z
111
+ .object({
112
+ enabled: z.boolean().optional(),
113
+ product_title: z.string().max(500).optional(),
114
+ product_match_key: z.string().max(500).optional(),
115
+ offer_id: z.number().int().positive().optional(),
116
+ other_product_active_deal_mode: z.enum(['warn', 'block', 'ignore']).optional(),
117
+ })
118
+ .optional(),
119
+ }),
120
+ createRequest: (input) => ({
121
+ method: 'POST',
122
+ path: `/workspaces/${input.workspace_id}/getcourse-waves/import`,
123
+ body: compactObject({
124
+ platformId: input.platform_id,
125
+ crmId: input.crm_id,
126
+ launchType: input.launch_type,
127
+ channels: input.channels,
128
+ funnel: input.funnel,
129
+ segment: input.segment,
130
+ dealFields: input.deal_fields,
131
+ pipelineId: input.pipeline_id,
132
+ statusId: input.status_id,
133
+ groupId: input.group_id,
134
+ contacts: input.contacts?.map((c) => compactObject({
135
+ contactId: c.contact_id,
136
+ dealId: c.deal_id,
137
+ transport: c.transport,
138
+ dialogId: c.dialog_id,
139
+ })),
140
+ confirm: input.confirm,
141
+ checkMessengerPresence: input.check_messenger_presence,
142
+ preflight: input.preflight
143
+ ? compactObject({
144
+ enabled: input.preflight.enabled,
145
+ productTitle: input.preflight.product_title,
146
+ productMatchKey: input.preflight.product_match_key,
147
+ offerId: input.preflight.offer_id,
148
+ otherProductActiveDealMode: input.preflight.other_product_active_deal_mode,
149
+ })
150
+ : undefined,
151
+ }),
152
+ }),
153
+ enhanceResponse: (response) => withInstructions(response, [
154
+ 'Запуск outbound-волны GetCourse: Шаг 1 (импорт контактов + пин сделок) → Шаг 2 (отправка). По умолчанию launch_type=status (простановка полей → «Процесс» GetCourse шлёт welcome).',
155
+ 'БЕЗ confirm=true — DRY-RUN: вернётся summary (totalContacts/withDeal/channels/dealFields/sample), НИЧЕГО не отправляется. Покажи summary пользователю и запускай реально только с confirm=true.',
156
+ 'channels — значения GetCourseTransport: "VK" | "Telegram" | "MAX" | "SMS" | "Email" | "Site" (для аналитики «Канал волны»).',
157
+ 'launch_type=status требует deal_fields = { "<числовой fieldId GetCourse>": значение } (одинаковые на всю волну). board требует pipeline_id+status_id, group — group_id.',
158
+ 'preflight (default enabled=true) — pre-send гейт перед каждой строкой Шага 2: блокирует контакт, если уже есть активная/оплаченная сделка по этому продукту или проверка GetCourse упала. Передавай product_title/product_match_key или funnel; если контекста продукта нет вообще, backend отклонит запуск до создания job.',
159
+ 'В ответе confirm-запуска — waveJobId. Опрашивай его через besales_getcourse_wave_status до status=COMPLETED (Шаг 2 идёт медленно, с паузами).',
160
+ 'check_messenger_presence (default TRUE): на Шаге 1 отсеивает контакты без мессенджера (Telegram/Max/VK) — они не импортируются и не уходят в волну (число — в contactsSkippedNoMessenger). Проверка = API-вызов на КАЖДЫЙ контакт, запуск синхронно ждёт Шаг 1 → для БОЛЬШИХ когорт (сотни контактов) возможен таймаут: тогда ставь check_messenger_presence=false и сначала прогони backfill POST /api/v2/.../chat-users/import/getcourse-refresh-messengers.',
161
+ ]),
162
+ }),
163
+ defineTool({
164
+ name: 'besales_getcourse_wave_status',
165
+ requiredFields: ['job_id'],
166
+ defaultWorkspaceId: true,
167
+ schema: z.object({
168
+ workspace_id: uuidSchema.optional(),
169
+ job_id: uuidSchema,
170
+ }),
171
+ createRequest: (input) => ({
172
+ method: 'GET',
173
+ path: `/workspaces/${input.workspace_id}/getcourse-waves/${input.job_id}`,
174
+ }),
175
+ enhanceResponse: (response) => withInstructions(response, [
176
+ 'Статус волны (джоб Шага 2): status (PROCESSING|COMPLETED), processedRows/successCount/failedCount, errorReasons (первые построчные ошибки), preflight aggregates.',
177
+ 'COMPLETED + failedCount>0 — часть контактов не прошла (см. errorReasons: нет сделки, поле вне «Предложения» заказа и т.п.).',
178
+ 'preflight.blocked/errors — контакты, которым НЕ отправляли; BroadcastRecipient для них не создаётся, поэтому received в аналитике не раздувается.',
179
+ ]),
180
+ }),
49
181
  defineTool({
50
182
  name: 'besales_agent_create',
51
183
  requiredFields: ['platform_id', 'name', 'model_lane'],
@@ -92,6 +224,33 @@ export const platformSetupTools = [
92
224
  }),
93
225
  }),
94
226
  }),
227
+ defineTool({
228
+ name: 'besales_agent_clone',
229
+ requiredFields: ['platform_id', 'source_agent_id', 'name'],
230
+ schema: z.object({
231
+ // Платформа-источник; клон приземляется на неё же (cross-platform не поддерживается).
232
+ platform_id: uuidSchema,
233
+ // Исходный AgentChat для глубокого копирования (обязан принадлежать platform_id).
234
+ source_agent_id: uuidSchema,
235
+ // Системное имя нового агента; при коллизии backend добавит суффикс _N.
236
+ name: z.string(),
237
+ // Отображаемое имя нового агента; если не задано — зеркалит name.
238
+ display_name: z.string().optional(),
239
+ }),
240
+ createRequest: (input) => ({
241
+ method: 'POST',
242
+ path: `/platforms/${input.platform_id}/agents/${input.source_agent_id}/clone`,
243
+ body: compactObject({
244
+ name: input.name,
245
+ displayName: input.display_name,
246
+ }),
247
+ }),
248
+ enhanceResponse: (response) => withInstructions(response, [
249
+ 'Клон — глубокая копия исходного агента на ТОЙ ЖЕ платформе (platform_id): baseSystemPrompt, knowledge namespaces, модель/model-lane/runtime, tools + builtin tools, перезаписи переменных (agent + workspace), ICP-линки и ВСЕ триггеры+действия скопированы на новый agent id (в ответе agent.id).',
250
+ 'НЕ скопированы (осознанно): routing rules (per-router) и per-platform behavior. Клон инертен, пока не привязан к роутеру — добавь routing rule (besales_routing_rule_upsert), чтобы диалоги на него попадали.',
251
+ 'Промпт идентичен источнику; PromptHub авто-bootstrap создаст новую версию при первой prompt-операции (besales_prompt_*). Cross-platform клон не поддерживается — для переноса на другую платформу используй besales_platform_clone_*.',
252
+ ]),
253
+ }),
95
254
  defineTool({
96
255
  name: 'besales_agent_update',
97
256
  requiredFields: ['platform_id', 'agent_id'],
@@ -225,6 +384,10 @@ export const platformSetupTools = [
225
384
  skip_llm: z.boolean().optional(),
226
385
  direct_agent_id: uuidSchema.nullable().optional(),
227
386
  lead_statuses: z.array(routingRuleLeadStatusSchema).optional(),
387
+ // CUSTOM_VARIABLE: N условий, объединяемых condition_logic (ALL=И / ANY=ИЛИ).
388
+ // Альтернатива legacy-паре custom_variable_id+variable_value (одно условие).
389
+ conditions: z.array(routingRuleConditionSchema).max(50).optional(),
390
+ condition_logic: z.enum(['ALL', 'ANY']).optional(),
228
391
  ...platformSetupConfirmationSchema,
229
392
  }),
230
393
  createRequest: (input) => ({
@@ -236,6 +399,11 @@ export const platformSetupTools = [
236
399
  dealMode: input.deal_mode,
237
400
  customVariableId: input.custom_variable_id,
238
401
  variableValue: input.variable_value,
402
+ conditionLogic: input.condition_logic,
403
+ conditions: input.conditions?.map((condition) => ({
404
+ customVariableId: condition.custom_variable_id,
405
+ variableValue: condition.variable_value,
406
+ })),
239
407
  customRouterPrompt: input.custom_router_prompt,
240
408
  isEnabled: input.is_enabled,
241
409
  priority: input.priority,