@besales/mcp 0.33.0 → 0.37.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -12
- package/dist/http/api-client.d.ts +2 -0
- package/dist/http/api-client.js +55 -0
- package/dist/http/api-client.js.map +1 -1
- package/dist/resources/docs/agent-behavior.md +7 -5
- package/dist/resources/docs/prompt-anatomy.md +4 -4
- package/dist/resources/docs/prompt-principles.md +22 -3
- package/dist/schemas/mcp-tools.json +1369 -98
- package/dist/skills/besales-dialogue-audit/SKILL.md +6 -0
- package/dist/tools/definitions/broadcast-analytics.d.ts +28 -7
- package/dist/tools/definitions/broadcast-analytics.js +399 -33
- package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
- package/dist/tools/definitions/broadcast-mailing-variants.d.ts +19 -0
- package/dist/tools/definitions/broadcast-mailing-variants.js +107 -0
- package/dist/tools/definitions/broadcast-mailing-variants.js.map +1 -0
- package/dist/tools/definitions/dialogue-audit.d.ts +23 -0
- package/dist/tools/definitions/dialogue-audit.js +155 -0
- package/dist/tools/definitions/dialogue-audit.js.map +1 -0
- package/dist/tools/definitions/follow-up-setup.d.ts +27 -0
- package/dist/tools/definitions/follow-up-setup.js +76 -0
- package/dist/tools/definitions/follow-up-setup.js.map +1 -0
- package/dist/tools/definitions/follow-up.d.ts +19 -0
- package/dist/tools/definitions/follow-up.js +81 -3
- package/dist/tools/definitions/follow-up.js.map +1 -1
- package/dist/tools/definitions/getcourse-wave.d.ts +147 -0
- package/dist/tools/definitions/getcourse-wave.js +505 -0
- package/dist/tools/definitions/getcourse-wave.js.map +1 -0
- package/dist/tools/definitions/platform-setup.d.ts +92 -20
- package/dist/tools/definitions/platform-setup.js +132 -537
- package/dist/tools/definitions/platform-setup.js.map +1 -1
- package/dist/tools/definitions/scheduled-tasks.d.ts +9 -0
- package/dist/tools/definitions/scheduled-tasks.js +49 -2
- package/dist/tools/definitions/scheduled-tasks.js.map +1 -1
- package/dist/tools/definitions/session.js +6 -4
- package/dist/tools/definitions/session.js.map +1 -1
- package/dist/tools/definitions/shared.d.ts +75 -13
- package/dist/tools/definitions/shared.js +120 -7
- package/dist/tools/definitions/shared.js.map +1 -1
- package/dist/tools/definitions.d.ts +171 -26
- package/dist/tools/definitions.js +4 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/registry-mapping-cases-core.d.ts +38 -0
- package/dist/tools/registry-mapping-cases-core.js +700 -0
- package/dist/tools/registry-mapping-cases-core.js.map +1 -0
- package/dist/tools/registry-mapping-cases-platform.d.ts +2 -0
- package/dist/tools/registry-mapping-cases-platform.js +954 -0
- package/dist/tools/registry-mapping-cases-platform.js.map +1 -0
- package/dist/tools/registry.js +12 -6
- package/dist/tools/registry.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { compactObject, defineTool, uuidSchema, withInstructions } from './shared.js';
|
|
3
|
+
const NAME_MAX_LENGTH = 200;
|
|
4
|
+
const DESCRIPTION_MAX_LENGTH = 4000;
|
|
5
|
+
export const broadcastMailingVariantTools = [
|
|
6
|
+
defineTool({
|
|
7
|
+
name: 'besales_broadcast_mailing_variant_list',
|
|
8
|
+
requiredFields: [],
|
|
9
|
+
defaultWorkspaceId: true,
|
|
10
|
+
schema: z
|
|
11
|
+
.object({
|
|
12
|
+
workspace_id: uuidSchema.optional(),
|
|
13
|
+
include_archived: z.boolean().optional(),
|
|
14
|
+
})
|
|
15
|
+
.strict(),
|
|
16
|
+
createRequest: (input) => ({
|
|
17
|
+
method: 'GET',
|
|
18
|
+
path: `/workspaces/${input.workspace_id}/broadcast-mailing-variants${input.include_archived ? '?includeArchived=true' : ''}`,
|
|
19
|
+
}),
|
|
20
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
21
|
+
'Возвращает workspace-scoped каталог «Вариантов рассылки». Для нового запуска выбирай ID активного варианта и передавай его как mailing_variant_id.',
|
|
22
|
+
'include_archived=true нужен для чтения исторических конфигураций аналитики; архивный вариант нельзя назначить новой волне.',
|
|
23
|
+
]),
|
|
24
|
+
}),
|
|
25
|
+
defineTool({
|
|
26
|
+
name: 'besales_broadcast_mailing_variant_create',
|
|
27
|
+
requiredFields: ['name'],
|
|
28
|
+
defaultWorkspaceId: true,
|
|
29
|
+
schema: z
|
|
30
|
+
.object({
|
|
31
|
+
workspace_id: uuidSchema.optional(),
|
|
32
|
+
name: z.string().trim().min(1).max(NAME_MAX_LENGTH),
|
|
33
|
+
description: z.string().max(DESCRIPTION_MAX_LENGTH).optional(),
|
|
34
|
+
})
|
|
35
|
+
.strict(),
|
|
36
|
+
createRequest: (input) => ({
|
|
37
|
+
method: 'POST',
|
|
38
|
+
path: `/workspaces/${input.workspace_id}/broadcast-mailing-variants`,
|
|
39
|
+
body: compactObject({
|
|
40
|
+
name: input.name,
|
|
41
|
+
description: input.description,
|
|
42
|
+
}),
|
|
43
|
+
}),
|
|
44
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
45
|
+
'Создаёт именованный вариант рассылки или восстанавливает архивный вариант с тем же нормализованным именем.',
|
|
46
|
+
'Описание фиксирует гипотезу, сообщения и GetCourse-процесс; конкретные запуски по-прежнему различаются cohort_label.',
|
|
47
|
+
]),
|
|
48
|
+
}),
|
|
49
|
+
defineTool({
|
|
50
|
+
name: 'besales_broadcast_mailing_variant_update',
|
|
51
|
+
requiredFields: ['mailing_variant_id'],
|
|
52
|
+
defaultWorkspaceId: true,
|
|
53
|
+
schema: z
|
|
54
|
+
.object({
|
|
55
|
+
workspace_id: uuidSchema.optional(),
|
|
56
|
+
mailing_variant_id: uuidSchema,
|
|
57
|
+
name: z.string().trim().min(1).max(NAME_MAX_LENGTH).optional(),
|
|
58
|
+
description: z.union([z.string().max(DESCRIPTION_MAX_LENGTH), z.null()]).optional(),
|
|
59
|
+
archived: z.boolean().optional(),
|
|
60
|
+
explicit_confirmation: z.literal(true).optional(),
|
|
61
|
+
})
|
|
62
|
+
.strict()
|
|
63
|
+
.refine((input) => input.name !== undefined ||
|
|
64
|
+
input.description !== undefined ||
|
|
65
|
+
input.archived !== undefined, {
|
|
66
|
+
message: 'Передай хотя бы одно из полей: name, description, archived',
|
|
67
|
+
})
|
|
68
|
+
.refine((input) => input.archived !== true || input.explicit_confirmation === true, {
|
|
69
|
+
message: 'Архивация требует explicit_confirmation=true после подтверждения пользователя',
|
|
70
|
+
path: ['explicit_confirmation'],
|
|
71
|
+
}),
|
|
72
|
+
createRequest: (input) => ({
|
|
73
|
+
method: 'PATCH',
|
|
74
|
+
path: `/workspaces/${input.workspace_id}/broadcast-mailing-variants/${input.mailing_variant_id}`,
|
|
75
|
+
body: compactObject({
|
|
76
|
+
name: input.name,
|
|
77
|
+
description: input.description,
|
|
78
|
+
archived: input.archived,
|
|
79
|
+
}),
|
|
80
|
+
}),
|
|
81
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
82
|
+
'Переименование синхронно обновляет legacy-снимок имени в связанных когортах. archived=true скрывает вариант из новых запусков, но сохраняет аналитику.',
|
|
83
|
+
'archived=true требует explicit_confirmation=true после явного подтверждения пользователя; archived=false восстанавливает вариант без подтверждения.',
|
|
84
|
+
]),
|
|
85
|
+
}),
|
|
86
|
+
defineTool({
|
|
87
|
+
name: 'besales_broadcast_mailing_variant_delete',
|
|
88
|
+
requiredFields: ['mailing_variant_id', 'explicit_confirmation'],
|
|
89
|
+
defaultWorkspaceId: true,
|
|
90
|
+
schema: z
|
|
91
|
+
.object({
|
|
92
|
+
workspace_id: uuidSchema.optional(),
|
|
93
|
+
mailing_variant_id: uuidSchema,
|
|
94
|
+
explicit_confirmation: z.literal(true),
|
|
95
|
+
})
|
|
96
|
+
.strict(),
|
|
97
|
+
createRequest: (input) => ({
|
|
98
|
+
method: 'DELETE',
|
|
99
|
+
path: `/workspaces/${input.workspace_id}/broadcast-mailing-variants/${input.mailing_variant_id}`,
|
|
100
|
+
}),
|
|
101
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
102
|
+
'Архивирует вариант без hard-delete: UUID может уже находиться в отложенном durable-run до создания когорты.',
|
|
103
|
+
'explicit_confirmation=true передавай только после явного подтверждения пользователя. Архивный вариант скрыт из новых запусков, но сохраняет историю и может быть восстановлен.',
|
|
104
|
+
]),
|
|
105
|
+
}),
|
|
106
|
+
];
|
|
107
|
+
//# sourceMappingURL=broadcast-mailing-variants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast-mailing-variants.js","sourceRoot":"","sources":["../../../src/tools/definitions/broadcast-mailing-variants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const dialogueAuditTools: (import("./shared.js").ToolDefinition<{
|
|
2
|
+
platform_id: string;
|
|
3
|
+
}> | import("./shared.js").ToolDefinition<{
|
|
4
|
+
platform_id: string;
|
|
5
|
+
cursor?: string | undefined;
|
|
6
|
+
limit?: number | undefined;
|
|
7
|
+
}> | import("./shared.js").ToolDefinition<{
|
|
8
|
+
run_id: string;
|
|
9
|
+
}> | import("./shared.js").ToolDefinition<{
|
|
10
|
+
run_id: string;
|
|
11
|
+
agent_id?: string | undefined;
|
|
12
|
+
category?: string | undefined;
|
|
13
|
+
severity?: string | undefined;
|
|
14
|
+
status?: "NEW" | "LIKED" | "DISLIKED" | undefined;
|
|
15
|
+
}> | import("./shared.js").ToolDefinition<{
|
|
16
|
+
platform_id: string;
|
|
17
|
+
period_from?: string | undefined;
|
|
18
|
+
period_to?: string | undefined;
|
|
19
|
+
explicit_confirmation?: boolean | undefined;
|
|
20
|
+
}> | import("./shared.js").ToolDefinition<{
|
|
21
|
+
run_id: string;
|
|
22
|
+
explicit_confirmation?: boolean | undefined;
|
|
23
|
+
}>)[];
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// «Ревизор диалогов» — ночной AI-разбор переписок канала. Не путать с `besales_dialogues_query`:
|
|
2
|
+
// тот отдаёт СЫРЫЕ диалоги для самостоятельного анализа, а здесь — готовые находки ревизора,
|
|
3
|
+
// который судил по РАЗВЁРНУТОМУ промпту агента, принципам и журналу действий, с якорями на
|
|
4
|
+
// конкретные реплики и накопленной разметкой человека.
|
|
5
|
+
//
|
|
6
|
+
// ⚠️ Разметки находок (лайк/дизлайк) здесь НЕТ и быть не должно: это оценка работы ревизора
|
|
7
|
+
// ЧЕЛОВЕКОМ и обучающий сигнал на будущее. Получив её, агент начнёт ставить оценки сам себе, и
|
|
8
|
+
// сигнал перестанет быть человеческим ровно тогда, когда станет использоваться.
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { defineTool, uuidSchema, withInstructions } from './shared.js';
|
|
11
|
+
/** Статус разметки находки человеком. Фильтр нужен, чтобы забрать «подтверждённое людьми». */
|
|
12
|
+
const findingStatusSchema = z.enum(['NEW', 'LIKED', 'DISLIKED']);
|
|
13
|
+
export const dialogueAuditTools = [
|
|
14
|
+
defineTool({
|
|
15
|
+
name: 'besales_dialogue_audit_config_get',
|
|
16
|
+
requiredFields: ['platform_id'],
|
|
17
|
+
schema: z.object({ platform_id: uuidSchema }).strict(),
|
|
18
|
+
createRequest: (input) => ({
|
|
19
|
+
method: 'GET',
|
|
20
|
+
path: `/platforms/${input.platform_id}/dialogue-audit/config`,
|
|
21
|
+
}),
|
|
22
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
23
|
+
'isConfigured=false — строки конфига ещё нет, значения в ответе это ДЕФОЛТЫ, а не настройки канала.',
|
|
24
|
+
'isEnabled=false означает, что ПЛАНОВЫЕ прогоны не идут. Ручной запуск при этом доступен.',
|
|
25
|
+
'dailyRunHour — час по часовому поясу КАНАЛА, а не по МСК и не по UTC.',
|
|
26
|
+
'Запись настроек через MCP не выведена намеренно: включение ревизора создаёт ежедневный расход на LLM. Меняй в кабинете.',
|
|
27
|
+
]),
|
|
28
|
+
}),
|
|
29
|
+
defineTool({
|
|
30
|
+
name: 'besales_dialogue_audit_runs_list',
|
|
31
|
+
requiredFields: ['platform_id'],
|
|
32
|
+
schema: z
|
|
33
|
+
.object({
|
|
34
|
+
platform_id: uuidSchema,
|
|
35
|
+
cursor: z.string().min(1).optional(),
|
|
36
|
+
limit: z.number().int().min(1).max(100).optional(),
|
|
37
|
+
})
|
|
38
|
+
.strict(),
|
|
39
|
+
createRequest: (input) => ({
|
|
40
|
+
method: 'GET',
|
|
41
|
+
path: `/platforms/${input.platform_id}/dialogue-audit/runs`,
|
|
42
|
+
query: {
|
|
43
|
+
...(input.cursor ? { cursor: input.cursor } : {}),
|
|
44
|
+
...(input.limit ? { limit: String(input.limit) } : {}),
|
|
45
|
+
},
|
|
46
|
+
}),
|
|
47
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
48
|
+
'Пагинация КУРСОРНАЯ: список пополняется сверху новыми прогонами, и offset показал бы один прогон дважды. Нужен полный охват — обходи nextCursor до конца.',
|
|
49
|
+
'status: PENDING/RUNNING — прогон живой; COMPLETED — закончен; FAILED — оборван; CANCELLED — остановлен человеком (это НЕ ошибка).',
|
|
50
|
+
'COMPLETED без находок — валидный исход: ревизор разобрал отрезки и претензий не нашёл.',
|
|
51
|
+
'type=DAILY — плановый прогон, MANUAL — запущенный руками или через MCP.',
|
|
52
|
+
]),
|
|
53
|
+
}),
|
|
54
|
+
defineTool({
|
|
55
|
+
name: 'besales_dialogue_audit_run_get',
|
|
56
|
+
requiredFields: ['run_id'],
|
|
57
|
+
schema: z.object({ run_id: uuidSchema }).strict(),
|
|
58
|
+
createRequest: (input) => ({
|
|
59
|
+
method: 'GET',
|
|
60
|
+
path: `/dialogue-audit/runs/${input.run_id}`,
|
|
61
|
+
}),
|
|
62
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
63
|
+
'Счётчики зафиксированы на прогоне и не пересчитываются: поздний переразбор отрезка не меняет задним числом цифры уже показанного отчёта.',
|
|
64
|
+
'Смотри на candidateSegments против auditedSegments и failedSegments: разбор части отрезков мог не состояться, и тогда «находок мало» означает «мало разобрали», а не «всё хорошо».',
|
|
65
|
+
'lastError у FAILED называет причину обрыва — читай его прежде, чем делать вывод о качестве агента.',
|
|
66
|
+
]),
|
|
67
|
+
}),
|
|
68
|
+
defineTool({
|
|
69
|
+
name: 'besales_dialogue_audit_findings',
|
|
70
|
+
requiredFields: ['run_id'],
|
|
71
|
+
schema: z
|
|
72
|
+
.object({
|
|
73
|
+
run_id: uuidSchema,
|
|
74
|
+
agent_id: uuidSchema.optional(),
|
|
75
|
+
category: z.string().min(1).optional(),
|
|
76
|
+
severity: z.string().min(1).optional(),
|
|
77
|
+
status: findingStatusSchema.optional(),
|
|
78
|
+
})
|
|
79
|
+
.strict(),
|
|
80
|
+
createRequest: (input) => ({
|
|
81
|
+
method: 'GET',
|
|
82
|
+
path: `/dialogue-audit/runs/${input.run_id}/findings`,
|
|
83
|
+
query: {
|
|
84
|
+
...(input.agent_id ? { agentId: input.agent_id } : {}),
|
|
85
|
+
...(input.category ? { category: input.category } : {}),
|
|
86
|
+
...(input.severity ? { severity: input.severity } : {}),
|
|
87
|
+
...(input.status ? { status: input.status } : {}),
|
|
88
|
+
},
|
|
89
|
+
}),
|
|
90
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
91
|
+
'truncated=true — список ОБРЕЗАН предохранителем. Считать такой ответ полным нельзя: сузь фильтрами (агент, важность) и забери остаток.',
|
|
92
|
+
'status=LIKED — человек подтвердил, что ревизор прав; DISLIKED — человек считает находку ошибочной. Для правки промпта бери LIKED и NEW, а DISLIKED не применяй: это явный отказ человека.',
|
|
93
|
+
'Разметка — оценка РАБОТЫ РЕВИЗОРА, а не команда «примени правку». Даже LIKED-находка бывает верной, но не стоящей исправления.',
|
|
94
|
+
'У находки есть якорь на конкретную реплику (primaryMessageId) — опирайся на него, а не на пересказ.',
|
|
95
|
+
'Ревизор не видел RAG-контекст запроса: находки про «выдумал факт» проверяй по журналу действий агента, прежде чем править промпт.',
|
|
96
|
+
'Правку промпта делай отдельно и явно: besales_prompt_patch_start → apply → lint → commit. Этот tool ничего не меняет.',
|
|
97
|
+
]),
|
|
98
|
+
}),
|
|
99
|
+
defineTool({
|
|
100
|
+
name: 'besales_dialogue_audit_run_start',
|
|
101
|
+
requiredFields: ['platform_id'],
|
|
102
|
+
schema: z
|
|
103
|
+
.object({
|
|
104
|
+
platform_id: uuidSchema,
|
|
105
|
+
// Пустой период = «всё непроверенное по водяным знакам». Диапазон нужен, когда просят
|
|
106
|
+
// разобрать конкретные дни, уже пройденные плановым прогоном.
|
|
107
|
+
period_from: z.string().datetime().optional(),
|
|
108
|
+
period_to: z.string().datetime().optional(),
|
|
109
|
+
explicit_confirmation: z.boolean().optional(),
|
|
110
|
+
})
|
|
111
|
+
.strict()
|
|
112
|
+
.refine((value) => value.explicit_confirmation === true, {
|
|
113
|
+
message: 'Прогон ревизора тратит деньги клиента на LLM — требуется explicit_confirmation=true после подтверждения оператором.',
|
|
114
|
+
})
|
|
115
|
+
.refine((value) => (value.period_from === undefined) === (value.period_to === undefined), { message: 'Диапазон задаётся ОБЕИМИ границами: period_from и period_to' }),
|
|
116
|
+
createRequest: (input) => ({
|
|
117
|
+
method: 'POST',
|
|
118
|
+
path: `/platforms/${input.platform_id}/dialogue-audit/runs`,
|
|
119
|
+
body: {
|
|
120
|
+
...(input.period_from ? { periodFrom: input.period_from } : {}),
|
|
121
|
+
...(input.period_to ? { periodTo: input.period_to } : {}),
|
|
122
|
+
},
|
|
123
|
+
}),
|
|
124
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
125
|
+
'Прогон durable: ответ приходит СРАЗУ с runId, работа идёт в очереди. Следи за ним через besales_dialogue_audit_run_get, а не жди ответа тут.',
|
|
126
|
+
'Уже разобранное заново не проверяется и не оплачивается — водяные знаки не двигались.',
|
|
127
|
+
'409 = на этом канале уже идёт прогон. Живой прогон ровно один; дождись его или останови.',
|
|
128
|
+
'400 = ревизор не настроен на канале либо выбранная модель не годится (gpt-5* запрещены: Responses API теряет JSON-режим).',
|
|
129
|
+
]),
|
|
130
|
+
}),
|
|
131
|
+
defineTool({
|
|
132
|
+
name: 'besales_dialogue_audit_run_cancel',
|
|
133
|
+
requiredFields: ['run_id'],
|
|
134
|
+
schema: z
|
|
135
|
+
.object({
|
|
136
|
+
run_id: uuidSchema,
|
|
137
|
+
explicit_confirmation: z.boolean().optional(),
|
|
138
|
+
})
|
|
139
|
+
.strict()
|
|
140
|
+
.refine((value) => value.explicit_confirmation === true, {
|
|
141
|
+
message: 'Остановка прерывает уже оплаченную работу — требуется explicit_confirmation=true после подтверждения оператором.',
|
|
142
|
+
}),
|
|
143
|
+
createRequest: (input) => ({
|
|
144
|
+
method: 'POST',
|
|
145
|
+
path: `/dialogue-audit/runs/${input.run_id}/cancel`,
|
|
146
|
+
body: {},
|
|
147
|
+
}),
|
|
148
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
149
|
+
'Прогон переходит в CANCELLED — это НЕ ошибка. Захваченные отрезки сразу возвращаются в пул.',
|
|
150
|
+
'Воркер прекращает работу на ближайшем heartbeat, ДО следующего вызова модели: уже начатый чанк может успеть дописаться.',
|
|
151
|
+
'Отдельного «продолжить» нет и не нужно: курсоры не двигались, недоразобранное подхватит следующий прогон.',
|
|
152
|
+
]),
|
|
153
|
+
}),
|
|
154
|
+
];
|
|
155
|
+
//# sourceMappingURL=dialogue-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialogue-audit.js","sourceRoot":"","sources":["../../../src/tools/definitions/dialogue-audit.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,6FAA6F;AAC7F,2FAA2F;AAC3F,uDAAuD;AACvD,EAAE;AACF,4FAA4F;AAC5F,+FAA+F;AAC/F,gFAAgF;AAChF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEvE,8FAA8F;AAC9F,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AAEjE,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,UAAU,CAAC;QACT,IAAI,EAAE,mCAAmC;QACzC,cAAc,EAAE,CAAC,aAAa,CAAC;QAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtD,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzB,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,cAAc,KAAK,CAAC,WAAW,wBAAwB;SAC9D,CAAC;QACF,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC5B,gBAAgB,CAAC,QAAQ,EAAE;YACzB,oGAAoG;YACpG,0FAA0F;YAC1F,uEAAuE;YACvE,yHAAyH;SAC1H,CAAC;KACL,CAAC;IACF,UAAU,CAAC;QACT,IAAI,EAAE,kCAAkC;QACxC,cAAc,EAAE,CAAC,aAAa,CAAC;QAC/B,MAAM,EAAE,CAAC;aACN,MAAM,CAAC;YACN,WAAW,EAAE,UAAU;YACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;SACnD,CAAC;aACD,MAAM,EAAE;QACX,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzB,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,cAAc,KAAK,CAAC,WAAW,sBAAsB;YAC3D,KAAK,EAAE;gBACL,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvD;SACF,CAAC;QACF,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC5B,gBAAgB,CAAC,QAAQ,EAAE;YACzB,2JAA2J;YAC3J,mIAAmI;YACnI,wFAAwF;YACxF,yEAAyE;SAC1E,CAAC;KACL,CAAC;IACF,UAAU,CAAC;QACT,IAAI,EAAE,gCAAgC;QACtC,cAAc,EAAE,CAAC,QAAQ,CAAC;QAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACjD,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzB,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,wBAAwB,KAAK,CAAC,MAAM,EAAE;SAC7C,CAAC;QACF,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC5B,gBAAgB,CAAC,QAAQ,EAAE;YACzB,0IAA0I;YAC1I,oLAAoL;YACpL,oGAAoG;SACrG,CAAC;KACL,CAAC;IACF,UAAU,CAAC;QACT,IAAI,EAAE,iCAAiC;QACvC,cAAc,EAAE,CAAC,QAAQ,CAAC;QAC1B,MAAM,EAAE,CAAC;aACN,MAAM,CAAC;YACN,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE;YAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YACtC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,EAAE;SACvC,CAAC;aACD,MAAM,EAAE;QACX,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzB,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,wBAAwB,KAAK,CAAC,MAAM,WAAW;YACrD,KAAK,EAAE;gBACL,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClD;SACF,CAAC;QACF,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC5B,gBAAgB,CAAC,QAAQ,EAAE;YACzB,wIAAwI;YACxI,2LAA2L;YAC3L,gIAAgI;YAChI,qGAAqG;YACrG,mIAAmI;YACnI,uHAAuH;SACxH,CAAC;KACL,CAAC;IACF,UAAU,CAAC;QACT,IAAI,EAAE,kCAAkC;QACxC,cAAc,EAAE,CAAC,aAAa,CAAC;QAC/B,MAAM,EAAE,CAAC;aACN,MAAM,CAAC;YACN,WAAW,EAAE,UAAU;YACvB,sFAAsF;YACtF,8DAA8D;YAC9D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YAC7C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YAC3C,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SAC9C,CAAC;aACD,MAAM,EAAE;aACR,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,qBAAqB,KAAK,IAAI,EAAE;YACvD,OAAO,EACL,qHAAqH;SACxH,CAAC;aACD,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,EAChF,EAAE,OAAO,EAAE,6DAA6D,EAAE,CAC3E;QACH,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,cAAc,KAAK,CAAC,WAAW,sBAAsB;YAC3D,IAAI,EAAE;gBACJ,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1D;SACF,CAAC;QACF,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC5B,gBAAgB,CAAC,QAAQ,EAAE;YACzB,8IAA8I;YAC9I,uFAAuF;YACvF,0FAA0F;YAC1F,2HAA2H;SAC5H,CAAC;KACL,CAAC;IACF,UAAU,CAAC;QACT,IAAI,EAAE,mCAAmC;QACzC,cAAc,EAAE,CAAC,QAAQ,CAAC;QAC1B,MAAM,EAAE,CAAC;aACN,MAAM,CAAC;YACN,MAAM,EAAE,UAAU;YAClB,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SAC9C,CAAC;aACD,MAAM,EAAE;aACR,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,qBAAqB,KAAK,IAAI,EAAE;YACvD,OAAO,EACL,kHAAkH;SACrH,CAAC;QACJ,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,wBAAwB,KAAK,CAAC,MAAM,SAAS;YACnD,IAAI,EAAE,EAAE;SACT,CAAC;QACF,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC5B,gBAAgB,CAAC,QAAQ,EAAE;YACzB,6FAA6F;YAC7F,yHAAyH;YACzH,2GAA2G;SAC5G,CAAC;KACL,CAAC;CACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* МУТАЦИИ follow-up сценариев для Platform Setup Bridge.
|
|
3
|
+
*
|
|
4
|
+
* Вынесены из `platform-setup.ts` ТОЛЬКО ради лимита длины файла (1200 строк) — как это уже
|
|
5
|
+
* сделано для волн GetCourse. Набор спредится в `platformSetupTools` НА ПРЕЖНЕМ МЕСТЕ: реестр
|
|
6
|
+
* сверяет точный порядок инструментов с `mcp-tools.json`, и перестановка сломала бы parity-тест.
|
|
7
|
+
*
|
|
8
|
+
* Чтение сценариев живёт отдельно, в `follow-up.ts`.
|
|
9
|
+
*/
|
|
10
|
+
export declare const followUpSetupTools: (import("./shared.js").ToolDefinition<{
|
|
11
|
+
platform_id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
type: "MEETING_REMINDER" | "INACTIVE_USER_REACTIVATION" | "LOST_CLIENTS";
|
|
14
|
+
trigger: "LOST_CLIENTS" | "USER_INACTIVITY" | "DEAL_CLOSED" | "BIRTHDAY_DATE" | "MEETING_TIME" | "CUSTOM_SCHEDULE";
|
|
15
|
+
config: {
|
|
16
|
+
[x: string]: unknown;
|
|
17
|
+
};
|
|
18
|
+
explicit_confirmation?: boolean | undefined;
|
|
19
|
+
confirmation_reason?: string | undefined;
|
|
20
|
+
sequence_id?: string | undefined;
|
|
21
|
+
description?: string | null | undefined;
|
|
22
|
+
enabled?: boolean | undefined;
|
|
23
|
+
}> | import("./shared.js").ToolDefinition<{
|
|
24
|
+
platform_id: string;
|
|
25
|
+
sequence_id: string;
|
|
26
|
+
name?: string | undefined;
|
|
27
|
+
}>)[];
|
|
@@ -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,23 @@ 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(
|
|
83
|
+
.describe('Условия принадлежности контакта цепочке, соединяются через И. Применяются при ЛЮБОМ ' +
|
|
84
|
+
"filterMode (при 'variable' обязателен и непуст, иначе цепочка не выберет никого). " +
|
|
85
|
+
'Для ветвления по варианту рассылки: переменная WAVE_MAILING_VARIANT, значение — UUID ' +
|
|
86
|
+
'варианта из каталога воркспейса, а НЕ его имя («first-ver» будет отвергнут). ' +
|
|
87
|
+
'ВАЖНО: отдельные цепочки НЕ взаимоисключающи — прогресс изолирован по sequenceId, ' +
|
|
88
|
+
'поэтому безусловная «ловящая» цепочка рядом с eq A и eq B не подстрахует, а УДВОИТ ' +
|
|
89
|
+
'отправку. Набор цепочек обязан быть строгим разбиением: eq A, eq B и fallback ' +
|
|
90
|
+
'neq A AND neq B (у контакта без переменной eq/in → false, neq → true)'),
|
|
80
91
|
steps: z.array(reactivationStepSchema).min(1),
|
|
81
92
|
})
|
|
82
93
|
.passthrough();
|
|
@@ -122,6 +133,42 @@ export const followUpStepStatsSchema = z.object({
|
|
|
122
133
|
from: z.string().optional().describe('Начало окна, ISO-дата. По умолчанию 30 дней назад'),
|
|
123
134
|
to: z.string().optional().describe('Конец окна, ISO-дата. По умолчанию сейчас'),
|
|
124
135
|
});
|
|
136
|
+
/** Горизонты сравнения, разрешённые бэкендом. Свободное число он отвергает 400. */
|
|
137
|
+
const REACTION_HORIZONS = [30, 60, 90, 180, 360, 720, 1440];
|
|
138
|
+
export const followUpReactionsSchema = z.object({
|
|
139
|
+
platform_id: uuidSchema,
|
|
140
|
+
from: z.string().describe('Начало периода по дате отправки шага, YYYY-MM-DD (московские сутки)'),
|
|
141
|
+
to: z
|
|
142
|
+
.string()
|
|
143
|
+
.describe('Конец периода, YYYY-MM-DD. Период длиннее 366 суток бэкенд отвергает'),
|
|
144
|
+
sequence_id: z
|
|
145
|
+
.array(uuidSchema)
|
|
146
|
+
.optional()
|
|
147
|
+
.describe('Фильтр цепочек. НЕ влияет на атрибуцию: окно ответа всегда считается по полной шкале ' +
|
|
148
|
+
'касаний контакта, иначе цифра менялась бы от набора фильтров'),
|
|
149
|
+
horizon_minutes: z
|
|
150
|
+
.union([
|
|
151
|
+
z.literal(REACTION_HORIZONS[0]),
|
|
152
|
+
z.literal(REACTION_HORIZONS[1]),
|
|
153
|
+
z.literal(REACTION_HORIZONS[2]),
|
|
154
|
+
z.literal(REACTION_HORIZONS[3]),
|
|
155
|
+
z.literal(REACTION_HORIZONS[4]),
|
|
156
|
+
z.literal(REACTION_HORIZONS[5]),
|
|
157
|
+
z.literal(REACTION_HORIZONS[6]),
|
|
158
|
+
])
|
|
159
|
+
.optional()
|
|
160
|
+
.describe('Горизонт сравнительной метрики. По умолчанию 90'),
|
|
161
|
+
segment: z
|
|
162
|
+
.array(z.string())
|
|
163
|
+
.optional()
|
|
164
|
+
.describe('Сегменты волны. Доступные значения приходят в ответе (`dimensions.segments`); у канала ' +
|
|
165
|
+
'без рассылок их нет вообще'),
|
|
166
|
+
product: z.array(z.string()).optional().describe('Продукты волны (`dimensions.products`)'),
|
|
167
|
+
channel: z
|
|
168
|
+
.array(z.string())
|
|
169
|
+
.optional()
|
|
170
|
+
.describe('Транспорты волны (`dimensions.channels`), например Telegram/WhatsApp/MAX/VK'),
|
|
171
|
+
});
|
|
125
172
|
export const followUpTools = [
|
|
126
173
|
defineTool({
|
|
127
174
|
name: 'besales_followup_sequence_list',
|
|
@@ -157,5 +204,36 @@ export const followUpTools = [
|
|
|
157
204
|
'Окно по умолчанию — 30 дней; для более раннего периода передай from/to.',
|
|
158
205
|
]),
|
|
159
206
|
}),
|
|
207
|
+
defineTool({
|
|
208
|
+
name: 'besales_followup_reactions',
|
|
209
|
+
requiredFields: ['platform_id', 'from', 'to'],
|
|
210
|
+
schema: followUpReactionsSchema,
|
|
211
|
+
createRequest: (input) => ({
|
|
212
|
+
method: 'GET',
|
|
213
|
+
// ⚠️ Ключи query — camelCase, в отличие от snake_case параметров тула: этот эндпоинт
|
|
214
|
+
// разбирает их в DTO с `forbidNonWhitelisted`, и `sequence_id` вернул бы 400
|
|
215
|
+
// «property should not exist». Соседний `sequence_list` принимает snake_case потому, что
|
|
216
|
+
// его контроллер объявляет параметры поштучно, — на него ориентироваться нельзя.
|
|
217
|
+
path: `/platforms/${input.platform_id}/follow-up/reactions${buildListQuery({
|
|
218
|
+
from: input.from,
|
|
219
|
+
to: input.to,
|
|
220
|
+
sequenceId: input.sequence_id,
|
|
221
|
+
horizonMinutes: input.horizon_minutes,
|
|
222
|
+
segment: input.segment,
|
|
223
|
+
product: input.product,
|
|
224
|
+
channel: input.channel,
|
|
225
|
+
})}`,
|
|
226
|
+
}),
|
|
227
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
228
|
+
'Метрик ДВЕ и они НЕ взаимозаменяемы. `replied` — операционная: у каждого шага СВОЁ окно (до следующего касания), поэтому шаг с суточным интервалом почти всегда выглядит лучше часового. Сравнивать шаги по ней НЕЛЬЗЯ.',
|
|
229
|
+
'Сравнивать шаги можно ТОЛЬКО по `horizonReplied` (равный горизонт) и ТОЛЬКО там, где `comparableReliable: true`.',
|
|
230
|
+
'comparableReliable=false означает, что доля ЗАВЫШЕНА, а не просто шумна: цензурирование информативно — следующий шаг уходит лишь к промолчавшим, поэтому выжившие обогащены ответившими. Замер: 67 % вырезанных дали 20,8 % против настоящих 5,5 %. Лечение — horizon_minutes КОРОЧЕ интервала между шагами.',
|
|
231
|
+
'Знаменатели разные: `replied` считается от `resolvedSent` (без ещё открытых окон), `horizonReplied` — от `comparableSent`. От `sent` не считается НИ ОДНА доля.',
|
|
232
|
+
'Ответ атрибутируется РОВНО ОДНОМУ касанию — ближайшему предшествующему. Окно закрывают шаг любой цепочки, волна рассылки и реплика живого оператора.',
|
|
233
|
+
'Цепочки с `measurable: false` шагов не записывают вообще (LOST_CLIENTS): их отсутствие в byStep означает «не меряем», а не «не работает».',
|
|
234
|
+
'Пустые массивы в `dimensions` — у канала нет рассылок, срезы по сегменту/продукту/мессенджеру там недоступны в принципе.',
|
|
235
|
+
'anchorExactShare < 1 — у части строк время отправки записано пакетно (отставание секунды). На окне в десятки минут это меньше процента.',
|
|
236
|
+
]),
|
|
237
|
+
}),
|
|
160
238
|
];
|
|
161
239
|
//# sourceMappingURL=follow-up.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"follow-up.js","sourceRoot":"","sources":["../../../src/tools/definitions/follow-up.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,eAAe,EACf,cAAc,EACd,UAAU,EACV,UAAU,EACV,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;GAYG;AACH,MAAM,uBAAuB,GAAG,CAAC;KAC9B,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAC3D,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC/B,KAAK,EAAE,CAAC;SACL,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;SACxC,QAAQ,CAAC,4DAA4D,CAAC;CAC1E,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,sBAAsB,GAAG,CAAC;KAC7B,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnD,YAAY,EAAE,CAAC;SACZ,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;SACzB,QAAQ,EAAE;SACV,QAAQ,CAAC,4EAA4E,CAAC;IACzF,UAAU,EAAE,CAAC;SACV,IAAI,CAAC,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;SAClC,QAAQ,EAAE;SACV,QAAQ,CACP,wFAAwF,CACzF;IACH,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,yFAAyF;QACvF,+CAA+C,CAClD;IACH,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IACpF,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CAAC,8CAA8C,CAAC;IAC3D,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,sEAAsE,CAAC;IACnF,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,wFAAwF;QACtF,+EAA+E,CAClF;IACH,UAAU,EAAE,CAAC;SACV,KAAK,CAAC,uBAAuB,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,8DAA8D,CAAC;IAC3E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,aAAa,EAAE,eAAe,CAAC,QAAQ,EAAE;CAC1C,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC;KACtC,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,UAAU,EAAE,CAAC;SACV,IAAI,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;SACzC,QAAQ,EAAE;SACV,QAAQ,CACP,
|
|
1
|
+
{"version":3,"file":"follow-up.js","sourceRoot":"","sources":["../../../src/tools/definitions/follow-up.ts"],"names":[],"mappings":"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"}
|