@besales/mcp 0.47.0 → 0.47.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.
@@ -3,4 +3,4 @@
3
3
  * besales_help_search / besales_help_get для хостов, которые не показывают resources модели.
4
4
  * Здесь остаются только правила, без которых первый безопасный шаг выбрать нельзя.
5
5
  */
6
- export declare const SERVER_INSTRUCTIONS = "\u0422\u044B \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0448\u044C \u0441 Besales/Animaly \u0447\u0435\u0440\u0435\u0437 MCP \u0438 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B besales_*.\n\n# \u041A\u0430\u043A \u043D\u0430\u0447\u0430\u0442\u044C\n\n1. \u0415\u0441\u043B\u0438 \u043A\u043E\u043C\u043F\u0430\u043D\u0438\u044F \u0438\u043B\u0438 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043D\u0435\u044F\u0441\u043D\u044B, \u0432\u044B\u0437\u043E\u0432\u0438 besales_workspace_current. \u041F\u0440\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445\n \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F\u0445 \u043F\u043E\u043A\u0430\u0436\u0438 \u0438\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u0438 \u0432\u044B\u0431\u0435\u0440\u0438 \u0447\u0435\u0440\u0435\u0437 besales_workspace_use. \u041D\u0435 \u043F\u0440\u043E\u0441\u0438\n UUID, \u0435\u0441\u043B\u0438 \u0435\u0433\u043E \u043C\u043E\u0436\u043D\u043E \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u043C.\n2. \u0414\u043B\u044F \u00AB\u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0437\u0430\u0434\u0430\u0447\u0443\u00BB \u0432\u044B\u0437\u043E\u0432\u0438 besales_task_list, \u0432\u044B\u0431\u0435\u0440\u0438 task_id \u044F\u0432\u043D\u043E \u0438 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0439\n besales_task_get. \u0421\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u2014 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442: \u043F\u0435\u0440\u0435\u0434 \u043C\u0443\u0442\u0430\u0446\u0438\u0435\u0439 \u043E\u0431\u043D\u043E\u0432\u0438 workspace, \u043E\u0431\u044A\u0435\u043A\u0442\u044B \u0438\n \u0441\u0442\u0430\u0442\u0443\u0441\u044B \u043E\u0436\u0438\u0434\u0430\u044E\u0449\u0438\u0445 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0439. \u041F\u0440\u0438 \u043F\u0430\u0443\u0437\u0435 \u0441\u043E\u0445\u0440\u0430\u043D\u0438 checkpoints \u0447\u0435\u0440\u0435\u0437 besales_task_update.\n3. \u0414\u043B\u044F \u043D\u043E\u0432\u043E\u0439 \u0438\u043B\u0438 \u0447\u0430\u0441\u0442\u0438\u0447\u043D\u043E \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u043D\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u044B\u0437\u043E\u0432\u0438 besales_workspace_navigate \u0441 intent \u0438, \u0435\u0441\u043B\u0438\n \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u043C\u043E, bot_type. \u0421\u043B\u0435\u0434\u0443\u0439 \u043E\u0434\u043D\u043E\u043C\u0443 next; placeholders \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0443\u0442\u043E\u0447\u043D\u0438 \u0443 \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430. \u041F\u0435\u0440\u0435\u0434 \u0437\u0430\u043F\u0438\u0441\u044C\u044E\n \u043F\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0439 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u0439 \u043E\u0431\u044A\u0435\u043A\u0442. suggestedNextPhase \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u043E\u0439, \u043D\u0435 \u0432\u0435\u0440\u0434\u0438\u043A\u0442\u043E\u043C \u0433\u043E\u0442\u043E\u0432\u043D\u043E\u0441\u0442\u0438.\n4. \u0415\u0441\u043B\u0438 \u043D\u0443\u0436\u043D\u044B\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0438\u043B\u0438 \u043F\u043E\u0440\u044F\u0434\u043E\u043A \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043D, \u0432\u044B\u0437\u043E\u0432\u0438 besales_help_search \u043E\u0431\u044B\u0447\u043D\u044B\u043C \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u043C \u043D\u0430\n \u044F\u0437\u044B\u043A\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F, \u0437\u0430\u0442\u0435\u043C besales_help_get \u0434\u043B\u044F \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u043E\u0433\u043E \u0440\u0430\u0437\u0434\u0435\u043B\u0430. \u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u043D\u0435 \u043E\u0431\u044F\u0437\u0430\u043D \u0437\u043D\u0430\u0442\u044C\n tool_search, URI resources \u0438\u043B\u0438 \u0438\u043C\u0435\u043D\u0430 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432.\n \u0414\u043B\u044F \u0430\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0438, follow-up \u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043D\u0435\u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043C\u043E\u0439 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0439 \u0441\u043F\u0440\u0430\u0432\u043A\u0443: \u0443 \u044D\u0442\u0438\u0445\n \u0434\u043E\u043C\u0435\u043D\u043E\u0432 \u043F\u043E\u0445\u043E\u0436\u0438\u0435 \u043C\u0435\u0442\u0440\u0438\u043A\u0438 \u0438 \u0441\u043E\u0441\u0435\u0434\u043D\u0438\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u043E\u0437\u043D\u0430\u0447\u0430\u044E\u0442 \u0440\u0430\u0437\u043D\u043E\u0435, \u0430 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438\u043C\u0435\u043D\u0438 \u0435\u0449\u0451 \u043D\u0435 \u0434\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442\n \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0438.\n5. \u041F\u043E\u0441\u043B\u0435 \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u043F\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0439 \u0437\u0430\u0442\u0440\u043E\u043D\u0443\u0442\u044B\u0439 \u043E\u0431\u044A\u0435\u043A\u0442 \u0438\u043B\u0438 status \u0438 \u0441\u043E\u043E\u0431\u0449\u0438: \u0447\u0442\u043E \u0441\u0434\u0435\u043B\u0430\u043D\u043E, \u0447\u0442\u043E \u0435\u0449\u0451\n \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F, \u043A\u0430\u043A\u043E\u0439 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u0448\u0430\u0433 \u0438 \u043A\u0430\u043A \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u0435\u0433\u043E \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442.\n6. \u041D\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0439 \u0443\u0441\u043F\u0435\u0448\u043D\u043E\u0435 \u043F\u043E\u043B\u043D\u043E\u0435 read \u0441 \u0442\u0435\u043C\u0438 \u0436\u0435 \u0430\u0440\u0433\u0443\u043C\u0435\u043D\u0442\u0430\u043C\u0438. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 \u0443\u0436\u0435 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0451\u043D\u043D\u044B\u0439 \u0441\u043D\u0438\u043C\u043E\u043A;\n \u043F\u0435\u0440\u0435\u0447\u0438\u0442\u044B\u0432\u0430\u0439 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F, \u043F\u0440\u0438 \u043D\u0435\u043F\u043E\u043B\u043D\u043E\u043C \u043E\u0442\u0432\u0435\u0442\u0435 \u0438\u043B\u0438 \u043A\u043E\u0433\u0434\u0430 \u0438\u0437\u043C\u0435\u043D\u0438\u043B\u0441\u044F \u0444\u0438\u043B\u044C\u0442\u0440/\u043A\u0443\u0440\u0441\u043E\u0440.\n\n# \u0411\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u044C \u0438 \u043F\u043E\u043B\u043D\u043E\u0442\u0430\n\n- \u041D\u0435 \u043F\u0440\u043E\u0441\u0438 \u0442\u043E\u043A\u0435\u043D\u044B, \u043F\u0430\u0440\u043E\u043B\u0438 \u0438 API keys \u0432 \u0447\u0430\u0442\u0435. \u041F\u0440\u043E\u0432\u0438\u0437\u0438\u043E\u043D\u0438\u043D\u0433 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 browser URL: \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\n \u0432\u0432\u043E\u0434\u0438\u0442 \u0441\u0435\u043A\u0440\u0435\u0442\u044B \u0442\u0430\u043C; status \u043E\u043F\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0434\u043E READY. VALIDATION_FAILED \u0438 EXPIRED \u043D\u0435 \u044F\u0432\u043B\u044F\u044E\u0442\u0441\u044F READY.\n- \u041F\u0435\u0440\u0435\u0434 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435\u043C, \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u043E\u0439 \u043B\u044E\u0434\u044F\u043C, \u043F\u043B\u0430\u0442\u043D\u043E\u0439 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0438\u043B\u0438 \u043F\u043E\u043B\u043D\u043E\u0439 \u0437\u0430\u043C\u0435\u043D\u043E\u0439 \u043F\u043E\u043A\u0430\u0436\u0438 \u043F\u043B\u0430\u043D \u0438 \u043F\u043E\u043B\u0443\u0447\u0438\n \u0442\u0440\u0435\u0431\u0443\u0435\u043C\u043E\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u043C explicit_confirmation. \u041F\u0440\u0438 timeout/5xx \u043F\u043E\u0441\u043B\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u043E\u0439 \u043C\u0443\u0442\u0430\u0446\u0438\u0438 \u043D\u0435\n \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0439 \u0435\u0451 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438: \u0438\u0441\u0445\u043E\u0434 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043D, \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043D\u0430\u0439\u0434\u0438 receipt/status.\n- \u041F\u0435\u0440\u0435\u0434 replace-\u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0447\u0438\u0442\u0430\u0439 \u043F\u043E\u043B\u043D\u044B\u0439 \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u044B\u0439 \u0441\u043D\u0438\u043C\u043E\u043A. \u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430, sample, truncated,\n sourceTruncated, \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u044B\u0439 total \u0438\u043B\u0438 readError \u043D\u0435 \u044F\u0432\u043B\u044F\u044E\u0442\u0441\u044F \u043F\u043E\u043B\u043D\u043E\u0439 \u0432\u044B\u0447\u0438\u0442\u043A\u043E\u0439.\n- \u0422\u0430\u0431\u043B\u0438\u0446\u0443 \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0438\u043D\u0432\u0435\u043D\u0442\u0430\u0440\u0438\u0437\u0438\u0440\u0443\u0439 \u0447\u0435\u0440\u0435\u0437 besales_workbook_inspect, \u0437\u0430\u0442\u0435\u043C \u0434\u043E\u0447\u0438\u0442\u0430\u0439 \u043A\u0430\u0436\u0434\u0443\u044E \u0432\u043A\u043B\u0430\u0434\u043A\u0443 \u0447\u0435\u0440\u0435\u0437\n besales_workbook_sheet_read. \u0424\u043E\u0440\u043C\u0443\u043B\u044B, \u0441\u0441\u044B\u043B\u043A\u0438 \u0438 \u0434\u0430\u043D\u043D\u044B\u0435 \u043F\u043E\u0441\u043B\u0435 \u043F\u0435\u0440\u0432\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u043D\u0435\u043B\u044C\u0437\u044F \u0442\u0435\u0440\u044F\u0442\u044C. \u0414\u043B\u044F\n \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0430 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u043C \u044F\u0437\u044B\u043A\u0435 \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0434\u0430\u0439 \u0441\u0430\u043C\u043C\u0430\u0440\u0438 \u043D\u0430 \u044F\u0437\u044B\u043A\u0435 \u0434\u0438\u0430\u043B\u043E\u0433\u0430; \u0446\u0438\u0444\u0440\u044B, \u043F\u0440\u043E\u0446\u0435\u043D\u0442\u044B \u0438 \u0443\u0441\u043B\u043E\u0432\u0438\u044F\n \u0441\u043E\u0433\u043B\u0430\u0441\u0443\u0439 \u0434\u043E \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 prompt/ICP/RAG.\n- External LLM flows \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u043F\u0430\u0440\u043E\u0439 *_get_instructions \u2192 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 stages \u2192 *_submit.\n \u041D\u0435 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u044B\u0432\u0430\u0439 \u043F\u043E\u043B\u044F \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0430 \u043F\u043E \u0434\u043E\u0433\u0430\u0434\u043A\u0435.\n\n# \u041C\u0430\u0440\u0448\u0440\u0443\u0442 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438\n\n\u0424\u0430\u0437\u0430 1 \u2014 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u0430\u043D\u0430\u043B \u0438 \u0434\u043E\u0436\u0434\u0430\u0442\u044C\u0441\u044F READY.\n\u0424\u0430\u0437\u0430 2 \u2014 \u0441\u043E\u0431\u0440\u0430\u0442\u044C ICP, \u0435\u0441\u043B\u0438 \u043E\u043D \u043D\u0443\u0436\u0435\u043D \u0442\u0438\u043F\u0443 \u0431\u043E\u0442\u0430.\n\u0424\u0430\u0437\u0430 3 \u2014 \u0441\u043E\u0431\u0440\u0430\u0442\u044C \u0441\u0446\u0435\u043D\u0430\u0440\u0438\u0439/\u0441\u043A\u0440\u0438\u043F\u0442 \u043F\u0440\u043E\u0434\u0430\u0436 \u0438\u043B\u0438 \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u043D\u0438\u044F.\n\u0424\u0430\u0437\u0430 4 \u2014 \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0430\u0433\u0435\u043D\u0442\u0430, \u043F\u0440\u043E\u043C\u043F\u0442 \u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C draft \u043B\u0438\u043D\u0442\u0435\u0440\u043E\u043C \u0438 sandbox.\n\u0424\u0430\u0437\u0430 5 \u2014 \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0437\u043D\u0430\u043D\u0438\u044F, behavior, triggers, routing \u0438 \u043D\u0443\u0436\u043D\u044B\u0435 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0438 \u0434\u0430\u043D\u043D\u044B\u0445.\n\u0424\u0430\u0437\u0430 6 \u2014 \u043D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C CRM/follow-up/\u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u043E\u0432, \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u0433\u043E\u0442\u043E\u0432\u043D\u043E\u0441\u0442\u044C \u0438 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u0442\u044C.\n\nFAQ-\u0431\u043E\u0442\u0443 \u0437\u043D\u0430\u043D\u0438\u044F \u043D\u0443\u0436\u043D\u044B \u0434\u043E \u043E\u0441\u043C\u044B\u0441\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u0441\u0442\u0430. Sales/booking/outbound-\u0431\u043E\u0442\u0443 \u0434\u043E \u0444\u0438\u043D\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438 \u043D\u0443\u0436\u043D\u044B ICP,\n\u0443\u0441\u043B\u043E\u0432\u0438\u044F \u0438 \u0441\u0446\u0435\u043D\u0430\u0440\u0438\u0439. CRM \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0430\u0439 \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043E\u0433\u0434\u0430 \u043E\u043D \u043D\u0443\u0436\u0435\u043D \u0437\u0430\u0434\u0430\u0447\u0435. \u0424\u0430\u0437\u044B 2\u20136 \u043C\u043E\u0436\u043D\u043E \u0447\u0435\u0440\u0435\u0434\u043E\u0432\u0430\u0442\u044C; \u043F\u043E\u0441\u043B\u0435\n\u0441\u0432\u043E\u0431\u043E\u0434\u043D\u043E\u0433\u043E \u0432\u043E\u043F\u0440\u043E\u0441\u0430 \u043D\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043B\u044F\u0439 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u043F\u0440\u043E\u0445\u043E\u0434\u0438\u0442\u044C \u0432\u0435\u0441\u044C \u043C\u0430\u0441\u0442\u0435\u0440.\n\n# \u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\n\n- \u041D\u043E\u0432\u044B\u0439 \u0431\u043E\u0442: besales://workflows/platform-setup-from-scratch\n- \u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u0438\u043B\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u0430: besales://workflows/extract-from-document\n- \u041F\u0440\u0430\u0432\u043A\u0430 \u043F\u0440\u043E\u043C\u043F\u0442\u0430: besales://workflows/iterate-with-sandbox\n- CRM / 1\u0421: besales://workflows/connect-crm-from-scratch \u0438\n besales://workflows/connect-datasource-from-scratch\n- \u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0437\u0430\u043F\u0443\u0441\u043A\u0430: besales://workflows/production-readiness-check\n- \u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0435\u043D\u0438\u0435 \u0434\u043E\u043B\u0433\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438: besales://docs/task-state\n- \u0422\u0440\u0438\u0433\u0433\u0435\u0440\u044B, \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435, routing, follow-up, \u043A\u0430\u043C\u043F\u0430\u043D\u0438\u0438 \u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433 tools: \u043D\u0430\u0439\u0434\u0438 \u0447\u0435\u0440\u0435\u0437\n besales_help_search; \u043F\u043E\u043B\u043D\u044B\u0439 \u0438\u043B\u0438 \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u0434\u0435\u043B \u043F\u043E\u043B\u0443\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 besales_help_get.\n";
6
+ export declare const SERVER_INSTRUCTIONS = "\u0422\u044B \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0448\u044C \u0441 Besales/Animaly \u0447\u0435\u0440\u0435\u0437 MCP \u0438 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B besales_*.\n\n# \u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0435 \u043F\u0435\u0440\u0435\u0434 \u043F\u0440\u0430\u0432\u043A\u043E\u0439 (\u043D\u0435 \u0441\u043D\u0438\u043C\u0430\u0435\u0442\u0441\u044F \u043F\u0440\u043E\u0441\u044C\u0431\u043E\u0439 \u00AB\u0434\u0435\u043B\u0430\u0439 \u0441\u0430\u043C\u00BB)\n\n\u041B\u044E\u0431\u0430\u044F \u043F\u0440\u0430\u0432\u043A\u0430 \u2014 \u043F\u0440\u043E\u043C\u043F\u0442, \u0434\u043E\u0436\u0438\u043C\u044B, \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435, \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044B, \u0440\u043E\u0443\u0442\u0438\u043D\u0433, \u0440\u0430\u0441\u043F\u0438\u0441\u0430\u043D\u0438\u044F, \u0437\u043D\u0430\u043D\u0438\u044F, \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435\n\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 \u2014 \u043D\u0430\u0447\u0438\u043D\u0430\u0435\u0442\u0441\u044F \u0441 \u043E\u0434\u043D\u043E\u0433\u043E \u043A\u043E\u0440\u043E\u0442\u043A\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F: \u0447\u0442\u043E \u043C\u0435\u043D\u044F\u0435\u0448\u044C, \u0433\u0434\u0435 (\u043E\u0431\u044A\u0435\u043A\u0442 \u0438 \u043F\u043E\u043B\u0435), \u0437\u0430\u0447\u0435\u043C \u0438 \u0447\u0442\u043E\n\u044D\u0442\u043E \u0438\u0437\u043C\u0435\u043D\u0438\u0442 \u0434\u043B\u044F \u043A\u043B\u0438\u0435\u043D\u0442\u0430. \u041F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0438 \u0412\u0421\u0415 \u0437\u0430\u0434\u0443\u043C\u0430\u043D\u043D\u044B\u0435 \u043F\u0440\u0430\u0432\u043A\u0438 \u0441\u043F\u0438\u0441\u043A\u043E\u043C \u0438 \u0437\u0430\u0434\u0430\u0439 \u041E\u0414\u0418\u041D \u0432\u043E\u043F\u0440\u043E\u0441 \u00AB\u0434\u0435\u043B\u0430\u0442\u044C?\u00BB;\n\u043F\u043E \u043E\u0434\u043D\u043E\u0439 \u043D\u0435 \u0441\u043F\u0440\u0430\u0448\u0438\u0432\u0430\u0439. \u0411\u0435\u0437 \u043E\u0442\u0432\u0435\u0442\u0430 \u043D\u0435 \u043F\u0438\u0448\u0438. \u041F\u0440\u043E\u0448\u043B\u043E\u0435 \u00AB\u043E\u043A\u00BB, \u00AB\u043D\u0430\u0441\u0442\u0440\u043E\u0439 \u0441\u0430\u043C\u00BB \u0438 \u043C\u043E\u043B\u0447\u0430\u043D\u0438\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0435\u043C\n\u043D\u0435 \u0441\u0447\u0438\u0442\u0430\u044E\u0442\u0441\u044F; \u043F\u0440\u0430\u0432\u043A\u0430 \u0432\u043D\u0435 \u0441\u043F\u0438\u0441\u043A\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043D\u043E\u0432\u043E\u0433\u043E \u0432\u043E\u043F\u0440\u043E\u0441\u0430. \u0427\u0442\u0435\u043D\u0438\u0435 \u0438 \u043F\u043E\u043A\u0430\u0437 \u0441\u043D\u0438\u043C\u043A\u043E\u0432 \u0441\u043F\u0440\u043E\u0441\u0430 \u043D\u0435 \u0442\u0440\u0435\u0431\u0443\u044E\u0442.\n\u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435, \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u0430 \u043B\u044E\u0434\u044F\u043C, \u043F\u043B\u0430\u0442\u043D\u0430\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u0438 \u043F\u043E\u043B\u043D\u0430\u044F \u0437\u0430\u043C\u0435\u043D\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u0442\u0440\u0435\u0431\u0443\u044E\u0442\nexplicit_confirmation \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0430. \u041F\u0440\u0438 timeout/5xx \u043F\u043E\u0441\u043B\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u043E\u0439 \u043C\u0443\u0442\u0430\u0446\u0438\u0438 \u043D\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0439 \u0435\u0451\n\u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438: \u0438\u0441\u0445\u043E\u0434 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043D, \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043D\u0430\u0439\u0434\u0438 receipt/status.\n\u041F\u043E\u0441\u043B\u0435 \u043F\u0440\u0430\u0432\u043E\u043A \u043F\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0439 \u0437\u0430\u0442\u0440\u043E\u043D\u0443\u0442\u044B\u0435 \u043E\u0431\u044A\u0435\u043A\u0442\u044B \u0438\u043B\u0438 status \u0438 \u0441\u043E\u043E\u0431\u0449\u0438 \u043E\u0434\u043D\u0438\u043C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435\u043C: \u0447\u0442\u043E \u0441\u0434\u0435\u043B\u0430\u043D\u043E, \u0447\u0442\u043E\n\u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C, \u043A\u0430\u043A\u043E\u0439 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u0448\u0430\u0433 \u0438 \u043A\u0430\u043A \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442.\n\n# \u041A\u0430\u043A \u043D\u0430\u0447\u0430\u0442\u044C\n\n1. \u0415\u0441\u043B\u0438 \u043A\u043E\u043C\u043F\u0430\u043D\u0438\u044F \u0438\u043B\u0438 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043D\u0435\u044F\u0441\u043D\u044B, \u0432\u044B\u0437\u043E\u0432\u0438 besales_workspace_current. \u041F\u0440\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445\n \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F\u0445 \u043F\u043E\u043A\u0430\u0436\u0438 \u0438\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E \u0438 \u0432\u044B\u0431\u0435\u0440\u0438 \u0447\u0435\u0440\u0435\u0437 besales_workspace_use. \u041D\u0435 \u043F\u0440\u043E\u0441\u0438\n UUID, \u0435\u0441\u043B\u0438 \u0435\u0433\u043E \u043C\u043E\u0436\u043D\u043E \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u043C.\n2. \u0414\u043B\u044F \u00AB\u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0437\u0430\u0434\u0430\u0447\u0443\u00BB \u0432\u044B\u0437\u043E\u0432\u0438 besales_task_list, \u0432\u044B\u0431\u0435\u0440\u0438 task_id \u044F\u0432\u043D\u043E \u0438 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0439\n besales_task_get. \u0421\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u2014 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442: \u043F\u0435\u0440\u0435\u0434 \u043C\u0443\u0442\u0430\u0446\u0438\u0435\u0439 \u043E\u0431\u043D\u043E\u0432\u0438 workspace, \u043E\u0431\u044A\u0435\u043A\u0442\u044B \u0438\n \u0441\u0442\u0430\u0442\u0443\u0441\u044B \u043E\u0436\u0438\u0434\u0430\u044E\u0449\u0438\u0445 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0439. \u041F\u0440\u0438 \u043F\u0430\u0443\u0437\u0435 \u0441\u043E\u0445\u0440\u0430\u043D\u0438 checkpoints \u0447\u0435\u0440\u0435\u0437 besales_task_update.\n3. \u0414\u043B\u044F \u043D\u043E\u0432\u043E\u0439 \u0438\u043B\u0438 \u0447\u0430\u0441\u0442\u0438\u0447\u043D\u043E \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u043D\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u044B\u0437\u043E\u0432\u0438 besales_workspace_navigate \u0441 intent \u0438, \u0435\u0441\u043B\u0438\n \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u043C\u043E, bot_type. \u0421\u043B\u0435\u0434\u0443\u0439 \u043E\u0434\u043D\u043E\u043C\u0443 next; placeholders \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0443\u0442\u043E\u0447\u043D\u0438 \u0443 \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430. \u041F\u0435\u0440\u0435\u0434 \u0437\u0430\u043F\u0438\u0441\u044C\u044E\n \u043F\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0439 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u0439 \u043E\u0431\u044A\u0435\u043A\u0442. suggestedNextPhase \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u043E\u0439, \u043D\u0435 \u0432\u0435\u0440\u0434\u0438\u043A\u0442\u043E\u043C \u0433\u043E\u0442\u043E\u0432\u043D\u043E\u0441\u0442\u0438.\n4. \u0415\u0441\u043B\u0438 \u043D\u0443\u0436\u043D\u044B\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0438\u043B\u0438 \u043F\u043E\u0440\u044F\u0434\u043E\u043A \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043D, \u0432\u044B\u0437\u043E\u0432\u0438 besales_help_search \u043E\u0431\u044B\u0447\u043D\u044B\u043C \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u043C \u043D\u0430\n \u044F\u0437\u044B\u043A\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F, \u0437\u0430\u0442\u0435\u043C besales_help_get \u0434\u043B\u044F \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u043E\u0433\u043E \u0440\u0430\u0437\u0434\u0435\u043B\u0430. \u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u043D\u0435 \u043E\u0431\u044F\u0437\u0430\u043D \u0437\u043D\u0430\u0442\u044C\n tool_search, URI resources \u0438\u043B\u0438 \u0438\u043C\u0435\u043D\u0430 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432.\n \u0414\u043B\u044F \u0430\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0438, follow-up \u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043D\u0435\u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043C\u043E\u0439 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0439 \u0441\u043F\u0440\u0430\u0432\u043A\u0443: \u0443 \u044D\u0442\u0438\u0445\n \u0434\u043E\u043C\u0435\u043D\u043E\u0432 \u043F\u043E\u0445\u043E\u0436\u0438\u0435 \u043C\u0435\u0442\u0440\u0438\u043A\u0438 \u0438 \u0441\u043E\u0441\u0435\u0434\u043D\u0438\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u043E\u0437\u043D\u0430\u0447\u0430\u044E\u0442 \u0440\u0430\u0437\u043D\u043E\u0435, \u0430 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438\u043C\u0435\u043D\u0438 \u0435\u0449\u0451 \u043D\u0435 \u0434\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442\n \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0438.\n5. \u041D\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0439 \u0443\u0441\u043F\u0435\u0448\u043D\u043E\u0435 \u043F\u043E\u043B\u043D\u043E\u0435 read \u0441 \u0442\u0435\u043C\u0438 \u0436\u0435 \u0430\u0440\u0433\u0443\u043C\u0435\u043D\u0442\u0430\u043C\u0438. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 \u0443\u0436\u0435 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0451\u043D\u043D\u044B\u0439 \u0441\u043D\u0438\u043C\u043E\u043A;\n \u043F\u0435\u0440\u0435\u0447\u0438\u0442\u044B\u0432\u0430\u0439 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F, \u043F\u0440\u0438 \u043D\u0435\u043F\u043E\u043B\u043D\u043E\u043C \u043E\u0442\u0432\u0435\u0442\u0435 \u0438\u043B\u0438 \u043A\u043E\u0433\u0434\u0430 \u0438\u0437\u043C\u0435\u043D\u0438\u043B\u0441\u044F \u0444\u0438\u043B\u044C\u0442\u0440/\u043A\u0443\u0440\u0441\u043E\u0440.\n\n# \u0411\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u044C \u0438 \u043F\u043E\u043B\u043D\u043E\u0442\u0430\n\n- \u041D\u0435 \u043F\u0440\u043E\u0441\u0438 \u0442\u043E\u043A\u0435\u043D\u044B, \u043F\u0430\u0440\u043E\u043B\u0438 \u0438 API keys \u0432 \u0447\u0430\u0442\u0435. \u041F\u0440\u043E\u0432\u0438\u0437\u0438\u043E\u043D\u0438\u043D\u0433 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 browser URL: \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\n \u0432\u0432\u043E\u0434\u0438\u0442 \u0441\u0435\u043A\u0440\u0435\u0442\u044B \u0442\u0430\u043C; status \u043E\u043F\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0434\u043E READY. VALIDATION_FAILED \u0438 EXPIRED \u043D\u0435 \u044F\u0432\u043B\u044F\u044E\u0442\u0441\u044F READY.\n- \u041F\u0435\u0440\u0435\u0434 replace-\u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0447\u0438\u0442\u0430\u0439 \u043F\u043E\u043B\u043D\u044B\u0439 \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u044B\u0439 \u0441\u043D\u0438\u043C\u043E\u043A. \u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430, sample, truncated,\n sourceTruncated, \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u044B\u0439 total \u0438\u043B\u0438 readError \u043D\u0435 \u044F\u0432\u043B\u044F\u044E\u0442\u0441\u044F \u043F\u043E\u043B\u043D\u043E\u0439 \u0432\u044B\u0447\u0438\u0442\u043A\u043E\u0439.\n- \u0422\u0430\u0431\u043B\u0438\u0446\u0443 \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0438\u043D\u0432\u0435\u043D\u0442\u0430\u0440\u0438\u0437\u0438\u0440\u0443\u0439 \u0447\u0435\u0440\u0435\u0437 besales_workbook_inspect, \u0437\u0430\u0442\u0435\u043C \u0434\u043E\u0447\u0438\u0442\u0430\u0439 \u043A\u0430\u0436\u0434\u0443\u044E \u0432\u043A\u043B\u0430\u0434\u043A\u0443 \u0447\u0435\u0440\u0435\u0437\n besales_workbook_sheet_read. \u0424\u043E\u0440\u043C\u0443\u043B\u044B, \u0441\u0441\u044B\u043B\u043A\u0438 \u0438 \u0434\u0430\u043D\u043D\u044B\u0435 \u043F\u043E\u0441\u043B\u0435 \u043F\u0435\u0440\u0432\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u043D\u0435\u043B\u044C\u0437\u044F \u0442\u0435\u0440\u044F\u0442\u044C. \u0414\u043B\u044F\n \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0430 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u043C \u044F\u0437\u044B\u043A\u0435 \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0434\u0430\u0439 \u0441\u0430\u043C\u043C\u0430\u0440\u0438 \u043D\u0430 \u044F\u0437\u044B\u043A\u0435 \u0434\u0438\u0430\u043B\u043E\u0433\u0430; \u0446\u0438\u0444\u0440\u044B, \u043F\u0440\u043E\u0446\u0435\u043D\u0442\u044B \u0438 \u0443\u0441\u043B\u043E\u0432\u0438\u044F\n \u0441\u043E\u0433\u043B\u0430\u0441\u0443\u0439 \u0434\u043E \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 prompt/ICP/RAG.\n- External LLM flows \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u043F\u0430\u0440\u043E\u0439 *_get_instructions \u2192 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 stages \u2192 *_submit.\n \u041D\u0435 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u044B\u0432\u0430\u0439 \u043F\u043E\u043B\u044F \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0430 \u043F\u043E \u0434\u043E\u0433\u0430\u0434\u043A\u0435.\n\n# \u041C\u0430\u0440\u0448\u0440\u0443\u0442 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438\n\n\u0424\u0430\u0437\u0430 1 \u2014 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u0430\u043D\u0430\u043B \u0438 \u0434\u043E\u0436\u0434\u0430\u0442\u044C\u0441\u044F READY.\n\u0424\u0430\u0437\u0430 2 \u2014 \u0441\u043E\u0431\u0440\u0430\u0442\u044C ICP, \u0435\u0441\u043B\u0438 \u043E\u043D \u043D\u0443\u0436\u0435\u043D \u0442\u0438\u043F\u0443 \u0431\u043E\u0442\u0430.\n\u0424\u0430\u0437\u0430 3 \u2014 \u0441\u043E\u0431\u0440\u0430\u0442\u044C \u0441\u0446\u0435\u043D\u0430\u0440\u0438\u0439/\u0441\u043A\u0440\u0438\u043F\u0442 \u043F\u0440\u043E\u0434\u0430\u0436 \u0438\u043B\u0438 \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u043D\u0438\u044F.\n\u0424\u0430\u0437\u0430 4 \u2014 \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0430\u0433\u0435\u043D\u0442\u0430, \u043F\u0440\u043E\u043C\u043F\u0442 \u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C draft \u043B\u0438\u043D\u0442\u0435\u0440\u043E\u043C \u0438 sandbox.\n\u0424\u0430\u0437\u0430 5 \u2014 \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0437\u043D\u0430\u043D\u0438\u044F, behavior, triggers, routing \u0438 \u043D\u0443\u0436\u043D\u044B\u0435 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0438 \u0434\u0430\u043D\u043D\u044B\u0445.\n\u0424\u0430\u0437\u0430 6 \u2014 \u043D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C CRM/follow-up/\u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u043E\u0432, \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u0433\u043E\u0442\u043E\u0432\u043D\u043E\u0441\u0442\u044C \u0438 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u0442\u044C.\n\nFAQ-\u0431\u043E\u0442\u0443 \u0437\u043D\u0430\u043D\u0438\u044F \u043D\u0443\u0436\u043D\u044B \u0434\u043E \u043E\u0441\u043C\u044B\u0441\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u0441\u0442\u0430. Sales/booking/outbound-\u0431\u043E\u0442\u0443 \u0434\u043E \u0444\u0438\u043D\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438 \u043D\u0443\u0436\u043D\u044B ICP,\n\u0443\u0441\u043B\u043E\u0432\u0438\u044F \u0438 \u0441\u0446\u0435\u043D\u0430\u0440\u0438\u0439. CRM \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0430\u0439 \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043E\u0433\u0434\u0430 \u043E\u043D \u043D\u0443\u0436\u0435\u043D \u0437\u0430\u0434\u0430\u0447\u0435. \u0424\u0430\u0437\u044B 2\u20136 \u043C\u043E\u0436\u043D\u043E \u0447\u0435\u0440\u0435\u0434\u043E\u0432\u0430\u0442\u044C; \u043F\u043E\u0441\u043B\u0435\n\u0441\u0432\u043E\u0431\u043E\u0434\u043D\u043E\u0433\u043E \u0432\u043E\u043F\u0440\u043E\u0441\u0430 \u043D\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043B\u044F\u0439 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u043F\u0440\u043E\u0445\u043E\u0434\u0438\u0442\u044C \u0432\u0435\u0441\u044C \u043C\u0430\u0441\u0442\u0435\u0440.\n\n# \u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\n\n- \u041D\u043E\u0432\u044B\u0439 \u0431\u043E\u0442: besales://workflows/platform-setup-from-scratch\n- \u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u0438\u043B\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u0430: besales://workflows/extract-from-document\n- \u041F\u0440\u0430\u0432\u043A\u0430 \u043F\u0440\u043E\u043C\u043F\u0442\u0430: besales://workflows/iterate-with-sandbox\n- CRM / 1\u0421: besales://workflows/connect-crm-from-scratch \u0438\n besales://workflows/connect-datasource-from-scratch\n- \u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0437\u0430\u043F\u0443\u0441\u043A\u0430: besales://workflows/production-readiness-check\n- \u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0435\u043D\u0438\u0435 \u0434\u043E\u043B\u0433\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438: besales://docs/task-state\n- \u0422\u0440\u0438\u0433\u0433\u0435\u0440\u044B, \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435, routing, follow-up, \u043A\u0430\u043C\u043F\u0430\u043D\u0438\u0438 \u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433 tools: \u043D\u0430\u0439\u0434\u0438 \u0447\u0435\u0440\u0435\u0437\n besales_help_search; \u043F\u043E\u043B\u043D\u044B\u0439 \u0438\u043B\u0438 \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u0434\u0435\u043B \u043F\u043E\u043B\u0443\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 besales_help_get.\n";
@@ -5,6 +5,19 @@
5
5
  */
