@besales/mcp 0.37.0 → 0.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/resources/docs/agent-behavior.md +7 -5
  2. package/dist/resources/docs/platforms.md +5 -1
  3. package/dist/resources/docs/prompt-anatomy.md +4 -4
  4. package/dist/resources/docs/prompt-principles.md +22 -3
  5. package/dist/schemas/mcp-tools.json +1031 -74
  6. package/dist/skills/besales-dialogue-audit/SKILL.md +6 -0
  7. package/dist/tools/definitions/broadcast-analytics.d.ts +7 -0
  8. package/dist/tools/definitions/broadcast-analytics.js +39 -0
  9. package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
  10. package/dist/tools/definitions/broadcast-mailing-variants.d.ts +18 -2
  11. package/dist/tools/definitions/broadcast-mailing-variants.js +66 -3
  12. package/dist/tools/definitions/broadcast-mailing-variants.js.map +1 -1
  13. package/dist/tools/definitions/dialogue-audit.d.ts +23 -0
  14. package/dist/tools/definitions/dialogue-audit.js +155 -0
  15. package/dist/tools/definitions/dialogue-audit.js.map +1 -0
  16. package/dist/tools/definitions/follow-up-setup.d.ts +27 -0
  17. package/dist/tools/definitions/follow-up-setup.js +76 -0
  18. package/dist/tools/definitions/follow-up-setup.js.map +1 -0
  19. package/dist/tools/definitions/follow-up.d.ts +19 -0
  20. package/dist/tools/definitions/follow-up.js +85 -3
  21. package/dist/tools/definitions/follow-up.js.map +1 -1
  22. package/dist/tools/definitions/getcourse-cold-welcome.d.ts +56 -0
  23. package/dist/tools/definitions/getcourse-cold-welcome.js +241 -0
  24. package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -0
  25. package/dist/tools/definitions/platform-setup.d.ts +24 -16
  26. package/dist/tools/definitions/platform-setup.js +27 -34
  27. package/dist/tools/definitions/platform-setup.js.map +1 -1
  28. package/dist/tools/definitions/scheduled-tasks.d.ts +5 -0
  29. package/dist/tools/definitions/scheduled-tasks.js +35 -0
  30. package/dist/tools/definitions/scheduled-tasks.js.map +1 -1
  31. package/dist/tools/definitions/shared.d.ts +23 -13
  32. package/dist/tools/definitions/shared.js +60 -7
  33. package/dist/tools/definitions/shared.js.map +1 -1
  34. package/dist/tools/definitions.d.ts +123 -18
  35. package/dist/tools/definitions.js +6 -1
  36. package/dist/tools/definitions.js.map +1 -1
  37. package/dist/tools/registry-mapping-cases-core.d.ts +4 -0
  38. package/dist/tools/registry-mapping-cases-core.js.map +1 -1
  39. package/dist/tools/registry-mapping-cases-platform.js +45 -1
  40. package/dist/tools/registry-mapping-cases-platform.js.map +1 -1
  41. package/package.json +2 -2
