@besales/mcp 0.45.0 → 0.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) 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 +68 -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/crm-integration.md +3 -1
  26. package/dist/resources/docs/follow-up.md +19 -0
  27. package/dist/resources/docs/platforms.md +2 -2
  28. package/dist/resources/docs/routing.md +18 -0
  29. package/dist/resources/docs/task-state.md +30 -0
  30. package/dist/resources/docs/trigger-actions.md +28 -0
  31. package/dist/resources/docs/variables.md +18 -0
  32. package/dist/resources/registry.js +51 -2
  33. package/dist/resources/registry.js.map +1 -1
  34. package/dist/resources/workflows/compare-models.md +4 -3
  35. package/dist/resources/workflows/connect-crm-from-scratch.md +8 -0
  36. package/dist/resources/workflows/extract-from-document.md +8 -1
  37. package/dist/resources/workflows/iterate-with-sandbox.md +5 -2
  38. package/dist/resources/workflows/platform-setup-from-scratch.md +90 -2
  39. package/dist/resources/workflows/production-readiness-check.md +22 -18
  40. package/dist/schemas/mcp-tools.json +1537 -177
  41. package/dist/server.d.ts +2 -0
  42. package/dist/server.js +8 -2
  43. package/dist/server.js.map +1 -1
  44. package/dist/tasks/task-state-store.d.ts +68 -0
  45. package/dist/tasks/task-state-store.js +278 -0
  46. package/dist/tasks/task-state-store.js.map +1 -0
  47. package/dist/tools/annotations.d.ts +7 -0
  48. package/dist/tools/annotations.js +16 -0
  49. package/dist/tools/annotations.js.map +1 -0
  50. package/dist/tools/contracts.js +7 -1
  51. package/dist/tools/contracts.js.map +1 -1
  52. package/dist/tools/definitions/agent-design.d.ts +49 -20
  53. package/dist/tools/definitions/agent-design.js +192 -19
  54. package/dist/tools/definitions/agent-design.js.map +1 -1
  55. package/dist/tools/definitions/analytics.d.ts +40 -0
  56. package/dist/tools/definitions/analytics.js +233 -0
  57. package/dist/tools/definitions/analytics.js.map +1 -0
  58. package/dist/tools/definitions/broadcast-analytics.d.ts +5 -4
  59. package/dist/tools/definitions/broadcast-analytics.js +26 -4
  60. package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
  61. package/dist/tools/definitions/broadcast-mailing-variants.d.ts +2 -0
  62. package/dist/tools/definitions/broadcast-mailing-variants.js +10 -0
  63. package/dist/tools/definitions/broadcast-mailing-variants.js.map +1 -1
  64. package/dist/tools/definitions/broadcast-scheduler.d.ts +20 -1
  65. package/dist/tools/definitions/broadcast-scheduler.js +134 -8
  66. package/dist/tools/definitions/broadcast-scheduler.js.map +1 -1
  67. package/dist/tools/definitions/contacts.d.ts +15 -0
  68. package/dist/tools/definitions/contacts.js +84 -0
  69. package/dist/tools/definitions/contacts.js.map +1 -0
  70. package/dist/tools/definitions/crm-platform.d.ts +2 -0
  71. package/dist/tools/definitions/crm-platform.js +95 -5
  72. package/dist/tools/definitions/crm-platform.js.map +1 -1
  73. package/dist/tools/definitions/datasource.d.ts +1 -0
  74. package/dist/tools/definitions/datasource.js +16 -1
  75. package/dist/tools/definitions/datasource.js.map +1 -1
  76. package/dist/tools/definitions/dialogue-audit.d.ts +2 -2
  77. package/dist/tools/definitions/dialogue-audit.js +54 -16
  78. package/dist/tools/definitions/dialogue-audit.js.map +1 -1
  79. package/dist/tools/definitions/dialogue-export.d.ts +1 -1
  80. package/dist/tools/definitions/dialogue-export.js +12 -0
  81. package/dist/tools/definitions/dialogue-export.js.map +1 -1
  82. package/dist/tools/definitions/external-api-channels.js +39 -12
  83. package/dist/tools/definitions/external-api-channels.js.map +1 -1
  84. package/dist/tools/definitions/follow-up-funnel-test.js +4 -0
  85. package/dist/tools/definitions/follow-up-funnel-test.js.map +1 -1
  86. package/dist/tools/definitions/follow-up-setup.js +3 -0
  87. package/dist/tools/definitions/follow-up-setup.js.map +1 -1
  88. package/dist/tools/definitions/follow-up.d.ts +1 -1
  89. package/dist/tools/definitions/follow-up.js +6 -0
  90. package/dist/tools/definitions/follow-up.js.map +1 -1
  91. package/dist/tools/definitions/getcourse-anchor-refresh.d.ts +3 -0
  92. package/dist/tools/definitions/getcourse-anchor-refresh.js +29 -2
  93. package/dist/tools/definitions/getcourse-anchor-refresh.js.map +1 -1
  94. package/dist/tools/definitions/getcourse-cold-welcome.d.ts +20 -2
  95. package/dist/tools/definitions/getcourse-cold-welcome.js +128 -7
  96. package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
  97. package/dist/tools/definitions/getcourse-wave.js +14 -0
  98. package/dist/tools/definitions/getcourse-wave.js.map +1 -1
  99. package/dist/tools/definitions/help.d.ts +8 -0
  100. package/dist/tools/definitions/help.js +219 -0
  101. package/dist/tools/definitions/help.js.map +1 -0
  102. package/dist/tools/definitions/knowledge.d.ts +27 -5
  103. package/dist/tools/definitions/knowledge.js +200 -33
  104. package/dist/tools/definitions/knowledge.js.map +1 -1
  105. package/dist/tools/definitions/link-tracking.js +31 -0
  106. package/dist/tools/definitions/link-tracking.js.map +1 -1
  107. package/dist/tools/definitions/model-comparison.js +12 -3
  108. package/dist/tools/definitions/model-comparison.js.map +1 -1
  109. package/dist/tools/definitions/operational-overview.d.ts +3 -0
  110. package/dist/tools/definitions/operational-overview.js +23 -0
  111. package/dist/tools/definitions/operational-overview.js.map +1 -0
  112. package/dist/tools/definitions/operator-workflow.d.ts +20 -0
  113. package/dist/tools/definitions/operator-workflow.js +114 -0
  114. package/dist/tools/definitions/operator-workflow.js.map +1 -0
  115. package/dist/tools/definitions/platform-setup.d.ts +54 -3
  116. package/dist/tools/definitions/platform-setup.js +211 -5
  117. package/dist/tools/definitions/platform-setup.js.map +1 -1
  118. package/dist/tools/definitions/scheduled-tasks.js +2 -0
  119. package/dist/tools/definitions/scheduled-tasks.js.map +1 -1
  120. package/dist/tools/definitions/session.js +103 -5
  121. package/dist/tools/definitions/session.js.map +1 -1
  122. package/dist/tools/definitions/shared.d.ts +272 -10
  123. package/dist/tools/definitions/shared.js +154 -8
  124. package/dist/tools/definitions/shared.js.map +1 -1
  125. package/dist/tools/definitions/task-state.d.ts +76 -0
  126. package/dist/tools/definitions/task-state.js +301 -0
  127. package/dist/tools/definitions/task-state.js.map +1 -0
  128. package/dist/tools/definitions/trigger-contact-claims.d.ts +7 -0
  129. package/dist/tools/definitions/trigger-contact-claims.js +60 -0
  130. package/dist/tools/definitions/trigger-contact-claims.js.map +1 -0
  131. package/dist/tools/definitions.d.ts +334 -35
  132. package/dist/tools/definitions.js +14 -0
  133. package/dist/tools/definitions.js.map +1 -1
  134. package/dist/tools/description-localization.d.ts +2 -0
  135. package/dist/tools/description-localization.js +46 -0
  136. package/dist/tools/description-localization.js.map +1 -0
  137. package/dist/tools/incomplete-list.d.ts +23 -0
  138. package/dist/tools/incomplete-list.js +39 -0
  139. package/dist/tools/incomplete-list.js.map +1 -0
  140. package/dist/tools/inventory.d.ts +10 -0
  141. package/dist/tools/inventory.js +49 -0
  142. package/dist/tools/inventory.js.map +1 -0
  143. package/dist/tools/registry-mapping-cases-core.js +122 -4
  144. package/dist/tools/registry-mapping-cases-core.js.map +1 -1
  145. package/dist/tools/registry-mapping-cases-platform.js +69 -0
  146. package/dist/tools/registry-mapping-cases-platform.js.map +1 -1
  147. package/dist/tools/registry.d.ts +2 -0
  148. package/dist/tools/registry.js +60 -8
  149. package/dist/tools/registry.js.map +1 -1
  150. package/dist/tools/result-envelope.d.ts +46 -0
  151. package/dist/tools/result-envelope.js +184 -0
  152. package/dist/tools/result-envelope.js.map +1 -0
  153. package/dist/tools/result.d.ts +41 -3
  154. package/dist/tools/result.js +229 -27
  155. package/dist/tools/result.js.map +1 -1
  156. package/dist/tools/tool-title.d.ts +2 -0
  157. package/dist/tools/tool-title.js +12 -0
  158. package/dist/tools/tool-title.js.map +1 -0
  159. package/dist/tools/toolsets.d.ts +37 -0
  160. package/dist/tools/toolsets.js +64 -0
  161. package/dist/tools/toolsets.js.map +1 -0
  162. package/dist/tools/trigger-action-config.js +4 -0
  163. package/dist/tools/trigger-action-config.js.map +1 -1
  164. package/dist/tools/verify-with.d.ts +5 -0
  165. package/dist/tools/verify-with.js +36 -0
  166. package/dist/tools/verify-with.js.map +1 -0
  167. package/dist/types/api-contract.gen.d.ts +2612 -332
  168. package/dist/utils/logger.d.ts +11 -0
  169. package/dist/utils/logger.js +64 -8
  170. package/dist/utils/logger.js.map +1 -1
  171. package/docs/agent-usage-guide.full.ru.md +21 -15
  172. package/docs/agent-usage-guide.ru.md +24 -16
  173. package/docs/async-operation-lifecycle.md +46 -0
  174. package/docs/connect.ru.md +120 -0
  175. package/docs/evals/model-behavior-scorecard.md +80 -0
  176. package/docs/failure-semantics.md +56 -0
  177. package/docs/help-navigation.md +48 -0
  178. package/docs/host-compatibility-matrix.md +153 -0
  179. package/docs/host-setup.md +22 -6
  180. package/docs/operation-coverage.md +114 -0
  181. package/docs/pii-policy.md +46 -0
  182. package/docs/response-size-budget.md +150 -0
  183. package/docs/task-state.md +58 -0
  184. package/docs/tool-effects.md +46 -0
  185. package/docs/tool-surface.md +91 -0
  186. package/package.json +6 -2
  187. package/scripts/model-eval-server.js +213 -0
  188. package/scripts/probe-mcp-protocol.js +134 -0
  189. package/scripts/run-model-eval.js +447 -0