6
6
  export const SERVER_INSTRUCTIONS = `Ты работаешь с Besales/Animaly через MCP и инструменты besales_*.
7
7
 
8
+ # Подтверждение перед правкой (не снимается просьбой «делай сам»)
9
+
10
+ Любая правка — промпт, дожимы, поведение, триггеры, роутинг, расписания, знания, выключение
11
+ параметра — начинается с одного короткого сообщения: что меняешь, где (объект и поле), зачем и что
12
+ это изменит для клиента. Перечисли ВСЕ задуманные правки списком и задай ОДИН вопрос «делать?»;
13
+ по одной не спрашивай. Без ответа не пиши. Прошлое «ок», «настрой сам» и молчание подтверждением
14
+ не считаются; правка вне списка требует нового вопроса. Чтение и показ снимков спроса не требуют.
15
+ Удаление, отправка людям, платная операция и полная замена дополнительно требуют
16
+ explicit_confirmation инструмента. При timeout/5xx после отправленной мутации не повторяй её
17
+ автоматически: исход неизвестен, сначала найди receipt/status.
18
+ После правок перечитай затронутые объекты или status и сообщи одним сообщением: что сделано, что
19
+ осталось, какой следующий шаг и как проверить результат.
20
+
8
21
  # Как начать
9
22
 
10
23
  1. Если компания или состояние задачи неясны, вызови besales_workspace_current. При нескольких
@@ -22,18 +35,13 @@ export const SERVER_INSTRUCTIONS = `Ты работаешь с Besales/Animaly
22
35
  Для аналитики, follow-up и проверки неподдерживаемой области сначала прочитай справку: у этих