@@ -0,0 +1,76 @@
1
+ import { z } from 'zod';
2
+ import { refineFollowUpConfig } from './follow-up.js';
3
+ import { anyObjectSchema, compactObject, defineTool, followUpSequenceTypeSchema, followUpTriggerSchema, platformSetupConfirmationSchema, setupConfirmation, uuidSchema, withInstructions, } from './shared.js';
4
+ /**
5
+ * Потолок длины имени копии follow-up сценария. Зеркалит `@MaxLength` в DTO бэкенда и
6
+ * `maxLength` в OpenAPI: расхождение означало бы поздний 400 вместо ранней понятной ошибки.
7
+ */
8
+ const FOLLOW_UP_NAME_MAX_LENGTH = 200;
9
+ /**
10
+ * МУТАЦИИ follow-up сценариев для Platform Setup Bridge.
11
+ *
12
+ * Вынесены из `platform-setup.ts` ТОЛЬКО ради лимита длины файла (1200 строк) — как это уже
13
+ * сделано для волн GetCourse. Набор спредится в `platformSetupTools` НА ПРЕЖНЕМ МЕСТЕ: реестр
14
+ * сверяет точный порядок инструментов с `mcp-tools.json`, и перестановка сломала бы parity-тест.
15
+ *
16
+ * Чтение сценариев живёт отдельно, в `follow-up.ts`.
17
+ */
18
+ export const followUpSetupTools = [
19
+ defineTool({
20
+ name: 'besales_followup_sequence_upsert',
21
+ requiredFields: ['platform_id', 'name', 'type', 'trigger', 'config'],
22
+ schema: z.object({
23
+ platform_id: uuidSchema,
24
+ sequence_id: uuidSchema.optional(),
25
+ name: z.string(),
26
+ description: z.string().nullable().optional(),
27
+ type: followUpSequenceTypeSchema,
28
+ enabled: z.boolean().optional(),
29
+ trigger: followUpTriggerSchema,
30
+ config: anyObjectSchema,
31
+ ...platformSetupConfirmationSchema,
32
+ })
33
+ .superRefine(refineFollowUpConfig),
34
+ createRequest: (input) => ({
35
+ method: input.sequence_id ? 'PATCH' : 'POST',
36
+ path: input.sequence_id
37
+ ? `/platforms/${input.platform_id}/follow-up/sequences/${input.sequence_id}`
38
+ : `/platforms/${input.platform_id}/follow-up/sequences`,
39
+ body: compactObject({
40
+ name: input.name,
41
+ description: input.description,
42
+ type: input.type,
43
+ enabled: input.enabled,
44
+ trigger: input.trigger,
45
+ config: input.config,
46
+ ...setupConfirmation(input),
47
+ }),
48
+ }),
49
+ }),
50
+ defineTool({
51
+ name: 'besales_followup_sequence_clone',
52
+ requiredFields: ['platform_id', 'sequence_id'],
53
+ schema: z
54
+ .object({
55
+ platform_id: uuidSchema,
56
+ // Источник копирования; обязан принадлежать platform_id (cross-platform не поддерживается).
57
+ sequence_id: uuidSchema,
58
+ // Имя копии. Не передано — сервер подберёт `<имя>-copy`, `<имя>-copy-2`, …
59
+ // Лимит зеркалит DTO бэкенда: без него агент получал бы поздний 400 вместо ранней ошибки.
60
+ name: z.string().max(FOLLOW_UP_NAME_MAX_LENGTH).optional(),
61
+ })
62
+ .strict(),
63
+ createRequest: (input) => ({
64
+ method: 'POST',
65
+ path: `/platforms/${input.platform_id}/follow-up/sequences/${input.sequence_id}/clone`,
66
+ body: compactObject({ name: input.name }),
67
+ }),
68
+ enhanceResponse: (response) => withInstructions(response, [
69
+ 'Копия создана ВЫКЛЮЧЕННОЙ и такой останется, пока её не включат явно: прогресс follow-up изолирован по sequenceId, поэтому включённая копия слала бы те же касания тем же контактам вторым потоком.',
70
+ 'Скопировано только ОПРЕДЕЛЕНИЕ (имя, тип, триггер, config). Прогресс контактов, история отправок и запланированные сообщения источника не копируются и не затрагиваются.',
71
+ 'Перед включением копии убедись, что условия цепочек образуют строгое разбиение (например eq A / eq B / neq A AND neq B). Две цепочки без взаимоисключающих условий удвоят отправку — они выполняются независимо.',
72
+ 'Копия остаётся на ТОЙ ЖЕ платформе. Для переноса на другую платформу используй besales_platform_clone_* — конфиг ссылается на статусы CRM, агентов, файлы и переменные этой платформы.',
73
+ ]),
74
+ }),
75
+ ];
76
+ //# sourceMappingURL=follow-up-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-up-setup.js","sourceRoot":"","sources":["../../../src/tools/definitions/follow-up-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACL,eAAe,EACf,aAAa,EACb,UAAU,EACV,0BAA0B,EAC1B,qBAAqB,EACrB,+BAA+B,EAC/B,iBAAiB,EACjB,UAAU,EACV,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAEtC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,UAAU,CAAC;QACT,IAAI,EAAE,kCAAkC;QACxC,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;QACpE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,WAAW,EAAE,UAAU;YACvB,WAAW,EAAE,UAAU,CAAC,QAAQ,EAAE;YAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;YAChB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YAC7C,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;YAC/B,OAAO,EAAE,qBAAqB;YAC9B,MAAM,EAAE,eAAe;YACvB,GAAG,+BAA+B;SACnC,CAAC;aACC,WAAW,CAAC,oBAAoB,CAAC;QACpC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzB,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;YAC5C,IAAI,EAAE,KAAK,CAAC,WAAW;gBACrB,CAAC,CAAC,cAAc,KAAK,CAAC,WAAW,wBAAwB,KAAK,CAAC,WAAW,EAAE;gBAC5E,CAAC,CAAC,cAAc,KAAK,CAAC,WAAW,sBAAsB;YACzD,IAAI,EAAE,aAAa,CAAC;gBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,GAAG,iBAAiB,CAAC,KAAK,CAAC;aAC5B,CAAC;SACH,CAAC;KACH,CAAC;IACF,UAAU,CAAC;QACT,IAAI,EAAE,iCAAiC;QACvC,cAAc,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC;QAC9C,MAAM,EAAE,CAAC;aACN,MAAM,CAAC;YACN,WAAW,EAAE,UAAU;YACvB,4FAA4F;YAC5F,WAAW,EAAE,UAAU;YACvB,2EAA2E;YAC3E,0FAA0F;YAC1F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,QAAQ,EAAE;SAC3D,CAAC;aACD,MAAM,EAAE;QACX,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,cAAc,KAAK,CAAC,WAAW,wBAAwB,KAAK,CAAC,WAAW,QAAQ;YACtF,IAAI,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;SAC1C,CAAC;QACF,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC5B,gBAAgB,CAAC,QAAQ,EAAE;YACzB,qMAAqM;YACrM,0KAA0K;YAC1K,kNAAkN;YAClN,wLAAwL;SACzL,CAAC;KACL,CAAC;CACH,CAAC"}
@@ -72,6 +72,16 @@ export declare const followUpStepStatsSchema: z.ZodObject<{
72
72
  from: z.ZodOptional<z.ZodString>;
73
73
  to: z.ZodOptional<z.ZodString>;
74
74
  }, z.core.$strip>;
