@besales/mcp 0.46.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.
Files changed (182) hide show
  1. package/README.md +96 -55
  2. package/dist/auth/connection-store.d.ts +21 -1
  3. package/dist/auth/connection-store.js +46 -2
  4. package/dist/auth/connection-store.js.map +1 -1
  5. package/dist/auth/oauth-client.d.ts +5 -1
  6. package/dist/auth/oauth-client.js +22 -12
  7. package/dist/auth/oauth-client.js.map +1 -1
  8. package/dist/cli.js +14 -5
  9. package/dist/cli.js.map +1 -1
  10. package/dist/http/api-client.d.ts +16 -1
  11. package/dist/http/api-client.js +50 -2
  12. package/dist/http/api-client.js.map +1 -1
  13. package/dist/instructions/server-instructions.d.ts +4 -13
  14. package/dist/instructions/server-instructions.js +76 -274
  15. package/dist/instructions/server-instructions.js.map +1 -1
  16. package/dist/prompts/registry.d.ts +15 -0
  17. package/dist/prompts/registry.js +83 -0
  18. package/dist/prompts/registry.js.map +1 -0
  19. package/dist/resources/concepts/feedback-sheets.md +7 -4
  20. package/dist/resources/concepts/handoff.md +4 -1
  21. package/dist/resources/concepts/sandbox.md +14 -5
  22. package/dist/resources/concepts/triggers.md +6 -2
  23. package/dist/resources/concepts/workbook-classification.md +26 -21
  24. package/dist/resources/docs/campaigns.md +20 -0
  25. package/dist/resources/docs/follow-up.md +19 -0
  26. package/dist/resources/docs/platforms.md +2 -2
  27. package/dist/resources/docs/routing.md +18 -0
  28. package/dist/resources/docs/task-state.md +30 -0
  29. package/dist/resources/docs/trigger-actions.md +28 -0
  30. package/dist/resources/docs/variables.md +18 -0
  31. package/dist/resources/registry.js +51 -2
  32. package/dist/resources/registry.js.map +1 -1
  33. package/dist/resources/workflows/extract-from-document.md +8 -1
  34. package/dist/resources/workflows/iterate-with-sandbox.md +5 -2
  35. package/dist/resources/workflows/platform-setup-from-scratch.md +90 -2
  36. package/dist/resources/workflows/production-readiness-check.md +22 -18
  37. package/dist/schemas/mcp-tools.json +1139 -96
  38. package/dist/server.d.ts +2 -0
  39. package/dist/server.js +8 -2
  40. package/dist/server.js.map +1 -1
  41. package/dist/tasks/task-state-store.d.ts +68 -0
  42. package/dist/tasks/task-state-store.js +278 -0
  43. package/dist/tasks/task-state-store.js.map +1 -0
  44. package/dist/tools/annotations.d.ts +7 -0
  45. package/dist/tools/annotations.js +16 -0
  46. package/dist/tools/annotations.js.map +1 -0
  47. package/dist/tools/contracts.js +7 -1
  48. package/dist/tools/contracts.js.map +1 -1
  49. package/dist/tools/definitions/agent-design.d.ts +41 -20
  50. package/dist/tools/definitions/agent-design.js +189 -19
  51. package/dist/tools/definitions/agent-design.js.map +1 -1
  52. package/dist/tools/definitions/analytics.d.ts +40 -0
  53. package/dist/tools/definitions/analytics.js +233 -0
  54. package/dist/tools/definitions/analytics.js.map +1 -0
  55. package/dist/tools/definitions/broadcast-analytics.js +12 -0
  56. package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
  57. package/dist/tools/definitions/broadcast-mailing-variants.d.ts +2 -0
  58. package/dist/tools/definitions/broadcast-mailing-variants.js +10 -0
  59. package/dist/tools/definitions/broadcast-mailing-variants.js.map +1 -1
  60. package/dist/tools/definitions/broadcast-scheduler.d.ts +14 -1
  61. package/dist/tools/definitions/broadcast-scheduler.js +148 -12
  62. package/dist/tools/definitions/broadcast-scheduler.js.map +1 -1
  63. package/dist/tools/definitions/contacts.d.ts +15 -0
  64. package/dist/tools/definitions/contacts.js +84 -0
  65. package/dist/tools/definitions/contacts.js.map +1 -0
  66. package/dist/tools/definitions/crm-platform.d.ts +2 -0
  67. package/dist/tools/definitions/crm-platform.js +75 -5
  68. package/dist/tools/definitions/crm-platform.js.map +1 -1
  69. package/dist/tools/definitions/datasource.d.ts +1 -0
  70. package/dist/tools/definitions/datasource.js +16 -1
  71. package/dist/tools/definitions/datasource.js.map +1 -1
  72. package/dist/tools/definitions/dialogue-audit.d.ts +2 -2
  73. package/dist/tools/definitions/dialogue-audit.js +54 -16
  74. package/dist/tools/definitions/dialogue-audit.js.map +1 -1
  75. package/dist/tools/definitions/dialogue-export.d.ts +1 -1
  76. package/dist/tools/definitions/dialogue-export.js +12 -0
  77. package/dist/tools/definitions/dialogue-export.js.map +1 -1
  78. package/dist/tools/definitions/external-api-channels.js +39 -12
  79. package/dist/tools/definitions/external-api-channels.js.map +1 -1
  80. package/dist/tools/definitions/follow-up-funnel-test.js +4 -0
  81. package/dist/tools/definitions/follow-up-funnel-test.js.map +1 -1
  82. package/dist/tools/definitions/follow-up-setup.js +3 -0
  83. package/dist/tools/definitions/follow-up-setup.js.map +1 -1
  84. package/dist/tools/definitions/follow-up.d.ts +2 -1
  85. package/dist/tools/definitions/follow-up.js +11 -0
  86. package/dist/tools/definitions/follow-up.js.map +1 -1
  87. package/dist/tools/definitions/getcourse-anchor-refresh.d.ts +3 -0
  88. package/dist/tools/definitions/getcourse-anchor-refresh.js +29 -2
  89. package/dist/tools/definitions/getcourse-anchor-refresh.js.map +1 -1
  90. package/dist/tools/definitions/getcourse-cold-welcome.d.ts +12 -2
  91. package/dist/tools/definitions/getcourse-cold-welcome.js +79 -4
  92. package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
  93. package/dist/tools/definitions/getcourse-wave.js +14 -0
  94. package/dist/tools/definitions/getcourse-wave.js.map +1 -1
  95. package/dist/tools/definitions/help.d.ts +8 -0
  96. package/dist/tools/definitions/help.js +219 -0
  97. package/dist/tools/definitions/help.js.map +1 -0
  98. package/dist/tools/definitions/knowledge.d.ts +27 -5
  99. package/dist/tools/definitions/knowledge.js +200 -33
  100. package/dist/tools/definitions/knowledge.js.map +1 -1
  101. package/dist/tools/definitions/link-tracking.js +9 -0
  102. package/dist/tools/definitions/link-tracking.js.map +1 -1
  103. package/dist/tools/definitions/model-comparison.js +6 -0
  104. package/dist/tools/definitions/model-comparison.js.map +1 -1
  105. package/dist/tools/definitions/operational-overview.d.ts +3 -0
  106. package/dist/tools/definitions/operational-overview.js +23 -0
  107. package/dist/tools/definitions/operational-overview.js.map +1 -0
  108. package/dist/tools/definitions/operator-workflow.d.ts +20 -0
  109. package/dist/tools/definitions/operator-workflow.js +114 -0
  110. package/dist/tools/definitions/operator-workflow.js.map +1 -0
  111. package/dist/tools/definitions/platform-setup.d.ts +26 -3
  112. package/dist/tools/definitions/platform-setup.js +209 -7
  113. package/dist/tools/definitions/platform-setup.js.map +1 -1
  114. package/dist/tools/definitions/scheduled-tasks.js +2 -0
  115. package/dist/tools/definitions/scheduled-tasks.js.map +1 -1
  116. package/dist/tools/definitions/session.js +103 -5
  117. package/dist/tools/definitions/session.js.map +1 -1
  118. package/dist/tools/definitions/shared.d.ts +154 -11
  119. package/dist/tools/definitions/shared.js +67 -9
  120. package/dist/tools/definitions/shared.js.map +1 -1
  121. package/dist/tools/definitions/task-state.d.ts +76 -0
  122. package/dist/tools/definitions/task-state.js +301 -0
  123. package/dist/tools/definitions/task-state.js.map +1 -0
  124. package/dist/tools/definitions/trigger-contact-claims.js +2 -0
  125. package/dist/tools/definitions/trigger-contact-claims.js.map +1 -1
  126. package/dist/tools/definitions.d.ts +273 -31
  127. package/dist/tools/definitions.js +12 -0
  128. package/dist/tools/definitions.js.map +1 -1
  129. package/dist/tools/description-localization.d.ts +2 -0
  130. package/dist/tools/description-localization.js +46 -0
  131. package/dist/tools/description-localization.js.map +1 -0
  132. package/dist/tools/incomplete-list.d.ts +23 -0
  133. package/dist/tools/incomplete-list.js +39 -0
  134. package/dist/tools/incomplete-list.js.map +1 -0
  135. package/dist/tools/inventory.d.ts +10 -0
  136. package/dist/tools/inventory.js +49 -0
  137. package/dist/tools/inventory.js.map +1 -0
  138. package/dist/tools/registry-mapping-cases-core.js +197 -2
  139. package/dist/tools/registry-mapping-cases-core.js.map +1 -1
  140. package/dist/tools/registry-mapping-cases-platform.js +69 -0
  141. package/dist/tools/registry-mapping-cases-platform.js.map +1 -1
  142. package/dist/tools/registry.d.ts +2 -0
  143. package/dist/tools/registry.js +60 -8
  144. package/dist/tools/registry.js.map +1 -1
  145. package/dist/tools/result-envelope.d.ts +46 -0
  146. package/dist/tools/result-envelope.js +184 -0
  147. package/dist/tools/result-envelope.js.map +1 -0
  148. package/dist/tools/result.d.ts +41 -3
  149. package/dist/tools/result.js +229 -27
  150. package/dist/tools/result.js.map +1 -1
  151. package/dist/tools/tool-title.d.ts +2 -0
  152. package/dist/tools/tool-title.js +12 -0
  153. package/dist/tools/tool-title.js.map +1 -0
  154. package/dist/tools/toolsets.d.ts +37 -0
  155. package/dist/tools/toolsets.js +64 -0
  156. package/dist/tools/toolsets.js.map +1 -0
  157. package/dist/tools/verify-with.d.ts +5 -0
  158. package/dist/tools/verify-with.js +36 -0
  159. package/dist/tools/verify-with.js.map +1 -0
  160. package/dist/types/api-contract.gen.d.ts +1433 -74
  161. package/dist/utils/logger.d.ts +11 -0
  162. package/dist/utils/logger.js +64 -8
  163. package/dist/utils/logger.js.map +1 -1
  164. package/docs/agent-usage-guide.full.ru.md +20 -15
  165. package/docs/agent-usage-guide.ru.md +29 -16
  166. package/docs/async-operation-lifecycle.md +46 -0
  167. package/docs/connect.ru.md +120 -0
  168. package/docs/evals/model-behavior-scorecard.md +80 -0
  169. package/docs/failure-semantics.md +56 -0
  170. package/docs/help-navigation.md +48 -0
  171. package/docs/host-compatibility-matrix.md +153 -0
  172. package/docs/host-setup.md +22 -6
  173. package/docs/operation-coverage.md +114 -0
  174. package/docs/pii-policy.md +46 -0
  175. package/docs/response-size-budget.md +150 -0
  176. package/docs/task-state.md +58 -0
  177. package/docs/tool-effects.md +46 -0
  178. package/docs/tool-surface.md +91 -0
  179. package/package.json +6 -2
  180. package/scripts/model-eval-server.js +213 -0
  181. package/scripts/probe-mcp-protocol.js +134 -0
  182. package/scripts/run-model-eval.js +447 -0
