@besales/mcp 0.31.0 → 0.32.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.
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "title": "besales-mcp Tool Definitions",
4
4
  "version": "1.2.0-draft",
5
- "lastUpdated": "2026-06-25",
5
+ "lastUpdated": "2026-07-26",
6
6
  "description": "MCP tool schemas для besales-mcp npm package. Active v1.5 set содержит PromptHub/ICP/Sandbox/Knowledge external-execution operations и stateless Platform Setup Bridge direct tools. Setup Pipeline session tools сохранены как Phase 4+ future design, но не входят в active toolset.",
7
7
  "executionModes": {
8
8
  "summary": "Каждая active LLM-операция имеет 2 MCP tools: get_instructions + submit. Claude локально между tools выполняет LLM-вызовы своими моделями. Auto-detection через JWT scope mcp:* → external default.",
@@ -1490,6 +1490,310 @@
1490
1490
  }
1491
1491
  }
1492
1492
  },
1493
+ {
1494
+ "name": "besales_getcourse_wave_run_start",
1495
+ "description": "Start a durable GetCourse status-mode wave run for up to 5000 contacts. The run chunks the cohort, waits for the import lock, processes chunks sequentially and survives service restarts; poll one run via besales_getcourse_wave_run_status instead of building waves manually. WITHOUT confirm=true this is a DRY-RUN and no run is created. A real run requires BOTH confirm=true and explicit_confirmation=true. Only launch_type=status is supported; use besales_getcourse_wave_import for board/group. HTTP 409 returns the already active runId for the platform. Scope: mcp:platform-setup.",
1496
+ "inputSchema": {
1497
+ "type": "object",
1498
+ "required": [
1499
+ "platform_id",
1500
+ "crm_id",
1501
+ "channels",
1502
+ "contacts"
1503
+ ],
1504
+ "properties": {
1505
+ "workspace_id": {
1506
+ "type": "string",
1507
+ "format": "uuid",
1508
+ "description": "Optional override. Normally omit — resolved from the connected session."
1509
+ },
1510
+ "platform_id": {
1511
+ "type": "string",
1512
+ "format": "uuid",
1513
+ "description": "GetCourse PLATFORM uuid."
1514
+ },
1515
+ "crm_id": {
1516
+ "type": "string",
1517
+ "format": "uuid",
1518
+ "description": "GetCourse CRM uuid."
1519
+ },
1520
+ "launch_type": {
1521
+ "type": "string",
1522
+ "enum": [
1523
+ "status"
1524
+ ],
1525
+ "description": "Only status mode is supported. For board/group use besales_getcourse_wave_import."
1526
+ },
1527
+ "channels": {
1528
+ "type": "array",
1529
+ "items": {
1530
+ "type": "string"
1531
+ },
1532
+ "minItems": 1,
1533
+ "description": "Wave channels (GetCourseTransport: VK|Telegram|MAX|SMS|Email|Site) for analytics."
1534
+ },
1535
+ "funnel": {
1536
+ "type": "string",
1537
+ "maxLength": 200,
1538
+ "description": "Canonical business-funnel key/name for analytics."
1539
+ },
1540
+ "segment": {
1541
+ "type": "string",
1542
+ "maxLength": 200,
1543
+ "description": "Wave segment label for analytics."
1544
+ },
1545
+ "cohort_label": {
1546
+ "type": "string",
1547
+ "maxLength": 200,
1548
+ "description": "Human-readable name of this concrete run."
1549
+ },
1550
+ "message_variant": {
1551
+ "type": "string",
1552
+ "maxLength": 120,
1553
+ "description": "Welcome-message variant for run analytics."
1554
+ },
1555
+ "found_count": {
1556
+ "type": "integer",
1557
+ "minimum": 0,
1558
+ "maximum": 10000000,
1559
+ "description": "Contacts found in the source before deduplication and filters."
1560
+ },
1561
+ "product_code": {
1562
+ "type": "string",
1563
+ "maxLength": 100,
1564
+ "pattern": "^[^\\s/]+$",
1565
+ "description": "Product code for the funnel→product analytics dictionary."
1566
+ },
1567
+ "product_name": {
1568
+ "type": "string",
1569
+ "maxLength": 200,
1570
+ "description": "Display name of the analytics product."
1571
+ },
1572
+ "deal_fields": {
1573
+ "type": "object",
1574
+ "additionalProperties": {
1575
+ "type": [
1576
+ "string",
1577
+ "number",
1578
+ "boolean",
1579
+ "null"
1580
+ ]
1581
+ },
1582
+ "description": "status mode: { \"<numeric fieldId>\": value } applied to every contact's deal."
1583
+ },
1584
+ "contacts": {
1585
+ "type": "array",
1586
+ "minItems": 1,
1587
+ "maxItems": 5000,
1588
+ "description": "Durable-run cohort.",
1589
+ "items": {
1590
+ "type": "object",
1591
+ "required": [
1592
+ "contact_id"
1593
+ ],
1594
+ "properties": {
1595
+ "contact_id": {
1596
+ "type": "string",
1597
+ "description": "GetCourse user id."
1598
+ },
1599
+ "deal_id": {
1600
+ "type": "string",
1601
+ "description": "Optional order id to pin."
1602
+ },
1603
+ "transport": {
1604
+ "type": "string",
1605
+ "description": "Optional known transport of the contact."
1606
+ },
1607
+ "dialog_id": {
1608
+ "type": "string",
1609
+ "description": "Optional GetCourse dialog id (resp_id)."
1610
+ },
1611
+ "lead_last_active_at": {
1612
+ "type": "string",
1613
+ "format": "date-time",
1614
+ "description": "Legacy ISO timestamp of the lead's last activity."
1615
+ },
1616
+ "segment_entered_at": {
1617
+ "type": "string",
1618
+ "format": "date-time",
1619
+ "description": "Exact ISO timestamp when the contact entered the segment."
1620
+ }
1621
+ },
1622
+ "additionalProperties": false
1623
+ }
1624
+ },
1625
+ "confirm": {
1626
+ "type": "boolean",
1627
+ "description": "Without true the call is a DRY-RUN: no run is created and nothing is sent."
1628
+ },
1629
+ "check_messenger_presence": {
1630
+ "type": "boolean",
1631
+ "description": "Whether to skip contacts without Telegram/Max/VK messenger presence."
1632
+ },
1633
+ "dedup_window_days": {
1634
+ "type": "integer",
1635
+ "minimum": 0,
1636
+ "maximum": 365,
1637
+ "description": "Deduplication window in days; 0 disables deduplication."
1638
+ },
1639
+ "dedup_scope": {
1640
+ "type": "string",
1641
+ "enum": [
1642
+ "any",
1643
+ "same_funnel"
1644
+ ],
1645
+ "description": "Deduplicate against any wave or only the same canonical funnel."
1646
+ },
1647
+ "preflight": {
1648
+ "type": "object",
1649
+ "description": "Per-contact pre-send gate.",
1650
+ "properties": {
1651
+ "enabled": {
1652
+ "type": "boolean",
1653
+ "description": "false disables the row-level preflight gate."
1654
+ },
1655
+ "product_title": {
1656
+ "type": "string",
1657
+ "maxLength": 500,
1658
+ "description": "Human product title used to build the match key."
1659
+ },
1660
+ "product_match_key": {
1661
+ "type": "string",
1662
+ "maxLength": 500,
1663
+ "description": "Pre-normalized product match key."
1664
+ },
1665
+ "offer_id": {
1666
+ "type": "integer",
1667
+ "minimum": 1,
1668
+ "description": "Optional GetCourse offer id."
1669
+ },
1670
+ "other_product_active_deal_mode": {
1671
+ "type": "string",
1672
+ "enum": [
1673
+ "warn",
1674
+ "block",
1675
+ "ignore"
1676
+ ],
1677
+ "description": "How to handle an active deal for another product."
1678
+ }
1679
+ },
1680
+ "additionalProperties": false
1681
+ },
1682
+ "chunk_size": {
1683
+ "type": "integer",
1684
+ "minimum": 1,
1685
+ "maximum": 500,
1686
+ "default": 100,
1687
+ "description": "Contacts per sequential chunk."
1688
+ },
1689
+ "explicit_confirmation": {
1690
+ "type": "boolean",
1691
+ "enum": [
1692
+ true
1693
+ ],
1694
+ "description": "Required together with confirm=true for a real run. MCP-only safety gate; not sent to the backend."
1695
+ },
1696
+ "confirmation_reason": {
1697
+ "type": "string",
1698
+ "description": "Optional human-readable reason accompanying explicit confirmation; not sent to the backend."
1699
+ }
1700
+ },
1701
+ "additionalProperties": false
1702
+ }
1703
+ },
1704
+ {
1705
+ "name": "besales_getcourse_wave_run_status",
1706
+ "description": "Get the aggregate status of one durable GetCourse wave run. The run owns chunking, sequential processing, import-lock waiting and restart recovery. This endpoint returns aggregates only; use besales_getcourse_wave_run_contacts for cursor-paginated per-contact outcomes. UNKNOWN and FAILED contacts are never retried automatically. Scope: mcp:platform-setup.",
1707
+ "inputSchema": {
1708
+ "type": "object",
1709
+ "required": [
1710
+ "run_id"
1711
+ ],
1712
+ "properties": {
1713
+ "workspace_id": {
1714
+ "type": "string",
1715
+ "format": "uuid",
1716
+ "description": "Optional override. Normally omit — resolved from the connected session."
1717
+ },
1718
+ "run_id": {
1719
+ "type": "string",
1720
+ "format": "uuid",
1721
+ "description": "Durable run uuid returned by besales_getcourse_wave_run_start or an HTTP 409 response."
1722
+ }
1723
+ },
1724
+ "additionalProperties": false
1725
+ }
1726
+ },
1727
+ {
1728
+ "name": "besales_getcourse_wave_run_contacts",
1729
+ "description": "List cursor-paginated per-contact outcomes of a durable GetCourse wave run, optionally filtered by PENDING|CLAIMED|SENT|SKIPPED|FAILED|UNKNOWN. SKIPPED covers deduplication, missing messenger and preflight blocks. UNKNOWN means the outcome is unknown after an interrupted chunk and sending may have happened. UNKNOWN and FAILED are never retried automatically; repeat only as a deliberate operator decision in a separate wave. Scope: mcp:platform-setup.",
1730
+ "inputSchema": {
1731
+ "type": "object",
1732
+ "required": [
1733
+ "run_id"
1734
+ ],
1735
+ "properties": {
1736
+ "workspace_id": {
1737
+ "type": "string",
1738
+ "format": "uuid",
1739
+ "description": "Optional override. Normally omit — resolved from the connected session."
1740
+ },
1741
+ "run_id": {
1742
+ "type": "string",
1743
+ "format": "uuid",
1744
+ "description": "Durable GetCourse wave run uuid."
1745
+ },
1746
+ "status": {
1747
+ "type": "string",
1748
+ "enum": [
1749
+ "PENDING",
1750
+ "CLAIMED",
1751
+ "SENT",
1752
+ "SKIPPED",
1753
+ "FAILED",
1754
+ "UNKNOWN"
1755
+ ],
1756
+ "description": "Optional per-contact status filter."
1757
+ },
1758
+ "cursor": {
1759
+ "type": "string",
1760
+ "format": "uuid",
1761
+ "description": "Opaque cursor returned by the previous page."
1762
+ },
1763
+ "limit": {
1764
+ "type": "integer",
1765
+ "minimum": 1,
1766
+ "maximum": 500,
1767
+ "default": 100,
1768
+ "description": "Contacts per page."
1769
+ }
1770
+ },
1771
+ "additionalProperties": false
1772
+ }
1773
+ },
1774
+ {
1775
+ "name": "besales_getcourse_wave_run_cancel",
1776
+ "description": "Cancel a durable GetCourse wave run so no new chunks are claimed. A currently claimed chunk may still finish; poll besales_getcourse_wave_run_status and inspect rows with besales_getcourse_wave_run_contacts. UNKNOWN and FAILED rows are never retried automatically. Scope: mcp:platform-setup.",
1777
+ "inputSchema": {
1778
+ "type": "object",
1779
+ "required": [
1780
+ "run_id"
1781
+ ],
1782
+ "properties": {
1783
+ "workspace_id": {
1784
+ "type": "string",
1785
+ "format": "uuid",
1786
+ "description": "Optional override. Normally omit — resolved from the connected session."
1787
+ },
1788
+ "run_id": {
1789
+ "type": "string",
1790
+ "format": "uuid",
1791
+ "description": "Durable GetCourse wave run uuid."
1792
+ }
1793
+ },
1794
+ "additionalProperties": false
1795
+ }
1796
+ },
1493
1797
  {
1494
1798
  "name": "besales_wazzup_templates_list",
1495
1799
  "description": "List approved WABA templates of a Wazzup platform with usability flags. Returns templateGuid, title, Meta moderation status, bodyText, variableCount (values required) and usable + unsupportedReasons. Only usable=true templates can be sent in a wave; the rest are unapproved or carry a media header / variable URL button, where values would land in the wrong slots. Scope: mcp:platform-setup.",
@@ -2700,7 +3004,169 @@
2700
3004
  ]