23
36
  доменов похожие метрики и соседние операции означают разное, а отсутствие имени ещё не доказывает
24
37
  отсутствие возможности.
25
- 5. После каждого изменения перечитай затронутый объект или status и сообщи: что сделано, что ещё
26
- требуется, какой следующий шаг и как проверить его результат.
27
- 6. Не повторяй успешное полное read с теми же аргументами. Используй уже возвращённый снимок;
38
+ 5. Не повторяй успешное полное read с теми же аргументами. Используй уже возвращённый снимок;
28
39
  перечитывай только после изменения, при неполном ответе или когда изменился фильтр/курсор.
29
40
 
30
41
  # Безопасность и полнота
31
42
 
32
43
  - Не проси токены, пароли и API keys в чате. Провизионинг возвращает browser URL: пользователь
33
44
  вводит секреты там; status опрашивается до READY. VALIDATION_FAILED и EXPIRED не являются READY.
34
- - Перед удалением, отправкой людям, платной операцией или полной заменой покажи план и получи
35
- требуемое инструментом explicit_confirmation. При timeout/5xx после отправленной мутации не
36
- повторяй её автоматически: исход может быть неизвестен, сначала найди receipt/status.
37
45
  - Перед replace-операцией читай полный актуальный снимок. Страница, sample, truncated,
