zaytsv-bot-graph-mcp 0.7.0 → 0.7.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zaytsv-bot-graph-mcp",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
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" },
@@ -5,15 +5,15 @@
5
5
 
6
6
  import { readFileSync } from "node:fs";
7
7
 
8
- const path = process.argv[2];
9
- if (!path) { console.error("Usage: node validate.mjs <import.json> [--platform=TELEGRAM|MAX|INSTAGRAM]"); process.exit(2); }
10
-
11
- // Разобрать --platform=... (регистронезависимо)
8
+ // Разобрать аргументы порядконезависимо: первый не-флаг = путь; --platform=... в любом месте
9
+ let path = "";
12
10
  let platform = "TELEGRAM";
13
- for (const arg of process.argv.slice(3)) {
11
+ for (const arg of process.argv.slice(2)) {
14
12
  const m = arg.match(/^--platform=([A-Za-z]+)$/);
15
- if (m) platform = m[1].toUpperCase();
13
+ if (m) { platform = m[1].toUpperCase(); }
14
+ else if (!arg.startsWith("--") && !path) { path = arg; }
16
15
  }
16
+ if (!path) { console.error("Usage: node validate.mjs <import.json> [--platform=TELEGRAM|MAX|INSTAGRAM]"); process.exit(2); }
17
17
  if (!["TELEGRAM", "MAX", "INSTAGRAM"].includes(platform)) {
18
18
  console.error(`❌ Неизвестная платформа: ${platform}. Допустимые: TELEGRAM, MAX, INSTAGRAM`);
19
19
  process.exit(2);
@@ -314,9 +314,9 @@ if (platform === "INSTAGRAM") {
314
314
  // только FIXED считаем конкретно; TOMORROW/UNTIL — всегда > 24h (Long.MAX_VALUE)
315
315
  if (!c || c.kind !== "FIXED") return Infinity;
316
316
  // legacy: durationSec
317
- if (typeof c.durationSec === "number" && c.durationSec > 0) return c.durationSec;
317
+ if (typeof c.durationSec === "number") return c.durationSec;
318
318
  // new format: duration + unit
319
- if (typeof c.duration === "number" && c.duration > 0) {
319
+ if (typeof c.duration === "number") {
320
320
  const u = String(c.unit || "");
321
321
  if (u === "MINUTES") return c.duration * 60;
322
322
  if (u === "HOURS") return c.duration * 3600;
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.0";
25
+ const VERSION = "0.7.1";
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");
@@ -116,7 +116,7 @@ const TOOLS = [
116
116
  { name: "create_graph_from_template", description: "Создать граф (DRAFT) из шаблона (см. list_templates). Возвращает граф с id — дальше правь через update_graph.", inputSchema: { type: "object", properties: { botId: { type: "string" }, templateId: { type: "string" }, name: { type: "string" } }, required: ["botId", "templateId"] } },
117
117
  { name: "rename_graph", description: "Переименовать сценарий (работает и для опубликованных — имя не влияет на исполнение).", inputSchema: { type: "object", properties: { graphId: { type: "string" }, name: { type: "string" } }, required: ["graphId", "name"] } },
118
118
  { name: "clone_graph", description: "Склонировать граф в новый DRAFT «… (copy)» — безопасно итерировать поверх опубликованного.", inputSchema: { type: "object", properties: { graphId: { type: "string" } }, required: ["graphId"] } },
119
- { name: "copy_graph", description: "Скопировать граф в ДРУГОГО бота (в т.ч. на другую платформу: Telegram⇄MAX⇄Instagram). Возвращает {graphId, sourcePlatform, targetPlatform, notes[]}. notes[] помечают, что адаптировано (severity=TRANSFORM, напр. вопрос-контакт → ввод телефона текстом), что требует ручной правки (MANUAL, напр. условие SUBSCRIBED в MAX) и особенности платформы (INFO). preview=true — только проверка совместимости, без копирования. Тот же бот запрещён (для дублирования есть clone_graph).", inputSchema: { type: "object", properties: { graphId: { type: "string" }, targetBotId: { type: "string", description: "id бота-получателя (см. list_bots)" }, preview: { type: "boolean", description: "true = только отчёт о совместимости, ничего не сохраняется" } }, required: ["graphId", "targetBotId"] } },
119
+ { name: "copy_graph", description: "Скопировать граф в ДРУГОГО бота (в т.ч. на другую платформу). Возвращает {graphId, sourcePlatform, targetPlatform, notes[]}. notes[] помечают, что адаптировано (severity=TRANSFORM, напр. вопрос-контакт → ввод телефона текстом), что требует ручной правки (MANUAL, напр. условие SUBSCRIBED в MAX) и особенности платформы (INFO). Авто-адаптация узлов реализована для Telegram⇄MAX; при копировании в/из Instagram-бота граф копируется без трансформаций — несовместимые узлы будут отмечены при публикации (IG-allowlist). preview=true — только проверка совместимости, без копирования. Тот же бот запрещён (для дублирования есть clone_graph).", inputSchema: { type: "object", properties: { graphId: { type: "string" }, targetBotId: { type: "string", description: "id бота-получателя (см. list_bots)" }, preview: { type: "boolean", description: "true = только отчёт о совместимости, ничего не сохраняется" } }, required: ["graphId", "targetBotId"] } },
120
120
  { name: "delete_graph", description: "Удалить граф. Активный (опубликованный и назначенный боту) удалить нельзя — будет 409; сначала переключи активный через set_active_graph.", inputSchema: { type: "object", properties: { graphId: { type: "string" } }, required: ["graphId"] } },
121
121
  { name: "set_active_graph", description: "Назначить, какой опубликованный граф активен у бота (переключение живого сценария без перепубликации).", inputSchema: { type: "object", properties: { botId: { type: "string" }, graphId: { type: "string" } }, required: ["botId", "graphId"] } },
122
122
  ];