2701
3005
  },
2702
3006
  "config": {
2703
- "type": "object"
3007
+ "type": "object",
3008
+ "description": "Конфигурация цепочки. Ключи — camelCase (передаётся в бэкенд без преобразования). Поля ниже описывают INACTIVE_USER_REACTIVATION; для MEETING_REMINDER/LOST_CLIENTS структура своя и произвольные поля разрешены.",
3009
+ "properties": {
3010
+ "enabled": {
3011
+ "type": "boolean"
3012
+ },
3013
+ "filterMode": {
3014
+ "type": "string",
3015
+ "enum": [
3016
+ "status",
3017
+ "eventType",
3018
+ "variable"
3019
+ ],
3020
+ "description": "Режим отбора контактов. Неизвестное значение НЕ включает ни один фильтр — цепочка ушла бы всем контактам канала, поэтому бэкенд его отвергает."
3021
+ },
3022
+ "sequenceConditions": {
3023
+ "type": "array",
3024
+ "items": {
3025
+ "type": "object",
3026
+ "required": [
3027
+ "variable",
3028
+ "op",
3029
+ "value"
3030
+ ],
3031
+ "properties": {
3032
+ "variable": {
3033
+ "type": "string",
3034
+ "description": "Имя per-contact переменной канала."
3035
+ },
3036
+ "op": {
3037
+ "type": "string",
3038
+ "enum": [
3039
+ "eq",
3040
+ "neq",
3041
+ "in"
3042
+ ]
3043
+ },
3044
+ "value": {
3045
+ "description": "Строка для eq/neq; непустой массив непустых строк для in.",
3046
+ "oneOf": [
3047
+ {
3048
+ "type": "string"
3049
+ },
3050
+ {
3051
+ "type": "array",
3052
+ "items": {
3053
+ "type": "string"
3054
+ }
3055
+ }
3056
+ ]
3057
+ }
3058
+ }
3059
+ },
3060
+ "description": "Обязателен и непуст при filterMode=variable."
3061
+ },
3062
+ "steps": {
3063
+ "type": "array",
3064
+ "minItems": 1,
3065
+ "description": "Шаги цепочки. Пустой массив отвергается: цепочка без шагов ничего не отправит.",
3066
+ "items": {
3067
+ "type": "object",
3068
+ "properties": {
3069
+ "stepType": {
3070
+ "type": "string",
3071
+ "enum": [
3072
+ "message",
3073
+ "webhook"
3074
+ ]
3075
+ },
3076
+ "scheduleMode": {
3077
+ "type": "string",
3078
+ "enum": [
3079
+ "offset",
3080
+ "clock"
3081
+ ],
3082
+ "description": "clock — время суток + сдвиг дней вместо задержки от последней активности."
3083
+ },
3084
+ "anchorMode": {
3085
+ "type": "string",
3086
+ "enum": [
3087
+ "last_inbound",
3088
+ "variable"
3089
+ ],
3090
+ "description": "variable — расписание считается от даты из переменной контакта (календарная цепочка)."
3091
+ },
3092
+ "anchorVariable": {
3093
+ "type": "string",
3094
+ "description": "Имя переменной с якорной датой. Обязательно при anchorMode=variable; переменная должна существовать у канала и НЕ быть константой."
3095
+ },
3096
+ "atTime": {
3097
+ "type": "string",
3098
+ "description": "Время суток HH:MM для scheduleMode=clock."
3099
+ },
3100
+ "dayOffset": {
3101
+ "type": "integer",
3102
+ "minimum": 0,
3103
+ "maximum": 30,
3104
+ "description": "Сдвиг в днях от якоря."
3105
+ },
3106
+ "validityMinutes": {
3107
+ "type": "integer",
3108
+ "minimum": 1,
3109
+ "description": "Окно валидности слота. Меньше 10 минут крон почти всегда промахнётся."
3110
+ },
3111
+ "slotGroup": {
3112
+ "type": "string",
3113
+ "description": "Метка взаимоисключающих вариантов одного момента (first-match-wins). Варианты ОБЯЗАНЫ идти в steps подряд."
3114
+ },
3115
+ "conditions": {
3116
+ "type": "array",
3117
+ "maxItems": 3,
3118
+ "items": {
3119
+ "type": "object",
3120
+ "required": [
3121
+ "variable",
3122
+ "op",
3123
+ "value"
3124
+ ],
3125
+ "properties": {
3126
+ "variable": {
3127
+ "type": "string",
3128
+ "description": "Имя per-contact переменной канала."
3129
+ },
3130
+ "op": {
3131
+ "type": "string",
3132
+ "enum": [
3133
+ "eq",
3134
+ "neq",
3135
+ "in"
3136
+ ]
3137
+ },
3138
+ "value": {
3139
+ "description": "Строка для eq/neq; непустой массив непустых строк для in.",
3140
+ "oneOf": [
3141
+ {
3142
+ "type": "string"
3143
+ },
3144
+ {
3145
+ "type": "array",
3146
+ "items": {
3147
+ "type": "string"
3148
+ }
3149
+ }
3150
+ ]
3151
+ }
3152
+ }
3153
+ },
3154
+ "description": "Условия на переменные контакта; не прошли — шаг пропускается."
3155
+ },
3156
+ "delayHours": {
3157
+ "type": "number"
3158
+ },
3159
+ "delayMinutes": {
3160
+ "type": "number"
3161
+ },
3162
+ "messageConfig": {
3163
+ "type": "object",
3164
+ "description": "Текст/шаблон касания. Плейсхолдеры {name} календарного шага обязаны резолвиться, иначе шаг пропускается в рантайме."
3165
+ }
3166
+ }
3167
+ }
3168
+ }
3169
+ }
2704
3170
  },
