@besales/mcp 0.41.0 → 0.43.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,95 @@
1
+ import { z } from 'zod';
2
+ import { compactObject, defineTool, uuidSchema, withInstructions } from './shared.js';
3
+ /** Потолок аудитории — общий с «Первым сообщением» и волнами: тот же разобранный файл. */
4
+ const MAX_CONTACTS = 5000;
5
+ /** Значение якоря — это дата, а не текст; паритет с DTO бэкенда. */
6
+ const ANCHOR_VALUE_MAX_LENGTH = 64;
7
+ const numericIdSchema = (field) => z
8
+ .string()
9
+ .trim()
10
+ .regex(/^\d+$/, `${field} обязан быть числовым идентификатором GetCourse`);
11
+ const contactSchema = z
12
+ .object({
13
+ contact_id: numericIdSchema('contact_id'),
14
+ deal_id: numericIdSchema('deal_id').optional(),
15
+ })
16
+ .strict();
17
+ const toContacts = (contacts) => contacts?.map((contact) => ({ contactId: contact.contact_id, dealId: contact.deal_id }));
18
+ /** Общее тело обеих ручек: отбор у предпросмотра и у запуска обязан быть ОДИН. */
19
+ const audienceShape = {
20
+ workspace_id: uuidSchema.optional(),
21
+ platform_id: uuidSchema,
22
+ contacts: z.array(contactSchema).min(1).max(MAX_CONTACTS).optional(),
23
+ current_anchor_value: z.string().trim().min(1).max(ANCHOR_VALUE_MAX_LENGTH).optional(),
24
+ };
25
+ /** Обе аудитории сразу отвергаются схемой, а не 400-й ошибкой сервера. */
26
+ const audienceRefinement = [
27
+ (input) => input.contacts === undefined || input.current_anchor_value === undefined,
28
+ {
29
+ message: 'Не больше одной аудитории: contacts (поимённый список) ЛИБО current_anchor_value (когорта). ' +
30
+ 'Без обеих — вся платформа.',
31
+ },
32
+ ];
33
+ const toBody = (input) => compactObject({
34
+ platformId: input.platform_id,
35
+ contacts: toContacts(input.contacts),
36
+ currentAnchorValue: input.current_anchor_value,
37
+ });
38
+ /**
39
+ * Перечитывание КАЛЕНДАРНЫХ ЯКОРЕЙ (даты эфира) из запинённой сделки GetCourse.
40
+ *
41
+ * ⚠️⚠️ Единственный способ донести до контактов ПЕРЕНЕСЁННЫЙ эфир. Автоматический добор якоря —
42
+ * set-if-absent и к заполненному значению не возвращается никогда, поэтому смена даты на сделке
43
+ * сама по себе никуда не доезжает: «Первое сообщение» будет возвращать SKIPPED_ANCHOR_IN_PAST,
44
+ * сколько его ни запускай.
45
+ *
46
+ * Операция необратима ПО ДАННЫМ — она затирает дату у живых контактов и переносит расписание их
47
+ * касаний, — поэтому старт требует explicit_confirmation и предваряется предпросмотром, как у
48
+ * сестринской рассылки «Первое сообщение».
49
+ */
50
+ export const getcourseAnchorRefreshTools = [
51
+ defineTool({
52
+ name: 'besales_getcourse_anchor_refresh_preview',
53
+ requiredFields: ['platform_id'],
54
+ defaultWorkspaceId: true,
55
+ schema: z.object(audienceShape).strict().refine(...audienceRefinement),
56
+ createRequest: (input) => ({
57
+ method: 'POST',
58
+ path: `/workspaces/${input.workspace_id}/getcourse-anchor-refresh/preview`,
59
+ body: toBody(input),
60
+ }),
61
+ enhanceResponse: (response) => withInstructions(response, [
62
+ 'Ничего не пишет и в школу не ходит — считает по базе. Показывай пользователю currentValues ДО запуска: это единственный способ увидеть, ЧТО именно будет переписано.',
63
+ 'currentValues — переменная → текущее значение → сколько контактов его несут. Если там несколько разных дат, отбор шире, чем один перенесённый эфир: сузь его current_anchor_value.',
64
+ 'withoutPinnedDeal — этим прогон ОТКАЖЕТ (SKIPPED_NO_PINNED_DEAL): без запинённой сделки читалась бы произвольная сделка контакта, и верная дата была бы затёрта чужой. Пин появится на следующем входящем либо его проставит импорт сделок.',
65
+ '⚠️ notInBase — строки присланного списка, которым НЕ нашлось контакта в базе площадки. «Прислали 500, найдено 200» означает, что 300 человек прогон не тронет вовсе: сначала импорт контактов (besales_getcourse_contacts_import), потом перечит. Называй это число пользователю — молча оно читается как полный охват.',
66
+ 'refreshableVariables пуст → перечитывать нечем: у площадки нет включённых календарных цепочек либо их якорь не заведён в карте полей сделки. Запуск в этом случае не стартует.',
67
+ '⚠️ НОВЫЕ значения предпросмотр не знает и знать не может: чтобы их узнать, надо прочитать все сделки — то есть выполнить сам прогон.',
68
+ ]),
69
+ }),
70
+ defineTool({
71
+ name: 'besales_getcourse_anchor_refresh_start',
72
+ requiredFields: ['platform_id', 'explicit_confirmation'],
73
+ defaultWorkspaceId: true,
74
+ schema: z
75
+ .object({ ...audienceShape, explicit_confirmation: z.literal(true) })
76
+ .strict()
77
+ .refine(...audienceRefinement),
78
+ createRequest: (input) => ({
79
+ method: 'POST',
80
+ path: `/workspaces/${input.workspace_id}/getcourse-anchor-refresh`,
81
+ body: toBody(input),
82
+ }),
83
+ enhanceResponse: (response) => withInstructions(response, [
84
+ 'Прогон идёт ФОНОМ: ответ подтверждает старт. Итоги ищутся по correlationId — в логах и в построчном аудите (audit_logs: entityType=ChatUser, action=GETCOURSE_ANCHOR_REFRESH, changes.variables содержит прежнее и новое значение каждого якоря).',
85
+ 'Перечитываются ТОЛЬКО якоря календарных цепочек площадки и ТОЛЬКО с запинённой сделки. Переменные ветвления (посещаемость эфира, клики) не трогаются: у них авторитетнее ответ клиента в диалоге.',
86
+ '⚠️⚠️ Прогресс цепочек НЕ откатывается. Уже отправленные касания остаются отправленными; заново планируются только не ушедшие. Перенос эфира ВПЕРЁД доезжает целиком, НАЗАД — закрывает часть слотов как просроченные. Скажи это пользователю до подтверждения: откатить нельзя.',
87
+ 'Исходы в логе прогона различают ПРИЧИНЫ, и чинятся они разным: UPDATED — дата перенесена, прежняя сохранена в аудите; UPDATED_AUDIT_LOST — дата перенесена, но строка аудита не легла (прежнее значение только в логе, откатить нечем); UNCHANGED — на сделке та же дата; SKIPPED_DEAL_FIELD_EMPTY — поле сделки пусто (заполнить в школе); SKIPPED_NO_PINNED_DEAL / SKIPPED_STALE_PIN — сделка не закреплена либо исчезла (перезакрепить импортом); SKIPPED_NOT_IN_BASE — контакта нет в базе (сначала импорт); FAILED — школа не ответила, повтор осмыслен.',
88
+ '⚠️ FAILED и UNCHANGED — противоположные новости: первое означает «не прочитали ни одной сделки, повтори», второе — «переносить нечего». Не сваливай их в одно «ничего не изменилось».',
89
+ 'alreadyRunning=true означает, что по этой площадке прогон уже идёт — дождись его, второй не запускается. ⚠️ Отмены у прогона НЕТ, а статус узнать неоткуда, кроме логов: сначала preview, потом запуск.',
90
+ 'started=false при пустом refreshableVariables — перечитывать нечем, а не сбой: у площадки нет включённых календарных цепочек либо якорь не замаплен на поле сделки.',
91
+ 'После прогона контакты с обновлённой датой снова доступны обычному запуску «Первого сообщения» — до него они отсеивались исходом SKIPPED_ANCHOR_IN_PAST.',
92
+ ]),
93
+ }),
94
+ ];
95
+ //# sourceMappingURL=getcourse-anchor-refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getcourse-anchor-refresh.js","sourceRoot":"","sources":["../../../src/tools/definitions/getcourse-anchor-refresh.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@ export declare const getcourseColdWelcomeTools: (import("./shared.js").ToolDefin
14
14
  }[] | undefined;
