zaytsv-bot-graph-mcp 0.7.2 → 0.7.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zaytsv-bot-graph-mcp",
3
- "version": "0.7.2",
3
+ "version": "0.7.3",
4
4
  "description": "MCP server to build and publish Telegram, MAX and Instagram bot funnels/automations in the zaytsv /bots service. Zero dependencies.",
5
5
  "type": "module",
6
6
  "bin": { "zaytsv-bot-graph-mcp": "src/index.mjs" },
@@ -62,7 +62,8 @@ IG-боты не поддерживают команды (`/start`). Вход
62
62
  - **Кнопки-ссылки (`kind:"URL"`)**: `value` = URL. Могут иметь `"track": true` — клики считаются, и на такой шаг можно сослаться из условия `LINK_CLICKED` (см. ниже).
63
63
  - **`color`** (опционально, и у CALLBACK, и у URL) — только стили, которые рендерит Telegram (как в основном боте / pengrad `ButtonStyle`): `""`=по умолчанию, `"#2EA6FF"`=primary (синий), `"#34C759"`=success (зелёный), `"#FF3B30"`=danger (красный). Других цветов нет.
64
64
  - **Режим «Вопрос» (`awaitReply: true`)** — сообщение задаёт вопрос и ждёт ответ (паркуется как `ASK_QUESTION`). Доп. поля: `"saveTo":"name"` (обязателен, `[a-z_][a-z0-9_]{0,63}`), `"inputKind":"TEXT"|"PHOTO"|"DOCUMENT"|"CONTACT"|"LOCATION"`, `"validator":"ANY"|"PHONE"|"EMAIL"|"REGEX"`, `"regex":"..."`, `"retryText":"..."`, `"maxAttempts":3`. Выходы — `valid` / `invalid` (как у `ASK_QUESTION`), плюс `btn_N` для кнопок.
65
- - `SEND_PHOTO` — `{ "photoUrl": "https://...", "caption": "подпись (необязательно, ≤1024)" }`
65
+ - **Канал ответа Instagram (`igReplyChannel`, только для IG-ботов)** — `"comment"` (по умолчанию) — публичный ответ под комментарием; `"dm"` — личное сообщение автору комментария (Private Reply). `"dm"` срабатывает только в графе с `TRIGGER_IG_COMMENT` (нужен `comment_id`): Meta разрешает **1 ЛС на комментарий**, 24-часовое окно на private reply не распространяется. Чтобы ответить и публично, и в ЛС — поставь два шага: один с `"igReplyChannel":"comment"`, второй с `"igReplyChannel":"dm"`.
66
+ - `SEND_PHOTO` — `{ "photoUrl": "https://...", "caption": "подпись (необязательно, ≤1024)", "igReplyChannel": "comment"|"dm" }` (`igReplyChannel` — только IG, см. `SEND_MESSAGE`)
66
67
 
67
68
  ### Логика / ветвление
68
69
  - `CONDITION` — проверка условий, выходы `yes` / `no`. `{ "match":"ALL"|"ANY", "conditions":[ { "kind":"...", "op":"...", "key":"...", "value":"..." } ] }`. `match:"ALL"` — все условия истинны; `"ANY"` — хотя бы одно. Полный список `kind`/`op`/полей — в разделе [«Условия CONDITION»](#условия-condition).
@@ -148,6 +149,7 @@ IG-боты подключаются через OAuth в разделе **«Ин
148
149
  - **`ASK_QUESTION`** — `inputKind` ограничен: только `TEXT`, `EMAIL`, `PHONE`, `NUMBER` (`IG_INPUT_UNSUPPORTED`). Нельзя запрашивать `CONTACT` (кнопка «Поделиться номером» недоступна в IG), `LOCATION`, `PHOTO`, `DOCUMENT`.
149
150
  - **Нет reply-клавиатур** — кнопки IG работают как inline (URL или Deep Link); стиль кнопок ограничен возможностями IG Messaging API.
150
151
  - **Нет SUBSCRIBED** — условие «подписан на канал» недоступно.
152
+ - **Коммент → ЛС (Private Reply)** — на `SEND_MESSAGE`/`SEND_PHOTO` в графе с `TRIGGER_IG_COMMENT` укажи `"igReplyChannel": "dm"`, чтобы ответить автору комментария в Direct (а не публично под постом). По умолчанию (`"comment"`) — публичный ответ. Подробнее — `igReplyChannel` в разделе «Сообщения».
151
153
 
152
154
  ### Оффлайн-проверка IG-графа
153
155
 
@@ -108,6 +108,12 @@ if (broadcast.length && triggers.length > broadcast.length) errors.push("BROADCA
108
108
  for (const n of nodes) {
109
109
  const c = n.config || {};
110
110
  const who = `«${c._title || n.id}» (${n.type})`;
111
+ if (c.igReplyChannel != null && !["comment", "dm"].includes(String(c.igReplyChannel))) {
112
+ warns.push(`${who}: igReplyChannel должен быть "comment" или "dm" (получено "${c.igReplyChannel}")`);
113
+ }
114
+ if (String(c.igReplyChannel) === "dm" && platform !== "INSTAGRAM") {
115
+ warns.push(`${who}: igReplyChannel="dm" учитывается только у Instagram-ботов`);
116
+ }
111
117
  switch (n.type) {
112
118
  case "SEND_MESSAGE": {
113
119
  const flat = !blank(c.text) || !blank(c.photoUrl);
package/src/index.mjs CHANGED
@@ -22,7 +22,7 @@ import os from "node:os";
22
22
  import fs from "node:fs";
23
23
  import path from "node:path";
24
24
 
25
- const VERSION = "0.7.2";
25
+ const VERSION = "0.7.3";
26
26
  const BASE = (process.env.ZAYTSV_BASE_URL || "https://zaytsv.ru").replace(/\/+$/, "");
27
27
  const CONFIG_DIR = path.join(os.homedir(), ".zaytsv-bot-graph");
28
28
  const TOKEN_FILE = path.join(CONFIG_DIR, "token");