@besales/mcp 0.47.0 → 0.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/instructions/server-instructions.d.ts +1 -1
- package/dist/instructions/server-instructions.js +14 -6
- package/dist/instructions/server-instructions.js.map +1 -1
- package/dist/resources/workflows/compare-models.md +4 -2
- package/dist/schemas/mcp-tools.json +256 -32
- package/dist/tools/definitions/broadcast-analytics.js +7 -3
- package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
- package/dist/tools/definitions/broadcast-scheduler.d.ts +20 -4
- package/dist/tools/definitions/broadcast-scheduler.js +159 -43
- package/dist/tools/definitions/broadcast-scheduler.js.map +1 -1
- package/dist/tools/definitions/crm-platform.d.ts +2 -0
- package/dist/tools/definitions/crm-platform.js +26 -2
- package/dist/tools/definitions/crm-platform.js.map +1 -1
- package/dist/tools/definitions/follow-up.d.ts +1 -0
- package/dist/tools/definitions/follow-up.js +13 -3
- package/dist/tools/definitions/follow-up.js.map +1 -1
- package/dist/tools/definitions/getcourse-cold-welcome.d.ts +3 -0
- package/dist/tools/definitions/getcourse-cold-welcome.js +18 -4
- package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
- package/dist/tools/definitions/model-comparison.js +2 -2
- package/dist/tools/definitions/model-comparison.js.map +1 -1
- package/dist/tools/definitions/platform-setup.d.ts +18 -0
- package/dist/tools/definitions/platform-setup.js +11 -2
- package/dist/tools/definitions/platform-setup.js.map +1 -1
- package/dist/tools/definitions/shared.d.ts +42 -0
- package/dist/tools/definitions/shared.js +47 -0
- package/dist/tools/definitions/shared.js.map +1 -1
- package/dist/tools/definitions.d.ts +43 -4
- package/dist/tools/registry-mapping-cases-core.js +137 -15
- package/dist/tools/registry-mapping-cases-core.js.map +1 -1
- package/dist/types/api-contract.gen.d.ts +101 -6
- package/docs/agent-usage-guide.ru.md +5 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broadcast-analytics.js","sourceRoot":"","sources":["../../../src/tools/definitions/broadcast-analytics.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"broadcast-analytics.js","sourceRoot":"","sources":["../../../src/tools/definitions/broadcast-analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,8 +25,13 @@ export declare const broadcastSchedulerTools: (import("./shared.js").ToolDefinit
|
|
|
25
25
|
window_to_local?: string | undefined;
|
|
26
26
|
days_of_week?: number[] | undefined;
|
|
27
27
|
days_of_month?: number[] | undefined;
|
|
28
|
+
handoff_from_school_platforms?: boolean | undefined;
|
|
29
|
+
resend_segment_on_new_registration?: boolean | undefined;
|
|
30
|
+
resend_segment_pause_days?: number | undefined;
|
|
28
31
|
channels?: ("Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX")[] | undefined;
|
|
29
32
|
channels_mode?: "RESTRICT" | "ADD" | undefined;
|
|
33
|
+
guard_active_series?: "OFF" | "WARN" | "BLOCK" | null | undefined;
|
|
34
|
+
skip_after_segment_ids?: string[] | undefined;
|
|
30
35
|
is_enabled?: boolean | undefined;
|
|
31
36
|
}> | import("./shared.js").ToolDefinition<{
|
|
32
37
|
segment_id: string;
|
|
@@ -47,8 +52,13 @@ export declare const broadcastSchedulerTools: (import("./shared.js").ToolDefinit
|
|
|
47
52
|
window_to_local?: string | undefined;
|
|
48
53
|
days_of_week?: number[] | undefined;
|
|
49
54
|
days_of_month?: number[] | undefined;
|
|
55
|
+
handoff_from_school_platforms?: boolean | undefined;
|
|
56
|
+
resend_segment_on_new_registration?: boolean | undefined;
|
|
57
|
+
resend_segment_pause_days?: number | undefined;
|
|
50
58
|
channels?: ("Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX")[] | undefined;
|
|
51
59
|
channels_mode?: "RESTRICT" | "ADD" | undefined;
|
|
60
|
+
guard_active_series?: "OFF" | "WARN" | "BLOCK" | null | undefined;
|
|
61
|
+
skip_after_segment_ids?: string[] | undefined;
|
|
52
62
|
is_enabled?: boolean | undefined;
|
|
53
63
|
}> | import("./shared.js").ToolDefinition<{
|
|
54
64
|
schedule_id: string;
|
|
@@ -60,15 +70,21 @@ export declare const broadcastSchedulerTools: (import("./shared.js").ToolDefinit
|
|
|
60
70
|
limit?: number | undefined;
|
|
61
71
|
}> | import("./shared.js").ToolDefinition<{
|
|
62
72
|
workspace_id?: string | undefined;
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
73
|
+
platform_id?: string | undefined;
|
|
74
|
+
window_days?: number | undefined;
|
|
75
|
+
funnels?: string[] | "all" | undefined;
|
|
76
|
+
product_codes?: string[] | "all" | undefined;
|
|
77
|
+
channels?: ("Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX")[] | undefined;
|
|
78
|
+
cooldown_days?: number | undefined;
|
|
79
|
+
local_day?: string | undefined;
|
|
80
|
+
force?: boolean | undefined;
|
|
66
81
|
}> | import("./shared.js").ToolDefinition<{
|
|
67
82
|
segment_id: string;
|
|
68
83
|
facets: {
|
|
69
84
|
application: "CANCELLED" | "ANY" | "NONE";
|
|
70
85
|
payment: "ANY" | "NOT_IN_FUNNEL" | "NOT_ANYWHERE";
|
|
71
86
|
attended?: "ANY" | "YES" | "NO" | undefined;
|
|
87
|
+
attendedFirstSession?: "ANY" | "YES" | "NO" | undefined;
|
|
72
88
|
activeSecondsMin?: number | undefined;
|
|
73
89
|
activeSecondsMax?: number | undefined;
|
|
74
90
|
webinarDayMin?: number | undefined;
|
|
@@ -81,7 +97,7 @@ export declare const broadcastSchedulerTools: (import("./shared.js").ToolDefinit
|
|
|
81
97
|
} | undefined;
|
|
82
98
|
untouchedOnly?: boolean | undefined;
|
|
83
99
|
};
|
|
84
|
-
freshness_anchor: "REGISTRATION" | "SERIES_END" | "SERIES_END_PLUS_WAIT" | "LAST_APPLICATION" | "PRELIST";
|
|
100
|
+
freshness_anchor: "REGISTRATION" | "SERIES_END" | "SERIES_END_PLUS_WAIT" | "FIRST_SESSION_END_PLUS_WAIT" | "LAST_APPLICATION" | "PRELIST";
|
|
85
101
|
workspace_id?: string | undefined;
|
|
86
102
|
wait_after_series_end_hours?: number | undefined;
|
|
87
103
|
priority?: number | undefined;
|
|
@@ -9,21 +9,41 @@ const DAILY_CAP_MAX = 5000;
|
|
|
9
9
|
*/
|
|
10
10
|
const FRESHNESS_DAYS_MAX = 78;
|
|
11
11
|
const COOLDOWN_DAYS_MAX = 365;
|
|
12
|
+
/** Потолок паузы повтора сегмента — серверный `SCHEDULE_RESEND_PAUSE_DAYS_MAX`. */
|
|
13
|
+
const RESEND_PAUSE_DAYS_MAX = 365;
|
|
14
|
+
/** Потолок списка «не писать после сегментов» — серверный `SCHEDULE_SKIP_AFTER_SEGMENTS_MAX`. */
|
|
15
|
+
const SKIP_AFTER_SEGMENTS_MAX = 20;
|
|
12
16
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* период на две тысячи строк со счётчиками — это мегабайты текста. Инструмент заведён из-за
|
|
17
|
-
* таймаута предпросмотра; без потолка он упёрся бы в предел того же рода с другой стороны.
|
|
17
|
+
* Окно свежести строк без расписания в «Пуле сегодня» — паритет с `POOL_TODAY_WINDOW_DAYS_MAX`
|
|
18
|
+
* бэкенда: окно регистраций строки (окно + 14 суток запаса) обязано уложиться в общую выкачку
|
|
19
|
+
* (30 суток). Больше сервер отвергнет 400.
|
|
18
20
|
*/
|
|
19
|
-
const
|
|
21
|
+
const POOL_TODAY_WINDOW_DAYS_MAX = 16;
|
|
20
22
|
const WAIT_HOURS_MAX = 720;
|
|
21
23
|
/** Локальная дата площадки — та же форма, что у бэкенда. */
|
|
22
24
|
const LOCAL_DATE_RE = /^\d{4}-\d{2}-\d{2}$/u;
|
|
25
|
+
/**
|
|
26
|
+
* Списки фильтров — ОДНА форма у расписания и у «Пула сегодня»: `'all'` либо список кодов.
|
|
27
|
+
*
|
|
28
|
+
* ⚠️ Границы повторяют DTO бэкенда (`POOL_TODAY_FUNNELS_MAX`, `POOL_TODAY_PRODUCTS_MAX`,
|
|
29
|
+
* `POOL_TODAY_FILTER_VALUE_MAX_LENGTH`): разойдясь, схема пропускала бы то, что сервер отвергает
|
|
30
|
+
* 400-м, и модель узнавала бы о границе из ошибки.
|
|
31
|
+
*/
|
|
32
|
+
const FILTER_VALUE_MAX_LENGTH = 64;
|
|
33
|
+
const FUNNELS_MAX = 100;
|
|
34
|
+
const PRODUCTS_MAX = 50;
|
|
35
|
+
const filterListSchema = (max) => z.union([
|
|
36
|
+
z.literal('all'),
|
|
37
|
+
z.array(z.string().trim().min(1).max(FILTER_VALUE_MAX_LENGTH)).max(max),
|
|
38
|
+
]);
|
|
23
39
|
const orderSchema = z.enum(['FRESH_FIRST', 'OLD_FIRST']);
|
|
24
40
|
const anchorSchema = z.enum([
|
|
25
41
|
'SERIES_END',
|
|
26
42
|
'SERIES_END_PLUS_WAIT',
|
|
43
|
+
// Конец ПЕРВОГО эфира серии плюс ожидание — для сегментов, которые пишут пропустившему первый
|
|
44
|
+
// эфир, ПОКА СЕРИЯ ИДЁТ. Требует фасета attendedFirstSession и перекрытия предохранителя серии
|
|
45
|
+
// на расписании (guard_active_series), иначе отправку остановит правило площадки.
|
|
46
|
+
'FIRST_SESSION_END_PLUS_WAIT',
|
|
27
47
|
'LAST_APPLICATION',
|
|
28
48
|
'REGISTRATION',
|
|
29
49
|
// ⚠️ Схема СТРОГАЯ: значение, объявленное на сервере и забытое здесь, отвергается ещё до
|
|
@@ -57,10 +77,8 @@ const scheduleShape = {
|
|
|
57
77
|
mailing_variant_id: uuidSchema,
|
|
58
78
|
platform_id: uuidSchema,
|
|
59
79
|
mechanism: z.literal('cold_welcome'),
|
|
60
|
-
funnels:
|
|
61
|
-
product_codes:
|
|
62
|
-
.union([z.literal('all'), z.array(z.string().trim().min(1).max(64)).max(50)])
|
|
63
|
-
.optional(),
|
|
80
|
+
funnels: filterListSchema(FUNNELS_MAX).optional(),
|
|
81
|
+
product_codes: filterListSchema(PRODUCTS_MAX).optional(),
|
|
64
82
|
freshness_days: z.number().int().min(1).max(FRESHNESS_DAYS_MAX),
|
|
65
83
|
window_mode: z.enum(['ROLLING', 'FIXED']).optional(),
|
|
66
84
|
// ⚠️ ЛОКАЛЬНАЯ дата площадки, а не момент: момент сдвинул бы границу на смещение зоны.
|
|
@@ -79,6 +97,9 @@ const scheduleShape = {
|
|
|
79
97
|
daily_cap: z.number().int().min(1).max(DAILY_CAP_MAX),
|
|
80
98
|
selection_order: orderSchema,
|
|
81
99
|
cooldown_days: z.number().int().min(0).max(COOLDOWN_DAYS_MAX),
|
|
100
|
+
handoff_from_school_platforms: z.boolean().optional().describe('ПЕРЕДАЧА: забирать людей с ДРУГИХ площадок GetCourse той же школы В ДОПОЛНЕНИЕ к своим. Своим людям площадки и людям без карточек расписание пишет как обычно, а людей, чья карточка живёт на других площадках школы (и тех, кого прошлая попытка уже перевезла, но сообщение не ушло), перед отправкой переносит сюда — с перепином на заказ сегмента и остановкой цепочек прежней площадки. Поэтому флаг включают прямо на основной авторассылке сегмента, второе расписание на тот же сегмент не нужно (так с 15.09.2026; раньше флаг заменял пул, и свои люди площадки текста не получали). Площадки-источники считает сам отбор («вся школа минус своя»), поэтому новая площадка школы подхватывается без правки расписания. Включайте на площадке, КУДА переносить людей (обычно квал-площадка): на площадке серии флаг заберёт к ней людей квал-площадки. Флаг нужен на ВСЕХ пересекающихся старших сегментах площадки: претензия старшего сегмента о флаге не знает, и человек с соседней площадки иначе не получит ничего. Требует сегмента-ПРОДОЛЖЕНИЯ (снят «только нетронутым», без правила повтора): у человека с соседней площадки право первого сообщения уже сожжено. Ещё требует заполненного домена школы у площадки расписания и хотя бы одной другой площадки GetCourse в школе. Выключено — передачи нет.'),
|
|
101
|
+
resend_segment_on_new_registration: z.boolean().optional().describe('ПОВТОР СЕГМЕНТА ПО НОВОЙ РЕГИСТРАЦИИ (с 16.09.2026). Включено — человеку, которому этим сегментом уже писали, расписание напишет снова, только если он зарегистрировался ПОСЛЕ нашей последней отправки этого сегмента и с неё прошла пауза resend_segment_pause_days; продукт регистрации может быть любым. Выключено — сегмент человеку не повторяется никогда (причина alreadySentSegment). Действует только у сегмента-ПРОДОЛЖЕНИЯ без правила повтора: у сегмента «только нетронутым» второе сообщение держит право первого касания (alreadyGreeted). Не передано — у нового расписания включено, у существующего остаётся как было.'),
|
|
102
|
+
resend_segment_pause_days: z.number().int().min(0).max(RESEND_PAUSE_DAYS_MAX).optional().describe('Пауза повтора сегмента: сутки по 24 часа от нашей последней отправки этого сегмента человеку. Пока не прошла — причина resendPause, человек вернётся в пул сам. Не передано — у нового расписания 3, у существующего остаётся как было. ⚠️ Меньше трёх суток повтор обычно не ускорит: разговор после нашей реплики закрывается тремя сутками тишины, и до тех пор человека держит причина dialogQuiet.'),
|
|
82
103
|
channels: z
|
|
83
104
|
// ⚠️ Канон транспортов, а не свободная строка: иначе про допустимые значения модель узнаёт
|
|
84
105
|
// из 400-й ошибки. Ровно этот дефект уже закрыт parity-тестом контракта для соседних тулов.
|
|
@@ -90,6 +111,16 @@ const scheduleShape = {
|
|
|
90
111
|
.enum(['RESTRICT', 'ADD'])
|
|
91
112
|
.optional()
|
|
92
113
|
.describe(`⚠️ УСТАРЕЛ и на поведение НЕ влияет (с 23.08.2026). Список channels значит «слать сюда», судьбу КАЖДОГО канала решает сервер: мессенджер уходит, только если школа подтвердила его наличие; SMS — только при известном телефоне; Email, WhatsApp, Viber, Сайт, Chatium — вслепую. Поле принимается ради обратной совместимости и игнорируется.`),
|
|
114
|
+
guard_active_series: z
|
|
115
|
+
.enum(['OFF', 'WARN', 'BLOCK'])
|
|
116
|
+
.nullable()
|
|
117
|
+
.optional()
|
|
118
|
+
.describe('Перекрытие предохранителя «идёт вебинарная серия» ДЛЯ ЭТОГО расписания. Не передано — у существующего остаётся как было; null — вернуть под настройку площадки. OFF — расписание пишет и во время серии человека; WARN — причина пишется в аудит, отправка идёт; BLOCK — отправка останавливается. Нужно сегментам, которые пишут внутрь серии ПО ЗАМЫСЛУ (например «пропустил первый эфир», якорь FIRST_SESSION_END_PLUS_WAIT): у них серия идёт по определению, а площадочный переключатель один на ВСЕ расписания площадки и ослабил бы защиту у postweb*, prelist, closed-app и cta разом. Перекрывается только правило серии: заявка и оплата остаются площадочными.'),
|
|
119
|
+
skip_after_segment_ids: z
|
|
120
|
+
.array(uuidSchema)
|
|
121
|
+
.max(SKIP_AFTER_SEGMENTS_MAX)
|
|
122
|
+
.optional()
|
|
123
|
+
.describe('НЕ ПИСАТЬ ПОСЛЕ СЕГМЕНТОВ (с 22.09.2026): id сегментов справочника (segment.id из besales_broadcast_schedule_list). Человеку, которому текст любого из них ушёл НЕ РАНЬШЕ его регистрации — той, по которой он попал в пул, — это расписание не пишет (причина skipAfterSegment); новая регистрация после того касания открывает человека снова. Сценарий: у расписания reg-no-show указать сегмент reg-no-show-day1 — получившему «пропустил первый эфир» обычное «не смогли прийти» по той же серии не уйдёт, остальным уйдёт. Не передано — у существующего остаётся как было; [] — снять правило. Сам сегмент расписания и чужие id сервер отвергает. Именно id, а не имена: имя сегмента переименовывают.'),
|
|
93
124
|
is_enabled: z.boolean().optional(),
|
|
94
125
|
};
|
|
95
126
|
/** `all` — это «фильтра нет», то есть ПУСТОЙ список на стороне API. */
|
|
@@ -115,11 +146,18 @@ const toScheduleBody = (input) => compactObject({
|
|
|
115
146
|
dailyCap: input.daily_cap,
|
|
116
147
|
selectionOrder: input.selection_order,
|
|
117
148
|
cooldownDays: input.cooldown_days,
|
|
149
|
+
handoffFromSchoolPlatforms: input.handoff_from_school_platforms,
|
|
150
|
+
resendSegmentOnNewRegistration: input.resend_segment_on_new_registration,
|
|
151
|
+
resendSegmentPauseDays: input.resend_segment_pause_days,
|
|
118
152
|
channels: input.channels,
|
|
119
153
|
// ⚠️ Режим передаётся ТОЛЬКО если его задал вызывающий: сам он на поведение не влияет, но
|
|
120
154
|
// подставлять сюда `RESTRICT` значит записать в строку расписания решение, которого никто
|
|
121
155
|
// не принимал, — а прочитано оно будет как действующая настройка.
|
|
122
156
|
channelsMode: input.channels_mode,
|
|
157
|
+
// ⚠️ `null` проходит намеренно (`compactObject` режет только `undefined`): им снимают
|
|
158
|
+
// перекрытие, и «не передал» обязано отличаться от «верни под площадку».
|
|
159
|
+
guardActiveSeries: input.guard_active_series,
|
|
160
|
+
skipAfterSegmentIds: input.skip_after_segment_ids,
|
|
123
161
|
isEnabled: input.is_enabled,
|
|
124
162
|
});
|
|
125
163
|
/**
|
|
@@ -168,12 +206,26 @@ export const broadcastSchedulerTools = [
|
|
|
168
206
|
}),
|
|
169
207
|
enhanceResponse: (response) => withInstructions(response, [
|
|
170
208
|
'Ничего не отправляет и не пишет: считает ТЕМ ЖЕ путём, что и крон — тот же источник фактов, тот же компилятор правила, те же исключения.',
|
|
171
|
-
'⚠️ Показывай пользователю excludedBy числами. alreadySentSegment — этим сегментом уже
|
|
209
|
+
'⚠️ Показывай пользователю excludedBy числами. alreadySentSegment — этим сегментом уже слали (при включённом resend_segment_on_new_registration — и регистрации новее нашей отправки нет); alreadyGreeted — человек уже получал «Первое сообщение» (одно на контакт навсегда, любым сегментом; прежнее имя ключа coldWelcomeClaimed приходит от старого бэкенда в окне выкатки); activeEpisode — человека уже ведёт автоприём регистраций (приветствие должны и не отдали, либо подготовлен повторный вход на новый эфир); touchClaimed — касание этого сегмента уже занято в журнале, либо тот же текст ушёл человеку другим сегментом меньше трёх суток назад (с 16.09.2026 другой сегмент тем же шаблоном можно, но после трёх суток тишины); журнал подач этого расписания (с 16.09.2026 тремя причинами вместо journal): journalSubmitted — подача ушла, ещё идёт или касание занято, journalNoMessenger — прошлая подача закончилась «карточку не завели» или «каналами не достать» (пауза 7 суток), journalRetryPause — прошлая попытка не удалась, и пауза после неё ещё идёт; contactBlocked — бан, удалённая карточка или действующий мьют; contactWithManager — с человеком работает менеджер (операторский статус или передача диалога в отдел моложе трёх суток); прежние ключи journal и contactHeld приходят только от старого бэкенда в окне выкатки; cooldown — получал любую нашу рассылку в окне.',
|
|
172
210
|
'⚠️⚠️ productNotInList — у расписания задан список продуктов, а у этих людей продукт другой или не указан вовсе. Прежде этот отсев шёл МОЛЧА: строка выбрасывалась без счётчика, и часть пула исчезала без причины. Чинится списком продуктов в расписании.',
|
|
173
211
|
'⚠️⚠️ notReachable — ни один из ВЫБРАННЫХ каналов до человека не доходит, и это подтвердил ответ школы. Про невыбранные каналы число не говорит ничего. Чинится составом каналов расписания или рассылки, а не правилом сегмента: вердикт записывается вместе с набором каналов и перестаёт держать паузу, как только набор изменили.',
|
|
174
212
|
'⚠️⚠️ factsUnknown — НЕ отсев: эти люди в пуле. Число значит «школу про них ещё не спрашивали», и без него ноль в notReachable читается как «все достижимы». Доставки оно НЕ обещает: тот же прогон опрашивает школу перед подачей (по 300 за раз) и часть из них тогда отсеет — в отчёте прогона эти числа уже пересчитаны.',
|
|
175
213
|
'⚠️ Если notReachable равен размеру пула, сперва проверь площадку: когда НИ ОДИН выбранный канал ею не обслуживается, недостижимы будут все до единого, и чинится это в настройках площадки, а не в расписании. Предпросмотр в этом случае показывает отдельное предупреждение, а прогон закрывается своей причиной.', '⚠️ unverifiable — «нечем проверить», а НЕ «не подходит»: нет назначения серии, серия ещё идёт, нет длительности просмотра. Эти люди в рассылку не идут, и это правильно: отсутствие данных о явке не равно отсутствию человека на эфире.',
|
|
176
214
|
'⚠️⚠️ truncatedSeriesSkipped — ЕДИНСТВЕННАЯ источниковая причина, которую чинит сам оператор: выборка упёрлась в потолок строк, и запись о явке серии могла остаться за его границей, поэтому судить о ней нечем. Чинится окном расписания за минуту — сузить свежесть, список воронок или продуктов. До 10.09.2026 это число складывалось с unverifiable и читалось как жалоба на данные школы: не путай их снова.',
|
|
215
|
+
'⚠️⚠️ claimedByHigherPriority — НЕ отсев по данным, а приоритет: человек подходит и под сегмент с БОЛЬШИМ приоритетом, у которого на этой площадке включено расписание ТОГО ЖЕ механизма, он в его окне и фильтрах, и то расписание его возьмёт — или уже отправило ему свой текст, в том числе волной школы. Исключение одно: старшее пишет только нетронутым, а этому человеку мы уже писали ДРУГИМ сегментом — тогда он остаётся младшему. Если старшее этому человеку уже писало (с 16.09.2026): без регистрации новее той отправки он остаётся за старшим; при новой регистрации его забирает старшее, если само повторит сегмент (resend_segment_on_new_registration у сегмента-продолжения), а иначе он уходит младшему — только когда продукт младшего не совпадает ни с одной отправкой старшего (неизвестный продукт держит). Большое число — не поломка, а мера пересечения; меняется приоритетами сегментов. ⚠️ Число НЕ обещает, что человеку вообще что-то уйдёт: (1) потолок и день запуска старшего не проверяются — упрётся старшее в потолок, излишек ждёт следующего запуска, а при FRESH_FIRST самые старые из него выходят из окна ни с чем; (2) если текст старшего уже ушёл волной школы, подхватить человека может только расписание ПОВТОРА старшего сегмента, и его надо завести отдельно; (3) человек без живой карточки на этой площадке не получит ничего ни от кого — повтор старшего отсечёт его причиной repeatNoCard; (4) если у расписаний РАЗНЫЕ списки воронок, разведение неполно: воронки отсекаются на стороне источника фактов, и строк человека из чужой воронки в снимке нет вовсе — ставь пересекающимся сегментам одинаковые воронки.',
|
|
216
|
+
'⚠️⚠️ repeatNoCard — кандидат на ПОВТОР (прошлое касание годится), но живой карточки на ЭТОЙ площадке у человека нет: чаще всего волну школы записали на эту площадку, а карточка у него на соседней. Без карточки не проверить ответы и дожимы, а импорт карточку здесь не заведёт (обновит соседнюю), поэтому такие люди исключаются. Расписанием это не чинится.',
|
|
217
|
+
'⚠️⚠️ cardOnSiblingPlatform — человек живёт на СОСЕДНЕЙ площадке той же школы GetCourse, а на площадке расписания карточки у него нет. Импорт её сюда не перенесёт: он ищет человека по школе и обновляет ту карточку, что уже есть, — поэтому такие люди исключаются, а не уезжают в импорт (иначе каждую неделю они занимали бы слот дневного потолка и закрывались исходом NOT_IMPORTED). Расписанием не чинится: рассылать надо с той площадки, где человек живёт. Большое число у расписания на новой площадке — норма: люди школы живут на старой.',
|
|
218
|
+
'⚠️⚠️ noMessengerVerdict — школа УЖЕ отвечала, что привязанных мессенджеров у человека нет, и ответ ещё в силе. Карточки в базе у него нет, импорт её не заведёт, поэтому подача сожгла бы слот дневного потолка и слот импортов воркспейса и закрылась бы исходом NOT_IMPORTED на 7 суток. Срок доверия ответу задаётся у ПЛОЩАДКИ (getcourse_settings.reachability_ttl_days, по умолчанию 7 суток; 0 — спрашивать школу каждый раз). Срок считается СУТКАМИ площадки: ответ в силе, пока он новее полуночи дня запуска минус срок — поэтому «Пул сегодня» и любой запуск того же дня отвечают одинаково, как бы ни задержался отбор (с 17.09.2026); когда срок истечёт, человек снова уедет в импорт и школу спросят заново. Чинится почтой, но включать её надо В ДВУХ местах: в allowlist ПЛОЩАДКИ (getcourse_settings.available_transports) и в каналах рассылки/расписания. Гейт сужает каналы по allowlist площадки, поэтому Email только в рассылке ничего не меняет — и это верно: канал вне allowlist школа не отправит никогда.',
|
|
219
|
+
'⚠️⚠️ alreadyInDialog — с человеком идёт ЖИВОЙ разговор: он написал нам после нашей последней реплики (агента, оператора, дожима или процесса школы из импортированной истории). Сам такой разговор не закроется, пока ему не ответят. Это ЗЕРКАЛО отказа доставки SKIPPED_ALREADY_IN_DIALOG, поэтому место в дневном лимите он не занимает. С 16.09.2026 одинаково у сегмента «только нетронутым» и у продолжения. Расписанием не чинится.',
|
|
220
|
+
'⚠️⚠️ dialogQuiet — пауза тишины разговора, а не отсев навсегда: наша последняя реплика в чате моложе трёх суток (по 24 часа), человек после неё не писал. После трёх суток тишины разговор закрыт, и человек вернётся в пул сам — в том числе тот, кто когда-то нам отвечал (решение 16.09.2026). Доставка отказывает таким тем же SKIPPED_ALREADY_IN_DIALOG. «Пул сегодня» считает эту причину на момент запуска авторассылки.',
|
|
221
|
+
'⚠️⚠️ skipAfterSegment — человеку уже ушёл текст одного из сегментов списка skip_after_segment_ids расписания, и он не регистрировался после того касания (например, получил «пропустил первый эфир», и «не смогли прийти» по той же серии ему не уходит). Новая регистрация открывает его снова. У расписания без списка число всегда 0.',
|
|
222
|
+
'⚠️⚠️ resendPause — этим сегментом человеку уже писали, после нашей отправки он зарегистрировался снова, и расписание повторит ему сегмент (resend_segment_on_new_registration), но пауза resend_segment_pause_days ещё идёт. Вернётся в пул сам. При выключенном флаге такие люди стоят в alreadySentSegment.',
|
|
223
|
+
'resendOpened — НЕ отсев: сколько из selectedCount пустил повтор сегмента по новой регистрации (этим сегментом им уже писали, они зарегистрировались снова, и пауза прошла). Это мера самого правила: при выключенном флаге всегда 0.',
|
|
224
|
+
'⚠️⚠️ guardActiveSeries / guardPaid / guardActiveApplication / guardUnverified — ЗЕРКАЛО предохранителя школы (идёт вебинарная серия; guardPaid — купил продукт после регистрации, по которой человек попал в сегмент; guardActiveApplication — после этой регистрации есть действующая заявка на продукт, с человеком работает менеджер; заявки и оплаты до этой регистрации не держат; оплата и заявка сразу — guardPaid; прежний ключ guardActiveDeal приходит только от старого бэкенда; не смог проверить — нет в данных школы или продукт оплаты не определён). Отбор спрашивает те же правила площадки, что и отправка, поэтому остановленные не занимают дневной лимит, и его добирают следующие по очереди. ⚠️ Числа считаются только до набора дневного лимита: кто после — в overCap, их предохранитель не судил. Серия проходит сама: человек вернётся в отбор, как только она закончится. Режимы правил — в настройках площадки (getcourse_settings.guard_*).',
|
|
225
|
+
'⚠️⚠️ guardUnchecked — НЕ отсев: предохранитель не проверил столько отобранных (cause=SOURCE_UNAVAILABLE — источник фактов не ответил, error — текст отказа; OUT_OF_TIME — проверка не уложилась в время запроса). Они стоят в selectedCount без проверки серии, заявки и оплаты; перед отправкой их проверит сама отправка, и часть отсеется. Скажи пользователю, что число «уйдёт» в этот раз завышено. На крупной площадке предпросмотр почти всегда отвечает OUT_OF_TIME (выкачка кандидатов съедает почти весь предел ответа) — полная картина с проверкой в besales_broadcast_pool_today. После отказа источника проверка минуту не повторяется: повторный вызов сразу вернёт SOURCE_UNAVAILABLE.',
|
|
226
|
+
'⚠️⚠️ notHandoffCandidate — у расписания с передачей (включён handoff_from_school_platforms) человек живёт на ДРУГОЙ площадке той же школы, но переносить его нельзя: его серия там ещё идёт (последний шаг календарной цепочки источника впереди или у контакта нет даты эфира) либо у него карточки сразу на нескольких других площадках. Свои люди площадки и люди без карточек сюда НЕ попадают: с 15.09.2026 расписание берёт их как обычно. У обычного расписания число всегда ноль.',
|
|
227
|
+
'⚠️⚠️ handoffReturn — этого человека передача уже увозила С ЭТОЙ площадки, и в рамках текущего входа в сегмент он сюда не вернётся: иначе два расписания-продолжения возили бы его по кругу, а каждый переезд необратим. Новый вход спустя время запрету не подлежит. Ненулевое число означает, что у вас кольцо из двух расписаний передачи — это настройка, а не сбой данных.',
|
|
228
|
+
'⚠️⚠️ handoffBlocked — карточку не перенесли: предохранитель школы (идёт серия, действующая заявка, оплата), контактом занят человек (бан, оператор, мьют), личность занята другим процессом либо на площадке-адресате уже есть карточка с этим внешним id (последнее — навсегда). Такие люди в подачу не идут и получают исход HANDOFF_BLOCKED в журнале подач.',
|
|
177
229
|
'factsAsOf — момент, на который источник считает данные полными. Сильно устаревшее значение означает, что аналитика отстаёт и «не пришедшие» могут быть ложными.',
|
|
178
230
|
'⚠️⚠️ overlaps — контакты, которых за последнюю неделю подавали ДРУГИЕ расписания. Непустой список означает, что человек рискует получить несколько сообщений: разведи расписания кулдауном или приоритетом сегментов, прежде чем включать.',
|
|
179
231
|
'byProduct показывает, как отбор разложится по продуктам — крон нарежет подачу этими же блоками.',
|
|
@@ -261,47 +313,102 @@ export const broadcastSchedulerTools = [
|
|
|
261
313
|
}),
|
|
262
314
|
enhanceResponse: (response) => withInstructions(response, [
|
|
263
315
|
'periodBucket — локальная ДАТА площадки: один прогон на сутки, повтор в тот же день невозможен.',
|
|
264
|
-
'⚠️ Статусы различают ПРИЧИНЫ, и чинятся они разным: DONE — пакет завершился; WAITING_RESOURCE — воркспейс был занят другим
|
|
316
|
+
'⚠️ Статусы различают ПРИЧИНЫ, и чинятся они разным: DONE — пакет завершился; WAITING_RESOURCE — прогон отложен, период НЕ сгорел: воркспейс был занят другим импортом или пакетом (ручным или соседнего расписания), не ответил источник фактов («Источник фактов: …») или не прочитались старшие сегменты («Старшие сегменты не прочитаны: …») — причина в error; прогон повторится ближайшим тиком, когда расписание созреет (в тот же день и не раньше его времени, поэтому «Запустить сейчас» до времени расписания сам не повторится); SKIPPED — правило отбора не дало кандидатов (смотри excludedBy); FAILED — упал запуск пакета; RUNNING — пакет ещё идёт.',
|
|
265
317
|
'⚠️ selectedCount — сколько ОТОБРАНО, launchedCount — сколько фактически доставлено. Расхождение нормально: часть отсеивают гейты отправки внутри пакета. Не называй selectedCount «отправлено».',
|
|
266
|
-
'
|
|
318
|
+
'⚠️ snapshot.guardUnchecked у прогона — в этот день предохранитель не проверил часть отобранных (источник фактов не ответил или кончилось время), и отсев доставки по серии, заявке и оплате был выше обычного. Отсеянных ОТБОРОМ по предохранителю можно найти в аудите предохранителя: строки с details.stage=SCHEDULE_SELECTION и runId прогона.',
|
|
319
|
+
'attempts растёт на каждом WAITING_RESOURCE: большое число при error «Воркспейс занят …» означает, что воркспейс постоянно занят и расписание стоит передвинуть по времени; при «Источник фактов: …» чинится источник, а не время.',
|
|
320
|
+
'⚠️ Все блоки «продукт × воронка» прогона уходят ОДНИМ пакетом, без потолка (прежде — не больше 10). excludedBy.droppedOverBlockLimit бывает только у старых прогонов — люди блоков сверх 10, которые ничего не получили.',
|
|
321
|
+
'⚠️ excludedBy.blockPlaceholdersUnresolved — люди блоков, снятых проверкой плана: в тексте блока не подставились переменные (обычно у агента нет перекрытия переменной). Остальные блоки ушли; эти люди вернутся к следующему запуску (исход SKIPPED_UNRESOLVED_VARS, пауза 6 ч), и, пока агента не поправят, блок снимается на каждом запуске, занимая место в потолке прогона (dailyCap); имена переменных — в причине их строк журнала подач. Чинится значениями переменных или перекрытиями у агента — скажи об этом пользователю.',
|
|
267
322
|
]),
|
|
268
323
|
}),
|
|
269
324
|
/**
|
|
270
|
-
*
|
|
325
|
+
* «Пул сегодня»: сегменты с правилом на площадке — сколько сейчас в пуле и сколько уйдёт.
|
|
326
|
+
*
|
|
327
|
+
* ⚠️⚠️ Считает СЕРВЕР фоном, одной выкачкой источника фактов на площадку: живой предпросмотр
|
|
328
|
+
* боевого расписания в таймаут MCP не укладывается (замер 09.09.2026). Вызов заказывает расчёт
|
|
329
|
+
* и сразу отдаёт последний посчитанный; повторный вызов с теми же параметрами — опрос, новый
|
|
330
|
+
* расчёт не заводится. С `local_day` — чтение утреннего расчёта того дня (история).
|
|
271
331
|
*
|
|
272
|
-
* ⚠️⚠️
|
|
273
|
-
*
|
|
274
|
-
*
|
|
275
|
-
*
|
|
332
|
+
* ⚠️⚠️ Побочный эффект ЕСТЬ, и инструмент не читающий: вызов без `local_day` — это POST,
|
|
333
|
+
* который заводит расчёт (строка живёт до двух недель) и снимает прежние неначатые заказы того
|
|
334
|
+
* же ключа. Пометка «только чтение» отдала бы его хосту в профиль, где вызовы одобряются без
|
|
335
|
+
* спроса. Идемпотентность объявлена честно: повтор с теми же параметрами переиспользует живой
|
|
336
|
+
* и свежий (до 5 минут) расчёт — на этом и держится опрос; исключение — `force`, он и назван
|
|
337
|
+
* «только после своей правки».
|
|
276
338
|
*/
|
|
277
339
|
defineTool({
|
|
278
|
-
name: '
|
|
279
|
-
sideEffect: '
|
|
340
|
+
name: 'besales_broadcast_pool_today',
|
|
341
|
+
sideEffect: 'write',
|
|
342
|
+
reversible: true,
|
|
343
|
+
idempotent: true,
|
|
280
344
|
requiredFields: [],
|
|
281
345
|
defaultWorkspaceId: true,
|
|
282
346
|
schema: z
|
|
283
347
|
.object({
|
|
284
348
|
workspace_id: uuidSchema.optional(),
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
349
|
+
platform_id: uuidSchema
|
|
350
|
+
.optional()
|
|
351
|
+
.describe('GetCourse-площадка. Не передан — первая активная площадка с расписанием.'),
|
|
352
|
+
window_days: z.number().int().min(1).max(POOL_TODAY_WINDOW_DAYS_MAX).optional(),
|
|
353
|
+
funnels: filterListSchema(FUNNELS_MAX).optional(),
|
|
354
|
+
product_codes: filterListSchema(PRODUCTS_MAX).optional(),
|
|
355
|
+
channels: z.array(getcourseTransportEnum).max(getcourseTransportEnum.options.length).optional(),
|
|
356
|
+
cooldown_days: z.number().int().min(0).max(COOLDOWN_DAYS_MAX).optional(),
|
|
357
|
+
// ⚠️ Проверяется только ФОРМА: существование даты сверяет сервер.
|
|
358
|
+
local_day: z.string().regex(LOCAL_DATE_RE, 'local_day: дата ГГГГ-ММ-ДД').optional(),
|
|
359
|
+
force: z.boolean().optional(),
|
|
291
360
|
})
|
|
292
|
-
.strict()
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
361
|
+
.strict()
|
|
362
|
+
.superRefine((input, ctx) => {
|
|
363
|
+
// ⚠️ Утренний расчёт дня считан с настройками по умолчанию: фильтры рядом с днём сервер
|
|
364
|
+
// отвергает 400-й, и узнавать об этом из ошибки модель не должна.
|
|
365
|
+
const withSettings = input.window_days !== undefined ||
|
|
366
|
+
input.funnels !== undefined ||
|
|
367
|
+
input.product_codes !== undefined ||
|
|
368
|
+
input.channels !== undefined ||
|
|
369
|
+
input.cooldown_days !== undefined ||
|
|
370
|
+
input.force !== undefined;
|
|
371
|
+
if (input.local_day !== undefined && withSettings) {
|
|
372
|
+
ctx.addIssue({
|
|
373
|
+
code: z.ZodIssueCode.custom,
|
|
374
|
+
path: ['local_day'],
|
|
375
|
+
message: 'local_day читает утренний расчёт дня с настройками по умолчанию — окно, воронки, продукты, каналы, кулдаун и force с ним не передаются',
|
|
376
|
+
});
|
|
377
|
+
}
|
|
297
378
|
}),
|
|
379
|
+
createRequest: (input) => input.local_day !== undefined
|
|
380
|
+
? {
|
|
381
|
+
method: 'GET',
|
|
382
|
+
path: `/workspaces/${input.workspace_id}/broadcast-pool` +
|
|
383
|
+
buildListQuery({ platformId: input.platform_id, day: input.local_day }),
|
|
384
|
+
}
|
|
385
|
+
: {
|
|
386
|
+
method: 'POST',
|
|
387
|
+
path: `/workspaces/${input.workspace_id}/broadcast-pool/refresh`,
|
|
388
|
+
body: compactObject({
|
|
389
|
+
platformId: input.platform_id,
|
|
390
|
+
windowDays: input.window_days,
|
|
391
|
+
funnels: toList(input.funnels),
|
|
392
|
+
products: toList(input.product_codes),
|
|
393
|
+
channels: input.channels,
|
|
394
|
+
cooldownDays: input.cooldown_days,
|
|
395
|
+
force: input.force,
|
|
396
|
+
}),
|
|
397
|
+
},
|
|
298
398
|
enhanceResponse: (response) => withInstructions(response, [
|
|
299
|
-
'⚠️⚠️
|
|
300
|
-
'
|
|
301
|
-
'
|
|
302
|
-
'
|
|
303
|
-
'
|
|
304
|
-
'
|
|
399
|
+
'⚠️⚠️ activeRun не пуст — идёт расчёт этих настроек: вызови инструмент ЕЩЁ РАЗ через минуту с теми же параметрами. Повторный вызов — опрос, новый расчёт он не заказывает. run — последний ПОСЧИТАННЫЙ расчёт этих настроек (run.finishedAt — когда); run=null — ещё не считали.',
|
|
400
|
+
'⚠️⚠️ Строка с расписанием (scheduleId не null) считается ТЕМ ЖЕ путём, что его тик: окно, воронки, продукты, каналы и тихий период — самого расписания; параметры вызова на неё не действуют. У выключенного расписания selectedCount значит «уйдёт, если включить». Строка без расписания считается по параметрам вызова (окно window_days, по умолчанию 3 суток; воронки, продукты, каналы, кулдаун), без рассылки и с потолком одного запуска — это верхняя граница того, что дало бы расписание.',
|
|
401
|
+
'Числа строки: poolSize — кандидаты после гейтов источника; selectedCount — отобрано на момент запуска авторассылки строки (у строки без расписания — запуска дня) по тому, что известно сейчас, а не «уже уехало»; отсеяно = poolSize − selectedCount, причины — preview.excludedBy тем же реестром, что у besales_broadcast_schedule_preview; preview.unverifiable — «нечем проверить», отсев источника ДО пула, а не причина отбора.',
|
|
402
|
+
'⚠️ status: COMPUTED — посчитана; FAILED — не смогли (причина в error, числа null, а не 0); SKIPPED — не считается по правилу, код в skip.reason: REPEAT_NEEDS_SCHEDULE (повторному касанию нужно окно не короче skip.minDays — считается только расписанием), WINDOW_NOT_SHARED (окно регистраций шире общей выборки — только расписанием), PLATFORM_SERVES_NO_CHANNELS (площадка не обслуживает ни одного канала), DEADLINE (расчёт упёрся в потолок skip.deadlineMinutes раньше, чем дошёл до строки).',
|
|
403
|
+
'⚠️ preview.truncated=true — «не весь пул»: выборка источника не дошла до начала окна строки, самые давние регистрации не рассмотрены. Совет «сузить свежесть» здесь не годится: выборку обрезал общий расчёт площадки.',
|
|
404
|
+
'failedRun — отказ (status=FAILED, причина в error) или замена новым заказом того же заказчика (CANCELLED), случившиеся ПОСЛЕ показанного расчёта. factsSource ≠ READY — источник фактов не настроен или выключен: расчёта не будет вовсе.',
|
|
405
|
+
'force=true — только после своей правки расписания, правила сегмента или запуска: без него свежий (до 5 минут) расчёт тех же настроек переиспользуется (запуск дня, отобравший людей или завершившийся после расчёта, переиспользование сбрасывает сам). Опрашивая идущий расчёт, force НЕ передавай — он заказал бы ещё один расчёт следом. local_day — утренний расчёт того дня (история «сегмент × день»), всегда с настройками по умолчанию.',
|
|
406
|
+
'⚠️ Вызов с ДРУГИМИ параметрами снимает твой прежний неначатый заказ (расчёт идёт по одному на всю систему). Сравнивая площадки или окна, дождись готовности одной комбинации и только потом заказывай следующую — иначе ни одна не досчитается.',
|
|
407
|
+
'Суммы по строкам не называй «людьми»: человек в двух сегментах посчитан дважды. Поимённых списков в ответе нет — людей смотрят в интерфейсе, под правом на контакты.',
|
|
408
|
+
'⚠️⚠️ «Сколько уйдёт сегодня» — это run.dayBreakdown, а не суммы poolSize/selectedCount: runDay (ГГГГ-ММ-ДД) — сегодня, пока хоть один запуск дня не завершился, потом — день ближайшего запуска; с local_day — сам этот день со всеми его запусками; scheduleIds — авторассылки этого дня; notComputedScheduleIds — авторассылки дня, которые не посчитались: числа дня без них неполные, так и скажи; ⚠️ план дня (registrations, people, excluded, selected, carriedOver, matured) — только по запускам, которые людей ещё не отбирали: ranScheduleIds — авторассылки дня, чей запуск уже прошёл: их итог — только facts.bySchedule, а у их сегментов run.rows[].dayBreakdown = null (списки после запуска планом не являются); с local_day непустой ranScheduleIds значит, что утренний расчёт досчитался уже после этих запусков, — так и скажи; allRan=true — все запуски дня уже прошли, плана нет: числа плана нулевые, не называй их, итог дня — facts; ranDuringComputation=true — запуск прошёл во время расчёта, числа неточны: без local_day повтори вызов с теми же параметрами (прошедший запуск сам сбрасывает переиспользование расчёта), с local_day утро не пересчитывается — оговори неточность; runTimes — время запусков дня по часам площадки (прошедший — когда прогон отобрал людей, предстоящий — по правилу); ⚠️⚠️ план считается на момент ЗАПУСКА, а не расчёта: кто созреет к запуску по эфиру, который уже закончился, — уже в числах; явка эфира, который ещё идёт, не известна, и таких людей в числах нет, пока эфир не кончится; matured — registrations плюс outsideSegments (null — не посчитано), outsideSegments — созреют к запуску в окне авторассылок дня, которые их рассматривают (их воронки и продукты, не раньше их свежести, по закончившимся эфирам), но не попали в пул ни одной; outsideSegmentsBy — они же по причинам (одна на регистрацию, сумма равна outsideSegments): paid — оплатил в этой воронке, application — живая заявка, attendanceNoMinutes — был на эфире, минут не записано, paidElsewhere — покупал в ДРУГОЙ воронке, seriesRunning — серия ещё идёт (их возьмут авторассылки по концу эфира, когда она закончится), other — прочее; у расчётов до 01.10.2026 paidElsewhere и seriesRunning нет — эти люди там в other; registrations — регистраций, вошедших в сегменты окнами своих авторассылок (от прошлого отбора до запуска; enteredFrom…enteredTo — общий охват этих окон); people — людей из них, КАЖДЫЙ ОДИН раз при любом числе сегментов; excluded — людей по причине отсева (noMessenger — нет мессенджера (в том числе прошлая подача этим расписанием закончилась «карточку не завели» или «каналами не достать»), inContact — на связи или писали недавно (этим сегментом уже писали, идёт разговор или трое суток тишины после нашей реплики, пауза повтора сегмента, пауза после любого нашего сообщения (поле расписания «Не писать, если писали за N дней»), подача этим расписанием ушла или ещё идёт), paid — купил продукт после регистрации, по которой попал в сегмент, withManager — с ним работает менеджер (действующая заявка на продукт после этой регистрации, операторский статус или передача диалога в отдел моложе трёх суток), blocked — бан, удалённая карточка или действующий мьют, activeSeries — идёт другая вебинарная серия, retryPause — прошлая попытка отправки этим расписанием не удалась, ждём паузу, overCap — не поместились в дневной потолок, higherPriority — уйдут в сегмент с большим приоритетом, otherPlatform — карточка на другой площадке школы, и эта авторассылка её не забирает (передача выключена, там ещё идёт серия эфиров или её дата неизвестна, карточек несколько, перенос не удался или уже увёз человека отсюда; у расчётов и прогонов до 22.09.2026 этой группы нет — эти люди в other), other — прочее (предохранитель не смог проверить заявки и оплаты, карточки на этой площадке нет, повтору не нашлось прошлого касания, непригодный номер человека); у расчётов до 16.09.2026 вместо новых приходят прежние группы alreadyWritten (уже писали), held (купил, менеджер, бан или мьют), pause (пауза); у запусков до 16.09.2026 (facts.scheduleRuns) к новым группам добавляются прежние held и pause, только ненулевые — называй их так и не складывай с новыми); people = selected + сумма excluded; carriedOver — уйдут этим запуском люди с прошлых дней. ⚠️⚠️ После запуска экран показывает «Уйдёт» числом «Взято запусками» (facts: sent + noMessenger + notSent + pending), когда все авторассылки плана (scheduleIds без ranScheduleIds и notComputedScheduleIds) уже отобрали людей и ни одна отобравшая не лежит вне плана; разница с selected + carriedOver показана как «добавились к запуску» / «отпали к запуску»: авторассылки отбирают людей по очереди, по приоритету, и за это время у части людей кончаются паузы. Называя «Уйдёт» дня, чьи запуски прошли, называй это число и разницу с планом. У каждого сегмента то же в run.rows[].dayBreakdown (без matured; null — сегмент не посчитан или запуск его авторассылки уже прошёл), и его runDay может быть другим днём — у авторассылки не на каждый день; у выключенной авторассылки selected — «уйдёт, если включить», в план дня она не входит.',
|
|
409
|
+
'facts — исход запусков дня run.dayBreakdown.runDay по людям, по всем авторассылкам площадки: sent — отправлено, noMessenger — карточку не завели или ни один канал не доходит (школа ответила, что мессенджеров нет, каналы не подошли или сорвалась запись импорта), pending — подан в ещё идущий прогон, notSent — не ушло или доставка не подтвердилась (в том числе сорванная отправка); notSentByReason — те же notSent по причинам: один исход на человека, сумма равна notSent; ключ — исход отказа отправки (SKIPPED_BOT_SILENCED — бот выключен у контакта, SKIPPED_ALREADY_IN_DIALOG — разговор уже идёт, SKIPPED_UNRESOLVED_VARS — переменные текста без значения и соседи, как в outcomes у besales_broadcast_launches_list), без следа отправки — исход журнала подач (UNRESOLVED_AFTER_BATCH — причина не записана: прогоны до 16.09.2026, RELEASED_LAUNCH_FAILED — запуск сорвался); человеку называй причины словами, а не кодами; bySchedule — то же по авторассылкам; scheduleRuns — что увидел каждый запуск дня при отборе (без фильтров): poolSize — пул авторассылки на момент отбора (окно свежести, а не люди дня; null — ещё не отбирал), collapsed — свёрнутые дубли одного человека, excluded — отсев по тем же группам, taken — взято запуском (люди в журнале подач; с этого числа начинается отправка авторассылки в bySchedule, а люди, которых импорт не завёл, в нём есть), unrecorded — люди пула, которых не объясняют ни причины, ни взятые (должно быть 0; не ноль — счётчики прогона не сходятся с его журналом); суммы пулов разных авторассылок людьми дня не называй — человек в двух сегментах посчитан дважды; selectedScheduleIds — авторассылки, чей прогон дня уже отобрал людей или завершился (без фильтров): есть там, но нет в run.dayBreakdown.ranScheduleIds — запуск прошёл уже после расчёта, и без local_day план устарел: повтори вызов с теми же параметрами; ⚠️ под фильтром воронки или продукта план берёт человека с любой регистрацией в них, а факты — по регистрации, с которой ему написали: у людей с регистрациями в разных воронках план и факты расходятся; facts=null — прогонов авторассылок этого дня нет (запуска ещё не было). days — до 14 дней с утренним расчётом (в 8:00, до запусков дня и впереди заказов в очереди; опоздавший виден по непустому ranScheduleIds) и хотя бы одним запуском, а также дни с прошедшим запуском без утреннего расчёта, свежие первыми (для local_day); у такого дня run — null или без dayBreakdown, итог дня по людям — только facts, а отбор каждого запуска — facts.scheduleRuns. Человеку называй сегменты и авторассылки, а не «строки».',
|
|
410
|
+
'⚠️⚠️ «Сколько ушло СЕГОДНЯ» — это todayFacts, а не facts: today — сегодняшний день площадки (ГГГГ-ММ-ДД, по её часам), todayFacts — отправка сегодня в том же виде, что facts, какой бы день ни показывал расклад. После всех запусков дня run.dayBreakdown.runDay и facts уже про ЗАВТРА (facts=null — завтра запусков ещё не было), а сегодняшние итоги остаются в todayFacts. Отвечая, разделяй «Сегодня» (todayFacts) и план ближайшего дня (run.dayBreakdown). todayFacts=null — сегодня запусков не было; с local_day today и todayFacts всегда null — у дня истории итог только facts.',
|
|
411
|
+
'Сводка выкачки у run: fetchedRows (строк источника), fetchTruncated (выборка упёрлась в бюджет — у строк она отзывается preview.truncated), registeredFrom/registeredTo (окно регистраций), trigger (MORNING — утренний расчёт истории, ON_DEMAND — заказанный), settings (настройки строк без расписания). Называй их, объясняя расхождение чисел между днями.',
|
|
305
412
|
]),
|
|
306
413
|
}),
|
|
307
414
|
defineTool({
|
|
@@ -316,6 +423,12 @@ export const broadcastSchedulerTools = [
|
|
|
316
423
|
facets: z
|
|
317
424
|
.object({
|
|
318
425
|
attended: z.enum(['YES', 'NO', 'ANY']).optional(),
|
|
426
|
+
/**
|
|
427
|
+
* Был на ПЕРВОМ эфире серии. `NO` — пропустил первый эфир; вопрос отвечается, пока
|
|
428
|
+
* серия ещё идёт, поэтому с `attended` они не взаимозаменяемы: та спрашивает про всю
|
|
429
|
+
* серию и до её конца равна «нечем проверить».
|
|
430
|
+
*/
|
|
431
|
+
attendedFirstSession: z.enum(['YES', 'NO', 'ANY']).optional(),
|
|
319
432
|
activeSecondsMin: z.number().int().min(0).optional(),
|
|
320
433
|
activeSecondsMax: z.number().int().min(0).optional(),
|
|
321
434
|
webinarDayMin: z.number().int().min(0).optional(),
|
|
@@ -326,10 +439,11 @@ export const broadcastSchedulerTools = [
|
|
|
326
439
|
// приходят непроверяемыми, и людям не уйдёт ничего.
|
|
327
440
|
prelist: z.enum(['YES', 'NO', 'ANY']).optional(),
|
|
328
441
|
/**
|
|
329
|
-
* ⚠️⚠️ ПОВТОРНОЕ касание. Сегмент уходит тем, у кого `key` был ПОСЛЕДНИМ
|
|
330
|
-
*
|
|
331
|
-
* единственную структурную защиту от второго
|
|
332
|
-
* порог снизу зеркалит серверную константу и здесь:
|
|
442
|
+
* ⚠️⚠️ ПОВТОРНОЕ касание. Сегмент уходит тем, у кого `key` был ПОСЛЕДНИМ касанием —
|
|
443
|
+
* нашей отправкой или волной школы на этой площадке — и кто нам не ответил. Снимает
|
|
444
|
+
* вечный одноразовый claim приветствия — единственную структурную защиту от второго
|
|
445
|
+
* сообщения живому человеку, — поэтому порог снизу зеркалит серверную константу и здесь:
|
|
446
|
+
* ниже 30 суток сервер откажет.
|
|
333
447
|
*/
|
|
334
448
|
previousSegment: z
|
|
335
449
|
.object({
|
|
@@ -344,7 +458,8 @@ export const broadcastSchedulerTools = [
|
|
|
344
458
|
* ⚠️⚠️ Молчание значит `true` — это сегодняшнее поведение платформы. Выключение
|
|
345
459
|
* осознанное и снимает ровно одну защиту: человеку, уже получившему от нас холодное
|
|
346
460
|
* приветствие, уйдёт ВТОРОЕ первое сообщение. Остальные гейты (ответ, оператор,
|
|
347
|
-
* тихий период, «этим сегментом уже слали») продолжают работать.
|
|
461
|
+
* тихий период, «этим сегментом уже слали») продолжают работать. Единственный фасет,
|
|
462
|
+
* который меняется и у замороженного сегмента (решение владельца 15.09.2026).
|
|
348
463
|
*/
|
|
349
464
|
untouchedOnly: z.boolean().optional(),
|
|
350
465
|
// ⚠️⚠️ ОБЯЗАТЕЛЬНЫ на сервере (`SEGMENT_FACETS_REQUIRED_GUARDS`): необязательное
|
|
@@ -371,7 +486,8 @@ export const broadcastSchedulerTools = [
|
|
|
371
486
|
}),
|
|
372
487
|
}),
|
|
373
488
|
enhanceResponse: (response) => withInstructions(response, [
|
|
374
|
-
'⚠️⚠️ 409 означает, что сегментом УЖЕ отправляли и правило заморожено. Это не ошибка доступа: строки отчётов уже несут это имя, и правка правила задним числом сделала бы разрез несопоставимым сам с собой. Заведи НОВЫЙ сегмент.',
|
|
489
|
+
'⚠️⚠️ 409 означает, что сегментом УЖЕ отправляли и правило заморожено. Это не ошибка доступа: строки отчётов уже несут это имя, и правка правила задним числом сделала бы разрез несопоставимым сам с собой. Заведи НОВЫЙ сегмент. Исключения — priority и facets.untouchedOnly: их меняют и у замороженного сегмента, передав остальное правило (фасеты, freshness_anchor, wait_after_series_end_hours) ТЕМ ЖЕ, что у сегмента сейчас; с даты переключения отчёт сегмента смешивает первые и повторные сообщения — скажи это человеку.',
|
|
490
|
+
'attendedFirstSession=NO — «пропустил ПЕРВЫЙ эфир», и это единственный способ написать человеку, пока его серия идёт. Требует: freshness_anchor=FIRST_SESSION_END_PLUS_WAIT (иначе вход в сегмент считался бы от конца серии — на 4–5 суток позже) и guard_active_series=OFF у РАСПИСАНИЯ (иначе предохранитель площадки остановит отправку: серия у человека идёт по определению). Источник фактов обязан отдавать явку по первому эфиру; пока не отдаёт, строки приходят непроверяемыми и никому ничего не уйдёт.',
|
|
375
491
|
'attended=NO проходит только достоверный «не пришёл». Человек, про которого данных нет (серия ещё идёт, назначения нет), в сегмент НЕ попадает — и это защита: отсутствие данных о явке не равно отсутствию человека на эфире.',
|
|
376
492
|
'Секунды, а не минуты: «от 120 минут» — это activeSecondsMin=7200. Контакт без известной длительности порог не проходит.',
|
|
377
493
|
'wait_after_series_end_hours — сколько ждать после эфира, прежде чем считать отсутствие явки доказанным. Дефолт 1 час: касание свежее, но явка к этому моменту досчитана у меньшинства (6 ч → 56 %, 24 ч → 74 %, 48 ч → 81 %), и недосчитанный контакт в отбор не попадает. Поэтому при коротком ожидании ставьте freshness_days от 3: при 1 человека смотрят ровно один раз.',
|