75
+ export declare const followUpReactionsSchema: z.ZodObject<{
76
+ platform_id: z.ZodString;
77
+ from: z.ZodString;
78
+ to: z.ZodString;
79
+ sequence_id: z.ZodOptional<z.ZodArray<z.ZodString>>;
80
+ horizon_minutes: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<30>, z.ZodLiteral<60>, z.ZodLiteral<90>, z.ZodLiteral<180>, z.ZodLiteral<360>, z.ZodLiteral<720>, z.ZodLiteral<1440>]>>;
81
+ segment: z.ZodOptional<z.ZodArray<z.ZodString>>;
82
+ product: z.ZodOptional<z.ZodArray<z.ZodString>>;
83
+ channel: z.ZodOptional<z.ZodArray<z.ZodString>>;
84
+ }, z.core.$strip>;
75
85
  export declare const followUpTools: (import("./shared.js").ToolDefinition<{
76
86
  platform_id: string;
77
87
  sequence_id?: string | undefined;
@@ -81,4 +91,13 @@ export declare const followUpTools: (import("./shared.js").ToolDefinition<{
81
91
  sequence_id: string;
82
92
  from?: string | undefined;
83
93
  to?: string | undefined;
94
+ }> | import("./shared.js").ToolDefinition<{
95
+ platform_id: string;
96
+ from: string;
97
+ to: string;
98
+ sequence_id?: string[] | undefined;
99
+ horizon_minutes?: 60 | 30 | 180 | 90 | 360 | 720 | 1440 | undefined;
100
+ segment?: string[] | undefined;
101
+ product?: string[] | undefined;
102
+ channel?: string[] | undefined;
84
103
  }>)[];
@@ -71,12 +71,27 @@ export const reactivationConfigSchema = z
71
71
  filterMode: z
72
72
  .enum(['status', 'eventType', 'variable'])
73
73
  .optional()
74
- .describe('Режим отбора контактов. Неизвестное значение НЕ включает ни один фильтр — цепочка уйдёт ' +
75
- 'всем контактам канала, поэтому бэкенд отвергает такой конфиг'),
74
+ .describe('БАЗОВЫЙ отбор контактов: по статусу CRM, по типу события платформы либо ' +
75
+ "'variable' = базового фильтра нет (отбор только по sequenceConditions). Условия по " +
76
+ 'переменным ОРТОГОНАЛЬНЫ этому выбору и добавляются к нему через И — чтобы ветвить ' +
77
+ "цепочки по варианту рассылки, сохранив отбор по событию, бери 'eventType' и задай " +
78
+ "sequenceConditions, а НЕ 'variable'. Неизвестное значение НЕ включает ни один фильтр — " +
79
+ 'цепочка уйдёт всем контактам канала, поэтому бэкенд отвергает такой конфиг'),
76
80
  sequenceConditions: z
77
81
  .array(variableConditionSchema)
78
82
  .optional()
79
- .describe("Обязателен и непуст при filterMode='variable'"),
83
+ .describe('Условия принадлежности контакта цепочке, соединяются через И. Применяются при ЛЮБОМ ' +
84
+ "filterMode (при 'variable' обязателен и непуст, иначе цепочка не выберет никого). " +
85
+ 'Ветвление по измерениям рассылки GetCourse: WAVE_MAILING_VARIANT — UUID варианта из ' +
86
+ 'каталога воркспейса, а НЕ его имя («first-ver» будет отвергнут); WAVE_PRODUCT — код ' +
87
+ 'продукта строчными без пробелов («dbo»); WAVE_FUNNEL — КЛЮЧ воронки (f-код «f11», ' +
88
+ 'иначе вся строка строчными), а НЕ метка запуска («f11 — ВК NR ДБО» будет отвергнут); ' +
89
+ 'WAVE_SEGMENT — имя сегмента. Значения проставляет запуск рассылки, у контакта без ' +
90
+ 'рассылки их нет. ' +
91
+ 'ВАЖНО: отдельные цепочки НЕ взаимоисключающи — прогресс изолирован по sequenceId, ' +
92
+ 'поэтому безусловная «ловящая» цепочка рядом с eq A и eq B не подстрахует, а УДВОИТ ' +
93
+ 'отправку. Набор цепочек обязан быть строгим разбиением: eq A, eq B и fallback ' +
94
+ 'neq A AND neq B (у контакта без переменной eq/in → false, neq → true)'),
80
95
  steps: z.array(reactivationStepSchema).min(1),
81
96
  })
