@retensy/mcp 0.21.2 → 0.24.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +106 -7
- package/package.json +2 -2
- package/skills/build-bot-funnel/SKILL.md +1 -0
- package/skills/build-bot-funnel/reference/schema.md +14 -3
- package/skills/build-bot-funnel/reference/validation.md +8 -0
- package/skills/build-bot-funnel/validate.mjs +2 -2
- package/skills/rebuild-funnel-from-builder/SKILL.md +154 -0
- package/skills/rebuild-funnel-from-builder/reference/mapping.md +95 -0
- package/src/index.mjs +592 -25
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Таблица сопоставления: другой конструктор → Retensy
|
|
2
|
+
|
|
3
|
+
Общие понятия, которые есть почти в любом bot-builder'е, и к чему они маппятся в `retensy-bot-graph`.
|
|
4
|
+
Полные конфиги и правила валидатора — в [`../../build-bot-funnel/reference/schema.md`](../../build-bot-funnel/reference/schema.md)
|
|
5
|
+
и [`validation.md`](../../build-bot-funnel/reference/validation.md) — здесь только «куда класть», не дублируем поля.
|
|
6
|
+
|
|
7
|
+
## Таблица по концепциям
|
|
8
|
+
|
|
9
|
+
| Концепция в источнике | Узел/конфиг Retensy | Примечания |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| Точка входа / команда запуска / приветственное сообщение | `TRIGGER_COMMAND` (`/start` и т.п., Telegram/MAX) | Для Instagram входа нет — `TRIGGER_IG_DM`/`TRIGGER_IG_COMMENT`/`TRIGGER_IG_STORY_REPLY`/`TRIGGER_IG_STORY_MENTION` |
|
|
12
|
+
| Триггер по ключевому слову/тексту | `TRIGGER_TEXT` (`matchMode: ANY/EQUALS/CONTAINS/REGEX`) | |
|
|
13
|
+
| Триггер по нажатию инлайн-кнопки (legacy callback без нашего авто-handle) | `TRIGGER_CALLBACK` | Для НОВЫХ кнопок-выборов отдельный триггер не нужен — используй рёбра `btn_N` от `SEND_MESSAGE` |
|
|
14
|
+
| Сообщение / текстовый блок / карточка | `SEND_MESSAGE` (`config.text` + `cards[0]`) | Оба поля обязательны, см. `SEND_NO_TEXT` в validation.md |
|
|
15
|
+
| Сообщение с фото/видео/документом/голосовым/кружком | `SEND_MESSAGE` с медиа-карточкой (`cards[].type`) или `SEND_PHOTO` | Файл заранее через `upload_file`, в графе хранится только URL |
|
|
16
|
+
| Альбом/галерея фото | `SEND_MESSAGE` карточка `type:"gallery"`, `urls[]` | 2–10 картинок |
|
|
17
|
+
| Инлайн-кнопка с выбором (ведёт к ветке сценария) | Кнопка `kind:"CALLBACK"` на `SEND_MESSAGE`, `value:""`, ребро `btn_N` | Непустой `value` ломает переход — см. `validation.md` |
|
|
18
|
+
| Кнопка-ссылка (переход на внешний сайт) | Кнопка `kind:"URL"`, `value` = ссылка; `track:true` если нужно считать клики | Условие по клику — `CONDITION kind:"LINK_CLICKED"` |
|
|
19
|
+
| Вопрос с ожиданием свободного ответа / сбор данных (имя/телефон/email) | `ASK_QUESTION` или `SEND_MESSAGE` с `awaitReply:true` + `saveTo`/`inputKind`/`validator` | Выходы `valid`/`invalid` |
|
|
20
|
+
| Задержка / «подождать N часов/дней» | `DELAY kind:"FIXED"` (`durationSec`) | |
|
|
21
|
+
| Отправка «завтра в HH:MM» | `DELAY kind:"TOMORROW"` | |
|
|
22
|
+
| Отправка в конкретный момент / «через сутки после записи» | `DELAY kind:"UNTIL"` (`isoTimestamp`, опц. `offset`) | |
|
|
23
|
+
| Запуск по расписанию (cron, ежедневная рассылка сводки и т.п.) | `TRIGGER_SCHEDULE` (`cron`, `timezone`) | Headless — без чата, отправка только через `config.target` |
|
|
24
|
+
| Тег / метка подписчика | `ADD_TAG` / `REMOVE_TAG`, условие `CONDITION kind:"TAG"` | `tag` ∈ `[a-z0-9_-]{1,64}` |
|
|
25
|
+
| Переменная / поле подписчика (custom field) | `SET_VARIABLE`, условие `CONDITION kind:"VARIABLE"` | `key` ∈ `[a-z_][a-z0-9_]{0,63}` |
|
|
26
|
+
| Условие «если/иначе» (бинарное) | `CONDITION` (выходы `yes`/`no`) | `match: ALL/ANY` по списку `conditions[]` |
|
|
27
|
+
| Условие со случайным сплитом (A/B тест) | `BRANCH` (`abTest:true`, выходы `case_<id>`) | |
|
|
28
|
+
| Ветвление по значению переменной/коду ответа (больше двух исходов) | `SWITCH` (`expression`, `cases[].value`, выходы `case_<id>`+`default`) | Детерминированный выбор, не случайный |
|
|
29
|
+
| Условие «подписан ли на канал» | `CONDITION kind:"SUBSCRIBED"` | Только Telegram/MAX |
|
|
30
|
+
| Условие по UTM-метке | `CONDITION kind:"UTM"` | |
|
|
31
|
+
| HTTP-запрос / вебхук наружу | Действие `external_request` в блоке `ACTIONS` | Платное действие; своих выходов нет — ветвиться по коду ответа через `saveStatusTo`+`SWITCH` |
|
|
32
|
+
| Входящий вебхук от стороннего сервиса | `TRIGGER_WEBHOOK` (+ `provider`/`connectionId`/`event` для готовых интеграций) | |
|
|
33
|
+
| Оплата / приём платежа | Действие `issue_invoice` в `ACTIONS` (НЕ отдельный узел) | `connectionId` подключения `provider=YOOKASSA`; ветка `paid` — если нужно ждать оплату в диалоге |
|
|
34
|
+
| Триггер «оплата прошла» | `TRIGGER_PAYMENT` | Фильтр `minAmount`/`descriptionContains` обязателен, иначе срабатывает на любую оплату |
|
|
35
|
+
| Форма на сайте / лендинге | `TRIGGER_SITE_FORM` (`siteId`, `formId`) | Только для своего опубликованного сайта в Retensy |
|
|
36
|
+
| Интеграция с CRM (amoCRM, Битрикс24, GetCourse и т.п.) | Действия `amocrm_send`/`bitrix24_call`/`getcourse_send`/... в `ACTIONS` | Нужен `connectionId` из `list_integrations` |
|
|
37
|
+
| Передача диалога оператору / «позвать менеджера» | Действие `agent_chat` в `ACTIONS` | Возврат — `dialog_handoff {active:false}` |
|
|
38
|
+
| AI-ответчик / встроенный GPT-блок | `AI_REPLY` (`mode: "simple"` или `"agent"`) | Платный узел на любом тарифе; у режима `agent` нет выхода `next`, только именованные ветки |
|
|
39
|
+
| Переход в другой сценарий / подворонку | Действие `call_scenario` в `ACTIONS` (`mode: "goto"`/`"call"`) | Ставится последним действием блока |
|
|
40
|
+
| Рассылка по сегменту/тегу | Отдельный инструмент `broadcast_send`, НЕ узел графа | Описание — скилл `send-broadcast` |
|
|
41
|
+
| Конец ветки / «стоп» | Ничего — ветка просто не имеет исходящих рёбер | **Не добавляй** узел `END`, его больше нет в палитре |
|
|
42
|
+
|
|
43
|
+
## Особенности конкретных источников
|
|
44
|
+
|
|
45
|
+
Эти сервисы не публикуют документированный формат экспорта воронки/сценария (только список
|
|
46
|
+
подписчиков CSV-экспортом) — поэтому граф почти всегда переносится по скриншотам/пересказу, а не
|
|
47
|
+
по машинному JSON. Ниже — на что обращать внимание при разборе каждого.
|
|
48
|
+
|
|
49
|
+
- **BotHelp** — сценарии строятся из «блоков» с условными переходами по тегам и триггерам ключевых
|
|
50
|
+
слов; у BotHelp есть «цепочки» (broadcast-подобные серии сообщений с задержками) — переносятся как
|
|
51
|
+
последовательность `SEND_MESSAGE` + `DELAY`, а не как единая рассылка. Переменные BotHelp
|
|
52
|
+
(`{{переменная}}`) — проверь синтаксис конкретных полей (имя/телефон/UTM) и сопоставь с нашими
|
|
53
|
+
`{{var.*}}`/`{{from.*}}`.
|
|
54
|
+
- **SaleBot** — активно использует HTTP-блоки («Внешний запрос») и JS-код внутри сценария. Код
|
|
55
|
+
(кастомная логика на JS) не маппится напрямую — спроси пользователя, что конкретно он делает, и
|
|
56
|
+
реализуй через `external_request`/`FORMULA`/`CONDITION`, либо зафиксируй как немаппируемое.
|
|
57
|
+
- **Senler** — завязан на ВКонтакте (группы, UTM ВК). У Retensy VK — это публикации на стену
|
|
58
|
+
(`vk_post`), а не полноценный бот-конструктор ВК: диалоговые сценарии Senler ВК переносятся в
|
|
59
|
+
Telegram/MAX/Instagram-бота Retensy, это не 1:1 перенос платформы, предупреди пользователя.
|
|
60
|
+
- **Leadteh** — похож на BotHelp по модели «блоки + условия по тегам»; отдельно стоит «воронка
|
|
61
|
+
продаж» (канбан-доска сделок) — это НЕ часть графа сценария, в Retensy ближайший аналог —
|
|
62
|
+
интеграция с внешней CRM (amoCRM/Битрикс24) через `ACTIONS`, не переноси как узлы графа.
|
|
63
|
+
- **Smartsender** — мультиканальный (email + мессенджеры + SMS); переноси только мессенджер-ветку в
|
|
64
|
+
граф, email/SMS-рассылки за пределами диалога — отдельный процесс (не маппятся в узлы графа).
|
|
65
|
+
- **ManyChat** — активно использует «Growth Tools» (виджеты входа с разных площадок — Ref URL, Click
|
|
66
|
+
Widget, Facebook Comments) и условные Smart Delay. Смарт-триггеры входа превращаются в один
|
|
67
|
+
подходящий `TRIGGER_*` Retensy (чаще `TRIGGER_COMMAND`/`TRIGGER_TEXT`); «Customer Chat» элементы
|
|
68
|
+
(facebook-специфика) обычно немаппируемы — фиксируй в корзине «не маппится».
|
|
69
|
+
- **PuzzleBot** — конструктор на основе «кубиков» с явными condition-блоками по переменным/рефералам;
|
|
70
|
+
реферальная система (учёт кто кого привёл) не имеет прямого аналога в Retensy — переносится как
|
|
71
|
+
`SET_VARIABLE`/`CONDITION` вручную по переменной, зафиксируй ограничение пользователю.
|
|
72
|
+
- **Любой другой источник, не названный выше** — та же методика: инвентарь → сопоставление по
|
|
73
|
+
смыслу шага (не по названию блока) → немаппируемое в отдельный список на подтверждение.
|
|
74
|
+
|
|
75
|
+
## Частые ловушки при переносе (из любого источника)
|
|
76
|
+
|
|
77
|
+
- **Кнопка-выбор с непустым `value`.** В исходнике кнопка часто хранит «значение» (тег/id ветки) —
|
|
78
|
+
при переносе в CALLBACK-кнопку Retensy это значение **не** переносится в поле `value` (оно должно
|
|
79
|
+
остаться `""`), переход задаётся только ребром `btn_N`. Если очень нужно явное значение — это
|
|
80
|
+
отдельный узел `TRIGGER_CALLBACK`, а не кнопка-выбор.
|
|
81
|
+
- **Задержки в других единицах.** Источники часто пишут задержку как «1440 минут» или «1 день» —
|
|
82
|
+
переведи в секунды (`durationSec`) аккуратно, не копируй число как есть в другое поле.
|
|
83
|
+
- **HTML/markdown разметка текста.** Форматирование источника (жирный/курсив/ссылки) почти никогда
|
|
84
|
+
не совпадает байт-в-байт с безопасным Telegram-HTML Retensy (`b,strong,i,em,u,ins,s,strike,del,code,pre,a[href],tg-spoiler,br`).
|
|
85
|
+
Если не уверен, что разметка пройдёт — ставь `parseMode:"PLAIN"` и убери теги.
|
|
86
|
+
Пустой экран над таблицей выбора кнопок — тоже источник незаметной потери контента, см. п.1 скилла
|
|
87
|
+
(сначала инвентарь, потом граф).
|
|
88
|
+
- **«Условие» в источнике — не всегда `CONDITION`.** Если исходный блок на самом деле случайно
|
|
89
|
+
делит аудиторию (A/B) — это `BRANCH`, а не `CONDITION`; если выбирает по значению из списка
|
|
90
|
+
вариантов — это `SWITCH`. Смотри поведение, не название.
|
|
91
|
+
- **Платные блоки источника vs платные узлы Retensy не совпадают 1:1.** AI-блок / внешний запрос /
|
|
92
|
+
оплата — в Retensy тоже платные (`PREMIUM_NODE_FORBIDDEN`/`PREMIUM_NODES`) независимо от того,
|
|
93
|
+
был ли эквивалент бесплатным в источнике — предупреди пользователя при переносе таких блоков.
|
|
94
|
+
- **Не копируй ID узлов источника как ID узлов Retensy.** Нужны валидные UUID (п.4 skill) —
|
|
95
|
+
генерируй новые, при необходимости сохраняя исходные имена/заголовки в `_title` для трассируемости.
|