15
15
  mailing_variant_id?: string | undefined;
16
16
  channels?: ("Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX")[] | undefined;
17
+ channels_mode?: "RESTRICT" | "ADD" | undefined;
17
18
  }> | import("./shared.js").ToolDefinition<{
18
19
  explicit_confirmation: true;
19
20
  workspace_id?: string | undefined;
@@ -29,7 +30,9 @@ export declare const getcourseColdWelcomeTools: (import("./shared.js").ToolDefin
29
30
  segment?: string | undefined;
30
31
  product_code?: string | undefined;
31
32
  funnel?: string | undefined;
33
+ cohort_label?: string | undefined;
32
34
  channels?: ("Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX")[] | undefined;
35
+ channels_mode?: "RESTRICT" | "ADD" | undefined;
33
36
  }> | import("./shared.js").ToolDefinition<{
34
37
  segments: {
35
38
  contacts: {
@@ -39,6 +42,7 @@ export declare const getcourseColdWelcomeTools: (import("./shared.js").ToolDefin
39
42
  segment?: string | undefined;
40
43
  product_code?: string | undefined;
41
44
  funnel?: string | undefined;
45
+ cohort_label?: string | undefined;
42
46
  deal_fields?: Record<string, string | number | boolean | null> | undefined;
43
47
  }[];
44
48
  explicit_confirmation: true;
@@ -47,6 +51,7 @@ export declare const getcourseColdWelcomeTools: (import("./shared.js").ToolDefin
47
51
  message?: string | undefined;
48
52
  mailing_variant_id?: string | undefined;
49
53
  channels?: ("Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX")[] | undefined;
54
+ channels_mode?: "RESTRICT" | "ADD" | undefined;
50
55
  }> | import("./shared.js").ToolDefinition<{
51
56
  batch_id: string;
52
57
  workspace_id?: string | undefined;
@@ -57,4 +62,18 @@ export declare const getcourseColdWelcomeTools: (import("./shared.js").ToolDefin
57
62
  }> | import("./shared.js").ToolDefinition<{
58
63
  job_id: string;
59
64
  workspace_id?: string | undefined;
65
+ }> | import("./shared.js").ToolDefinition<{
66
+ platform_id: string;
67
+ contacts: {
68
+ contact_id: string;
69
+ deal_id?: string | undefined;
70
+ dialog_id?: string | undefined;
71
+ transport?: string | undefined;
72
+ email?: string | undefined;
73
+ phone?: string | undefined;
74
+ first_name?: string | undefined;
75
+ last_name?: string | undefined;
76
+ }[];
77
+ workspace_id?: string | undefined;
78
+ check_messenger_presence?: boolean | undefined;
60
79
  }>)[];
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { compactObject, defineTool, getcourseTransportEnum, uuidSchema, withInstructions, } from './shared.js';
2
+ import { compactObject, defineTool, coldWelcomeChannelsModeEnum, getcourseTransportEnum, uuidSchema, withInstructions, } from './shared.js';
3
3
  const MESSAGE_MAX_LENGTH = 4000;
4
4
  const LABEL_MAX_LENGTH = 200;
5
5
  const MAX_CONTACTS = 5000;
@@ -23,6 +23,35 @@ const contactSchema = z
23
23
  })
24
24
  .strict();
25
25
  const toContacts = (contacts) => contacts?.map((contact) => ({ contactId: contact.contact_id, dealId: contact.deal_id }));
26
+ /**
27
+ * Пустая строка = поля НЕТ.
28
+ *
29
+ * ⚠️ В экспорте GetCourse пустая ячейка приезжает как `''`, и список, собранный из него, почти
30
+ * всегда содержит пустые почты, телефоны и имена. Без этого `email: ''` завалил бы ВЕСЬ вызов
31
+ * валидацией, хотя у файлового импорта та же строка проходит нормально: разбор считает пустое
32
+ * значение отсутствующим. Симметрично `EmptyToUndefined` в DTO бэкенда.
33
+ */
34
+ const emptyAsAbsent = (schema) => z.preprocess((value) => (typeof value === 'string' && value.trim() === '' ? undefined : value), schema.optional());
35
+ /**
36
+ * Строка ИМПОРТА — шире отправочной: кроме идентификаторов несёт данные самого контакта.
37
+ *
38
+ * Ключи остаются snake_case и уезжают на бэкенд КАК ЕСТЬ: там их читает разбор по алиасам колонок
39
+ * экспорта GetCourse (`contact_id`, `gc_deal_id`, `first_name`, …), тот же, что и для файла.
40
+ * Переименование в camelCase завело бы вторую копию правил разбора — а разбор решает, какой
41
+ * транспорт у контакта и попадёт ли он в базу вообще.
42
+ */
43
+ const importContactSchema = z
44
+ .object({
45
+ contact_id: numericIdSchema('contact_id'),
46
+ deal_id: emptyAsAbsent(numericIdSchema('deal_id')),
47
+ dialog_id: emptyAsAbsent(numericIdSchema('dialog_id')),
48
+ transport: emptyAsAbsent(z.string().trim().max(50)),
49
+ email: emptyAsAbsent(z.string().trim().email('email невалиден').max(320)),
50
+ phone: emptyAsAbsent(z.string().trim().max(64)),
51
+ first_name: emptyAsAbsent(z.string().trim().max(200)),
52
+ last_name: emptyAsAbsent(z.string().trim().max(200)),
53
+ })
54
+ .strict();
26
55
  /**
27
56
  * Рассылка «Первое сообщение» (холодное приветствие GetCourse): МЫ пишем первыми контактам без
28
57
  * открытого диалога. Отправка НЕОБРАТИМА и не идемпотентна на стороне GetCourse — повтор создал
@@ -42,6 +71,7 @@ export const getcourseColdWelcomeTools = [
42
71
  contacts: z.array(contactSchema).min(1).max(MAX_CONTACTS).optional(),
43
72
  mailing_variant_id: uuidSchema.optional(),
44
73
  channels: z.array(getcourseTransportEnum).optional(),
74
+ channels_mode: coldWelcomeChannelsModeEnum.optional(),
45
75
  })
46
76
  .strict()
47
77
  .refine((input) => (input.created_after !== undefined) !== (input.contacts !== undefined), {
@@ -56,11 +86,14 @@ export const getcourseColdWelcomeTools = [
56
86
  contacts: toContacts(input.contacts),
57
87
  mailingVariantId: input.mailing_variant_id,
58
88
  channels: input.channels,
89
+ channelsMode: input.channels_mode,
59
90
  }),
60
91
  }),
61
92
  enhanceResponse: (response) => withInstructions(response, [
62
93
  'totalContacts — сколько ЕЩЁ может получить первое сообщение; alreadyWelcomed — сколько уже получали его раньше (оно одноразово НА КОНТАКТ, не на рассылку).',
63
94
  '⚠️⚠️ Если задано ограничение каналов, ФАКТИЧЕСКИЙ охват = totalContacts − narrowedOutByChannels (доказанно отсечённые каналами). Называй пользователю именно эту разность: сырой totalContacts завысит обещание, а отправку не отозвать. channelsUnknown вычитать НЕ надо — у этих контактов привязки просто ещё не проверены, при отправке их спросят у школы живьём.',
95
+ '⚠️⚠️ channels_mode решает СМЫСЛ списка. RESTRICT (по умолчанию) — фильтр поверх автоматического выбора: он умеет только сужать, поэтому Email/WhatsApp/SMS в нём не уедут НИКОГДА (их нет в bot_link школы). Просят «написать ещё и на почту» / «достать тех, у кого нет мессенджера» — это channels_mode=ADD, иначе рассылка молча уйдёт без писем.',
96
+ 'channelsNotAllowedByPlatform — выбранные каналы, не включённые на площадке: они не уедут ни в каком режиме. Назови их пользователю, это чинится в настройках площадки, а не повтором запуска.',
64
97
  'Для аудитории по файлу дополнительно приходят alreadyInDialog и notInBase: контакты предсписка обязаны быть импортированы (Шаг 1) до запуска.',
65
98
  'Всегда показывай пользователю фактический охват и alreadyWelcomed ДО старта: отправку нельзя отозвать.',
66
99
  'Часть контактов отсеется уже в прогоне (мьют бота, нет даты эфира, недостижимость, переменные без значения) — разбивка по причинам будет в outcomes задачи.',
@@ -84,7 +117,9 @@ export const getcourseColdWelcomeTools = [
84
117
  segment: z.string().max(LABEL_MAX_LENGTH).optional(),
85
118
  product_code: z.string().max(LABEL_MAX_LENGTH).optional(),
86
119
  funnel: z.string().max(LABEL_MAX_LENGTH).optional(),
120
+ cohort_label: z.string().max(LABEL_MAX_LENGTH).optional(),
87
121
  channels: z.array(getcourseTransportEnum).optional(),
122
+ channels_mode: coldWelcomeChannelsModeEnum.optional(),
88
123
  explicit_confirmation: z.literal(true),
89
124
  })
90
125
  .strict()
@@ -107,17 +142,21 @@ export const getcourseColdWelcomeTools = [
107
142
  segment: input.segment,
108
143
  productCode: input.product_code,
109
144
  funnel: input.funnel,
145
+ cohortLabel: input.cohort_label,
110
146
  channels: input.channels,
147
+ channelsMode: input.channels_mode,
111
148
  }),
112
149
  }),
113
150
  enhanceResponse: (response) => withInstructions(response, [
114
151
  'Рассылка запущена фоном: прогресс и разбивка исходов — в задаче импорта (jobId).',
152
+ 'cohort_label — имя ЭТОГО запуска в «Аналитике рассылок». Задавай его на каждом запуске: без него разрез «по запускам» различает их только датой, а два запуска одной рассылки за день сольются в одну подпись.',
115
153
  'Текст заморожен снимком: правка рассылки НЕ меняет идущий запуск.',
116
154
  'Если у рассылки заданы message_text_by_segment и segment совпал — уедет ТЕКСТ СЕГМЕНТА. Назови пользователю, какой текст выбран, ДО подтверждения: отправку не отозвать.',
117
155
  '⚠️ Метка segment аудиторию НЕ отбирает. Поэтому посегментный текст разрешён только с contacts (файл): с created_after он ушёл бы ВСЕЙ когорте после даты и выжег бы отметку приветствия — второй сегмент получил бы нулевой охват. Такой запуск отвергается 400.',
118
156
  'Повторный запуск по той же границе безопасен: уже получившие первое сообщение не получат второе.',
119
157
  'platform_id и deal_fields можно опустить, если они заданы в рассылке как «по умолчанию» — сервер подставит их сам.',
120
158
  'Пустой объект deal_fields — НЕ то же, что отсутствие ключа: он означает «на этом запуске без полей» и гасит дефолты рассылки.',
159
+ '⚠️⚠️ channels_mode едет ПАРОЙ с channels: перебил список на запуске — режим тоже берётся с запуска и по умолчанию равен RESTRICT. То есть запуск с channels, но без channels_mode, ОТМЕНЯЕТ аддитивный режим рассылки. Передавай оба поля вместе.',
121
160
  'deal_fields штампуются ПОСЛЕ успешной отправки (пин из строки файла, иначе закреплённая сделка контакта); их отказ не отменяет отправку и виден счётчиком dealStamp.',
122
161
  'Контакт, у которого переменная текста осталась без значения, ПРОПУСКАЕТСЯ (outcome SKIPPED_UNRESOLVED_VARS) — сырые {скобки} живому человеку не уедут. Отметка приветствия при этом не сгорает: проставьте значение или перезапись у агента и запустите повторно, контакт доберётся.',
123
162
  ]),
@@ -133,12 +172,14 @@ export const getcourseColdWelcomeTools = [
133
172
  message: z.string().trim().min(1).max(MESSAGE_MAX_LENGTH).optional(),
134
173
  mailing_variant_id: uuidSchema.optional(),
135
174
  channels: z.array(getcourseTransportEnum).optional(),
175
+ channels_mode: coldWelcomeChannelsModeEnum.optional(),
136
176
  segments: z
137
177
  .array(z
138
178
  .object({
139
179
  segment: z.string().max(LABEL_MAX_LENGTH).optional(),
140
180
  product_code: z.string().max(LABEL_MAX_LENGTH).optional(),
141
181
  funnel: z.string().max(LABEL_MAX_LENGTH).optional(),
182
+ cohort_label: z.string().max(LABEL_MAX_LENGTH).optional(),
142
183
  deal_fields: z
143
184
  .record(z
144
185
  .string()
@@ -163,10 +204,12 @@ export const getcourseColdWelcomeTools = [
163
204
  message: input.message,
164
205
  mailingVariantId: input.mailing_variant_id,
165
206
  channels: input.channels,
207
+ channelsMode: input.channels_mode,
166
208
  segments: input.segments.map((segment) => compactObject({
167
209
  segment: segment.segment,
168
210
  productCode: segment.product_code,
169
211
  funnel: segment.funnel,
212
+ cohortLabel: segment.cohort_label,
170
213
  dealFields: segment.deal_fields,
171
214
  contacts: toContacts(segment.contacts),
172
215
  })),
@@ -174,6 +217,7 @@ export const getcourseColdWelcomeTools = [
174
217
  }),
175
218
  enhanceResponse: (response) => withInstructions(response, [
176
219
  'Пакет: несколько сегментов одним вызовом, у каждого свой список контактов, свои метки и свои поля сделки.',
220
+ 'cohort_label задаётся ПОСЕГМЕНТНО: каждый сегмент — отдельный запуск со своей задачей и когортой, и общая на пакет подпись схлопнула бы их в отчёте в одну корзину.',
177
221
  'Сегменты идут ПО ОЧЕРЕДИ — задачи импорта не могут выполняться параллельно. Прогресс смотри через besales_getcourse_cold_welcome_batch_status по batchId.',
178
222
  'Весь пакет проверяется ДО первой отправки: сегмент без текста ИЛИ текст с переменными, которые не подставляются его контактам, отменяет пакет целиком, пока никому ничего не ушло. В ошибке названы сами переменные, контакт проверки и агент — чинить надо значение переменной или перезапись у этого агента.',
179
223
  '⚠️ Проверка переменных на плане ВЫБОРОЧНАЯ (несколько контактов сегмента) и не гарантирует, что подставится всем: агента выбирает роутер по контакту. Полноту держит гейт на самой отправке — контакт с сырыми скобками пропускается с outcome SKIPPED_UNRESOLVED_VARS.',
@@ -250,5 +294,36 @@ export const getcourseColdWelcomeTools = [
250
294
  'Останавливает ОСТАТОК когорты в пределах ~10 секунд; уже отправленное не отзывается.',
251
295
  ]),
252
296
  }),
297
+ defineTool({
298
+ name: 'besales_getcourse_contacts_import',
299
+ requiredFields: ['platform_id', 'contacts'],
300
+ defaultWorkspaceId: true,
301
+ schema: z
302
+ .object({
303
+ workspace_id: uuidSchema.optional(),
304
+ platform_id: uuidSchema,
305
+ contacts: z.array(importContactSchema).min(1).max(MAX_CONTACTS),
306
+ check_messenger_presence: z.boolean().optional(),
307
+ })
308
+ .strict(),
309
+ createRequest: (input) => ({
310
+ method: 'POST',
311
+ path: `/workspaces/${input.workspace_id}/chat-users/import/getcourse-contacts`,
312
+ body: compactObject({
313
+ platformId: input.platform_id,
314
+ contacts: input.contacts,
315
+ checkMessengerPresence: input.check_messenger_presence,
316
+ }),
317
+ }),
318
+ enhanceResponse: (response) => withInstructions(response, [
319
+ 'НИЧЕГО НЕ ОТПРАВЛЯЕТ: заводит или обновляет контакты в базе платформы, чтобы по ним можно было запускать «Нашу отправку». Матчинг существующих — по contact_id (getcourse_user_id).',
320
+ 'Импорт нужен ровно тогда, когда preview показал notInBase > 0: отправке нужен ChatUser, иначе контакт получает исход SKIPPED_NOT_IN_BASE и остаётся без сообщения.',
321
+ 'Идёт фоном — вернувшийся jobId опрашивай через задачу импорта; отвечает сразу, а не по завершении.',
322
+ '⚠️ Гейт «один активный импорт на воркспейс» общий с волнами и пакетами: 409 означает «идёт другой импорт», а не сбой — дождись его и повтори.',
323
+ '⚠️ first_name прямо влияет на текст: обращение подставляется системным {greeting}, и у контакта без имени обращения не будет вовсе. Передавай имя, если оно есть в источнике.',
324
+ 'check_messenger_presence по умолчанию включён и отсеивает контакты без Telegram/MAX/VK. Это API-вызов на КАЖДЫЙ контакт, поэтому на тысячах строк импорт идёт заметно дольше.',
325
+ 'Повторный импорт того же списка безопасен: существующий контакт обновляется, второй не создаётся.',
326
+ ]),
327
+ }),
253
328
  ];
254
329
  //# sourceMappingURL=getcourse-cold-welcome.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getcourse-cold-welcome.js","sourceRoot":"","sources":["../../../src/tools/definitions/getcourse-cold-welcome.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getcourse-cold-welcome.js","sourceRoot":"","sources":["../../../src/tools/definitions/getcourse-cold-welcome.ts"],"names":[],"mappings":"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"}
@@ -31,4 +31,9 @@ export declare const linkTrackingTools: (import("./shared.js").ToolDefinition<{
31
31
  days?: number | undefined;
32
32
  page?: number | undefined;
33
33
  page_size?: number | undefined;
34
+ }> | import("./shared.js").ToolDefinition<{
35
+ workspace_id?: string | undefined;
36
+ }> | import("./shared.js").ToolDefinition<{
37
+ domain: string | null;
38
+ workspace_id?: string | undefined;
34
39
  }>)[];
@@ -35,6 +35,39 @@ const targetUrlSchema = z
35
35
  }
36
36
  }, { message: 'target_url должен быть абсолютным http(s)-адресом' });
37
37
  const daysSchema = z.number().int().min(1).max(ANALYTICS_MAX_DAYS);
38
+ /** Потолок длины хоста по DNS — паритет с `LINK_DOMAIN_HOST_MAX_LENGTH`. */
39
+ const DOMAIN_HOST_MAX_LENGTH = 253;
40
+ /** Имя перед зоной: 3–24 символа, латиница и цифры, дефис внутри — паритет с `LINK_DOMAIN_LABEL_PATTERN`. */
41
+ const DOMAIN_LABEL_PATTERN = /^[a-z0-9][a-z0-9-]{1,22}[a-z0-9]$/;
42
+ /** Паритет с `LINK_DOMAIN_PUNYCODE_PREFIX`. */
43
+ const DOMAIN_PUNYCODE_PREFIX = 'xn--';
44
+ /**
45
+ * Хост коротких ссылок воркспейса.
46
+ *
47
+ * Проверяется только ФОРМА: голый хост без схемы и пути, имя по правилам DNS, не punycode.
48
+ *
49
+ * ⚠️ Список ЗОН и список занятых имён здесь сознательно НЕ дублируются — они приходят с
50
+ * сервера (`besales_link_domain_get`) и меняются вместе с инфраструктурой. Своя копия
51
+ * разъехалась бы с тем, что реально поднято, и агент либо предлагал бы зону, которой нет,
52
+ * либо отвергал бы живую. Форму же продублировать безопасно: она структурная.
53
+ */
54
+ const linkDomainSchema = z
55
+ .string()
56
+ .trim()
57
+ .max(DOMAIN_HOST_MAX_LENGTH)
58
+ .refine((value) => {
59
+ const host = value.toLowerCase().replace(/\.$/, '');
60
+ // Голый хост: ни схемы, ни пути, ни порта, ни учётных данных.
61
+ if (!/^[a-z0-9.-]+$/.test(host))
62
+ return false;
63
+ const [label, ...rest] = host.split('.');
64
+ if (rest.length < 1)
65
+ return false;
66
+ return DOMAIN_LABEL_PATTERN.test(label) && !label.startsWith(DOMAIN_PUNYCODE_PREFIX);
67
+ }, {
68
+ message: 'domain: хост вида <имя>.<зона> без схемы и пути; имя — 3–24 символа латиницей, ' +
69
+ 'цифры и дефис внутри, не начинается с xn--. Доступные зоны — в besales_link_domain_get',
70
+ });
38
71
  export const linkTrackingTools = [
39
72
  defineTool({
40
73
  name: 'besales_tracked_link_list',
@@ -196,5 +229,50 @@ export const linkTrackingTools = [
196
229
  'Для следующей страницы увеличивай page; максимальный page_size — 200.',
197
230
  ]),
198
231
  }),
232
+ defineTool({
233
+ name: 'besales_link_domain_get',
234
+ requiredFields: [],
235
+ defaultWorkspaceId: true,
236
+ schema: z
237
+ .object({
238
+ workspace_id: uuidSchema.optional(),
239
+ })
240
+ .strict(),
241
+ createRequest: (input) => ({
242
+ method: 'GET',
243
+ path: `/workspaces/${input.workspace_id}/link-tracking-domain`,
244
+ }),
245
+ enhanceResponse: (response) => withInstructions(response, [
246
+ 'domain — хост, с которого уходят короткие ссылки этого воркспейса; null означает, что используется общий домен платформы (он же defaultBaseUrl).',
247
+ 'zones — зоны, доступные для назначения. ПУСТОЙ список означает, что выбор домена на платформе не настроен: назначить нельзя, и это не ошибка запроса. Зона появляется только после того, как для неё подняты wildcard-запись DNS и wildcard-сертификат.',
248
+ '⚠️ Смена домена влияет ТОЛЬКО на новые ссылки: короткий адрес собирается в момент отправки и вшивается в сообщение навсегда. Уже разосланные ссылки продолжают открываться на прежнем хосте.',
249
+ '⚠️ Адрес staticUrl, который уже вставлен куда-либо руками (промпт агента, шаблон, подпись), при смене домена НЕ переписывается — он продолжит содержать прежнее имя. После смены перечитай каталог besales_tracked_link_list и перевставь такие адреса.',
250
+ ]),
251
+ }),
252
+ defineTool({
253
+ name: 'besales_link_domain_set',
254
+ requiredFields: ['domain'],
255
+ defaultWorkspaceId: true,
256
+ schema: z
257
+ .object({
258
+ workspace_id: uuidSchema.optional(),
259
+ // Обязательное И nullable одновременно: null — единственный явный способ вернуться на
260
+ // общий домен, а пропуск поля обязан быть ошибкой, а не молчаливым сбросом.
261
+ domain: linkDomainSchema.nullable(),
262
+ })
263
+ .strict(),
264
+ createRequest: (input) => ({
265
+ method: 'PUT',
266
+ path: `/workspaces/${input.workspace_id}/link-tracking-domain`,
267
+ body: { domain: input.domain },
268
+ }),
269
+ enhanceResponse: (response) => withInstructions(response, [
270
+ 'Домен назначен. Он влияет только на НОВЫЕ ссылки — уже отправленные продолжают работать на прежнем адресе, и это обязательное свойство: короткий адрес вшит в разосланные сообщения.',
271
+ '⚠️ Выбранное имя закрепляется за воркспейсом НАВСЕГДА. Сброс (domain=null) возвращает воркспейс на общий домен, но имя не освобождает: отдать его другому клиенту нельзя, иначе письма прежнего владельца открывались бы на чужом бренде. Вернуться на своё прежнее имя можно.',
272
+ '400 означает, что домен не прошёл правила: зона не из списка zones, имя не по формату (латиница и цифры, дефис внутри, 3–24 символа, ровно один уровень под зоной), имя начинается с xn--, либо имя занято служебными адресами платформы. Перечитай besales_link_domain_get и возьми зону оттуда.',
273
+ '409 означает, что хост занят ДРУГИМ воркспейсом — в том числе тем, который его когда-то освободил. Выбери другое имя, повторять запрос бессмысленно.',
274
+ '⚠️ Уже вставленные вручную адреса staticUrl не переписываются: после смены домена перевставь их из besales_tracked_link_list.',
275
+ ]),
276
+ }),
199
277
  ];
200
278
  //# sourceMappingURL=link-tracking.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"link-tracking.js","sourceRoot":"","sources":["../../../src/tools/definitions/link-tracking.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"link-tracking.js","sourceRoot":"","sources":["../../../src/tools/definitions/link-tracking.ts"],"names":[],"mappings":"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"}
@@ -699,6 +699,18 @@ export declare const platformBitrix24BotSettingsSchema: z.ZodObject<{
699
699
  open_line_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
700
700
  ignore_crm_stage_gate: z.ZodOptional<z.ZodBoolean>;
701
701
  }, z.core.$strict>;
702
+ /**
703
+ * Как применять «Каналы первого сообщения» к КОНТАКТУ.
704
+ *
705
+ * ⚠️⚠️ `RESTRICT` умеет только СУЖАТЬ: он фильтрует уже посчитанный автоматический выбор, а
706
+ * Email/WhatsApp/SMS в него не попадают ни у кого (`bot_link` школы отдаёт только vk/telegram/max).
707
+ * То есть список этих каналов в режиме `RESTRICT` — молчаливый no-op, и модель обязана предлагать
708
+ * `ADD`, когда пользователь просит «отправить ещё и на почту».
709
+ */
710
+ export declare const coldWelcomeChannelsModeEnum: z.ZodEnum<{
711
+ RESTRICT: "RESTRICT";
712
+ ADD: "ADD";
713
+ }>;
702
714
  export declare const getcourseTransportEnum: z.ZodEnum<{
703
715
  Site: "Site";
704
716
  Email: "Email";
@@ -526,6 +526,15 @@ export const platformBitrix24BotSettingsSchema = z
526
526
  ignore_crm_stage_gate: z.boolean().optional(),
527
527
  })
528
528
  .strict();
529
+ /**
530
+ * Как применять «Каналы первого сообщения» к КОНТАКТУ.
531
+ *
532
+ * ⚠️⚠️ `RESTRICT` умеет только СУЖАТЬ: он фильтрует уже посчитанный автоматический выбор, а
533
+ * Email/WhatsApp/SMS в него не попадают ни у кого (`bot_link` школы отдаёт только vk/telegram/max).
534
+ * То есть список этих каналов в режиме `RESTRICT` — молчаливый no-op, и модель обязана предлагать
535
+ * `ADD`, когда пользователь просит «отправить ещё и на почту».
536
+ */
537
+ export const coldWelcomeChannelsModeEnum = z.enum(['RESTRICT', 'ADD']);
529
538
  export const getcourseTransportEnum = z.enum([
530
539
  'Site',
531
540
  'Email',