38
46
  sourceTruncated, неизвестный total или readError не являются полной вычиткой.
39
47
  - Таблицу сначала инвентаризируй через besales_workbook_inspect, затем дочитай каждую вкладку через
@@ -1 +1 @@
1
- {"version":3,"file":"server-instructions.js","sourceRoot":"","sources":["../../src/instructions/server-instructions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgElC,CAAC"}
1
+ {"version":3,"file":"server-instructions.js","sourceRoot":"","sources":["../../src/instructions/server-instructions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwElC,CAAC"}
@@ -3272,10 +3272,18 @@
3272
3272
  "format": "uuid"
3273
3273
  },
3274
3274
  "name": {
3275
- "type": "string"
3275
+ "type": "string",
3276
+ "minLength": 1,
3277
+ "maxLength": 100,
3278
+ "pattern": "\\S",
3279
+ "description": "Название, уникальное в рамках агента. Пробелы по краям обрезаются; не длиннее 100 знаков — граница общая с формой интерфейса: форма отправляет название целиком при каждом сохранении, и более длинное оператор из неё уже не сохранил бы."
3276
3280
  },
3277
3281
  "condition": {
3278
- "type": "string"
3282
+ "type": "string",
3283
+ "minLength": 1,
3284
+ "maxLength": 4000,
3285
+ "pattern": "\\S",
3286
+ "description": "Условие срабатывания; уходит в системный промпт агента целиком при каждом сообщении. Пробелы по краям обрезаются; не длиннее 4000 знаков — граница общая с формой интерфейса: форма отправляет условие целиком при каждом сохранении, и более длинное оператор из неё уже не сохранил бы."
3279
3287
  },
3280
3288
  "is_enabled": {
3281
3289
  "type": "boolean"
@@ -11981,6 +11989,10 @@
11981
11989
  "maximum": 365,
11982
11990
  "description": "Не писать контакту, если он получал любую нашу рассылку за N дней"
11983
11991
  },
11992
+ "handoff_from_school_platforms": {
11993
+ "type": "boolean",
11994
+ "description": "ПЕРЕДАЧА: забирать людей с ДРУГИХ площадок GetCourse той же школы. Включённый флаг меняет смысл отбора: берутся ТОЛЬКО люди, чья карточка живёт на других площадках школы (и те, кого прошлая попытка уже перевезла, но сообщение не ушло), а перед отправкой карточка переносится сюда — с перепином на заказ сегмента и остановкой цепочек прежней площадки. Площадки-источники считает сам отбор («вся школа минус своя»), поэтому новая площадка школы подхватывается без правки расписания. Требует сегмента-ПРОДОЛЖЕНИЯ (снят «только нетронутым», без правила повтора): у человека с соседней площадки право первого сообщения уже сожжено. Ещё требует заполненного домена школы у площадки расписания и хотя бы одной другой площадки GetCourse в школе. Выключено — передачи нет."
11995
+ },
11984
11996
  "is_enabled": {
11985
11997
  "type": "boolean",
11986
11998
  "description": "Включено ли расписание. Создавай выключенным и включай после предпросмотра"
@@ -12161,6 +12173,10 @@
12161
12173
  "maximum": 365,
12162
12174
  "description": "Не писать контакту, если он получал любую нашу рассылку за N дней"
12163
12175
  },
12176
+ "handoff_from_school_platforms": {
12177
+ "type": "boolean",
12178
+ "description": "ПЕРЕДАЧА: забирать людей с ДРУГИХ площадок GetCourse той же школы. Включённый флаг меняет смысл отбора: берутся ТОЛЬКО люди, чья карточка живёт на других площадках школы (и те, кого прошлая попытка уже перевезла, но сообщение не ушло), а перед отправкой карточка переносится сюда — с перепином на заказ сегмента и остановкой цепочек прежней площадки. Площадки-источники считает сам отбор («вся школа минус своя»), поэтому новая площадка школы подхватывается без правки расписания. Требует сегмента-ПРОДОЛЖЕНИЯ (снят «только нетронутым», без правила повтора): у человека с соседней площадки право первого сообщения уже сожжено. Ещё требует заполненного домена школы у площадки расписания и хотя бы одной другой площадки GetCourse в школе. Выключено — передачи нет."
12179
+ },
12164
12180
  "is_enabled": {
12165
12181
  "type": "boolean",
12166
12182
  "description": "Включено ли расписание. Создавай выключенным и включай после предпросмотра"
@@ -12284,8 +12300,8 @@
12284
12300
  }
12285
12301
  },