82
97
  .passthrough();
@@ -122,6 +137,42 @@ export const followUpStepStatsSchema = z.object({
122
137
  from: z.string().optional().describe('Начало окна, ISO-дата. По умолчанию 30 дней назад'),
123
138
  to: z.string().optional().describe('Конец окна, ISO-дата. По умолчанию сейчас'),
124
139
  });
140
+ /** Горизонты сравнения, разрешённые бэкендом. Свободное число он отвергает 400. */
141
+ const REACTION_HORIZONS = [30, 60, 90, 180, 360, 720, 1440];
142
+ export const followUpReactionsSchema = z.object({
143
+ platform_id: uuidSchema,
144
+ from: z.string().describe('Начало периода по дате отправки шага, YYYY-MM-DD (московские сутки)'),
145
+ to: z
146
+ .string()
147
+ .describe('Конец периода, YYYY-MM-DD. Период длиннее 366 суток бэкенд отвергает'),
148
+ sequence_id: z
149
+ .array(uuidSchema)
150
+ .optional()
151
+ .describe('Фильтр цепочек. НЕ влияет на атрибуцию: окно ответа всегда считается по полной шкале ' +
152
+ 'касаний контакта, иначе цифра менялась бы от набора фильтров'),
153
+ horizon_minutes: z
154
+ .union([
155
+ z.literal(REACTION_HORIZONS[0]),
156
+ z.literal(REACTION_HORIZONS[1]),
157
+ z.literal(REACTION_HORIZONS[2]),
158
+ z.literal(REACTION_HORIZONS[3]),
159
+ z.literal(REACTION_HORIZONS[4]),
160
+ z.literal(REACTION_HORIZONS[5]),
161
+ z.literal(REACTION_HORIZONS[6]),
162
+ ])
163
+ .optional()
164
+ .describe('Горизонт сравнительной метрики. По умолчанию 90'),
165
+ segment: z
166
+ .array(z.string())
167
+ .optional()
168
+ .describe('Сегменты волны. Доступные значения приходят в ответе (`dimensions.segments`); у канала ' +
169
+ 'без рассылок их нет вообще'),
170
+ product: z.array(z.string()).optional().describe('Продукты волны (`dimensions.products`)'),
171
+ channel: z
172
+ .array(z.string())
173
+ .optional()
174
+ .describe('Транспорты волны (`dimensions.channels`), например Telegram/WhatsApp/MAX/VK'),
175
+ });
125
176
  export const followUpTools = [
126
177
  defineTool({
127
178
  name: 'besales_followup_sequence_list',
@@ -157,5 +208,36 @@ export const followUpTools = [
157
208
  'Окно по умолчанию — 30 дней; для более раннего периода передай from/to.',
158
209
  ]),
159
210
  }),