@@ -0,0 +1,301 @@
1
+ import { join } from 'node:path';
2
+ import { homedir } from 'node:os';
3
+ import { z } from 'zod';
4
+ import { getSessionWorkspaceId } from '../../auth/session-workspace.js';
5
+ import { TaskStateStore, TASK_STATUSES, } from '../../tasks/task-state-store.js';
6
+ import { WorkspaceResolutionError } from '../../auth/connection-store.js';
7
+ import { defineTool, uuidSchema } from './shared.js';
8
+ const taskObjectRefSchema = z
9
+ .object({
10
+ type: z.string().trim().min(1).max(80),
11
+ id: z.string().trim().min(1).max(200),
12
+ label: z.string().trim().min(1).max(200).optional(),
13
+ })
14
+ .strict();
15
+ const taskCheckpointSchema = z
16
+ .object({
17
+ key: z.string().trim().min(1).max(80),
18
+ label: z.string().trim().min(1).max(200),
19
+ status: z.enum(['PENDING', 'COMPLETED', 'BLOCKED']),
20
+ evidence: z.string().trim().min(1).max(500).optional(),
21
+ })
22
+ .strict();
23
+ const taskPendingOperationSchema = z
24
+ .object({
25
+ operation: z.string().trim().min(1).max(120),
26
+ object_ref: taskObjectRefSchema.optional(),
27
+ idempotency_key: z.string().trim().min(1).max(200).optional(),
28
+ verify_with: z.string().trim().min(1).max(120).optional(),
29
+ status: z.enum(['PLANNED', 'AWAITING_USER', 'OUTCOME_UNKNOWN']),
30
+ })
31
+ .strict();
32
+ const taskPayloadShape = {
33
+ goal: z.string().trim().min(3).max(500),
34
+ context: z.string().trim().min(1).max(2000).optional(),
35
+ constraints: z.array(z.string().trim().min(1).max(500)).max(20).default([]),
36
+ object_refs: z.array(taskObjectRefSchema).max(100).default([]),
37
+ checkpoints: z.array(taskCheckpointSchema).max(100).default([]),
38
+ pending_operations: z.array(taskPendingOperationSchema).max(50).default([]),
39
+ expected_user_action: z.string().trim().min(1).max(1000).nullable().optional(),
40
+ };
41
+ const optionalTaskPayloadShape = {
42
+ goal: taskPayloadShape.goal.optional(),
43
+ context: taskPayloadShape.context,
44
+ constraints: taskPayloadShape.constraints.optional(),
45
+ object_refs: taskPayloadShape.object_refs.optional(),
46
+ checkpoints: taskPayloadShape.checkpoints.optional(),
47
+ pending_operations: taskPayloadShape.pending_operations.optional(),
48
+ expected_user_action: taskPayloadShape.expected_user_action,
49
+ };
50
+ export const taskStateTools = [
51
+ defineTool({
52
+ name: 'besales_task_create',
53
+ sideEffect: 'write',
54
+ reversible: true,
55
+ closedWorld: true,
56
+ requiredFields: ['goal'],
57
+ schema: z
58
+ .object({
59
+ workspace_id: uuidSchema.optional(),
60
+ ...taskPayloadShape,
61
+ retention_days: z.number().int().min(1).max(180).optional(),
62
+ })
63
+ .strict(),
64
+ localHandler: async (input, ctx) => {
65
+ assertNoCredentialLikeValue(input);
66
+ const workspaceId = await resolveTaskWorkspace(input.workspace_id, ctx);
67
+ const task = await storeFor(ctx).create(workspaceId, payloadFromInput(input), input.retention_days);
68
+ return withResumeInstructions(task);
69
+ },
70
+ }),
71
+ defineTool({
72
+ name: 'besales_task_list',
73
+ sideEffect: 'none',
74
+ closedWorld: true,
75
+ requiredFields: [],
76
+ schema: z
77
+ .object({
78
+ workspace_id: uuidSchema.optional(),
79
+ status: z.enum(TASK_STATUSES).optional(),
80
+ })
81
+ .strict(),
82
+ localHandler: async (input, ctx) => {
83
+ const workspaceId = await resolveTaskWorkspace(input.workspace_id, ctx);
84
+ const tasks = await storeFor(ctx).list(workspaceId, input.status);
85
+ return {
86
+ workspace_id: workspaceId,
87
+ tasks: tasks.map(taskSummary),
88
+ selection_required: tasks.length > 1,
89
+ next: tasks.length === 0
90
+ ? 'Создайте задачу через besales_task_create.'
91
+ : 'Выберите task_id явно и вызовите besales_task_get. Задача не выбирается по давности автоматически.',
92
+ };
93
+ },
94
+ }),
95
+ defineTool({
96
+ name: 'besales_task_get',
97
+ sideEffect: 'none',
98
+ closedWorld: true,
99
+ requiredFields: ['task_id'],
100
+ schema: z.object({ workspace_id: uuidSchema.optional(), task_id: uuidSchema }).strict(),
101
+ localHandler: async (input, ctx) => {
102
+ const workspaceId = await resolveTaskWorkspace(input.workspace_id, ctx);
103
+ return withResumeInstructions(await storeFor(ctx).get(workspaceId, input.task_id));
104
+ },
105
+ }),
106
+ defineTool({
107
+ name: 'besales_task_update',
108
+ sideEffect: 'write',
109
+ reversible: true,
110
+ closedWorld: true,
111
+ requiredFields: ['task_id', 'expected_version'],
112
+ schema: z
113
+ .object({
114
+ workspace_id: uuidSchema.optional(),
115
+ task_id: uuidSchema,
116
+ expected_version: z.number().int().min(1),
117
+ ...optionalTaskPayloadShape,
118
+ })
119
+ .strict()
120
+ .refine((input) => Object.keys(optionalTaskPayloadShape).some((field) => input[field] !== undefined), { message: 'At least one task field must be updated.' }),
121
+ localHandler: async (input, ctx) => {
122
+ assertNoCredentialLikeValue(input);
123
+ const workspaceId = await resolveTaskWorkspace(input.workspace_id, ctx);
124
+ const patch = payloadPatchFromInput(input);
125
+ return withResumeInstructions(await storeFor(ctx).update(workspaceId, input.task_id, input.expected_version, patch));
126
+ },
127
+ }),
128
+ defineTool({
129
+ name: 'besales_task_close',
130
+ sideEffect: 'write',
131
+ reversible: false,
132
+ closedWorld: true,
133
+ requiredFields: ['task_id', 'expected_version', 'outcome'],
134
+ schema: z
135
+ .object({
136
+ workspace_id: uuidSchema.optional(),
137
+ task_id: uuidSchema,
138
+ expected_version: z.number().int().min(1),
139
+ outcome: z.enum(['COMPLETED', 'CANCELLED']),
140
+ })
141
+ .strict(),
142
+ localHandler: async (input, ctx) => {
143
+ const workspaceId = await resolveTaskWorkspace(input.workspace_id, ctx);
144
+ return toPublicTask(await storeFor(ctx).close(workspaceId, input.task_id, input.expected_version, input.outcome));
145
+ },
146
+ }),
147
+ defineTool({
148
+ name: 'besales_task_delete',
149
+ sideEffect: 'write',
150
+ reversible: false,
151
+ closedWorld: true,
152
+ requiredFields: ['task_id', 'expected_version', 'explicit_confirmation'],
153
+ schema: z
154
+ .object({
155
+ workspace_id: uuidSchema.optional(),
156
+ task_id: uuidSchema,
157
+ expected_version: z.number().int().min(1),
158
+ explicit_confirmation: z.literal(true),
159
+ })
160
+ .strict(),
161
+ localHandler: async (input, ctx) => {
162
+ const workspaceId = await resolveTaskWorkspace(input.workspace_id, ctx);
163
+ await storeFor(ctx).delete(workspaceId, input.task_id, input.expected_version);
164
+ return { task_id: input.task_id, workspace_id: workspaceId, deleted: true };
165
+ },
166
+ }),
167
+ ];
168
+ function storeFor(ctx) {
169
+ const configured = ctx.env.BESALES_MCP_TASK_STATE_PATH?.trim();
170
+ return new TaskStateStore({
171
+ filePath: configured || join(homedir(), '.besales-mcp', 'tasks-v1.json'),
172
+ });
173
+ }
174
+ async function resolveTaskWorkspace(explicitWorkspaceId, ctx) {
175
+ const connections = await ctx.store.list();
176
+ if (connections.length === 0) {
177
+ throw new WorkspaceResolutionError('Not connected to any workspace. Run `besales-mcp connect` before saving task state.');
178
+ }
179
+ const connected = (workspaceId) => connections.some((connection) => connection.workspaceId === workspaceId);
180
+ const envPin = ctx.env.BESALES_WORKSPACE_ID?.trim();
181
+ if (envPin) {
182
+ if (!connected(envPin)) {
183
+ throw new WorkspaceResolutionError(`Pinned workspace ${envPin} is not connected.`);
184
+ }
185
+ if (explicitWorkspaceId && explicitWorkspaceId !== envPin) {
186
+ throw new WorkspaceResolutionError(`This session is pinned to ${envPin}; cross-workspace task access is refused.`);
187
+ }
188
+ return envPin;
189
+ }
190
+ if (explicitWorkspaceId) {
191
+ if (!connected(explicitWorkspaceId)) {
192
+ throw new WorkspaceResolutionError(`Workspace ${explicitWorkspaceId} is not connected.`);
193
+ }
194
+ return explicitWorkspaceId;
195
+ }
196
+ const sessionWorkspaceId = getSessionWorkspaceId();
197
+ if (sessionWorkspaceId && connected(sessionWorkspaceId))
198
+ return sessionWorkspaceId;
199
+ if (connections.length === 1)
200
+ return connections[0].workspaceId;
201
+ throw new WorkspaceResolutionError('Multiple workspaces are connected. Use besales_workspace_use or pass workspace_id before selecting a task.');
202
+ }
203
+ function payloadFromInput(input) {
204
+ return {
205
+ goal: input.goal,
206
+ context: input.context,
207
+ constraints: input.constraints,
208
+ objectRefs: input.object_refs,
209
+ checkpoints: input.checkpoints,
210
+ pendingOperations: input.pending_operations.map((operation) => ({
211
+ operation: operation.operation,
212
+ objectRef: operation.object_ref,
213
+ idempotencyKey: operation.idempotency_key,
214
+ verifyWith: operation.verify_with,
215
+ status: operation.status,
216
+ })),
217
+ expectedUserAction: input.expected_user_action,
218
+ };
219
+ }
220
+ function payloadPatchFromInput(input) {
221
+ const patch = {};
222
+ if (typeof input.goal === 'string')
223
+ patch.goal = input.goal;
224
+ if (typeof input.context === 'string')
225
+ patch.context = input.context;
226
+ if (Array.isArray(input.constraints))
227
+ patch.constraints = input.constraints;
228
+ if (Array.isArray(input.object_refs)) {
229
+ patch.objectRefs = input.object_refs;
230
+ }
231
+ if (Array.isArray(input.checkpoints)) {
232
+ patch.checkpoints = input.checkpoints;
233
+ }
234
+ if (Array.isArray(input.pending_operations)) {
235
+ patch.pendingOperations = input.pending_operations.map((operation) => ({
236
+ operation: operation.operation,
237
+ objectRef: operation.object_ref,
238
+ idempotencyKey: operation.idempotency_key,
239
+ verifyWith: operation.verify_with,
240
+ status: operation.status,
241
+ }));
242
+ }
243
+ if (input.expected_user_action === null || typeof input.expected_user_action === 'string') {
244
+ patch.expectedUserAction = input.expected_user_action;
245
+ }
246
+ return patch;
247
+ }
248
+ function taskSummary(task) {
249
+ return {
250
+ task_id: task.taskId,
251
+ goal: task.goal,
252
+ status: task.status,
253
+ version: task.version,
254
+ updated_at: task.updatedAt,
255
+ expires_at: task.expiresAt,
256
+ expected_user_action: task.expectedUserAction ?? null,
257
+ pending_operation_count: task.pendingOperations.length,
258
+ };
259
+ }
260
+ function toPublicTask(task) {
261
+ return {
262
+ task_id: task.taskId,
263
+ workspace_id: task.workspaceId,
264
+ owner: task.owner,
265
+ status: task.status,
266
+ version: task.version,
267
+ goal: task.goal,
268
+ context: task.context ?? null,
269
+ constraints: task.constraints,
270
+ object_refs: task.objectRefs,
271
+ checkpoints: task.checkpoints,
272
+ pending_operations: task.pendingOperations.map((operation) => ({
273
+ operation: operation.operation,
274
+ object_ref: operation.objectRef,
275
+ idempotency_key: operation.idempotencyKey,
276
+ verify_with: operation.verifyWith,
277
+ status: operation.status,
278
+ })),
279
+ expected_user_action: task.expectedUserAction ?? null,
280
+ created_at: task.createdAt,
281
+ updated_at: task.updatedAt,
282
+ expires_at: task.expiresAt,
283
+ };
284
+ }
285
+ function withResumeInstructions(task) {
286
+ return {
287
+ ...toPublicTask(task),
288
+ resumable: task.status === 'ACTIVE',
289
+ resume_rule: task.status === 'ACTIVE'
290
+ ? 'Before any mutation, re-read the referenced objects and besales_workspace_current; saved state is context, not proof of current state or permissions.'
291
+ : 'This task cannot be resumed. Create a new task if more work is required.',
292
+ };
293
+ }
294
+ function assertNoCredentialLikeValue(value) {
295
+ const serialized = JSON.stringify(value);
296
+ const credentialPattern = /(?:sk-|mcp_|bsl_)[A-Za-z0-9._-]{12,}|Bearer\s+\S{12,}|(?:password|client_secret|api[_-]?key)\s*[:=]\s*\S{8,}/iu;
297
+ if (credentialPattern.test(serialized)) {
298
+ throw new Error('Task state refuses credential-like values. Keep secrets in the browser setup flow or keychain.');
299
+ }
300
+ }
301
+ //# sourceMappingURL=task-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-state.js","sourceRoot":"","sources":["../../../src/tools/definitions/task-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const triggerContactClaimTools: (import("./shared.js").ToolDefinition<{
2
+ chat_user_id: string;
3
+ }> | import("./shared.js").ToolDefinition<{
4
+ chat_user_id: string;
5
+ trigger_id: string;
6
+ explicit_confirmation: true;
7
+ }>)[];
@@ -0,0 +1,60 @@
1
+ // Права одноразовых триггеров. Триггер с «Сработать один раз на контакт» после первого
2
+ // срабатывания исчезает из беседы НАВСЕГДА: право берётся атомарной вставкой и сжигается, как
3
+ // только хоть одно действие отработало во внешней системе. Вернуть его до появления этих
4
+ // инструментов можно было только запросом в БД руками.
5
+ import { z } from 'zod';
6
+ import { defineTool, setupConfirmation, uuidSchema, withInstructions } from './shared.js';
7
+ export const triggerContactClaimTools = [
8
+ defineTool({
9
+ name: 'besales_trigger_claim_list',
10
+ sideEffect: 'none',
11
+ requiredFields: ['chat_user_id'],
12
+ schema: z
13
+ .object({
14
+ chat_user_id: uuidSchema,
15
+ })
16
+ .strict(),
17
+ createRequest: (input) => ({
18
+ method: 'GET',
19
+ path: `/contacts/${input.chat_user_id}/trigger-claims`,
20
+ }),
21
+ enhanceResponse: (response) => withInstructions(response, [
22
+ 'Пустой список — норма: у большинства контактов одноразовых триггеров нет вовсе.',
23
+ 'status=COMPLETED — триггер отработал и право сожжено. status=IN_PROGRESS — право взято прогоном.',
24
+ 'canReset=false у ЛЮБОГО IN_PROGRESS: право держит владелец, и снять его нельзя ни в каком возрасте — закрытие права в оркестраторе адресует пару «триггер+контакт», поэтому удаление такой строки дало бы двух владельцев разом.',
25
+ 'Право, зависшее в IN_PROGRESS надолго (владелец умер, не закрыв его), этим инструментом НЕ лечится: нужен разработчик. Возраст видно по claimedAt.',
26
+ 'Единица — КАНАЛ (ChatUser), а не человек: один клиент в Telegram и WhatsApp имеет два независимых права.',
27
+ ]),
28
+ }),
29
+ defineTool({
30
+ name: 'besales_trigger_claim_reset',
31
+ sideEffect: 'write',
32
+ requiredFields: ['chat_user_id', 'trigger_id', 'explicit_confirmation'],
33
+ schema: z
34
+ .object({
35
+ chat_user_id: uuidSchema,
36
+ trigger_id: uuidSchema,
37
+ // Снятие права разрешает триггеру ПОВТОРИТЬ необратимые действия во внешних системах
38
+ // (вторая заметка в CRM, вторая передача оператору) — ровно то, ради чего оператор
39
+ // включал «один раз». `literal(true)` + `requiredFields`, как у `besales_trigger_delete`:
40
+ // необязательное поле модель просто опустит и получит отказ уже после вызова.
41
+ explicit_confirmation: z.literal(true),
42
+ })
43
+ .strict(),
44
+ createRequest: (input) => ({
45
+ method: 'DELETE',
46
+ path: `/contacts/${input.chat_user_id}/trigger-claims/${input.trigger_id}`,
47
+ // Тело у DELETE — тот же канон, что у `besales_trigger_delete`: подтверждение обязано
48
+ // доехать до сервера, иначе гейт защищает ровно одного клиента.
49
+ body: setupConfirmation(input),
50
+ }),
51
+ enhanceResponse: (response) => withInstructions(response, [
52
+ 'Право возвращено: триггер сможет сработать на этом контакте ещё раз и повторить свои действия.',
53
+ '409 означает, что право держит прогон триггера (status=IN_PROGRESS) — снять его можно только после завершения прогона, это не сбой.',
54
+ 'Брошенное IN_PROGRESS (владелец умер, не закрыв право) этой ручкой НЕ снимается: закрытие права в оркестраторе адресует пару «триггер+контакт», и удаление такой строки дало бы два владельца разом.',
55
+ '404 означает, что права нет: либо триггер уже разрешён, либо он никогда не срабатывал на этом контакте.',
56
+ 'Снятие НЕ выключает саму настройку «Сработать один раз на контакт» — после следующего срабатывания право сожжётся снова.',
57
+ ]),
58
+ }),
59
+ ];
60
+ //# sourceMappingURL=trigger-contact-claims.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger-contact-claims.js","sourceRoot":"","sources":["../../../src/tools/definitions/trigger-contact-claims.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,8FAA8F;AAC9F,yFAAyF;AACzF,uDAAuD;AACvD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE1F,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,UAAU,CAAC;QACT,IAAI,EAAE,4BAA4B;QAClC,UAAU,EAAE,MAAM;QAClB,cAAc,EAAE,CAAC,cAAc,CAAC;QAChC,MAAM,EAAE,CAAC;aACN,MAAM,CAAC;YACN,YAAY,EAAE,UAAU;SACzB,CAAC;aACD,MAAM,EAAE;QACX,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzB,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,aAAa,KAAK,CAAC,YAAY,iBAAiB;SACvD,CAAC;QACF,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC5B,gBAAgB,CAAC,QAAQ,EAAE;YACzB,iFAAiF;YACjF,kGAAkG;YAClG,kOAAkO;YAClO,oJAAoJ;YACpJ,0GAA0G;SAC3G,CAAC;KACL,CAAC;IACF,UAAU,CAAC;QACT,IAAI,EAAE,6BAA6B;QACnC,UAAU,EAAE,OAAO;QACnB,cAAc,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,uBAAuB,CAAC;QACvE,MAAM,EAAE,CAAC;aACN,MAAM,CAAC;YACN,YAAY,EAAE,UAAU;YACxB,UAAU,EAAE,UAAU;YACtB,qFAAqF;YACrF,mFAAmF;YACnF,0FAA0F;YAC1F,8EAA8E;YAC9E,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;SACvC,CAAC;aACD,MAAM,EAAE;QACX,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzB,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,aAAa,KAAK,CAAC,YAAY,mBAAmB,KAAK,CAAC,UAAU,EAAE;YAC1E,sFAAsF;YACtF,gEAAgE;YAChE,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC;SAC/B,CAAC;QACF,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC5B,gBAAgB,CAAC,QAAQ,EAAE;YACzB,gGAAgG;YAChG,qIAAqI;YACrI,sMAAsM;YACtM,yGAAyG;YACzG,0HAA0H;SAC3H,CAAC;KACL,CAAC;CACH,CAAC"}