2705
3171
  "explicit_confirmation": {
2706
3172
  "type": "boolean"
@@ -3233,6 +3699,31 @@
3233
3699
  "MAX"
3234
3700
  ]
3235
3701
  }
3702
+ },
3703
+ "create_missing_deal_enabled": {
3704
+ "type": "boolean",
3705
+ "description": "Create an order when the contact has no deal at all, so a status wave can still reach them (fields need a deal to be stamped on). The order is created from create_missing_deal_offer_id; funnel/stage are optional placement hints. Creates REAL orders in the school — dangerous, requires explicit_confirmation."
3706
+ },
3707
+ "create_missing_deal_offer_id": {
3708
+ "type": [
3709
+ "integer",
3710
+ "null"
3711
+ ],
3712
+ "description": "GetCourse offer id used to create the order. REQUIRED when create_missing_deal_enabled is true: the legacy /pl/api/deals endpoint can only create an order from an offer. Use a free offer so the order amount is zero."
3713
+ },
3714
+ "create_missing_deal_funnel_id": {
3715
+ "type": [
3716
+ "integer",
3717
+ "null"
3718
+ ],
3719
+ "description": "OPTIONAL GetCourse funnel id for placing the created order (defaults to the offer funnel). Must be set together with create_missing_deal_stage_id and belong to the GetCourse CRM of the wave."
3720
+ },
3721
+ "create_missing_deal_stage_id": {
3722
+ "type": [
3723
+ "integer",
3724
+ "null"
3725
+ ],
3726
+ "description": "OPTIONAL GetCourse stage id inside the funnel above. Must be set together with create_missing_deal_funnel_id."
3236
3727
  }