211
+ defineTool({
212
+ name: 'besales_followup_reactions',
213
+ requiredFields: ['platform_id', 'from', 'to'],
214
+ schema: followUpReactionsSchema,
215
+ createRequest: (input) => ({
216
+ method: 'GET',
217
+ // ⚠️ Ключи query — camelCase, в отличие от snake_case параметров тула: этот эндпоинт
218
+ // разбирает их в DTO с `forbidNonWhitelisted`, и `sequence_id` вернул бы 400
219
+ // «property should not exist». Соседний `sequence_list` принимает snake_case потому, что
220
+ // его контроллер объявляет параметры поштучно, — на него ориентироваться нельзя.
221
+ path: `/platforms/${input.platform_id}/follow-up/reactions${buildListQuery({
222
+ from: input.from,
223
+ to: input.to,
224
+ sequenceId: input.sequence_id,
225
+ horizonMinutes: input.horizon_minutes,
226
+ segment: input.segment,
227
+ product: input.product,
228
+ channel: input.channel,
229
+ })}`,
230
+ }),
231
+ enhanceResponse: (response) => withInstructions(response, [
232
+ 'Метрик ДВЕ и они НЕ взаимозаменяемы. `replied` — операционная: у каждого шага СВОЁ окно (до следующего касания), поэтому шаг с суточным интервалом почти всегда выглядит лучше часового. Сравнивать шаги по ней НЕЛЬЗЯ.',
233
+ 'Сравнивать шаги можно ТОЛЬКО по `horizonReplied` (равный горизонт) и ТОЛЬКО там, где `comparableReliable: true`.',
234
+ 'comparableReliable=false означает, что доля ЗАВЫШЕНА, а не просто шумна: цензурирование информативно — следующий шаг уходит лишь к промолчавшим, поэтому выжившие обогащены ответившими. Замер: 67 % вырезанных дали 20,8 % против настоящих 5,5 %. Лечение — horizon_minutes КОРОЧЕ интервала между шагами.',
235
+ 'Знаменатели разные: `replied` считается от `resolvedSent` (без ещё открытых окон), `horizonReplied` — от `comparableSent`. От `sent` не считается НИ ОДНА доля.',
236
+ 'Ответ атрибутируется РОВНО ОДНОМУ касанию — ближайшему предшествующему. Окно закрывают шаг любой цепочки, волна рассылки и реплика живого оператора.',
237
+ 'Цепочки с `measurable: false` шагов не записывают вообще (LOST_CLIENTS): их отсутствие в byStep означает «не меряем», а не «не работает».',
238
+ 'Пустые массивы в `dimensions` — у канала нет рассылок, срезы по сегменту/продукту/мессенджеру там недоступны в принципе.',
239
+ 'anchorExactShare < 1 — у части строк время отправки записано пакетно (отставание секунды). На окне в десятки минут это меньше процента.',
240
+ ]),
241
+ }),
160
242
  ];
161
243
  //# sourceMappingURL=follow-up.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"follow-up.js","sourceRoot":"","sources":["../../../src/tools/definitions/follow-up.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"follow-up.js","sourceRoot":"","sources":["../../../src/tools/definitions/follow-up.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Рассылка «Первое сообщение» (холодное приветствие GetCourse): МЫ пишем первыми контактам без
