@opencx/mcp 1.15.15 → 1.15.21

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 (65) hide show
  1. package/dist/campaign-tools.spec.d.ts +2 -0
  2. package/dist/campaign-tools.spec.d.ts.map +1 -0
  3. package/dist/campaign-tools.spec.js +508 -0
  4. package/dist/campaign-tools.spec.js.map +1 -0
  5. package/dist/companies.spec.d.ts +2 -0
  6. package/dist/companies.spec.d.ts.map +1 -0
  7. package/dist/companies.spec.js +191 -0
  8. package/dist/companies.spec.js.map +1 -0
  9. package/dist/phone-caller-number-tool.spec.d.ts +2 -0
  10. package/dist/phone-caller-number-tool.spec.d.ts.map +1 -0
  11. package/dist/phone-caller-number-tool.spec.js +97 -0
  12. package/dist/phone-caller-number-tool.spec.js.map +1 -0
  13. package/dist/schema.d.ts +10756 -7565
  14. package/dist/schema.d.ts.map +1 -1
  15. package/dist/server.d.ts.map +1 -1
  16. package/dist/server.js +12 -2
  17. package/dist/server.js.map +1 -1
  18. package/dist/slack-tools.spec.d.ts +2 -0
  19. package/dist/slack-tools.spec.d.ts.map +1 -0
  20. package/dist/slack-tools.spec.js +148 -0
  21. package/dist/slack-tools.spec.js.map +1 -0
  22. package/dist/tools/campaign-channel.d.ts +4 -0
  23. package/dist/tools/campaign-channel.d.ts.map +1 -0
  24. package/dist/tools/campaign-channel.js +250 -0
  25. package/dist/tools/campaign-channel.js.map +1 -0
  26. package/dist/tools/campaign-discovery.d.ts +4 -0
  27. package/dist/tools/campaign-discovery.d.ts.map +1 -0
  28. package/dist/tools/campaign-discovery.js +70 -0
  29. package/dist/tools/campaign-discovery.js.map +1 -0
  30. package/dist/tools/campaign-qualification.d.ts +4 -0
  31. package/dist/tools/campaign-qualification.d.ts.map +1 -0
  32. package/dist/tools/campaign-qualification.js +289 -0
  33. package/dist/tools/campaign-qualification.js.map +1 -0
  34. package/dist/tools/campaign-spine.d.ts +4 -0
  35. package/dist/tools/campaign-spine.d.ts.map +1 -0
  36. package/dist/tools/campaign-spine.js +630 -0
  37. package/dist/tools/campaign-spine.js.map +1 -0
  38. package/dist/tools/companies.d.ts +4 -0
  39. package/dist/tools/companies.d.ts.map +1 -0
  40. package/dist/tools/companies.js +127 -0
  41. package/dist/tools/companies.js.map +1 -0
  42. package/dist/tools/macros.js +1 -1
  43. package/dist/tools/macros.js.map +1 -1
  44. package/dist/tools/phone.d.ts.map +1 -1
  45. package/dist/tools/phone.js +54 -2
  46. package/dist/tools/phone.js.map +1 -1
  47. package/dist/tools/reports.d.ts.map +1 -1
  48. package/dist/tools/reports.js +1 -0
  49. package/dist/tools/reports.js.map +1 -1
  50. package/dist/tools/sla.d.ts.map +1 -1
  51. package/dist/tools/sla.js +3 -3
  52. package/dist/tools/sla.js.map +1 -1
  53. package/dist/tools/slack.d.ts +4 -0
  54. package/dist/tools/slack.d.ts.map +1 -0
  55. package/dist/tools/slack.js +76 -0
  56. package/dist/tools/slack.js.map +1 -0
  57. package/dist/utils/session-channel.d.ts +2 -2
  58. package/dist/utils/session-channel.d.ts.map +1 -1
  59. package/dist/utils/session-channel.js +1 -0
  60. package/dist/utils/session-channel.js.map +1 -1
  61. package/package.json +1 -1
  62. package/dist/tools/sequences.d.ts +0 -4
  63. package/dist/tools/sequences.d.ts.map +0 -1
  64. package/dist/tools/sequences.js +0 -182
  65. package/dist/tools/sequences.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=campaign-tools.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"campaign-tools.spec.d.ts","sourceRoot":"","sources":["../src/campaign-tools.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,508 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
4
+ import { createServer } from './server.js';
5
+ // The sequence-authoring toolset, from the agent's side of the wire.
6
+ //
7
+ // Two of these tests exist because of a specific failure: `wait` was built into
8
+ // the service and the HTTP API but never declared on the MCP tools, so the
9
+ // agent — told by the tool description to "poll read_qualification_run" —
10
+ // wrote a `until … sleep 4 … done` Bash loop and blocked itself for the whole
11
+ // enrichment, then again for the judge, then scheduled itself a wake-up. A
12
+ // capability the tool doesn't declare does not exist.
13
+ function mockResponse(body, status = 200) {
14
+ return new Response(JSON.stringify(body), { status, statusText: 'OK' });
15
+ }
16
+ function requestUrl(call) {
17
+ const arg = call[0];
18
+ return arg instanceof Request ? arg.url : String(arg);
19
+ }
20
+ async function requestBody(call) {
21
+ const arg = call[0];
22
+ if (arg instanceof Request) {
23
+ const text = await arg.clone().text();
24
+ return text ? JSON.parse(text) : undefined;
25
+ }
26
+ const opts = call[1];
27
+ return opts?.body ? JSON.parse(opts.body) : undefined;
28
+ }
29
+ describe('sequence authoring tools', () => {
30
+ let client;
31
+ let cleanup;
32
+ let fetchSpy;
33
+ beforeEach(async () => {
34
+ fetchSpy = vi.fn().mockResolvedValue(mockResponse({ ok: true }));
35
+ vi.stubGlobal('fetch', fetchSpy);
36
+ const server = createServer('test-api-key', 'https://api.test.com');
37
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
38
+ await server.connect(serverTransport);
39
+ client = new Client({ name: 'test-client', version: '1.0.0' });
40
+ await client.connect(clientTransport);
41
+ cleanup = async () => {
42
+ await client.close();
43
+ await server.close();
44
+ };
45
+ });
46
+ afterEach(async () => {
47
+ await cleanup();
48
+ vi.restoreAllMocks();
49
+ });
50
+ const toolNamed = async (name) => {
51
+ const { tools } = await client.listTools();
52
+ return tools.find((t) => t.name === name);
53
+ };
54
+ describe('awaiting a run instead of polling for it', () => {
55
+ it('enrich_people DECLARES wait — an undeclared param cannot be passed', async () => {
56
+ const tool = await toolNamed('enrich_people');
57
+ expect(tool).toBeDefined();
58
+ expect(Object.keys(tool.inputSchema.properties ?? {})).toContain('wait');
59
+ });
60
+ it('judge_people DECLARES wait', async () => {
61
+ const tool = await toolNamed('judge_people');
62
+ expect(Object.keys(tool.inputSchema.properties ?? {})).toContain('wait');
63
+ });
64
+ it('forwards wait:true to the enrich API', async () => {
65
+ await client.callTool({
66
+ name: 'enrich_people',
67
+ arguments: {
68
+ sequence_id: 'c1',
69
+ scope: { kind: 'batch_key', batch_key: 'wave-1' },
70
+ wait: true,
71
+ },
72
+ });
73
+ const body = await requestBody(fetchSpy.mock.calls[0]);
74
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain('/sequences/c1/enrich');
75
+ expect(body).toMatchObject({ wait: true });
76
+ });
77
+ it('forwards wait:true to the judge API alongside the criteria', async () => {
78
+ await client.callTool({
79
+ name: 'judge_people',
80
+ arguments: {
81
+ sequence_id: 'c1',
82
+ scope: { kind: 'contact_ids', contact_ids: ['r1', 'r2'] },
83
+ criteria: {
84
+ must: [{ label: 'Billing complaint', text: 'contacted support about billing' }],
85
+ nice: [],
86
+ },
87
+ wait: true,
88
+ },
89
+ });
90
+ const body = await requestBody(fetchSpy.mock.calls[0]);
91
+ expect(body).toMatchObject({
92
+ wait: true,
93
+ // The contact-addressed scope crosses the wire verbatim.
94
+ scope: { kind: 'contact_ids', contact_ids: ['r1', 'r2'] },
95
+ // `label` is the short name the dashboard shows; `text` is the long
96
+ // instruction the judge reads. Both cross the wire.
97
+ criteria: {
98
+ must: [{ label: 'Billing complaint', text: 'contacted support about billing' }],
99
+ nice: [],
100
+ },
101
+ });
102
+ });
103
+ it('omitting wait sends no wait — the population run stays fire-and-forget', async () => {
104
+ await client.callTool({
105
+ name: 'judge_people',
106
+ arguments: { sequence_id: 'c1', scope: { kind: 'all_candidates' } },
107
+ });
108
+ const body = await requestBody(fetchSpy.mock.calls[0]);
109
+ expect(body?.wait).toBeUndefined();
110
+ });
111
+ it('tells the agent to await rather than poll, in both descriptions', async () => {
112
+ // The old descriptions said "Poll read_qualification_run for progress",
113
+ // and that is exactly what the agent did — from Bash, blocking itself.
114
+ for (const name of ['enrich_people', 'judge_people']) {
115
+ const tool = await toolNamed(name);
116
+ expect(tool.description).toMatch(/wait/i);
117
+ expect(tool.description).toMatch(/NEVER poll/i);
118
+ expect(tool.description).not.toMatch(/Poll read_qualification_run/i);
119
+ }
120
+ });
121
+ });
122
+ describe('discovering what the sequence can send', () => {
123
+ it.each([
124
+ ['list_whatsapp_templates', '/whatsapp/templates/catalog'],
125
+ ['list_whatsapp_senders', '/whatsapp/senders'],
126
+ ])('%s reads %s — org-scoped, the same list the dashboard picker shows', async (name, path) => {
127
+ await client.callTool({ name, arguments: {} });
128
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain(path);
129
+ });
130
+ it.each(['list_whatsapp_templates', 'list_whatsapp_senders'])('%s takes no arguments — the catalog is not per-sequence', async (name) => {
131
+ const tool = await toolNamed(name);
132
+ expect(Object.keys(tool.inputSchema.properties ?? {})).toEqual([]);
133
+ });
134
+ it('list_enrichment_paths needs no arguments', async () => {
135
+ const tool = await toolNamed('list_enrichment_paths');
136
+ expect(Object.keys(tool.inputSchema.properties ?? {})).toEqual([]);
137
+ await client.callTool({ name: 'list_enrichment_paths', arguments: {} });
138
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain('/sequences/enrichment-catalog');
139
+ });
140
+ });
141
+ describe('authoring the sequence', () => {
142
+ it('set_sequence_columns writes the columns, never a type', async () => {
143
+ await client.callTool({
144
+ name: 'set_sequence_columns',
145
+ arguments: {
146
+ sequence_id: 'c1',
147
+ columns: [{ key: 'tags', label: 'Topics', path: '$.opencx.data.sessions[*].tags[*]' }],
148
+ },
149
+ });
150
+ const body = await requestBody(fetchSpy.mock.calls[0]);
151
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain('/sequences/c1/columns');
152
+ expect(body).toEqual({
153
+ columns: [{ key: 'tags', label: 'Topics', path: '$.opencx.data.sessions[*].tags[*]' }],
154
+ });
155
+ });
156
+ it('set_sequence_senders replaces the bound set', async () => {
157
+ await client.callTool({
158
+ name: 'set_sequence_senders',
159
+ arguments: { sequence_id: 'c1', channel: 'whatsapp', sender_ids: ['pn_1'] },
160
+ });
161
+ const body = await requestBody(fetchSpy.mock.calls[0]);
162
+ expect(body).toEqual({ channel: 'whatsapp', sender_ids: ['pn_1'] });
163
+ });
164
+ it('create_whatsapp_template posts the reduced authoring shape', async () => {
165
+ await client.callTool({
166
+ name: 'create_whatsapp_template',
167
+ arguments: {
168
+ name: 'invoicing_followup',
169
+ language: 'ar',
170
+ category: 'UTILITY',
171
+ body_text: 'Hi {{1}}',
172
+ body_variable_examples: ['Sara'],
173
+ footer_text: 'Support',
174
+ },
175
+ });
176
+ const body = await requestBody(fetchSpy.mock.calls[0]);
177
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain('/whatsapp/templates');
178
+ expect(body).toEqual({
179
+ name: 'invoicing_followup',
180
+ language: 'ar',
181
+ category: 'UTILITY',
182
+ body_text: 'Hi {{1}}',
183
+ body_variable_examples: ['Sara'],
184
+ footer_text: 'Support',
185
+ });
186
+ // Optional fields the caller omitted are not sent as undefined keys.
187
+ expect(body).not.toHaveProperty('header_text');
188
+ expect(body).not.toHaveProperty('waba_id');
189
+ });
190
+ it('defaults the examples list rather than omitting a required field', async () => {
191
+ await client.callTool({
192
+ name: 'create_whatsapp_template',
193
+ arguments: {
194
+ name: 'plain',
195
+ language: 'en_US',
196
+ category: 'UTILITY',
197
+ body_text: 'We are back',
198
+ },
199
+ });
200
+ const body = await requestBody(fetchSpy.mock.calls[0]);
201
+ expect(body?.body_variable_examples).toEqual([]);
202
+ });
203
+ });
204
+ describe('the spine — create, enroll, launch', () => {
205
+ it('create_sequence posts to /sequences', async () => {
206
+ await client.callTool({
207
+ name: 'create_sequence',
208
+ arguments: { name: 'Win back quiet merchants', brief: 'Merchants who went quiet.' },
209
+ });
210
+ // The guard this replaces asserted the URL was NOT the legacy engine's.
211
+ // That engine's public surface is gone, so the distinction it drew no
212
+ // longer exists — and left as a rename it read `toContain` and
213
+ // `not.toContain` the same string, which nothing can satisfy.
214
+ const url = requestUrl(fetchSpy.mock.calls[0]);
215
+ expect(url).toContain('/sequences');
216
+ expect(await requestBody(fetchSpy.mock.calls[0])).toEqual({
217
+ name: 'Win back quiet merchants',
218
+ brief: 'Merchants who went quiet.',
219
+ });
220
+ });
221
+ it('add_sequence_contacts hits /contacts — the path it used to guess as /recipients', async () => {
222
+ await client.callTool({
223
+ name: 'add_sequence_contacts',
224
+ arguments: {
225
+ sequence_id: 'c1',
226
+ contacts: [{ contact_id: 'ct-1' }, { phone_number: '962790000001' }],
227
+ batch_key: 'wave-1',
228
+ },
229
+ });
230
+ const url = requestUrl(fetchSpy.mock.calls[0]);
231
+ expect(url).toContain('/sequences/c1/contacts');
232
+ expect(url).not.toContain('/recipients');
233
+ expect(await requestBody(fetchSpy.mock.calls[0])).toEqual({
234
+ contacts: [{ contact_id: 'ct-1' }, { phone_number: '962790000001' }],
235
+ source: 'companion',
236
+ batch_key: 'wave-1',
237
+ });
238
+ });
239
+ it.each([
240
+ ['get_launch_preview', 'GET', '/sequences/c1/launch-preview'],
241
+ ['launch_sequence', 'POST', '/sequences/c1/launch'],
242
+ ['pause_sequence', 'POST', '/sequences/c1/pause'],
243
+ ['resume_sequence', 'POST', '/sequences/c1/resume'],
244
+ ['get_sequence', 'GET', '/sequences/c1'],
245
+ ['list_sequence_senders', 'GET', '/sequences/c1/senders'],
246
+ ['list_qualification_runs', 'GET', '/sequences/c1/qualification-runs'],
247
+ ])('%s calls %s %s', async (name, _verb, path) => {
248
+ await client.callTool({ name, arguments: { sequence_id: 'c1' } });
249
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain(path);
250
+ });
251
+ it('list_sequences needs no arguments', async () => {
252
+ const tool = await toolNamed('list_sequences');
253
+ expect(Object.keys(tool.inputSchema.properties ?? {})).toEqual([]);
254
+ await client.callTool({ name: 'list_sequences', arguments: {} });
255
+ expect(requestUrl(fetchSpy.mock.calls[0])).toMatch(/\/sequences($|\?)/);
256
+ });
257
+ it.each([
258
+ ['get_sequence_contact', 'GET', '/sequences/c1/contacts/ct-1'],
259
+ ['get_sequence_contact_events', 'GET', '/sequences/c1/contacts/ct-1/events'],
260
+ ])('%s calls %s %s (contact-addressed)', async (name, _verb, path) => {
261
+ await client.callTool({ name, arguments: { sequence_id: 'c1', contact_id: 'ct-1' } });
262
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain(path);
263
+ });
264
+ it('list_sequence_contacts hits the /contacts collection', async () => {
265
+ await client.callTool({ name: 'list_sequence_contacts', arguments: { sequence_id: 'c1' } });
266
+ const url = requestUrl(fetchSpy.mock.calls[0]);
267
+ expect(url).toContain('/sequences/c1/contacts');
268
+ expect(url).not.toContain('/recipients');
269
+ });
270
+ it('update_sequence_contact PATCHes the contact-addressed person route', async () => {
271
+ await client.callTool({
272
+ name: 'update_sequence_contact',
273
+ arguments: { sequence_id: 'c1', contact_id: 'ct-1', display_name: 'Sara' },
274
+ });
275
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain('/sequences/c1/contacts/ct-1');
276
+ expect(await requestBody(fetchSpy.mock.calls[0])).toEqual({ display_name: 'Sara' });
277
+ });
278
+ it('update_sequence_step_delay patches the step by index', async () => {
279
+ await client.callTool({
280
+ name: 'update_sequence_step_delay',
281
+ arguments: { sequence_id: 'c1', step_index: 1, delay_minutes: 2880 },
282
+ });
283
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain('/sequences/c1/steps/1/delay');
284
+ expect(await requestBody(fetchSpy.mock.calls[0])).toEqual({ delay_minutes: 2880 });
285
+ });
286
+ });
287
+ describe("overriding the engine is the USER's call", () => {
288
+ it('exit_sequence_contact records the reason', async () => {
289
+ await client.callTool({
290
+ name: 'exit_sequence_contact',
291
+ arguments: { sequence_id: 'c1', contact_id: 'r1', reason: 'already a customer' },
292
+ });
293
+ // The person is identified in the BODY, not the path — the route takes
294
+ // whichever handle the caller holds, and a contact id is only one of them.
295
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain('/sequences/c1/contacts/exit');
296
+ expect(await requestBody(fetchSpy.mock.calls[0])).toEqual({
297
+ contact_id: 'r1',
298
+ reason: 'already a customer',
299
+ });
300
+ });
301
+ it('include_sequence_contact overrides one named person', async () => {
302
+ await client.callTool({
303
+ name: 'include_sequence_contact',
304
+ arguments: { sequence_id: 'c1', contact_id: 'r1' },
305
+ });
306
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain('/sequences/c1/contacts/r1/include');
307
+ });
308
+ });
309
+ describe('step authoring tools — enroll-first ops', () => {
310
+ it('set_sequence_steps forwards a full voice step list to PUT /steps', async () => {
311
+ await client.callTool({
312
+ name: 'set_sequence_steps',
313
+ arguments: {
314
+ sequence_id: 'c1',
315
+ steps: [
316
+ {
317
+ channel: 'voice',
318
+ content: {
319
+ type: 'voice_call',
320
+ extra_instructions: 'Call {{name}}.',
321
+ variables: { name: { source: 'display_name', fallback: 'there' } },
322
+ },
323
+ delay_minutes: 0,
324
+ },
325
+ ],
326
+ },
327
+ });
328
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain('/sequences/c1/steps');
329
+ const body = await requestBody(fetchSpy.mock.calls[0]);
330
+ expect(body).toMatchObject({
331
+ steps: [{ channel: 'voice', content: { type: 'voice_call' }, delay_minutes: 0 }],
332
+ });
333
+ });
334
+ it('edit_sequence_steps forwards a mixed typed batch to PATCH /steps', async () => {
335
+ await client.callTool({
336
+ name: 'edit_sequence_steps',
337
+ arguments: {
338
+ sequence_id: 'c1',
339
+ edits: [
340
+ { op: 'remove', step_index: 2 },
341
+ {
342
+ op: 'append',
343
+ steps: [
344
+ {
345
+ channel: 'whatsapp',
346
+ content: {
347
+ type: 'whatsapp_template',
348
+ template_name: 'followup',
349
+ template_language: 'en',
350
+ variables: {},
351
+ },
352
+ delay_minutes: 1440,
353
+ },
354
+ ],
355
+ },
356
+ { op: 'update', step_index: 0, delay_minutes: 0 },
357
+ ],
358
+ },
359
+ });
360
+ const body = await requestBody(fetchSpy.mock.calls[0]);
361
+ expect(body?.edits).toHaveLength(3);
362
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain('/sequences/c1/steps');
363
+ });
364
+ it('set_sequence_steps forwards an email step — {{signature}} needs no binding', async () => {
365
+ await client.callTool({
366
+ name: 'set_sequence_steps',
367
+ arguments: {
368
+ sequence_id: 'c1',
369
+ steps: [
370
+ {
371
+ channel: 'email',
372
+ content: {
373
+ type: 'email',
374
+ subject: 'Your order, {{name}}',
375
+ html: '<p>Hi {{name}},</p><p>{{signature}}</p>',
376
+ text: 'Hi {{name}},\n\n{{signature}}',
377
+ variables: { name: { source: 'display_name', fallback: 'there' } },
378
+ },
379
+ delay_minutes: 0,
380
+ },
381
+ ],
382
+ },
383
+ });
384
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain('/sequences/c1/steps');
385
+ const body = await requestBody(fetchSpy.mock.calls[0]);
386
+ expect(body).toMatchObject({
387
+ steps: [{ channel: 'email', content: { type: 'email' }, delay_minutes: 0 }],
388
+ });
389
+ });
390
+ it('set_sequence_steps refuses an unbound email placeholder AT THE TOOL — no wire call', async () => {
391
+ // The token hides in the TEXT part on purpose: the scan must cover all
392
+ // three parts, not just the subject.
393
+ const result = await client.callTool({
394
+ name: 'set_sequence_steps',
395
+ arguments: {
396
+ sequence_id: 'c1',
397
+ steps: [
398
+ {
399
+ channel: 'email',
400
+ content: {
401
+ type: 'email',
402
+ subject: 'Hello',
403
+ html: '<p>Hello,</p>',
404
+ text: 'Hi {{firstname}},',
405
+ variables: {},
406
+ },
407
+ delay_minutes: 0,
408
+ },
409
+ ],
410
+ },
411
+ });
412
+ expect(result.isError).toBe(true);
413
+ expect(JSON.stringify(result.content)).toContain('unbound placeholders: firstname');
414
+ expect(fetchSpy).not.toHaveBeenCalled();
415
+ });
416
+ it('edit_sequence_steps updates a step with email content — token-free copy needs no variables', async () => {
417
+ await client.callTool({
418
+ name: 'edit_sequence_steps',
419
+ arguments: {
420
+ sequence_id: 'c1',
421
+ edits: [
422
+ {
423
+ op: 'update',
424
+ step_index: 1,
425
+ content: { type: 'email', subject: 'New subject', html: '<p>Hi.</p>', text: 'Hi.' },
426
+ },
427
+ ],
428
+ },
429
+ });
430
+ const body = await requestBody(fetchSpy.mock.calls[0]);
431
+ expect(body?.edits).toEqual([
432
+ {
433
+ op: 'update',
434
+ step_index: 1,
435
+ content: {
436
+ type: 'email',
437
+ subject: 'New subject',
438
+ html: '<p>Hi.</p>',
439
+ text: 'Hi.',
440
+ variables: {},
441
+ },
442
+ },
443
+ ]);
444
+ });
445
+ it('update_sequence forwards ONLY provided fields — a partial stays partial', async () => {
446
+ await client.callTool({
447
+ name: 'update_sequence',
448
+ arguments: {
449
+ sequence_id: 'c1',
450
+ settings: { respect_office_hours: true, office_hours_id: null },
451
+ },
452
+ });
453
+ const body = await requestBody(fetchSpy.mock.calls[0]);
454
+ expect(body).toEqual({
455
+ settings: { respect_office_hours: true, office_hours_id: null },
456
+ });
457
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain('/sequences/c1');
458
+ });
459
+ it('create_sequence still carries NO steps param — authoring is enroll-first', async () => {
460
+ const tool = await toolNamed('create_sequence');
461
+ expect(Object.keys(tool.inputSchema.properties ?? {})).not.toContain('steps');
462
+ });
463
+ });
464
+ describe('voice sender tools — the un-pinned channel', () => {
465
+ it('set_sequence_senders ACCEPTS channel voice (the whatsapp pin is gone)', async () => {
466
+ await client.callTool({
467
+ name: 'set_sequence_senders',
468
+ arguments: { sequence_id: 'c1', channel: 'voice', sender_ids: ['agent-1'] },
469
+ });
470
+ const body = await requestBody(fetchSpy.mock.calls[0]);
471
+ expect(body).toMatchObject({ channel: 'voice', sender_ids: ['agent-1'] });
472
+ });
473
+ it('list_voice_senders reads the campaign voice-senders catalog', async () => {
474
+ await client.callTool({ name: 'list_voice_senders', arguments: {} });
475
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain('/sequences/voice-senders');
476
+ });
477
+ it('list_verified_phone_numbers reads the phone surface', async () => {
478
+ await client.callTool({ name: 'list_verified_phone_numbers', arguments: {} });
479
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain('/phone/verified-phone-numbers');
480
+ });
481
+ });
482
+ describe('journey reads', () => {
483
+ it("get_sequence_contact_events reads one person's ledger", async () => {
484
+ await client.callTool({
485
+ name: 'get_sequence_contact_events',
486
+ arguments: { sequence_id: 'c1', contact_id: 'r1' },
487
+ });
488
+ expect(requestUrl(fetchSpy.mock.calls[0])).toContain('/sequences/c1/contacts/r1/events');
489
+ });
490
+ });
491
+ describe('API failures come back as data, not exceptions', () => {
492
+ it('reports a 403 without throwing, so the agent can explain it', async () => {
493
+ fetchSpy.mockResolvedValue(mockResponse({ message: 'insufficient scope' }, 403));
494
+ const res = await client.callTool({
495
+ name: 'create_whatsapp_template',
496
+ arguments: {
497
+ name: 'nope',
498
+ language: 'en_US',
499
+ category: 'UTILITY',
500
+ body_text: 'Hi',
501
+ },
502
+ });
503
+ const content = res.content;
504
+ expect(JSON.parse(content[0].text)).toMatchObject({ ok: false, status: 403 });
505
+ });
506
+ });
507
+ });
508
+ //# sourceMappingURL=campaign-tools.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"campaign-tools.spec.js","sourceRoot":"","sources":["../src/campaign-tools.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=companies.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"companies.spec.d.ts","sourceRoot":"","sources":["../src/companies.spec.ts"],"names":[],"mappings":""}