@@ -1,11 +1,21 @@
1
1
  import { z } from 'zod';
2
+ import { assertCompleteList } from '../incomplete-list.js';
2
3
  import { followUpSetupTools } from './follow-up-setup.js';
3
4
  import { getCourseWaveTools } from './getcourse-wave.js';
4
5
  import { normalizeTriggerActions } from '../trigger-action-config.js';
5
- import { agentOutputConfigSchema, agentRuntimeConfigSchema, agentScopeSchema, agentToolPatchSchema, anyObjectSchema, behaviorErrorHandlingSchema, behaviorGreetingSchema, behaviorMediaHandlingSchema, behaviorMessageFilterSchema, behaviorMessageSplittingSchema, behaviorOperatorScheduleSchema, behaviorPrivacySchema, behaviorTypingBehaviorSchema, behaviorUrlHandlingSchema, buildListQuery, compactObject, defineTool, feedbackSheetRowSchema, mapBehaviorErrorHandlingInput, mapBehaviorGreetingInput, mapBehaviorMediaHandlingInput, mapBehaviorOperatorScheduleInput, mapBehaviorTypingInput, mapBehaviorUrlHandlingInput, mapOutputConfigInput, mapPipelineAutoFinishInput, mapPipelineCrmBehaviorInput, mapPlatformAccessControlInput, mapPlatformBitrix24BotSettingsInput, mapPlatformCrmBehaviorInput, mapPlatformGeneralSettingsInput, mapPlatformGetcourseSettingsInput, mapPlatformFunnelAnalyticsInput, mapPlatformInstagramCommentInput, mapPlatformSalebotSettingsInput, mapPlatformSmsgorodSettingsInput, mapPlatformVariablesConfigInput, mapPlatformWidgetMarketingInput, mapRuntimeConfigInput, modelLaneSchema, pipelineAutoFinishSchema, pipelineCrmBehaviorSchema, platformAccessControlSchema, platformBitrix24BotSettingsSchema, platformCrmBehaviorSchema, platformGeneralSettingsSchema, platformGetcourseSettingsSchema, platformFunnelAnalyticsSchema, platformInstagramCommentSchema, platformSalebotSettingsSchema, platformSetupConfirmationSchema, platformSmsgorodSettingsSchema, platformVariablesConfigSchema, mapPromptPatchOperationInput, platformWidgetMarketingSchema, PROMPT_BATCH_IDEMPOTENCY_KEY_MAX_LENGTH, PROMPT_BATCH_MAX_AGENTS, PROMPT_DIFF_MAX_LINES_LIMIT, promptPatchOperationSchema, routingRuleConditionSchema, routingRuleLeadStatusSchema, routingStrategySchema, setupConfirmation, triggerScopeSchema, uuidSchema, withInstructions, } from './shared.js';
6
+ import { PLATFORM_AGENTS_MAX_PAGE_SIZE, agentOutputConfigSchema, agentRuntimeConfigSchema, agentScopeSchema, agentToolPatchSchema, anyObjectSchema, behaviorErrorHandlingSchema, behaviorGreetingSchema, behaviorMediaHandlingSchema, behaviorMessageFilterSchema, behaviorMessageSplittingSchema, behaviorOperatorScheduleSchema, behaviorPrivacySchema, behaviorTypingBehaviorSchema, behaviorUrlHandlingSchema, buildListQuery, compactObject, defineTool, feedbackSheetRowSchema, mapBehaviorErrorHandlingInput, mapBehaviorGreetingInput, mapBehaviorMediaHandlingInput, mapBehaviorOperatorScheduleInput, mapBehaviorTypingInput, mapBehaviorUrlHandlingInput, mapOutputConfigInput, mapPipelineAutoFinishInput, mapPipelineCrmBehaviorInput, mapPlatformAccessControlInput, mapPlatformBitrix24BotSettingsInput, mapPlatformCrmBehaviorInput, mapPlatformGeneralSettingsInput, mapPlatformGetcourseSettingsInput, mapPlatformFunnelAnalyticsInput, mapPlatformInstagramCommentInput, mapPlatformSalebotSettingsInput, mapPlatformSmsgorodSettingsInput, mapPlatformVariablesConfigInput, mapPlatformWidgetMarketingInput, mapRuntimeConfigInput, modelLaneSchema, pipelineAutoFinishSchema, pipelineCrmBehaviorSchema, platformAccessControlSchema, platformBitrix24BotSettingsSchema, platformCrmBehaviorSchema, platformGeneralSettingsSchema, platformGetcourseSettingsSchema, platformFunnelAnalyticsSchema, platformInstagramCommentSchema, platformSalebotSettingsSchema, platformSetupConfirmationSchema, platformSmsgorodSettingsSchema, platformVariablesConfigSchema, mapPromptPatchOperationInput, platformWidgetMarketingSchema, PROMPT_BATCH_IDEMPOTENCY_KEY_MAX_LENGTH, PROMPT_BATCH_MAX_AGENTS, PROMPT_DIFF_MAX_LINES_LIMIT, promptPatchOperationSchema, routingRuleConditionSchema, routingRuleLeadStatusSchema, routingStrategySchema, setupConfirmation, triggerScopeSchema, uuidSchema, withInstructions, } from './shared.js';
7
+ /**
8
+ * Потолки названия и условия триггера — зеркала `AGENT_TRIGGER_NAME_MAX_LENGTH` и
9
+ * `AGENT_TRIGGER_CONDITION_MAX_LENGTH` бэкенда. Границы общие с формой интерфейса: форма шлёт
10
+ * все поля целиком на каждом сохранении, и записанное здесь значение длиннее потолка оператор
11
+ * уже не смог бы сохранить из неё.
12
+ */
13
+ const TRIGGER_NAME_MAX_LENGTH = 100;
14
+ const TRIGGER_CONDITION_MAX_LENGTH = 4000;
6
15
  export const platformSetupTools = [
7
16
  defineTool({
8
17
  name: 'besales_workspace_overview',
18
+ sideEffect: 'none',
9
19
  requiredFields: [],
10
20
  defaultWorkspaceId: true,
11
21
  schema: z.object({
@@ -22,36 +32,178 @@ export const platformSetupTools = [
22
32
  'После overview перейди на drill-down: `besales_platform_context_get` для конкретной платформы, `besales_agent_list` для агентов внутри неё.',
23
33
  ]),
24
34
  }),
35
+ defineTool({
36
+ name: 'besales_workspace_navigate',
37
+ sideEffect: 'none',
38
+ closedWorld: true,
39
+ requiredFields: ['intent'],
40
+ defaultWorkspaceId: true,
41
+ resultPolicy: { neverTruncate: true },
42
+ schema: z
43
+ .object({
44
+ workspace_id: uuidSchema.optional(),
45
+ intent: z.enum([
46
+ 'CREATE_BOT',
47
+ 'IMPROVE_AGENT',
48
+ 'DIAGNOSE_CONTACT',
49
+ 'AUDIT_DIALOGUES',
50
+ 'CAMPAIGN_REPORT',
51
+ 'CONNECT_CRM',
52
+ 'CONNECT_DATASOURCE',
53
+ 'CONFIGURE_FOLLOWUP',
54
+ 'CONTINUE_TASK',
55
+ 'FREEFORM',
56
+ ]),
57
+ bot_type: z.enum(['FAQ', 'SALES', 'BOOKING', 'OUTBOUND', 'SUPPORT', 'UNKNOWN']).optional(),
58
+ platform_id: uuidSchema.optional(),
59
+ agent_id: uuidSchema.optional(),
60
+ contact_id: uuidSchema.optional(),
61
+ task_id: uuidSchema.optional(),
62
+ question: z.string().trim().min(2).max(500).optional(),
63
+ })
64
+ .strict(),
65
+ createRequest: (input) => ({
66
+ method: 'POST',
67
+ path: `/workspaces/${input.workspace_id}/navigation`,
68
+ body: compactObject({
69
+ intent: input.intent,
70
+ botType: input.bot_type,
71
+ platformId: input.platform_id,
72
+ agentId: input.agent_id,
73
+ contactId: input.contact_id,
74
+ taskId: input.task_id,
75
+ question: input.question,
76
+ }),
77
+ }),
78
+ enhanceResponse: (response) => withInstructions(response, [
79
+ 'next.tool и next.arguments — один адресный следующий шаг; placeholders перечислены в requiredUserInput и не должны угадываться.',
80
+ 'Сохранённый overview — evidence только на момент ответа. Перед записью перечитай выбранный объект, а после записи выполни next.verifyWith.',
81
+ 'CREATE_BOT учитывает bot_type: FAQ не требует ICP/CRM автоматически, SALES/BOOKING/OUTBOUND требуют ICP и условий до доказательства готовности.',
82
+ 'FREEFORM возвращает help route и не запускает обязательный шестишаговый мастер.',
83
+ ]),
84
+ }),
25
85
  defineTool({
26
86
  name: 'besales_platform_context_get',
87
+ sideEffect: 'none',
27
88
  requiredFields: ['platform_id'],
89
+ resultPolicy: {
90
+ neverTruncate: true,
91
+ droppablePaths: ['agents[].baseSystemPrompt'],
92
+ narrowingHint: 'Снимок канала отдаётся целиком и на канале с десятками агентов не помещается в ответ. Работайте по одному агенту: besales_agent_list для перечня, besales_prompt_patch_get для промпта.',
93
+ },
28
94
  schema: z.object({
29
95
  platform_id: uuidSchema,
96
+ sections: z
97
+ .array(z.enum([
98
+ 'platform',
99
+ 'agent_summaries',
100
+ 'agents_full',
101
+ 'router',
102
+ 'behavior',
103
+ 'follow_up',
104
+ 'pipeline_settings',
105
+ 'readiness',
106
+ ]))
107
+ .min(1)
108
+ .optional(),
30
109
  }),
31
110
  createRequest: (input) => ({
32
111
  method: 'GET',
33
- path: `/platforms/${input.platform_id}/setup/context`,
112
+ path: `/platforms/${input.platform_id}/setup/context` +
113
+ (input.sections
114
+ ? `?sections=${encodeURIComponent(input.sections.join(','))}`
115
+ : ''),
34
116
  }),
35
117
  enhanceResponse: (response) => withInstructions(response, [
36
- 'Use this sanitized context first for Platform Setup Bridge flows.',
118
+ 'Для точечного чтения передай sections; agent_summaries не содержит полный промпт, agents_full содержит.',
37
119
  'Read readiness flags, then call targeted mutation tools. Do not ask the user for workspace_id.',
38
120
  'Prompt content changes still go through besales_prompt_* tools and besales_prompt_finalize.',
39
121
  ]),
40
122
  }),
123
+ defineTool({
124
+ name: 'besales_trigger_action_catalog_get',
125
+ sideEffect: 'none',
126
+ requiredFields: ['platform_id'],
127
+ resultPolicy: { neverTruncate: true },
128
+ schema: z.object({
129
+ platform_id: uuidSchema,
130
+ action_type: z.string().trim().min(1).optional(),
131
+ }),
132
+ createRequest: (input) => ({
133
+ method: 'GET',
134
+ path: `/platforms/${input.platform_id}/setup/trigger-action-catalog` +
135
+ (input.action_type ? `?actionType=${encodeURIComponent(input.action_type)}` : ''),
136
+ }),
137
+ enhanceResponse: (response) => withInstructions(response, [
138
+ 'Каталог построен из боевого CreateTriggerActionDto и канона TRIGGER_ACTION_CONFIG.',
139
+ 'Перед созданием нового actionType запроси его отдельно через action_type и используй minimalExample без угадывания имени config-поля.',
140
+ 'После записи выполни verification из записи каталога; перечитывание контекста проверяет сохранение, но не внешний эффект.',
141
+ ]),
142
+ }),
41
143
  defineTool({
42
144
  name: 'besales_agent_list',
145
+ sideEffect: 'none',
43
146
  requiredFields: ['platform_id'],
147
+ resultPolicy: { neverTruncate: true },
44
148
  schema: z.object({
45
149
  platform_id: uuidSchema,
150
+ limit: z.number().int().min(1).max(PLATFORM_AGENTS_MAX_PAGE_SIZE).optional(),
151
+ cursor: z.string().min(1).optional(),
152
+ query: z.string().min(1).optional(),
153
+ }),
154
+ createRequest: (input) => {
155
+ const query = new URLSearchParams();
156
+ if (input.limit !== undefined)
157
+ query.set('limit', String(input.limit));
158
+ if (input.cursor)
159
+ query.set('cursor', input.cursor);
160
+ if (input.query)
161
+ query.set('q', input.query);
162
+ const suffix = query.size > 0 ? `?${query.toString()}` : '';
163
+ return { method: 'GET', path: `/platforms/${input.platform_id}/agents${suffix}` };
164
+ },
165
+ enhanceResponse: (response, input) => assertCompleteList(response, {
166
+ pageRequested: input.limit !== undefined || input.cursor !== undefined,
167
+ toolName: 'besales_agent_list',
168
+ howToPage: `Повтори вызов с limit до ${PLATFORM_AGENTS_MAX_PAGE_SIZE} и cursor из ответа, пока cursor не станет пустым.`,
169
+ }),
170
+ }),
171
+ defineTool({
172
+ name: 'besales_agent_get',
173
+ sideEffect: 'none',
174
+ requiredFields: ['agent_id'],
175
+ resultPolicy: { neverTruncate: true },
176
+ schema: z.object({
177
+ agent_id: uuidSchema,
46
178
  }),
47
179
  createRequest: (input) => ({
48
180
  method: 'GET',
49
- path: `/platforms/${input.platform_id}/agents`,
181
+ path: `/agents/${input.agent_id}`,
50
182
  }),
51
183
  }),
184
+ defineTool({
185
+ name: 'besales_agent_readiness_get',
186
+ sideEffect: 'none',
187
+ closedWorld: true,
188
+ requiredFields: ['agent_id'],
189
+ resultPolicy: { neverTruncate: true },
190
+ schema: z.object({ agent_id: uuidSchema }).strict(),
191
+ createRequest: (input) => ({
192
+ method: 'GET',
193
+ path: `/agents/${input.agent_id}/readiness`,
194
+ }),
195
+ enhanceResponse: (response) => withInstructions(response, [
196
+ 'Сейчас readiness всегда отвечает NOT_PROVEN: API не фиксирует версию зависимых настроек (behavior, routing, triggers, knowledge, ICP), и повтор sandbox этого не снимает. Не обещай пользователю READY.',
197
+ 'Выполни адресные пункты missing и перечитай readiness; promptAndAgentCurrent=true означает только актуальность промпта и записи агента.',
198
+ 'passRate не является quality. Нужны COMPLETED, свежая конфигурация, findings, qualityRate и checksRate с expectations.',
199
+ 'crmAuthorization=NOT_EVALUATED не подтверждает live-доступ CRM; проверяй его отдельной health/authorization операцией, если CRM нужна сценарию.',
200
+ ]),
201
+ }),
52
202
  defineTool({
53
203
  name: 'besales_agent_variable_overrides_get',
204
+ sideEffect: 'none',
54
205
  requiredFields: ['platform_id', 'agent_id'],
206
+ resultPolicy: { neverTruncate: true },
55
207
  schema: z.object({
56
208
  platform_id: uuidSchema,
57
209
  agent_id: uuidSchema,
@@ -68,6 +220,7 @@ export const platformSetupTools = [
68
220
  }),
69
221
  defineTool({
70
222
  name: 'besales_getcourse_departments_list',
223
+ sideEffect: 'none',
71
224
  requiredFields: ['platform_id'],
72
225
  schema: z.object({
73
226
  platform_id: uuidSchema,
@@ -84,6 +237,7 @@ export const platformSetupTools = [
84
237
  ...getCourseWaveTools,
85
238
  defineTool({
86
239
  name: 'besales_wazzup_templates_list',
240
+ sideEffect: 'none',
87
241
  requiredFields: ['platform_id'],
88
242
  defaultWorkspaceId: true,
89
243
  schema: z.object({
@@ -102,6 +256,7 @@ export const platformSetupTools = [
102
256
  }),
103
257
  defineTool({
104
258
  name: 'besales_wazzup_wave_import',
259
+ sideEffect: 'spend',
105
260
  requiredFields: ['platform_id', 'template_guid', 'contacts'],
106
261
  defaultWorkspaceId: true,
107
262
  schema: z
@@ -168,6 +323,7 @@ export const platformSetupTools = [
168
323
  }),
169
324
  defineTool({
170
325
  name: 'besales_wazzup_wave_status',
326
+ sideEffect: 'none',
171
327
  requiredFields: ['job_id'],
172
328
  defaultWorkspaceId: true,
173
329
  schema: z.object({
@@ -187,6 +343,7 @@ export const platformSetupTools = [
187
343
  }),
188
344
  defineTool({
189
345
  name: 'besales_agent_create',
346
+ sideEffect: 'write',
190
347
  requiredFields: ['platform_id', 'name', 'model_lane'],
191
348
  schema: z.object({
192
349
  platform_id: uuidSchema,
@@ -233,6 +390,7 @@ export const platformSetupTools = [
233
390
  }),
234
391
  defineTool({
235
392
  name: 'besales_agent_clone',
393
+ sideEffect: 'write',
236
394
  requiredFields: ['platform_id', 'source_agent_id', 'name'],
237
395
  schema: z.object({
238
396
  // Платформа-источник; клон приземляется на неё же (cross-platform не поддерживается).
@@ -260,6 +418,7 @@ export const platformSetupTools = [
260
418
  }),
261
419
  defineTool({
262
420
  name: 'besales_agent_update',
421
+ sideEffect: 'write',
263
422
  requiredFields: ['platform_id', 'agent_id'],
264
423
  schema: z.object({
265
424
  platform_id: uuidSchema,
@@ -325,6 +484,7 @@ export const platformSetupTools = [
325
484
  // В v2 заменён post_processors (Routing Studio Critic node) + post_processor_bindings.
326
485
  defineTool({
327
486
  name: 'besales_agent_tools_update',
487
+ sideEffect: 'write',
328
488
  requiredFields: ['platform_id', 'agent_id', 'tools'],
329
489
  schema: z.object({
330
490
  platform_id: uuidSchema,
@@ -346,6 +506,7 @@ export const platformSetupTools = [
346
506
  }),
347
507
  defineTool({
348
508
  name: 'besales_router_update',
509
+ sideEffect: 'write',
349
510
  requiredFields: ['platform_id'],
350
511
  schema: z.object({
351
512
  platform_id: uuidSchema,
@@ -377,6 +538,7 @@ export const platformSetupTools = [
377
538
  }),
378
539
  defineTool({
379
540
  name: 'besales_routing_rule_upsert',
541
+ sideEffect: 'write',
380
542
  requiredFields: ['platform_id', 'routing_strategy', 'custom_router_prompt'],
381
543
  schema: z.object({
382
544
  platform_id: uuidSchema,
@@ -437,13 +599,15 @@ export const platformSetupTools = [
437
599
  }),
438
600
  defineTool({
439
601
  name: 'besales_trigger_upsert',
602
+ sideEffect: 'write',
440
603
  requiredFields: ['platform_id', 'agent_id'],
441
604
  schema: z.object({
442
605
  platform_id: uuidSchema,
443
606
  agent_id: uuidSchema,
444
607
  trigger_id: uuidSchema.optional(),
445
- name: z.string().optional(),
446
- condition: z.string().optional(),
608
+ // `.trim()` — как у формы и бэкенда: строка из пробелов пустая, «Оплата » равна «Оплата».
609
+ name: z.string().trim().min(1).max(TRIGGER_NAME_MAX_LENGTH).optional(),
610
+ condition: z.string().trim().min(1).max(TRIGGER_CONDITION_MAX_LENGTH).optional(),
447
611
  is_enabled: z.boolean().optional(),
448
612
  priority: z.number().int().min(1).max(100).optional(),
449
613
  stop_propagation: z.boolean().optional(),
@@ -530,6 +694,7 @@ export const platformSetupTools = [
530
694
  }),
531
695
  defineTool({
532
696
  name: 'besales_trigger_delete',
697
+ sideEffect: 'write',
533
698
  requiredFields: ['platform_id', 'agent_id', 'trigger_id', 'explicit_confirmation'],
534
699
  schema: z
535
700
  .object({
@@ -552,6 +717,7 @@ export const platformSetupTools = [
552
717
  }),
553
718
  defineTool({
554
719
  name: 'besales_behavior_update',
720
+ sideEffect: 'write',
555
721
  requiredFields: ['platform_id'],
556
722
  schema: z
557
723
  .object({
@@ -615,6 +781,7 @@ export const platformSetupTools = [
615
781
  ...followUpSetupTools,
616
782
  defineTool({
617
783
  name: 'besales_pipeline_settings_update',
784
+ sideEffect: 'write',
618
785
  requiredFields: ['platform_id'],
619
786
  schema: z
620
787
  .object({
@@ -639,6 +806,7 @@ export const platformSetupTools = [
639
806
  }),
640
807
  defineTool({
641
808
  name: 'besales_platform_settings_update',
809
+ sideEffect: 'write',
642
810
  requiredFields: ['platform_id'],
643
811
  schema: z
644
812
  .object({
@@ -721,6 +889,7 @@ export const platformSetupTools = [
721
889
  }),
722
890
  defineTool({
723
891
  name: 'besales_audit_revert',
892
+ sideEffect: 'write',
724
893
  requiredFields: ['audit_log_id'],
725
894
  defaultWorkspaceId: true,
726
895
  schema: z
@@ -752,6 +921,7 @@ export const platformSetupTools = [
752
921
  }),
753
922
  defineTool({
754
923
  name: 'besales_feedback_sheet_link',
924
+ sideEffect: 'write',
755
925
  requiredFields: ['agent_id', 'source_url'],
756
926
  schema: z.object({
757
927
  agent_id: uuidSchema,
@@ -775,6 +945,7 @@ export const platformSetupTools = [
775
945
  }),
776
946
  defineTool({
777
947
  name: 'besales_feedback_sheet_list',
948
+ sideEffect: 'none',
778
949
  requiredFields: ['agent_id'],
779
950
  schema: z.object({
780
951
  agent_id: uuidSchema,
@@ -786,6 +957,7 @@ export const platformSetupTools = [
786
957
  }),
787
958
  defineTool({
788
959
  name: 'besales_feedback_sheet_read',
960
+ sideEffect: 'none',
789
961
  requiredFields: ['agent_id', 'feedback_sheet_id'],
790
962
  schema: z.object({
791
963
  agent_id: uuidSchema,
@@ -803,6 +975,7 @@ export const platformSetupTools = [
803
975
  }),
804
976
  defineTool({
805
977
  name: 'besales_feedback_sheet_unlink',
978
+ sideEffect: 'write',
806
979
  requiredFields: ['agent_id', 'feedback_sheet_id'],
807
980
  schema: z.object({
808
981
  agent_id: uuidSchema,
@@ -815,6 +988,7 @@ export const platformSetupTools = [
815
988
  }),
816
989
  defineTool({
817
990
  name: 'besales_feedback_sheet_row_update',
991
+ sideEffect: 'write',
818
992
  requiredFields: ['agent_id', 'feedback_sheet_id', 'rows'],
819
993
  schema: z.object({
820
994
  agent_id: uuidSchema,
@@ -846,6 +1020,7 @@ export const platformSetupTools = [
846
1020
  // S4.13 — besales_facts_classify_and_migrate
847
1021
  defineTool({
848
1022
  name: 'besales_facts_classify_and_migrate',
1023
+ sideEffect: 'spend',
849
1024
  requiredFields: ['agent_id'],
850
1025
  schema: z.object({
851
1026
  agent_id: uuidSchema,
@@ -866,6 +1041,7 @@ export const platformSetupTools = [
866
1041
  // S2.5 extra — besales_agent_facts_set
867
1042
  defineTool({
868
1043
  name: 'besales_agent_facts_set',
1044
+ sideEffect: 'write',
869
1045
  requiredFields: ['agent_id', 'factual_context'],
870
1046
  schema: z.object({
871
1047
  agent_id: uuidSchema,
@@ -888,6 +1064,11 @@ export const platformSetupTools = [
888
1064
  // ─────────────────────────────────────────────────────────────────
889
1065
  defineTool({
890
1066
  name: 'besales_prompt_patch_start',
1067
+ // Ответ несёт ПОЛНЫЙ текст промпта — до 80 000 символов по боевой границе платформы, то
1068
+ // есть до ~160 КБ кириллицей. Общий потолок в 64 КБ отказывал бы на штатном промпте, а
1069
+ // текст здесь незаменим: по нему строят якоря правок, и усечённый даёт промах якоря.
1070
+ resultPolicy: { neverTruncate: true, maxResultBytes: 400_000 },
1071
+ sideEffect: 'write',
891
1072
  requiredFields: ['agent_id'],
892
1073
  schema: z.object({
893
1074
  agent_id: uuidSchema,
@@ -906,6 +1087,11 @@ export const platformSetupTools = [
906
1087
  }),
907
1088
  defineTool({
908
1089
  name: 'besales_prompt_patch_get',
1090
+ // Ответ несёт ПОЛНЫЙ текст промпта — до 80 000 символов по боевой границе платформы, то
1091
+ // есть до ~160 КБ кириллицей. Общий потолок в 64 КБ отказывал бы на штатном промпте, а
1092
+ // текст здесь незаменим: по нему строят якоря правок, и усечённый даёт промах якоря.
1093
+ resultPolicy: { neverTruncate: true, maxResultBytes: 400_000 },
1094
+ sideEffect: 'none',
909
1095
  requiredFields: ['agent_id', 'draft_id'],
910
1096
  schema: z.object({
911
1097
  agent_id: uuidSchema,
@@ -920,6 +1106,7 @@ export const platformSetupTools = [
920
1106
  // mcp-tools.json (registry.spec проверяет parity), поэтому вставка строго после _patch_get.
921
1107
  defineTool({
922
1108
  name: 'besales_prompt_headroom',
1109
+ sideEffect: 'none',
923
1110
  requiredFields: ['agent_id'],
924
1111
  // .strict() — иначе опечатка `draftId` вместо `draft_id` молча отбрасывается zod'ом,
925
1112
  // и тулза измеряет закоммиченный промпт вместо черновика.
@@ -943,6 +1130,8 @@ export const platformSetupTools = [
943
1130
  }),
944
1131
  defineTool({
945
1132
  name: 'besales_prompt_diff',
1133
+ sideEffect: 'none',
1134
+ closedWorld: true,
946
1135
  requiredFields: ['agent_id', 'compare_agent_id'],
947
1136
  schema: z
948
1137
  .object({
@@ -965,6 +1154,11 @@ export const platformSetupTools = [
965
1154
  }),
966
1155
  defineTool({
967
1156
  name: 'besales_prompt_patch_apply',
1157
+ // Ответ несёт ПОЛНЫЙ текст промпта — до 80 000 символов по боевой границе платформы, то
1158
+ // есть до ~160 КБ кириллицей. Общий потолок в 64 КБ отказывал бы на штатном промпте, а
1159
+ // текст здесь незаменим: по нему строят якоря правок, и усечённый даёт промах якоря.
1160
+ resultPolicy: { neverTruncate: true, maxResultBytes: 400_000 },
1161
+ sideEffect: 'write',
968
1162
  requiredFields: ['agent_id', 'draft_id', 'operations'],
969
1163
  schema: z.object({
970
1164
  agent_id: uuidSchema,
@@ -990,6 +1184,7 @@ export const platformSetupTools = [
990
1184
  }),
991
1185
  defineTool({
992
1186
  name: 'besales_prompt_patch_commit',
1187
+ sideEffect: 'write',
993
1188
  requiredFields: ['agent_id', 'draft_id'],
994
1189
  schema: z.object({
995
1190
  agent_id: uuidSchema,
@@ -1012,6 +1207,7 @@ export const platformSetupTools = [
1012
1207
  }),
1013
1208
  defineTool({
1014
1209
  name: 'besales_prompt_patch_discard',
1210
+ sideEffect: 'write',
1015
1211
  requiredFields: ['agent_id', 'draft_id'],
1016
1212
  schema: z.object({
1017
1213
  agent_id: uuidSchema,
@@ -1026,7 +1222,8 @@ export const platformSetupTools = [
1026
1222
  // mcp-tools.json — registry.spec сверяет имена позиционно.
1027
1223
  defineTool({
1028
1224
  name: 'besales_prompt_batch_start',
1029
- requiredFields: ['agent_ids', 'operations'],
1225
+ sideEffect: 'spend',
1226
+ requiredFields: ['agent_ids', 'operations', 'explicit_confirmation'],
1030
1227
  schema: z
1031
1228
  .object({
1032
1229
  agent_ids: z.array(uuidSchema).min(1).max(PROMPT_BATCH_MAX_AGENTS),
@@ -1034,6 +1231,7 @@ export const platformSetupTools = [
1034
1231
  all_or_nothing: z.boolean().optional(),
1035
1232
  idempotency_key: z.string().max(PROMPT_BATCH_IDEMPOTENCY_KEY_MAX_LENGTH).optional(),
1036
1233
  platform_id: uuidSchema.optional(),
1234
+ explicit_confirmation: z.literal(true),
1037
1235
  })
1038
1236
  .strict(),
1039
1237
  createRequest: (input) => ({
@@ -1056,6 +1254,7 @@ export const platformSetupTools = [
1056
1254
  }),
1057
1255
  defineTool({
1058
1256
  name: 'besales_prompt_batch_status',
1257
+ sideEffect: 'none',
1059
1258
  requiredFields: ['run_id'],
1060
1259
  schema: z.object({ run_id: uuidSchema }).strict(),
1061
1260
  createRequest: (input) => ({
@@ -1065,6 +1264,7 @@ export const platformSetupTools = [
1065
1264
  }),
1066
1265
  defineTool({
1067
1266
  name: 'besales_prompt_batch_resume',
1267
+ sideEffect: 'spend',
1068
1268
  requiredFields: ['run_id'],
1069
1269
  schema: z.object({ run_id: uuidSchema }).strict(),
1070
1270
  createRequest: (input) => ({
@@ -1079,6 +1279,8 @@ export const platformSetupTools = [
1079
1279
  // S2.6 extra — besales_prompt_lint (после patches, чтобы matched catalog order)
1080
1280
  defineTool({
1081
1281
  name: 'besales_prompt_lint',
1282
+ sideEffect: 'none',
1283
+ closedWorld: true,
1082
1284
  requiredFields: ['prompt_text'],
1083
1285
  defaultWorkspaceId: true,
1084
1286
  schema: z.object({