3237
3728
  }
3238
3729
  },
@@ -6963,6 +7454,243 @@
6963
7454
  }
6964
7455
  }
6965
7456
  }
7457
+ },
7458
+ {
7459
+ "name": "besales_followup_sequence_list",
7460
+ "description": "Read-only список follow-up-цепочек канала: id, имя, тип, триггер, enabled, число шагов. Полный config — только по sequence_id или include_config=true (иначе ответ раздувает контекст). Upsert заменяет config ЦЕЛИКОМ, поэтому перед правкой одного шага прочитай конфиг здесь. Scope: read:analytics.",
7461
+ "inputSchema": {
7462
+ "type": "object",
7463
+ "required": [
7464
+ "platform_id"
7465
+ ],
7466
+ "additionalProperties": false,
7467
+ "properties": {
7468
+ "platform_id": {
7469
+ "type": "string",
7470
+ "format": "uuid"
7471
+ },
7472
+ "sequence_id": {
7473
+ "type": "string",
7474
+ "format": "uuid",
7475
+ "description": "Вернуть одну цепочку вместе с полным конфигом."
7476
+ },
7477
+ "include_config": {
7478
+ "type": "boolean",
7479
+ "description": "Отдать конфиги всех цепочек. По умолчанию не отдаются — они объёмные."
7480
+ }
7481
+ }
7482
+ }
7483
+ },
7484
+ {
7485
+ "name": "besales_followup_step_stats",
7486
+ "description": "Read-only витрина по шагам follow-up-цепочки: сколько ушло, сколько пропущено и почему (условие, плейсхолдер, окно валидности, закрытый слот). Окно по умолчанию 30 дней. Scope: read:analytics.",
7487
+ "inputSchema": {
7488
+ "type": "object",
7489
+ "required": [
7490
+ "platform_id",
7491
+ "sequence_id"
7492
+ ],
7493
+ "additionalProperties": false,
7494
+ "properties": {
7495
+ "platform_id": {
7496
+ "type": "string",
7497
+ "format": "uuid"
7498
+ },
7499
+ "sequence_id": {
7500
+ "type": "string",
7501
+ "format": "uuid"
7502
+ },
7503
+ "from": {
7504
+ "type": "string",
7505
+ "format": "date",
7506
+ "description": "Начало окна (YYYY-MM-DD). По умолчанию 30 дней назад."
7507
+ },
7508
+ "to": {
7509
+ "type": "string",
7510
+ "format": "date",
7511
+ "description": "Конец окна (YYYY-MM-DD). По умолчанию сейчас."
7512
+ }
7513
+ }
7514
+ }
7515
+ },
7516
+ {
7517
+ "name": "besales_scheduled_task_list",
7518
+ "description": "Read-only список плановых задач канала (модуль «Задачи»). Единственный тип — DIALOGUE_ANALYSIS (суфлёр: саммари дня + почасовой «Статус коммуникации»). Scope: mcp:platform-setup.",
7519
+ "inputSchema": {
7520
+ "type": "object",
7521
+ "required": [
7522
+ "platform_id"
7523
+ ],
7524
+ "additionalProperties": false,
7525
+ "properties": {
7526
+ "platform_id": {
7527
+ "type": "string",
7528
+ "format": "uuid",
7529
+ "description": "Канал (только Bitrix24Bot)."
7530
+ }
7531
+ }
7532
+ }
7533
+ },
7534
+ {
7535
+ "name": "besales_scheduled_task_update",
7536
+ "description": "Создать/обновить плановую задачу канала. Конфиг мержится на сервере — присылай только изменяемые поля. Требует explicit_confirmation: задача пишет в CRM клиента по расписанию. Scope: mcp:platform-setup.",
7537
+ "inputSchema": {
7538
+ "type": "object",
7539
+ "required": [
7540
+ "platform_id",
7541
+ "is_enabled"
7542
+ ],
7543
+ "additionalProperties": false,
7544
+ "properties": {
7545
+ "platform_id": {
7546
+ "type": "string",
7547
+ "format": "uuid",
7548
+ "description": "Канал (только Bitrix24Bot)."
7549
+ },
7550
+ "type": {
7551
+ "type": "string",
7552
+ "enum": [
7553
+ "DIALOGUE_ANALYSIS"
7554
+ ],
7555
+ "default": "DIALOGUE_ANALYSIS"
7556
+ },
7557
+ "is_enabled": {
7558
+ "type": "boolean",
7559
+ "description": "Выключено — не выполняется вовсе, независимо от режимов."
7560
+ },
7561
+ "daily": {
7562
+ "type": "object",
7563
+ "additionalProperties": false,
7564
+ "required": [
7565
+ "enabled"
7566
+ ],
7567
+ "properties": {
7568
+ "enabled": {
7569
+ "type": "boolean"
7570
+ },
7571
+ "summary_time": {
7572
+ "type": "string",
7573
+ "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
7574
+ "description": "Локальное время канала, HH:mm"
7575
+ },
7576
+ "output": {
7577
+ "type": "string",
7578
+ "enum": [
7579
+ "note",
7580
+ "hidden"
7581
+ ],
7582
+ "description": "note — заметка в таймлайн CRM (безопасно). hidden — скрытое сообщение в открытой линии (клиент не видит; на живом портале НЕ проверено)."
7583
+ }
7584
+ },
7585
+ "description": "Саммари дня. Пишется ПОСЛЕ summary_time по локальному времени канала.",
7586
+ "if": {
7587
+ "properties": {
7588
+ "enabled": {
7589
+ "const": true
7590
+ }
7591
+ },
7592
+ "required": [
7593
+ "enabled"
7594
+ ]
7595
+ },
7596
+ "then": {
7597
+ "required": [
7598
+ "enabled",
7599
+ "summary_time"
7600
+ ]
7601
+ }
7602
+ },
7603
+ "hourly": {
7604
+ "type": "object",
7605
+ "additionalProperties": false,
7606
+ "required": [
7607
+ "enabled"
7608
+ ],
7609
+ "properties": {
7610
+ "enabled": {
7611
+ "type": "boolean"
7612
+ },
7613
+ "window_start": {
7614
+ "type": "string",
7615
+ "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
7616
+ "description": "Локальное время канала, HH:mm"
7617
+ },
7618
+ "window_end": {
7619
+ "type": "string",
7620
+ "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
7621
+ "description": "Локальное время канала, HH:mm"
7622
+ },
7623
+ "min_new_events": {
7624
+ "type": "integer",
7625
+ "minimum": 1,
7626
+ "description": "Порог новых событий: не набрано — разбор не запускается и заметка не пишется."
7627
+ },
7628
+ "output": {
7629
+ "type": "string",
7630
+ "enum": [
7631
+ "note",
7632
+ "hidden"
7633
+ ],
7634
+ "description": "note — заметка в таймлайн CRM (безопасно). hidden — скрытое сообщение в открытой линии (клиент не видит; на живом портале НЕ проверено)."
7635
+ }
7636
+ },
7637
+ "description": "«Статус коммуникации» — раз в час внутри рабочего окна и только при новых сообщениях.",
7638
+ "if": {
7639
+ "properties": {
7640
+ "enabled": {
7641
+ "const": true
7642
+ }
7643
+ },
7644
+ "required": [
7645
+ "enabled"
7646
+ ]
7647
+ },
7648
+ "then": {
7649
+ "required": [
7650
+ "enabled",
7651
+ "window_start",
7652
+ "window_end"
7653
+ ]
7654
+ }
7655
+ },
7656
+ "funnels": {
7657
+ "type": "array",
7658
+ "items": {
7659
+ "type": "string",
7660
+ "minLength": 1
7661
+ },
7662
+ "description": "ID воронок CRM. Пусто = без фильтра."
7663
+ },
7664
+ "managers": {
7665
+ "type": "array",
7666
+ "items": {
7667
+ "type": "integer",
7668
+ "minimum": 1
7669
+ },
7670
+ "description": "ASSIGNED_BY_ID ответственных Bitrix (не наши id — бери из besales_crm_operator_list). Пусто = без фильтра."
7671
+ },
7672
+ "daily_prompt": {
7673
+ "type": [
7674
+ "string",
7675
+ "null"
7676
+ ],
7677
+ "minLength": 1,
7678
+ "description": "Переопределение системного промпта саммари дня. Пусто = встроенный (написан под «ткани/производство»). null — СНЯТЬ переопределение (вернуть встроенный промпт)."
7679
+ },
7680
+ "hourly_prompt": {
7681
+ "type": [
7682
+ "string",
7683
+ "null"
7684
+ ],
7685
+ "minLength": 1,
7686
+ "description": "Переопределение системного промпта почасового статуса. null — СНЯТЬ переопределение (вернуть встроенный промпт)."
7687
+ },
7688
+ "explicit_confirmation": {
7689
+ "type": "boolean",
7690
+ "description": "Обязательно true после подтверждения оператором."
7691
+ }
7692
+ }
7693
+ }
6966
7694
  }
6967
7695
  ],
6968
7696
  "resources": [
@@ -7154,9 +7882,9 @@
7154
7882
  }
7155
7883
  ],
7156
7884
  "summary": {
7157
- "total_tools": 145,
7885
+ "total_tools": 156,
7158
7886
  "tools_by_category": {
7159
- "getcourse_wave": 2,
7887
+ "getcourse_wave": 6,
7160
7888
  "files_upload": 3,
7161
7889
  "platform_provisioning": 3,
7162
7890
  "crm_provisioning": 6,
@@ -7190,7 +7918,9 @@
7190
7918
  "session_workspace": 2,
7191
7919
  "model_comparison": 4,
7192
7920
  "dialog_script": 2,
7193
- "broadcast_analytics": 2
7921
+ "broadcast_analytics": 2,
7922
+ "scheduled_tasks": 2,
7923
+ "follow_up_read": 2
7194
7924
  },
7195
7925
  "external_execution_pairs": [
7196
7926
  "besales_icp_analysis_get_instructions / submit",