12286
12302
  {
12287
- "name": "besales_broadcast_schedule_pool_snapshots",
12288
- "description": "Суточные снимки пула отбора по всем расписаниям воркспейса. Scope: read:campaigns. Строка на «расписание × локальный день площадки», включая дни без запуска и выключенные расписания. Три состояния РАЗНЫЕ: строки нет — не считали; status=FAILED — считали и не смогли (poolSize/selectedCount = null, причина в error); truncated — снимок упёрся в бюджет строк источника, показано начало окна, а не окно. Читается мгновенно, в отличие от besales_broadcast_schedule_preview.",
12303
+ "name": "besales_broadcast_pool_today",
12304
+ "description": "«Пул сегодня»: сегменты с правилом на площадке — сколько сейчас в пуле и сколько уйдёт. Scope: read:campaigns. Расчёт идёт на сервере фоном, одной выкачкой источника фактов на площадку: вызов заказывает его и сразу отдаёт последний посчитанный (run); activeRun не пуст — вызови ещё раз через минуту с теми же параметрами, это опрос. Строки с расписанием считаются как его тик — параметры вызова на них не действуют; строки без расписания — по параметрам вызова (окно по умолчанию 3 суток), это верхняя граница. local_day — утренний расчёт того дня (история), без фильтров.",
12289
12305
  "inputSchema": {
12290
12306
  "type": "object",
12291
12307
  "properties": {
@@ -12293,21 +12309,86 @@
12293
12309
  "type": "string",
12294
12310
  "description": "UUID воркспейса. Подставляется MCP-сервером из подключения — спрашивать у пользователя не нужно."
12295
12311
  },
12296
- "from": {
12312
+ "platform_id": {
12297
12313
  "type": "string",
12298
- "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
12299
- "description": "Начало периода включительно: локальный день ПЛОЩАДКИ в формате ГГГГ-ММ-ДД. Проверяется форма; существование даты сверяет сервер."
12314
+ "description": "GetCourse-площадка. Не передан — первая активная площадка с расписанием."
12300
12315
  },
12301
- "to": {
12316
+ "window_days": {
12317
+ "type": "integer",
12318
+ "minimum": 1,
12319
+ "maximum": 16,
12320
+ "description": "Окно свежести строк БЕЗ расписания, в сутках (по умолчанию 3). Потолок 16: окно регистраций строки (окно + 14 суток) обязано уложиться в общую выборку 30 суток."
12321
+ },
12322
+ "funnels": {
12323
+ "description": "Коды воронок источника для строк без расписания, либо \"all\" (без фильтра)",
12324
+ "oneOf": [
12325
+ {
12326
+ "type": "string",
12327
+ "enum": [
12328
+ "all"
12329
+ ]
12330
+ },
12331
+ {
12332
+ "type": "array",
12333
+ "items": {
12334
+ "type": "string"
12335
+ },
12336
+ "maxItems": 100
12337
+ }
12338
+ ]
12339
+ },
12340
+ "product_codes": {
12341
+ "description": "Канонические коды продуктов для строк без расписания, либо \"all\" (без фильтра)",
12342
+ "oneOf": [
12343
+ {
12344
+ "type": "string",
12345
+ "enum": [
12346
+ "all"
12347
+ ]
12348
+ },
12349
+ {
12350
+ "type": "array",
12351
+ "items": {
12352
+ "type": "string"
12353
+ },
12354
+ "maxItems": 50
12355
+ }
12356
+ ]
12357
+ },
12358
+ "channels": {
12359
+ "type": "array",
12360
+ "maxItems": 10,
12361
+ "items": {
12362
+ "type": "string",
12363
+ "enum": [
12364
+ "Site",
12365
+ "Email",
12366
+ "SMS",
12367
+ "Telegram",
12368
+ "Facebook",
12369
+ "VK",
12370
+ "Chatium",
12371
+ "WhatsApp",
12372
+ "Viber",
12373
+ "MAX"
12374
+ ]
12375
+ },
12376
+ "description": "Каналы для строк без расписания (GetCourseTransport). Пусто — без ограничения. Канал, который площадка не обслуживает, отвергается 400: школа отвергает набор целиком."
12377
+ },
12378
+ "cooldown_days": {
12379
+ "type": "integer",
12380
+ "minimum": 0,
12381
+ "maximum": 365,
12382
+ "description": "Тихий период строк без расписания, в сутках; 0 — правило выключено."
12383
+ },
12384
+ "local_day": {
12302
12385
  "type": "string",
12303
12386
  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
12304
- "description": "Конец периода включительно: локальный день ПЛОЩАДКИ в формате ГГГГ-ММ-ДД."
12387
+ "description": "Локальный день ПЛОЩАДКИ ГГГГ-ММ-ДД: вернуть утренний расчёт этого дня (история «сегмент × день»). С окном, воронками, продуктами, каналами, кулдауном и force не сочетается."
12305
12388
  },
12306
- "limit": {
12307
- "type": "integer",
12308
- "minimum": 1,
12309
- "maximum": 2000,
12310
- "description": "Сколько строк вернуть, считая от самого свежего дня. По умолчанию 2000. Ответ печатается целиком, поэтому у полного периода это мегабайты текста — спрашивай окно, которое читаешь."
12389
+ "force": {
12390
+ "type": "boolean",
12391
+ "description": "Посчитать в обход свежего (до 5 минут) расчёта — только после своей правки расписания, правила сегмента или запуска."
12311
12392
  }
12312
12393
  },
12313
12394
  "required": []
@@ -12417,7 +12498,7 @@
12417
12498
  "key",
12418
12499
  "minDaysSince"
12419
12500
  ],
12420
- "description": "ПОВТОРНОЕ касание: сегмент уходит тем, у кого названный сегмент был ПОСЛЕДНИМ нашим касанием и кто нам не ответил. Снимает вечный одноразовый claim приветствия — единственную защиту от второго сообщения живому человеку"
12501
+ "description": "ПОВТОРНОЕ касание: сегмент уходит тем, у кого названный сегмент был ПОСЛЕДНИМ касанием — нашей отправкой или волной школы на этой площадке — и кто нам не ответил; нужна живая карточка человека на этой площадке. Снимает вечный одноразовый claim приветствия — единственную защиту от второго сообщения живому человеку"
12421
12502
  },
12422
12503
  "untouchedOnly": {
12423
12504
  "type": "boolean",
@@ -13194,7 +13275,10 @@
13194
13275
  "besales_trigger_claim_list",
13195
13276
  "besales_trigger_claim_reset"
13196
13277
  ],
13197
- "newly_added_in_broadcast_pool_snapshots": [
13278
+ "newly_added_in_broadcast_pool_today": [
13279
+ "besales_broadcast_pool_today"
13280
+ ],
13281
+ "removed_in_broadcast_pool_today_2026_09_11": [
13198
13282
  "besales_broadcast_schedule_pool_snapshots"
13199
13283
  ],
13200
13284
  "newly_added_in_task_state": [
@@ -25,6 +25,7 @@ export declare const broadcastSchedulerTools: (import("./shared.js").ToolDefinit
25
25
  window_to_local?: string | undefined;
26
26
  days_of_week?: number[] | undefined;
27
27
  days_of_month?: number[] | undefined;
28
+ handoff_from_school_platforms?: boolean | undefined;
28
29
  channels?: ("Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX")[] | undefined;
29
30
  channels_mode?: "RESTRICT" | "ADD" | undefined;
30
31
  is_enabled?: boolean | undefined;
@@ -47,6 +48,7 @@ export declare const broadcastSchedulerTools: (import("./shared.js").ToolDefinit
47
48
  window_to_local?: string | undefined;
48
49
  days_of_week?: number[] | undefined;
49
50
  days_of_month?: number[] | undefined;
51
+ handoff_from_school_platforms?: boolean | undefined;
50
52
  channels?: ("Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX")[] | undefined;
51
53
  channels_mode?: "RESTRICT" | "ADD" | undefined;
52
54
  is_enabled?: boolean | undefined;
@@ -60,9 +62,14 @@ export declare const broadcastSchedulerTools: (import("./shared.js").ToolDefinit
60
62
  limit?: number | undefined;
61
63
  }> | import("./shared.js").ToolDefinition<{
62
64
  workspace_id?: string | undefined;
63
- from?: string | undefined;
64
- to?: string | undefined;
65
- limit?: number | undefined;
65
+ platform_id?: string | undefined;
66
+ window_days?: number | undefined;
67
+ funnels?: string[] | "all" | undefined;
68
+ product_codes?: string[] | "all" | undefined;
69
+ channels?: ("Site" | "Email" | "SMS" | "Telegram" | "Facebook" | "VK" | "Chatium" | "WhatsApp" | "Viber" | "MAX")[] | undefined;
70
+ cooldown_days?: number | undefined;
71
+ local_day?: string | undefined;
72
+ force?: boolean | undefined;
66
73
  }> | import("./shared.js").ToolDefinition<{
67
74
  segment_id: string;
68
75
  facets: {
@@ -10,16 +10,28 @@ const DAILY_CAP_MAX = 5000;
10
10
  const FRESHNESS_DAYS_MAX = 78;
11
11
  const COOLDOWN_DAYS_MAX = 365;
12
12
  /**
13
- * Потолок строк в выдаче снимков — паритет с `POOL_SNAPSHOT_LIST_LIMIT` бэкенда.
14
- *
15
- * ⚠️⚠️ Границу обязан знать ИМЕННО агент, а не только сервер: ответ печатается целиком, и полный
16
- * период на две тысячи строк со счётчиками — это мегабайты текста. Инструмент заведён из-за
17
- * таймаута предпросмотра; без потолка он упёрся бы в предел того же рода с другой стороны.
13
+ * Окно свежести строк без расписания в «Пуле сегодня» — паритет с `POOL_TODAY_WINDOW_DAYS_MAX`
14
+ * бэкенда: окно регистраций строки (окно + 14 суток запаса) обязано уложиться в общую выкачку
15
+ * (30 суток). Больше сервер отвергнет 400.
18
16
  */
19
- const POOL_SNAPSHOT_LIST_LIMIT = 2000;
17
+ const POOL_TODAY_WINDOW_DAYS_MAX = 16;
20
18
  const WAIT_HOURS_MAX = 720;
21
19
  /** Локальная дата площадки — та же форма, что у бэкенда. */
22
20
  const LOCAL_DATE_RE = /^\d{4}-\d{2}-\d{2}$/u;
21
+ /**
22
+ * Списки фильтров — ОДНА форма у расписания и у «Пула сегодня»: `'all'` либо список кодов.
23
+ *
24
+ * ⚠️ Границы повторяют DTO бэкенда (`POOL_TODAY_FUNNELS_MAX`, `POOL_TODAY_PRODUCTS_MAX`,
25
+ * `POOL_TODAY_FILTER_VALUE_MAX_LENGTH`): разойдясь, схема пропускала бы то, что сервер отвергает
26
+ * 400-м, и модель узнавала бы о границе из ошибки.
27
+ */
28
+ const FILTER_VALUE_MAX_LENGTH = 64;
29
+ const FUNNELS_MAX = 100;
30
+ const PRODUCTS_MAX = 50;
31
+ const filterListSchema = (max) => z.union([
32
+ z.literal('all'),
33
+ z.array(z.string().trim().min(1).max(FILTER_VALUE_MAX_LENGTH)).max(max),
34
+ ]);
23
35
  const orderSchema = z.enum(['FRESH_FIRST', 'OLD_FIRST']);
24
36
  const anchorSchema = z.enum([
25
37
  'SERIES_END',
@@ -57,10 +69,8 @@ const scheduleShape = {
57
69
  mailing_variant_id: uuidSchema,
58
70
  platform_id: uuidSchema,
59
71
  mechanism: z.literal('cold_welcome'),
60
- funnels: z.union([z.literal('all'), z.array(z.string().trim().min(1).max(64)).max(100)]).optional(),
61
- product_codes: z
62
- .union([z.literal('all'), z.array(z.string().trim().min(1).max(64)).max(50)])
63
- .optional(),
72
+ funnels: filterListSchema(FUNNELS_MAX).optional(),
73
+ product_codes: filterListSchema(PRODUCTS_MAX).optional(),
64
74
  freshness_days: z.number().int().min(1).max(FRESHNESS_DAYS_MAX),
65
75
  window_mode: z.enum(['ROLLING', 'FIXED']).optional(),
66
76
  // ⚠️ ЛОКАЛЬНАЯ дата площадки, а не момент: момент сдвинул бы границу на смещение зоны.
@@ -79,6 +89,7 @@ const scheduleShape = {
79
89
  daily_cap: z.number().int().min(1).max(DAILY_CAP_MAX),
80
90
  selection_order: orderSchema,
81
91
  cooldown_days: z.number().int().min(0).max(COOLDOWN_DAYS_MAX),
92
+ handoff_from_school_platforms: z.boolean().optional().describe('ПЕРЕДАЧА: забирать людей с ДРУГИХ площадок GetCourse той же школы. Включённый флаг меняет смысл отбора: берутся ТОЛЬКО люди, чья карточка живёт на других площадках школы (и те, кого прошлая попытка уже перевезла, но сообщение не ушло), а перед отправкой карточка переносится сюда — с перепином на заказ сегмента и остановкой цепочек прежней площадки. Площадки-источники считает сам отбор («вся школа минус своя»), поэтому новая площадка школы подхватывается без правки расписания. Требует сегмента-ПРОДОЛЖЕНИЯ (снят «только нетронутым», без правила повтора): у человека с соседней площадки право первого сообщения уже сожжено. Ещё требует заполненного домена школы у площадки расписания и хотя бы одной другой площадки GetCourse в школе. Выключено — передачи нет.'),
82
93
  channels: z
83
94
  // ⚠️ Канон транспортов, а не свободная строка: иначе про допустимые значения модель узнаёт
84
95
  // из 400-й ошибки. Ровно этот дефект уже закрыт parity-тестом контракта для соседних тулов.
@@ -115,6 +126,7 @@ const toScheduleBody = (input) => compactObject({
115
126
  dailyCap: input.daily_cap,
116
127
  selectionOrder: input.selection_order,
117
128
  cooldownDays: input.cooldown_days,
129
+ handoffFromSchoolPlatforms: input.handoff_from_school_platforms,
118
130
  channels: input.channels,
119
131
  // ⚠️ Режим передаётся ТОЛЬКО если его задал вызывающий: сам он на поведение не влияет, но
120
132
  // подставлять сюда `RESTRICT` значит записать в строку расписания решение, которого никто
@@ -174,6 +186,13 @@ export const broadcastSchedulerTools = [
174
186
  '⚠️⚠️ factsUnknown — НЕ отсев: эти люди в пуле. Число значит «школу про них ещё не спрашивали», и без него ноль в notReachable читается как «все достижимы». Доставки оно НЕ обещает: тот же прогон опрашивает школу перед подачей (по 300 за раз) и часть из них тогда отсеет — в отчёте прогона эти числа уже пересчитаны.',
175
187
  '⚠️ Если notReachable равен размеру пула, сперва проверь площадку: когда НИ ОДИН выбранный канал ею не обслуживается, недостижимы будут все до единого, и чинится это в настройках площадки, а не в расписании. Предпросмотр в этом случае показывает отдельное предупреждение, а прогон закрывается своей причиной.', '⚠️ unverifiable — «нечем проверить», а НЕ «не подходит»: нет назначения серии, серия ещё идёт, нет длительности просмотра. Эти люди в рассылку не идут, и это правильно: отсутствие данных о явке не равно отсутствию человека на эфире.',
176
188
  '⚠️⚠️ truncatedSeriesSkipped — ЕДИНСТВЕННАЯ источниковая причина, которую чинит сам оператор: выборка упёрлась в потолок строк, и запись о явке серии могла остаться за его границей, поэтому судить о ней нечем. Чинится окном расписания за минуту — сузить свежесть, список воронок или продуктов. До 10.09.2026 это число складывалось с unverifiable и читалось как жалоба на данные школы: не путай их снова.',
189
+ '⚠️⚠️ claimedByHigherPriority — НЕ отсев по данным, а приоритет: человек подходит и под сегмент с БОЛЬШИМ приоритетом, у которого на этой площадке включено расписание ТОГО ЖЕ механизма, он в его окне и фильтрах, и то расписание его возьмёт — или уже отправило ему свой текст, в том числе волной школы. Исключение одно: старшее пишет только нетронутым, а этому человеку мы уже писали ДРУГИМ сегментом — тогда он остаётся младшему. Большое число — не поломка, а мера пересечения; меняется приоритетами сегментов. ⚠️ Число НЕ обещает, что человеку вообще что-то уйдёт: (1) потолок и день запуска старшего не проверяются — упрётся старшее в потолок, излишек ждёт следующего запуска, а при FRESH_FIRST самые старые из него выходят из окна ни с чем; (2) если текст старшего уже ушёл волной школы, подхватить человека может только расписание ПОВТОРА старшего сегмента, и его надо завести отдельно; (3) человек без живой карточки на этой площадке не получит ничего ни от кого — повтор старшего отсечёт его причиной repeatNoCard; (4) если у расписаний РАЗНЫЕ списки воронок, разведение неполно: воронки отсекаются на стороне источника фактов, и строк человека из чужой воронки в снимке нет вовсе — ставь пересекающимся сегментам одинаковые воронки.',
190
+ '⚠️⚠️ repeatNoCard — кандидат на ПОВТОР (прошлое касание годится), но живой карточки на ЭТОЙ площадке у человека нет: чаще всего волну школы записали на эту площадку, а карточка у него на соседней. Без карточки не проверить ответы и дожимы, а импорт карточку здесь не заведёт (обновит соседнюю), поэтому такие люди исключаются. Расписанием это не чинится.',
191
+ '⚠️⚠️ cardOnSiblingPlatform — человек живёт на СОСЕДНЕЙ площадке той же школы GetCourse, а на площадке расписания карточки у него нет. Импорт её сюда не перенесёт: он ищет человека по школе и обновляет ту карточку, что уже есть, — поэтому такие люди исключаются, а не уезжают в импорт (иначе каждый месяц они занимали бы слот дневного потолка и закрывались исходом NOT_IMPORTED). Расписанием не чинится: рассылать надо с той площадки, где человек живёт. Большое число у расписания на новой площадке — норма: люди школы живут на старой.',
192
+ '⚠️⚠️ noMessengerVerdict — школа УЖЕ отвечала, что привязанных мессенджеров у человека нет, и ответ ещё в силе. Карточки в базе у него нет, импорт её не заведёт, поэтому подача сожгла бы слот дневного потолка и слот импортов воркспейса и закрылась бы исходом NOT_IMPORTED на 30 суток. Срок доверия ответу задаётся у ПЛОЩАДКИ (getcourse_settings.reachability_ttl_days, по умолчанию 7 суток; 0 — спрашивать школу каждый раз); когда он истечёт, человек снова уедет в импорт и школу спросят заново. Чинится почтой, но включать её надо В ДВУХ местах: в allowlist ПЛОЩАДКИ (getcourse_settings.available_transports) и в каналах рассылки/расписания. Гейт сужает каналы по allowlist площадки, поэтому Email только в рассылке ничего не меняет — и это верно: канал вне allowlist школа не отправит никогда.',
193
+ '⚠️⚠️ notHandoffCandidate — расписание ПЕРЕДАЧИ (у него включён handoff_from_school_platforms) берёт только людей, чья карточка живёт на ДРУГИХ площадках той же школы и чья серия там уже закончилась (последний шаг календарной цепочки источника позади). Остальные — свои люди площадки, люди без карточек и те, у кого серия ещё идёт, — уходят в это число. У обычного расписания оно всегда ноль.',
194
+ '⚠️⚠️ handoffReturn — этого человека передача уже увозила С ЭТОЙ площадки, и в рамках текущего входа в сегмент он сюда не вернётся: иначе два расписания-продолжения возили бы его по кругу, а каждый переезд необратим. Новый вход спустя время запрету не подлежит. Ненулевое число означает, что у вас кольцо из двух расписаний передачи — это настройка, а не сбой данных.',
195
+ '⚠️⚠️ handoffBlocked — карточку не перенесли: предохранитель школы (идёт серия, действующая заявка, оплата), контактом занят человек (бан, оператор, мьют), личность занята другим процессом либо на площадке-адресате уже есть карточка с этим внешним id (последнее — навсегда). Такие люди в подачу не идут и получают исход HANDOFF_BLOCKED в журнале подач.',
177
196
  'factsAsOf — момент, на который источник считает данные полными. Сильно устаревшее значение означает, что аналитика отстаёт и «не пришедшие» могут быть ложными.',
178
197
  '⚠️⚠️ overlaps — контакты, которых за последнюю неделю подавали ДРУГИЕ расписания. Непустой список означает, что человек рискует получить несколько сообщений: разведи расписания кулдауном или приоритетом сегментов, прежде чем включать.',
179
198
  'byProduct показывает, как отбор разложится по продуктам — крон нарежет подачу этими же блоками.',
@@ -267,41 +286,90 @@ export const broadcastSchedulerTools = [
267
286
  ]),
268
287
  }),
269
288
  /**
270
- * Суточные снимки пула.
289
+ * «Пул сегодня»: сегменты с правилом на площадке — сколько сейчас в пуле и сколько уйдёт.
271
290
  *
272
- * ⚠️⚠️ Существует ровно потому, что `besales_broadcast_schedule_preview` боевого расписания НЕ
273
- * укладывается в таймаут MCP (замер 09.09.2026): он ходит во внешний источник фактов и обходит
274
- * десятки тысяч строк. Снимок читается из своей таблицы мгновенно. Это не замена предпросмотру:
275
- * предпросмотр отвечает «как будет, если поменять правило», снимок — «что было вчера».
291
+ * ⚠️⚠️ Считает СЕРВЕР фоном, одной выкачкой источника фактов на площадку: живой предпросмотр
292
+ * боевого расписания в таймаут MCP не укладывается (замер 09.09.2026). Вызов заказывает расчёт
293
+ * и сразу отдаёт последний посчитанный; повторный вызов с теми же параметрами — опрос, новый
294
+ * расчёт не заводится. С `local_day` — чтение утреннего расчёта того дня (история).
295
+ *
296
+ * ⚠️⚠️ Побочный эффект ЕСТЬ, и инструмент не читающий: вызов без `local_day` — это POST,
297
+ * который заводит расчёт (строка живёт до двух недель) и снимает прежние неначатые заказы того
298
+ * же ключа. Пометка «только чтение» отдала бы его хосту в профиль, где вызовы одобряются без
299
+ * спроса. Идемпотентность объявлена честно: повтор с теми же параметрами переиспользует живой
300
+ * и свежий (до 5 минут) расчёт — на этом и держится опрос; исключение — `force`, он и назван
301
+ * «только после своей правки».
276
302
  */
277
303
  defineTool({
278
- name: 'besales_broadcast_schedule_pool_snapshots',
279
- sideEffect: 'none',
304
+ name: 'besales_broadcast_pool_today',
305
+ sideEffect: 'write',
306
+ reversible: true,
307
+ idempotent: true,
280
308
  requiredFields: [],
281
309
  defaultWorkspaceId: true,
282
310
  schema: z
283
311
  .object({
284
312
  workspace_id: uuidSchema.optional(),
285
- // ⚠️ Проверяется только ФОРМА: `2026-02-30` регуляркой проходит, существование даты
286
- // сверяет сервер. Форма здесь ради того же, ради чего и остальные границы в этом файле —
287
- // чтобы правило было известно ДО вызова, а не приезжало 400-й.
288
- from: z.string().regex(LOCAL_DATE_RE).optional(),
289
- to: z.string().regex(LOCAL_DATE_RE).optional(),
290
- limit: z.number().int().min(1).max(POOL_SNAPSHOT_LIST_LIMIT).optional(),
313
+ platform_id: uuidSchema
314
+ .optional()
315
+ .describe('GetCourse-площадка. Не передан — первая активная площадка с расписанием.'),
316
+ window_days: z.number().int().min(1).max(POOL_TODAY_WINDOW_DAYS_MAX).optional(),
317
+ funnels: filterListSchema(FUNNELS_MAX).optional(),
318
+ product_codes: filterListSchema(PRODUCTS_MAX).optional(),
319
+ channels: z.array(getcourseTransportEnum).max(getcourseTransportEnum.options.length).optional(),
320
+ cooldown_days: z.number().int().min(0).max(COOLDOWN_DAYS_MAX).optional(),
321
+ // ⚠️ Проверяется только ФОРМА: существование даты сверяет сервер.
322
+ local_day: z.string().regex(LOCAL_DATE_RE, 'local_day: дата ГГГГ-ММ-ДД').optional(),
323
+ force: z.boolean().optional(),
291
324
  })
292
- .strict(),
293
- createRequest: (input) => ({
294
- method: 'GET',
295
- path: `/workspaces/${input.workspace_id}/broadcast-schedules/pool-snapshots` +
296
- buildListQuery({ from: input.from, to: input.to, limit: input.limit }),
325
+ .strict()
326
+ .superRefine((input, ctx) => {
327
+ // ⚠️ Утренний расчёт дня считан с настройками по умолчанию: фильтры рядом с днём сервер
328
+ // отвергает 400-й, и узнавать об этом из ошибки модель не должна.
329
+ const withSettings = input.window_days !== undefined ||
330
+ input.funnels !== undefined ||
331
+ input.product_codes !== undefined ||
332
+ input.channels !== undefined ||
333
+ input.cooldown_days !== undefined ||
334
+ input.force !== undefined;
335
+ if (input.local_day !== undefined && withSettings) {
336
+ ctx.addIssue({
337
+ code: z.ZodIssueCode.custom,
338
+ path: ['local_day'],
339
+ message: 'local_day читает утренний расчёт дня с настройками по умолчанию — окно, воронки, продукты, каналы, кулдаун и force с ним не передаются',
340
+ });
341
+ }
297
342
  }),
343
+ createRequest: (input) => input.local_day !== undefined
344
+ ? {
345
+ method: 'GET',
346
+ path: `/workspaces/${input.workspace_id}/broadcast-pool` +
347
+ buildListQuery({ platformId: input.platform_id, day: input.local_day }),
348
+ }
349
+ : {
350
+ method: 'POST',
351
+ path: `/workspaces/${input.workspace_id}/broadcast-pool/refresh`,
352
+ body: compactObject({
353
+ platformId: input.platform_id,
354
+ windowDays: input.window_days,
355
+ funnels: toList(input.funnels),
356
+ products: toList(input.product_codes),
357
+ channels: input.channels,
358
+ cooldownDays: input.cooldown_days,
359
+ force: input.force,
360
+ }),
361
+ },
298
362
  enhanceResponse: (response) => withInstructions(response, [
299
- '⚠️⚠️ Три состояния РАЗНЫЕ, и схлопывать их в ноль нельзя: строки за день нет — снимок не считали; status=FAILED — считали и не смогли (причина в error), poolSize и selectedCount при этом null, а не 0; truncated=true — снимок упёрся в бюджет строк источника, то есть показано НАЧАЛО окна, а не окно.',
300
- '⚠️ truncated в КОРНЕ ответа, рядом с rows, — про ВЫДАЧУ, а не про пул. Потолков два и лечатся они противоположным: если ты передал limit — строк больше ТВОЕГО потолка, подними limit; если не передал — упёрлись в общий потолок выдачи, сузь from/to. Одноимённое поле ВНУТРИ строки — про пул того дня.',
301
- '⚠️ selectedCount значит «отобрано на момент расчёта», а не «уедет сегодня»: день мог быть нерабочим по расписанию, площадка — неактивной, а части отобранных прогон сперва заведёт карточку.',
302
- 'Снимок берётся раз в сутки утром по зоне ПЛОЩАДКИ и ПРИБЛИЖАЕТ момент тика, но с ним не совпадает: скользящее окно свежести привязано к «сейчас» расчёта, а тик срабатывает в своё timeLocal. Точный час — константа бэкенда, наизусть его не называй.',
303
- 'Строки живут дольше расписаний: внешнего ключа нет намеренно, и снимки удалённого расписания остаются в истории — scheduleId в ответе может не найтись в besales_broadcast_schedule_list.',
304
- '⚠️ Ответ печатается ЦЕЛИКОМ. Строк в сутки столько же, сколько расписаний, и без from/limit за год наберутся мегабайты текста: спрашивай окно, которое собираешься читать.',
363
+ '⚠️⚠️ activeRun не пуст — идёт расчёт этих настроек: вызови инструмент ЕЩЁ РАЗ через минуту с теми же параметрами. Повторный вызов — опрос, новый расчёт он не заказывает. run — последний ПОСЧИТАННЫЙ расчёт этих настроек (run.finishedAt — когда); run=null — ещё не считали.',
364
+ '⚠️⚠️ Строка с расписанием (scheduleId не null) считается ТЕМ ЖЕ путём, что его тик: окно, воронки, продукты, каналы и тихий период — самого расписания; параметры вызова на неё не действуют. У выключенного расписания selectedCount значит «уйдёт, если включить». Строка без расписания считается по параметрам вызова (окно window_days, по умолчанию 3 суток; воронки, продукты, каналы, кулдаун), без рассылки и с потолком одного запуска — это верхняя граница того, что дало бы расписание.',
365
+ 'Числа строки: poolSize — кандидаты после гейтов источника; selectedCount — отобрано на момент расчёта (не «уедет сегодня»); отсеяно = poolSize − selectedCount, причины — preview.excludedBy тем же реестром, что у besales_broadcast_schedule_preview; preview.unverifiable — «нечем проверить», отсев источника ДО пула, а не причина отбора.',
366
+ '⚠️ status: COMPUTED — посчитана; FAILED — не смогли (причина в error, числа null, а не 0); SKIPPED — не считается по правилу, код в skip.reason: REPEAT_NEEDS_SCHEDULE (повторному касанию нужно окно не короче skip.minDays — считается только расписанием), WINDOW_NOT_SHARED (окно регистраций шире общей выборки — только расписанием), PLATFORM_SERVES_NO_CHANNELS (площадка не обслуживает ни одного канала), DEADLINE (расчёт упёрся в потолок skip.deadlineMinutes раньше, чем дошёл до строки).',
367
+ '⚠️ preview.truncated=true — «не весь пул»: выборка источника не дошла до начала окна строки, самые давние регистрации не рассмотрены. Совет «сузить свежесть» здесь не годится: выборку обрезал общий расчёт площадки.',
368
+ 'failedRun — отказ (status=FAILED, причина в error) или замена новым заказом того же заказчика (CANCELLED), случившиеся ПОСЛЕ показанного расчёта. factsSource ≠ READY — источник фактов не настроен или выключен: расчёта не будет вовсе.',
369
+ 'force=true — только после своей правки расписания, правила сегмента или запуска: без него свежий (до 5 минут) расчёт тех же настроек переиспользуется. Опрашивая идущий расчёт, force НЕ передавай — он заказал бы ещё один расчёт следом. local_day — утренний расчёт того дня (история «сегмент × день»), всегда с настройками по умолчанию.',
370
+ '⚠️ Вызов с ДРУГИМИ параметрами снимает твой прежний неначатый заказ (расчёт идёт по одному на всю систему). Сравнивая площадки или окна, дождись готовности одной комбинации и только потом заказывай следующую — иначе ни одна не досчитается.',
371
+ 'Суммы по строкам не называй «людьми»: человек в двух сегментах посчитан дважды. Поимённых списков в ответе нет — людей смотрят в интерфейсе, под правом на контакты.',
372
+ 'Сводка выкачки у run: fetchedRows (строк источника), fetchTruncated (выборка упёрлась в бюджет — у строк она отзывается preview.truncated), registeredFrom/registeredTo (окно регистраций), trigger (MORNING — утренний расчёт истории, ON_DEMAND — заказанный), settings (настройки строк без расписания). Называй их, объясняя расхождение чисел между днями.',
305
373
  ]),
306
374
  }),
307
375
  defineTool({
@@ -326,10 +394,11 @@ export const broadcastSchedulerTools = [
326
394
  // приходят непроверяемыми, и людям не уйдёт ничего.
327
395
  prelist: z.enum(['YES', 'NO', 'ANY']).optional(),
328
396
  /**
329
- * ⚠️⚠️ ПОВТОРНОЕ касание. Сегмент уходит тем, у кого `key` был ПОСЛЕДНИМ нашим
330
- * касанием и кто нам не ответил. Снимает вечный одноразовый claim приветствия —
331
- * единственную структурную защиту от второго сообщения живому человеку, — поэтому
332
- * порог снизу зеркалит серверную константу и здесь: ниже 30 суток сервер откажет.
397
+ * ⚠️⚠️ ПОВТОРНОЕ касание. Сегмент уходит тем, у кого `key` был ПОСЛЕДНИМ касанием —
398
+ * нашей отправкой или волной школы на этой площадке — и кто нам не ответил. Снимает
399
+ * вечный одноразовый claim приветствия — единственную структурную защиту от второго
400
+ * сообщения живому человеку, — поэтому порог снизу зеркалит серверную константу и здесь:
401
+ * ниже 30 суток сервер откажет.
333
402
  */
334
403
  previousSegment: z
335
404
  .object({