3
+ * открытого диалога. Отправка НЕОБРАТИМА и не идемпотентна на стороне GetCourse — повтор создал
4
+ * бы второе сообщение живому человеку, поэтому старт требует explicit_confirmation и всегда
5
+ * предваряется preview.
6
+ */
7
+ export declare const getcourseColdWelcomeTools: (import("./shared.js").ToolDefinition<{
8
+ platform_id: string;
9
+ workspace_id?: string | undefined;
10
+ created_after?: string | undefined;
11
+ contacts?: {
12
+ contact_id: string;
13
+ deal_id?: string | undefined;
14
+ }[] | undefined;
15
+ }> | import("./shared.js").ToolDefinition<{
16
+ explicit_confirmation: true;
17
+ workspace_id?: string | undefined;
18
+ platform_id?: string | undefined;
19
+ created_after?: string | undefined;
20
+ contacts?: {
21
+ contact_id: string;
22
+ deal_id?: string | undefined;
23
+ }[] | undefined;
24
+ deal_fields?: Record<string, string | number | boolean | null> | undefined;
25
+ message?: string | undefined;
26
+ mailing_variant_id?: string | undefined;
27
+ segment?: string | undefined;
28
+ product_code?: string | undefined;
29
+ funnel?: string | undefined;
30
+ }> | import("./shared.js").ToolDefinition<{
31
+ segments: {
32
+ contacts: {
33
+ contact_id: string;
34
+ deal_id?: string | undefined;
35
+ }[];
36
+ segment?: string | undefined;
37
+ product_code?: string | undefined;
38
+ funnel?: string | undefined;
39
+ deal_fields?: Record<string, string | number | boolean | null> | undefined;
40
+ }[];
41
+ explicit_confirmation: true;
42
+ workspace_id?: string | undefined;
43
+ platform_id?: string | undefined;
44
+ message?: string | undefined;
45
+ mailing_variant_id?: string | undefined;
46
+ }> | import("./shared.js").ToolDefinition<{
47
+ batch_id: string;
48
+ workspace_id?: string | undefined;
49
+ }> | import("./shared.js").ToolDefinition<{
50
+ batch_id: string;
51
+ explicit_confirmation: true;
52
+ workspace_id?: string | undefined;
53
+ }> | import("./shared.js").ToolDefinition<{
54
+ job_id: string;
55
+ workspace_id?: string | undefined;
56
+ }>)[];
@@ -0,0 +1,241 @@
1
+ import { z } from 'zod';
2
+ import { compactObject, defineTool, uuidSchema, withInstructions } from './shared.js';
3
+ const MESSAGE_MAX_LENGTH = 4000;
4
+ const LABEL_MAX_LENGTH = 200;
5
+ const MAX_CONTACTS = 5000;
6
+ /** Потолок сегментов в пакете — паритет с бэкендом и с батчем волны. */
7
+ const MAX_BATCH_SEGMENTS = 10;
8
+ /**
9
+ * Строка предсписка: getcourseUserId + опциональный пин сделки для штампа полей.
10
+ *
11
+ * Оба поля — ЧИСЛА в строковом виде, и проверяется именно форма: паритет с сестринской
12
+ * `besales_getcourse_wave_run_start`. Непустоты мало — «AB-123» доезжал до штампа уже ПОСЛЕ
13
+ * доставки сообщения, а «user@mail.ru» молча выпадал в отбракованные строки.
14
+ */
15
+ const numericIdSchema = (field) => z
16
+ .string()
17
+ .trim()
18
+ .regex(/^\d+$/, `${field} обязан быть числовым идентификатором GetCourse`);
19
+ const contactSchema = z
20
+ .object({
21
+ contact_id: numericIdSchema('contact_id'),
22
+ deal_id: numericIdSchema('deal_id').optional(),
23
+ })
24
+ .strict();
25
+ const toContacts = (contacts) => contacts?.map((contact) => ({ contactId: contact.contact_id, dealId: contact.deal_id }));
26
+ /**
27
+ * Рассылка «Первое сообщение» (холодное приветствие GetCourse): МЫ пишем первыми контактам без
28
+ * открытого диалога. Отправка НЕОБРАТИМА и не идемпотентна на стороне GetCourse — повтор создал
29
+ * бы второе сообщение живому человеку, поэтому старт требует explicit_confirmation и всегда
30
+ * предваряется preview.
31
+ */
32
+ export const getcourseColdWelcomeTools = [
33
+ defineTool({
34
+ name: 'besales_getcourse_cold_welcome_preview',
35
+ requiredFields: ['platform_id'],
36
+ defaultWorkspaceId: true,
37
+ schema: z
38
+ .object({
39
+ workspace_id: uuidSchema.optional(),
40
+ platform_id: uuidSchema,
41
+ created_after: z.string().datetime({ offset: true }).optional(),
42
+ contacts: z.array(contactSchema).min(1).max(MAX_CONTACTS).optional(),
43
+ })
44
+ .strict()
45
+ .refine((input) => (input.created_after !== undefined) !== (input.contacts !== undefined), {
46
+ message: 'Ровно одна аудитория: created_after (по дате) ЛИБО contacts (по файлу)',
47
+ }),
48
+ createRequest: (input) => ({
49
+ method: 'POST',
50
+ path: `/workspaces/${input.workspace_id}/getcourse-cold-welcome/preview`,
51
+ body: compactObject({
52
+ platformId: input.platform_id,
53
+ createdAfter: input.created_after,
54
+ contacts: toContacts(input.contacts),
55
+ }),
56
+ }),
57
+ enhanceResponse: (response) => withInstructions(response, [
58
+ 'totalContacts — сколько ЕЩЁ может получить первое сообщение; alreadyWelcomed — сколько уже получали его раньше (оно одноразово НА КОНТАКТ, не на рассылку).',
59
+ 'Для аудитории по файлу дополнительно приходят alreadyInDialog и notInBase: контакты предсписка обязаны быть импортированы (Шаг 1) до запуска.',
60
+ 'Всегда показывай пользователю totalContacts и alreadyWelcomed ДО старта: отправку нельзя отозвать.',
61
+ 'Часть контактов отсеется уже в прогоне (мьют бота, нет даты эфира, недостижимость) — разбивка по причинам будет в outcomes задачи.',
62
+ ]),
63
+ }),
64
+ defineTool({
65
+ name: 'besales_getcourse_cold_welcome_start',
66
+ requiredFields: ['explicit_confirmation'],
67
+ defaultWorkspaceId: true,
68
+ schema: z
69
+ .object({
70
+ workspace_id: uuidSchema.optional(),
71
+ platform_id: uuidSchema.optional(),
72
+ created_after: z.string().datetime({ offset: true }).optional(),
73
+ contacts: z.array(contactSchema).min(1).max(MAX_CONTACTS).optional(),
74
+ deal_fields: z
75
+ .record(z.string().regex(/^\d+$/, 'Ключ deal_fields обязан быть числовым fieldId GetCourse'), z.union([z.string(), z.number(), z.boolean(), z.null()]))
76
+ .optional(),
77
+ message: z.string().trim().min(1).max(MESSAGE_MAX_LENGTH).optional(),
78
+ mailing_variant_id: uuidSchema.optional(),
79
+ segment: z.string().max(LABEL_MAX_LENGTH).optional(),
80
+ product_code: z.string().max(LABEL_MAX_LENGTH).optional(),
81
+ funnel: z.string().max(LABEL_MAX_LENGTH).optional(),
82
+ explicit_confirmation: z.literal(true),
83
+ })
84
+ .strict()
85
+ .refine((input) => (input.message !== undefined) !== (input.mailing_variant_id !== undefined), {
86
+ message: 'Ровно один источник текста: message (разовый) ЛИБО mailing_variant_id (сохранённая рассылка)',
87
+ })
88
+ .refine((input) => (input.created_after !== undefined) !== (input.contacts !== undefined), {
89
+ message: 'Ровно одна аудитория: created_after (по дате) ЛИБО contacts (по файлу)',
90
+ }),
91
+ createRequest: (input) => ({
92
+ method: 'POST',
93
+ path: `/workspaces/${input.workspace_id}/getcourse-cold-welcome`,
94
+ body: compactObject({
95
+ platformId: input.platform_id,
96
+ createdAfter: input.created_after,
97
+ contacts: toContacts(input.contacts),
98
+ dealFields: input.deal_fields,
99
+ message: input.message,
100
+ mailingVariantId: input.mailing_variant_id,
101
+ segment: input.segment,
102
+ productCode: input.product_code,
103
+ funnel: input.funnel,
104
+ }),
105
+ }),
106
+ enhanceResponse: (response) => withInstructions(response, [
107
+ 'Рассылка запущена фоном: прогресс и разбивка исходов — в задаче импорта (jobId).',
108
+ 'Текст заморожен снимком: правка рассылки НЕ меняет идущий запуск.',
109
+ 'Если у рассылки заданы message_text_by_segment и segment совпал — уедет ТЕКСТ СЕГМЕНТА. Назови пользователю, какой текст выбран, ДО подтверждения: отправку не отозвать.',
110
+ '⚠️ Метка segment аудиторию НЕ отбирает. Поэтому посегментный текст разрешён только с contacts (файл): с created_after он ушёл бы ВСЕЙ когорте после даты и выжег бы отметку приветствия — второй сегмент получил бы нулевой охват. Такой запуск отвергается 400.',
111
+ 'Повторный запуск по той же границе безопасен: уже получившие первое сообщение не получат второе.',
112
+ 'platform_id и deal_fields можно опустить, если они заданы в рассылке как «по умолчанию» — сервер подставит их сам.',
113
+ 'Пустой объект deal_fields — НЕ то же, что отсутствие ключа: он означает «на этом запуске без полей» и гасит дефолты рассылки.',
114
+ 'deal_fields штампуются ПОСЛЕ успешной отправки (пин из строки файла, иначе закреплённая сделка контакта); их отказ не отменяет отправку и виден счётчиком dealStamp.',
115
+ ]),
116
+ }),
117
+ defineTool({
118
+ name: 'besales_getcourse_cold_welcome_batch_start',
119
+ requiredFields: ['segments', 'explicit_confirmation'],
120
+ defaultWorkspaceId: true,
121
+ schema: z
122
+ .object({
123
+ workspace_id: uuidSchema.optional(),
124
+ platform_id: uuidSchema.optional(),
125
+ message: z.string().trim().min(1).max(MESSAGE_MAX_LENGTH).optional(),
126
+ mailing_variant_id: uuidSchema.optional(),
127
+ segments: z
128
+ .array(z
129
+ .object({
130
+ segment: z.string().max(LABEL_MAX_LENGTH).optional(),
131
+ product_code: z.string().max(LABEL_MAX_LENGTH).optional(),
132
+ funnel: z.string().max(LABEL_MAX_LENGTH).optional(),
133
+ deal_fields: z
134
+ .record(z
135
+ .string()
136
+ .regex(/^\d+$/, 'Ключ deal_fields обязан быть числовым fieldId GetCourse'), z.union([z.string(), z.number(), z.boolean(), z.null()]))
137
+ .optional(),
138
+ contacts: z.array(contactSchema).min(1).max(MAX_CONTACTS),
139
+ })
140
+ .strict())
141
+ .min(1)
142
+ .max(MAX_BATCH_SEGMENTS),
143
+ explicit_confirmation: z.literal(true),
144
+ })
145
+ .strict()
146
+ .refine((input) => (input.message !== undefined) !== (input.mailing_variant_id !== undefined), {
147
+ message: 'Ровно один источник текста: message (разовый) ЛИБО mailing_variant_id (сохранённая рассылка)',
148
+ }),
149
+ createRequest: (input) => ({
150
+ method: 'POST',
151
+ path: `/workspaces/${input.workspace_id}/getcourse-cold-welcome/batch`,
152
+ body: compactObject({
153
+ platformId: input.platform_id,
154
+ message: input.message,
155
+ mailingVariantId: input.mailing_variant_id,
156
+ segments: input.segments.map((segment) => compactObject({
157
+ segment: segment.segment,
158
+ productCode: segment.product_code,
159
+ funnel: segment.funnel,
160
+ dealFields: segment.deal_fields,
161
+ contacts: toContacts(segment.contacts),
162
+ })),
163
+ }),
164
+ }),
165
+ enhanceResponse: (response) => withInstructions(response, [
166
+ 'Пакет: несколько сегментов одним вызовом, у каждого свой список контактов, свои метки и свои поля сделки.',
167
+ 'Сегменты идут ПО ОЧЕРЕДИ — задачи импорта не могут выполняться параллельно. Прогресс смотри через besales_getcourse_cold_welcome_batch_status по batchId.',
168
+ 'Весь пакет проверяется ДО первой отправки: сегмент без текста отменяет пакет целиком, пока никому ничего не ушло.',
169
+ 'Отказ одного сегмента НЕ останавливает остальные — смотри разбивку в статусе.',
170
+ ]),
171
+ }),
172
+ defineTool({
173
+ name: 'besales_getcourse_cold_welcome_batch_status',
174
+ requiredFields: ['batch_id'],
175
+ defaultWorkspaceId: true,
176
+ schema: z
177
+ .object({ workspace_id: uuidSchema.optional(), batch_id: uuidSchema })
178
+ .strict(),
179
+ createRequest: (input) => ({
180
+ method: 'GET',
181
+ path: `/workspaces/${input.workspace_id}/getcourse-cold-welcome/batch/${input.batch_id}`,
182
+ }),
183
+ enhanceResponse: (response) => withInstructions(response, [
184
+ 'state — агрегат по пакету, segments[] — разбивка: у каждого свой статус, свой importJobId и своя причина отказа.',
185
+ 'stalled=true означает, что драйвер оборвался (рестарт инстанса). НЕ запускай пакет заново — зови besales_getcourse_cold_welcome_batch_resume по тому же batch_id: источник текста хранится в плане, пересобирать списки не нужно, а уже отправленным контактам повтор не уйдёт (приветствие одноразово НА КОНТАКТ).',
186
+ ]),
187
+ }),
188
+ defineTool({
189
+ name: 'besales_getcourse_cold_welcome_batch_resume',
190
+ requiredFields: ['batch_id'],
191
+ defaultWorkspaceId: true,
192
+ schema: z
193
+ .object({ workspace_id: uuidSchema.optional(), batch_id: uuidSchema })
194
+ .strict(),
195
+ createRequest: (input) => ({
196
+ method: 'POST',
197
+ path: `/workspaces/${input.workspace_id}/getcourse-cold-welcome/batch/${input.batch_id}/resume`,
198
+ }),
199
+ enhanceResponse: (response) => withInstructions(response, [
200
+ 'Поднимает драйвер для НЕ НАЧАТЫХ сегментов пакета. Подтверждения не требует: повтора отправки не будет — приветствие одноразово НА КОНТАКТ, а уже начатые сегменты не перезапускаются.',
201
+ ]),
202
+ }),
203
+ defineTool({
204
+ name: 'besales_getcourse_cold_welcome_batch_cancel',
205
+ requiredFields: ['batch_id', 'explicit_confirmation'],
206
+ defaultWorkspaceId: true,
207
+ schema: z
208
+ .object({
209
+ workspace_id: uuidSchema.optional(),
210
+ batch_id: uuidSchema,
211
+ explicit_confirmation: z.literal(true),
212
+ })
213
+ .strict(),
214
+ createRequest: (input) => ({
215
+ method: 'POST',
216
+ path: `/workspaces/${input.workspace_id}/getcourse-cold-welcome/batch/${input.batch_id}/cancel`,
217
+ }),
218
+ enhanceResponse: (response) => withInstructions(response, [
219
+ 'Отменяет ОСТАТОК пакета: не начатые сегменты и идущую задачу. Уже отправленное не отзывается.',
220
+ ]),
221
+ }),
222
+ defineTool({
223
+ name: 'besales_getcourse_cold_welcome_cancel',
224
+ requiredFields: ['job_id'],
225
+ defaultWorkspaceId: true,
226
+ schema: z
227
+ .object({
228
+ workspace_id: uuidSchema.optional(),
229
+ job_id: uuidSchema,
230
+ })
231
+ .strict(),
232
+ createRequest: (input) => ({
233
+ method: 'POST',
234
+ path: `/workspaces/${input.workspace_id}/getcourse-cold-welcome/${input.job_id}/cancel`,
235
+ }),
236
+ enhanceResponse: (response) => withInstructions(response, [
237
+ 'Останавливает ОСТАТОК когорты в пределах ~10 секунд; уже отправленное не отзывается.',
238
+ ]),
239
+ }),
240
+ ];
241
+ //# sourceMappingURL=getcourse-cold-welcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getcourse-cold-welcome.js","sourceRoot":"","sources":["../../../src/tools/definitions/getcourse-cold-welcome.ts"],"names":[],"mappings":"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"}