@strands-agents/sdk 1.1.0 → 1.2.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 (134) hide show
  1. package/README.md +6 -0
  2. package/dist/src/__tests__/interrupt.test.js +13 -8
  3. package/dist/src/__tests__/interrupt.test.js.map +1 -1
  4. package/dist/src/__tests__/mcp.test.js +221 -7
  5. package/dist/src/__tests__/mcp.test.js.map +1 -1
  6. package/dist/src/agent/__tests__/agent.interrupt.test.js +54 -5
  7. package/dist/src/agent/__tests__/agent.interrupt.test.js.map +1 -1
  8. package/dist/src/agent/__tests__/agent.test.js +56 -0
  9. package/dist/src/agent/__tests__/agent.test.js.map +1 -1
  10. package/dist/src/agent/__tests__/snapshot.test.js +98 -0
  11. package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
  12. package/dist/src/agent/agent-as-tool.d.ts.map +1 -1
  13. package/dist/src/agent/agent-as-tool.js +2 -3
  14. package/dist/src/agent/agent-as-tool.js.map +1 -1
  15. package/dist/src/agent/agent.d.ts +59 -0
  16. package/dist/src/agent/agent.d.ts.map +1 -1
  17. package/dist/src/agent/agent.js +86 -10
  18. package/dist/src/agent/agent.js.map +1 -1
  19. package/dist/src/agent/snapshot.d.ts +9 -17
  20. package/dist/src/agent/snapshot.d.ts.map +1 -1
  21. package/dist/src/agent/snapshot.js +9 -17
  22. package/dist/src/agent/snapshot.js.map +1 -1
  23. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +371 -39
  24. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
  25. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +26 -7
  26. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
  27. package/dist/src/conversation-manager/sliding-window-conversation-manager.js +192 -41
  28. package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
  29. package/dist/src/hooks/events.d.ts +24 -3
  30. package/dist/src/hooks/events.d.ts.map +1 -1
  31. package/dist/src/hooks/events.js +26 -4
  32. package/dist/src/hooks/events.js.map +1 -1
  33. package/dist/src/hooks/index.d.ts +1 -1
  34. package/dist/src/hooks/index.d.ts.map +1 -1
  35. package/dist/src/hooks/index.js +1 -1
  36. package/dist/src/hooks/index.js.map +1 -1
  37. package/dist/src/index.d.ts +6 -4
  38. package/dist/src/index.d.ts.map +1 -1
  39. package/dist/src/index.js +4 -2
  40. package/dist/src/index.js.map +1 -1
  41. package/dist/src/interrupt.d.ts +29 -2
  42. package/dist/src/interrupt.d.ts.map +1 -1
  43. package/dist/src/interrupt.js +45 -3
  44. package/dist/src/interrupt.js.map +1 -1
  45. package/dist/src/mcp.d.ts +38 -2
  46. package/dist/src/mcp.d.ts.map +1 -1
  47. package/dist/src/mcp.js +84 -7
  48. package/dist/src/mcp.js.map +1 -1
  49. package/dist/src/models/__tests__/anthropic.test.js +23 -8
  50. package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
  51. package/dist/src/models/__tests__/bedrock.test.js +43 -20
  52. package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
  53. package/dist/src/models/__tests__/google.test.js +14 -6
  54. package/dist/src/models/__tests__/google.test.js.map +1 -1
  55. package/dist/src/models/anthropic.d.ts +5 -3
  56. package/dist/src/models/anthropic.d.ts.map +1 -1
  57. package/dist/src/models/anthropic.js +11 -3
  58. package/dist/src/models/anthropic.js.map +1 -1
  59. package/dist/src/models/bedrock.d.ts +6 -7
  60. package/dist/src/models/bedrock.d.ts.map +1 -1
  61. package/dist/src/models/bedrock.js +31 -18
  62. package/dist/src/models/bedrock.js.map +1 -1
  63. package/dist/src/models/google/model.js +1 -1
  64. package/dist/src/models/google/model.js.map +1 -1
  65. package/dist/src/models/google/types.d.ts +5 -3
  66. package/dist/src/models/google/types.d.ts.map +1 -1
  67. package/dist/src/models/openai/__tests__/chat.test.js +10 -2
  68. package/dist/src/models/openai/__tests__/chat.test.js.map +1 -1
  69. package/dist/src/models/openai/__tests__/responses.test.js +19 -0
  70. package/dist/src/models/openai/__tests__/responses.test.js.map +1 -1
  71. package/dist/src/models/openai/errors.d.ts.map +1 -1
  72. package/dist/src/models/openai/errors.js +7 -4
  73. package/dist/src/models/openai/errors.js.map +1 -1
  74. package/dist/src/multiagent/__tests__/graph.tracer.test.js +14 -0
  75. package/dist/src/multiagent/__tests__/graph.tracer.test.js.map +1 -1
  76. package/dist/src/multiagent/__tests__/interrupts.test.d.ts +2 -0
  77. package/dist/src/multiagent/__tests__/interrupts.test.d.ts.map +1 -0
  78. package/dist/src/multiagent/__tests__/interrupts.test.js +390 -0
  79. package/dist/src/multiagent/__tests__/interrupts.test.js.map +1 -0
  80. package/dist/src/multiagent/__tests__/state.test.js +139 -1
  81. package/dist/src/multiagent/__tests__/state.test.js.map +1 -1
  82. package/dist/src/multiagent/events.d.ts +15 -1
  83. package/dist/src/multiagent/events.d.ts.map +1 -1
  84. package/dist/src/multiagent/events.js +18 -0
  85. package/dist/src/multiagent/events.js.map +1 -1
  86. package/dist/src/multiagent/graph.d.ts +37 -1
  87. package/dist/src/multiagent/graph.d.ts.map +1 -1
  88. package/dist/src/multiagent/graph.js +171 -43
  89. package/dist/src/multiagent/graph.js.map +1 -1
  90. package/dist/src/multiagent/multiagent.d.ts +78 -6
  91. package/dist/src/multiagent/multiagent.d.ts.map +1 -1
  92. package/dist/src/multiagent/multiagent.js +115 -1
  93. package/dist/src/multiagent/multiagent.js.map +1 -1
  94. package/dist/src/multiagent/nodes.d.ts.map +1 -1
  95. package/dist/src/multiagent/nodes.js +55 -21
  96. package/dist/src/multiagent/nodes.js.map +1 -1
  97. package/dist/src/multiagent/state.d.ts +39 -3
  98. package/dist/src/multiagent/state.d.ts.map +1 -1
  99. package/dist/src/multiagent/state.js +80 -1
  100. package/dist/src/multiagent/state.js.map +1 -1
  101. package/dist/src/multiagent/swarm.d.ts +15 -0
  102. package/dist/src/multiagent/swarm.d.ts.map +1 -1
  103. package/dist/src/multiagent/swarm.js +127 -37
  104. package/dist/src/multiagent/swarm.js.map +1 -1
  105. package/dist/src/registry/__tests__/tool-registry.test.js +26 -0
  106. package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -1
  107. package/dist/src/registry/tool-registry.d.ts +9 -7
  108. package/dist/src/registry/tool-registry.d.ts.map +1 -1
  109. package/dist/src/registry/tool-registry.js +29 -10
  110. package/dist/src/registry/tool-registry.js.map +1 -1
  111. package/dist/src/session/__tests__/session-manager.test.js +45 -3
  112. package/dist/src/session/__tests__/session-manager.test.js.map +1 -1
  113. package/dist/src/session/session-manager.d.ts +5 -2
  114. package/dist/src/session/session-manager.d.ts.map +1 -1
  115. package/dist/src/session/session-manager.js +9 -6
  116. package/dist/src/session/session-manager.js.map +1 -1
  117. package/dist/src/telemetry/__tests__/meter.test.js +5 -27
  118. package/dist/src/telemetry/__tests__/meter.test.js.map +1 -1
  119. package/dist/src/telemetry/meter.d.ts +12 -4
  120. package/dist/src/telemetry/meter.d.ts.map +1 -1
  121. package/dist/src/telemetry/meter.js +13 -8
  122. package/dist/src/telemetry/meter.js.map +1 -1
  123. package/dist/src/tools/mcp-tool.d.ts.map +1 -1
  124. package/dist/src/tools/mcp-tool.js +3 -2
  125. package/dist/src/tools/mcp-tool.js.map +1 -1
  126. package/dist/src/tsconfig.tsbuildinfo +1 -1
  127. package/dist/src/types/__tests__/agent.test.js +97 -0
  128. package/dist/src/types/__tests__/agent.test.js.map +1 -1
  129. package/dist/src/types/agent.d.ts +26 -5
  130. package/dist/src/types/agent.d.ts.map +1 -1
  131. package/dist/src/types/agent.js +20 -3
  132. package/dist/src/types/agent.js.map +1 -1
  133. package/dist/src/vended-tools/notebook/notebook.d.ts +1 -1
  134. package/package.json +1 -1
package/README.md CHANGED
@@ -19,6 +19,7 @@
19
19
  <a href="https://github.com/strands-agents/sdk-typescript/pulls"><img alt="GitHub open pull requests" src="https://img.shields.io/github/issues-pr/strands-agents/sdk-typescript"/></a>
20
20
  <a href="https://github.com/strands-agents/sdk-typescript/blob/main/LICENSE.APACHE"><img alt="License" src="https://img.shields.io/github/license/strands-agents/sdk-typescript"/></a>
21
21
  <a href="https://www.npmjs.com/package/@strands-agents/sdk"><img alt="NPM Version" src="https://img.shields.io/npm/v/@strands-agents/sdk"/></a>
22
+ <a href="https://discord.gg/strands"><img alt="Strands Discord" src="https://img.shields.io/badge/Discord-Strands-5865F2?logo=discord&logoColor=white"/></a>
22
23
  </div>
23
24
 
24
25
  <p>
@@ -328,6 +329,11 @@ We welcome contributions! See our [Contributing Guide](CONTRIBUTING.md) for deta
328
329
 
329
330
  ---
330
331
 
332
+ ## Stay in touch with the team
333
+ Come meet the Strands team and other users on [**Discord**](https://discord.com/invite/strands)
334
+
335
+ ---
336
+
331
337
  ## License
332
338
 
333
339
  This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE.APACHE) file for details.
@@ -14,6 +14,7 @@ describe('Interrupt', () => {
14
14
  name: 'confirm_action',
15
15
  reason: 'Please confirm',
16
16
  response: 'approved',
17
+ source: 'hook',
17
18
  });
18
19
  // response is mutable after construction
19
20
  interrupt.response = 'changed';
@@ -33,7 +34,7 @@ describe('Interrupt', () => {
33
34
  it('omits undefined reason/response from toJSON', () => {
34
35
  const interrupt = new Interrupt({ id: 'int-1', name: 'test' });
35
36
  const json = interrupt.toJSON();
36
- expect(json).toStrictEqual({ id: 'int-1', name: 'test' });
37
+ expect(json).toStrictEqual({ id: 'int-1', name: 'test', source: 'hook' });
37
38
  expect('reason' in json).toBe(false);
38
39
  expect('response' in json).toBe(false);
39
40
  });
@@ -66,7 +67,7 @@ describe('InterruptState', () => {
66
67
  it('creates new interrupt and stores it', () => {
67
68
  const state = new InterruptState();
68
69
  const interrupt = state.getOrCreateInterrupt('int-1', 'test', 'reason');
69
- expect(interrupt).toEqual({ id: 'int-1', name: 'test', reason: 'reason' });
70
+ expect(interrupt).toEqual({ id: 'int-1', name: 'test', reason: 'reason', source: 'hook' });
70
71
  expect(state.interrupts['int-1']).toBe(interrupt);
71
72
  expect(state.getInterruptsList()).toStrictEqual([interrupt]);
72
73
  });
@@ -96,6 +97,7 @@ describe('InterruptState', () => {
96
97
  name: 'confirm',
97
98
  reason: 'reason',
98
99
  response: 'pre-approved',
100
+ source: 'hook',
99
101
  });
100
102
  });
101
103
  it('ignores preemptive response when interrupt already exists', () => {
@@ -109,6 +111,7 @@ describe('InterruptState', () => {
109
111
  name: 'confirm',
110
112
  reason: 'reason',
111
113
  response: 'user response',
114
+ source: 'hook',
112
115
  });
113
116
  });
114
117
  });
@@ -214,13 +217,14 @@ describe('interruptFromAgent', () => {
214
217
  name: 'confirm',
215
218
  reason: 'need approval',
216
219
  response: 'pre-approved',
217
- });
220
+ }, 'tool');
218
221
  expect(result).toBe('pre-approved');
219
- expect(state.interrupts['test-id']).toEqual({
222
+ expect(state.interrupts['test-id']).toMatchObject({
220
223
  id: 'test-id',
221
224
  name: 'confirm',
222
225
  reason: 'need approval',
223
226
  response: 'pre-approved',
227
+ source: 'tool',
224
228
  });
225
229
  });
226
230
  it('returns resume response over preemptive response for existing interrupt', () => {
@@ -232,9 +236,9 @@ describe('interruptFromAgent', () => {
232
236
  name: 'confirm',
233
237
  reason: 'need approval',
234
238
  response: 'preemptive',
235
- });
239
+ }, 'tool');
236
240
  expect(result).toBe('user-provided');
237
- expect(state.interrupts['test-id']).toEqual({
241
+ expect(state.interrupts['test-id']).toMatchObject({
238
242
  id: 'test-id',
239
243
  name: 'confirm',
240
244
  reason: 'need approval',
@@ -247,12 +251,13 @@ describe('interruptFromAgent', () => {
247
251
  const result = interruptFromAgent(agent, 'test-id', {
248
252
  name: 'confirm',
249
253
  response: null,
250
- });
254
+ }, 'tool');
251
255
  expect(result).toBeNull();
252
- expect(state.interrupts['test-id']).toEqual({
256
+ expect(state.interrupts['test-id']).toMatchObject({
253
257
  id: 'test-id',
254
258
  name: 'confirm',
255
259
  response: null,
260
+ source: 'tool',
256
261
  });
257
262
  });
258
263
  });
@@ -1 +1 @@
1
- {"version":3,"file":"interrupt.test.js","sourceRoot":"","sources":["../../../src/__tests__/interrupt.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interrupt.test.js","sourceRoot":"","sources":["../../../src/__tests__/interrupt.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
2
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
3
3
  import { McpError, ErrorCode, ElicitRequestSchema, UrlElicitationRequiredError, } from '@modelcontextprotocol/sdk/types.js';
4
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
5
+ import { ClientCredentialsProvider } from '@modelcontextprotocol/sdk/client/auth-extensions.js';
4
6
  import { McpClient } from '../mcp.js';
5
7
  import { McpTool } from '../tools/mcp-tool.js';
6
8
  import { JsonBlock } from '../types/messages.js';
@@ -16,6 +18,16 @@ function createMockCallToolStream(result) {
16
18
  yield { type: 'result', result };
17
19
  };
18
20
  }
21
+ vi.mock('@modelcontextprotocol/sdk/client/streamableHttp.js', () => ({
22
+ StreamableHTTPClientTransport: vi.fn(function () {
23
+ return { start: vi.fn(), send: vi.fn(), close: vi.fn() };
24
+ }),
25
+ }));
26
+ vi.mock('@modelcontextprotocol/sdk/client/auth-extensions.js', () => ({
27
+ ClientCredentialsProvider: vi.fn(function () {
28
+ return { redirectUrl: undefined, clientMetadata: { client_id: 'test' } };
29
+ }),
30
+ }));
19
31
  vi.mock('@modelcontextprotocol/sdk/client/index.js', () => ({
20
32
  Client: vi.fn(function () {
21
33
  return {
@@ -115,7 +127,11 @@ describe('MCP Integration', () => {
115
127
  sdkClientMock = vi.mocked(Client).mock.results[0].value;
116
128
  });
117
129
  it('initializes SDK client with correct configuration', () => {
118
- expect(Client).toHaveBeenCalledWith({ name: 'TestApp', version: '0.0.1' }, undefined);
130
+ expect(Client).toHaveBeenCalledWith({ name: 'TestApp', version: '0.0.1' }, expect.objectContaining({
131
+ listChanged: expect.objectContaining({
132
+ tools: expect.objectContaining({ autoRefresh: false, debounceMs: 300 }),
133
+ }),
134
+ }));
119
135
  });
120
136
  it('injects trace context into tool arguments when active span exists', async () => {
121
137
  mockActiveSpan();
@@ -243,12 +259,32 @@ describe('MCP Integration', () => {
243
259
  sdkClientMock.callTool.mockResolvedValue({ content: [] });
244
260
  await client.callTool(tool, { op: 'add' });
245
261
  expect(sdkClientMock.connect).toHaveBeenCalled();
246
- expect(sdkClientMock.callTool).toHaveBeenCalledWith({
247
- name: 'calc',
248
- arguments: { op: 'add' },
249
- });
262
+ expect(sdkClientMock.callTool).toHaveBeenCalledWith({ name: 'calc', arguments: { op: 'add' } }, undefined, undefined);
250
263
  expect(sdkClientMock.experimental.tasks.callToolStream).not.toHaveBeenCalled();
251
264
  });
265
+ it('forwards abort signal to SDK callTool', async () => {
266
+ const tool = new McpTool({ name: 'calc', description: '', inputSchema: {}, client });
267
+ sdkClientMock.callTool.mockResolvedValue({ content: [] });
268
+ const controller = new AbortController();
269
+ await client.callTool(tool, { op: 'add' }, { signal: controller.signal });
270
+ expect(sdkClientMock.callTool).toHaveBeenCalledWith({ name: 'calc', arguments: { op: 'add' } }, undefined, {
271
+ signal: controller.signal,
272
+ });
273
+ });
274
+ it('forwards abort signal to callToolStream when tasksConfig is provided', async () => {
275
+ const resultsLengthBefore = vi.mocked(Client).mock.results.length;
276
+ const taskClient = new McpClient({
277
+ applicationName: 'TestApp',
278
+ transport: mockTransport,
279
+ tasksConfig: {},
280
+ });
281
+ const taskSdkClientMock = vi.mocked(Client).mock.results[resultsLengthBefore].value;
282
+ const tool = new McpTool({ name: 'calc', description: '', inputSchema: {}, client: taskClient });
283
+ taskSdkClientMock.experimental.tasks.callToolStream.mockReturnValue(createMockCallToolStream({ content: [] })());
284
+ const controller = new AbortController();
285
+ await taskClient.callTool(tool, { op: 'add' }, { signal: controller.signal });
286
+ expect(taskSdkClientMock.experimental.tasks.callToolStream).toHaveBeenCalledWith({ name: 'calc', arguments: { op: 'add' } }, undefined, { timeout: 60000, maxTotalTimeout: 300000, resetTimeoutOnProgress: true, signal: controller.signal });
287
+ });
252
288
  it('uses callToolStream when tasksConfig is provided (empty object)', async () => {
253
289
  const resultsLengthBefore = vi.mocked(Client).mock.results.length;
254
290
  const taskClient = new McpClient({
@@ -318,7 +354,7 @@ describe('MCP Integration', () => {
318
354
  elicitationCallback: callback,
319
355
  });
320
356
  const lastCall = vi.mocked(Client).mock.calls.at(-1);
321
- expect(lastCall[1]).toEqual({ capabilities: { elicitation: { form: {}, url: {} } } });
357
+ expect(lastCall[1]).toEqual(expect.objectContaining({ capabilities: { elicitation: { form: {}, url: {} } } }));
322
358
  });
323
359
  it('elicitation handler returns accepted result with content', async () => {
324
360
  const callbackResult = { action: 'accept', content: { username: 'alice' } };
@@ -374,6 +410,98 @@ describe('MCP Integration', () => {
374
410
  await expect(handler(request, extra)).rejects.toThrow('User cancelled');
375
411
  });
376
412
  });
413
+ describe('tools list changed', () => {
414
+ let client;
415
+ let sdkClientMock;
416
+ beforeEach(() => {
417
+ client = new McpClient({ applicationName: 'TestApp', transport: mockTransport });
418
+ sdkClientMock = vi.mocked(Client).mock.results.at(-1).value;
419
+ sdkClientMock.connect.mockResolvedValue(undefined);
420
+ });
421
+ function triggerToolsChanged() {
422
+ const ctorCall = vi.mocked(Client).mock.calls.at(-1);
423
+ ctorCall[1].listChanged.tools.onChanged(null, null);
424
+ }
425
+ it('calls onToolsChanged with old names and new tools when list changes', async () => {
426
+ sdkClientMock.listTools.mockResolvedValue({
427
+ tools: [{ name: 'tool_a', description: 'A', inputSchema: {} }],
428
+ });
429
+ await client.listTools();
430
+ const onToolsChanged = vi.fn();
431
+ client.onToolsChanged = onToolsChanged;
432
+ sdkClientMock.listTools.mockResolvedValue({
433
+ tools: [
434
+ { name: 'tool_a', description: 'A', inputSchema: {} },
435
+ { name: 'tool_b', description: 'B', inputSchema: {} },
436
+ ],
437
+ });
438
+ triggerToolsChanged();
439
+ await vi.waitFor(() => expect(onToolsChanged).toHaveBeenCalled());
440
+ expect(onToolsChanged).toHaveBeenCalledWith(['tool_a'], expect.any(Array));
441
+ const newTools = onToolsChanged.mock.calls[0][1];
442
+ expect(newTools.map((t) => t.name)).toEqual(['tool_a', 'tool_b']);
443
+ });
444
+ it('updates registered tool names after each listTools call', async () => {
445
+ sdkClientMock.listTools.mockResolvedValue({
446
+ tools: [
447
+ { name: 'x', description: 'X', inputSchema: {} },
448
+ { name: 'y', description: 'Y', inputSchema: {} },
449
+ ],
450
+ });
451
+ await client.listTools();
452
+ const onToolsChanged = vi.fn();
453
+ client.onToolsChanged = onToolsChanged;
454
+ sdkClientMock.listTools.mockResolvedValue({
455
+ tools: [{ name: 'z', description: 'Z', inputSchema: {} }],
456
+ });
457
+ triggerToolsChanged();
458
+ await vi.waitFor(() => expect(onToolsChanged).toHaveBeenCalled());
459
+ expect(onToolsChanged).toHaveBeenCalledWith(['x', 'y'], expect.any(Array));
460
+ const newTools = onToolsChanged.mock.calls[0][1];
461
+ expect(newTools.map((t) => t.name)).toEqual(['z']);
462
+ });
463
+ it('does not throw when onToolsChanged is not set', async () => {
464
+ sdkClientMock.listTools.mockResolvedValue({
465
+ tools: [{ name: 'tool_a', description: 'A', inputSchema: {} }],
466
+ });
467
+ await client.listTools();
468
+ sdkClientMock.listTools.mockResolvedValue({
469
+ tools: [{ name: 'tool_b', description: 'B', inputSchema: {} }],
470
+ });
471
+ triggerToolsChanged();
472
+ await new Promise((r) => setTimeout(r, 0));
473
+ });
474
+ it('logs warning and preserves registry when listTools fails during refresh', async () => {
475
+ sdkClientMock.listTools.mockResolvedValue({
476
+ tools: [{ name: 'tool_a', description: 'A', inputSchema: {} }],
477
+ });
478
+ await client.listTools();
479
+ const onToolsChanged = vi.fn();
480
+ client.onToolsChanged = onToolsChanged;
481
+ sdkClientMock.listTools.mockRejectedValue(new Error('server disconnected'));
482
+ const warnSpy = vi.spyOn(logger, 'warn');
483
+ triggerToolsChanged();
484
+ await vi.waitFor(() => expect(warnSpy).toHaveBeenCalled());
485
+ expect(onToolsChanged).not.toHaveBeenCalled();
486
+ expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('failed to refresh tools'));
487
+ });
488
+ it('coalesces notifications received during an in-flight refresh into one extra refresh', async () => {
489
+ sdkClientMock.listTools.mockResolvedValue({
490
+ tools: [{ name: 'tool_a', description: 'A', inputSchema: {} }],
491
+ });
492
+ await client.listTools();
493
+ const onToolsChanged = vi.fn();
494
+ client.onToolsChanged = onToolsChanged;
495
+ let resolveListTools;
496
+ sdkClientMock.listTools.mockReturnValue(new Promise((r) => (resolveListTools = r)));
497
+ triggerToolsChanged();
498
+ triggerToolsChanged();
499
+ triggerToolsChanged();
500
+ resolveListTools({ tools: [{ name: 'tool_b', description: 'B', inputSchema: {} }] });
501
+ await vi.waitFor(() => expect(onToolsChanged).toHaveBeenCalledTimes(2));
502
+ expect(sdkClientMock.listTools).toHaveBeenCalledTimes(3);
503
+ });
504
+ });
377
505
  describe('McpTool', () => {
378
506
  const mockClientWrapper = { callTool: vi.fn() };
379
507
  const tool = new McpTool({
@@ -384,12 +512,21 @@ describe('MCP Integration', () => {
384
512
  });
385
513
  const toolContext = {
386
514
  toolUse: { toolUseId: 'id-123', name: 'weather', input: { city: 'NYC' } },
387
- agent: {},
515
+ agent: { cancelSignal: new AbortController().signal },
388
516
  invocationState: {},
389
517
  interrupt: () => {
390
518
  throw new Error('interrupt not available in mock context');
391
519
  },
392
520
  };
521
+ it('forwards agent cancelSignal to callTool', async () => {
522
+ vi.mocked(mockClientWrapper.callTool).mockResolvedValue({
523
+ content: [{ type: 'text', text: 'ok' }],
524
+ });
525
+ await runTool(tool.stream(toolContext));
526
+ expect(mockClientWrapper.callTool).toHaveBeenCalledWith(tool, { city: 'NYC' }, {
527
+ signal: toolContext.agent.cancelSignal,
528
+ });
529
+ });
393
530
  it('returns text results on success', async () => {
394
531
  vi.mocked(mockClientWrapper.callTool).mockResolvedValue({
395
532
  content: [{ type: 'text', text: 'Sunny' }],
@@ -786,4 +923,81 @@ describe('log routing', () => {
786
923
  expect(customHandler).toHaveBeenCalledWith(params);
787
924
  });
788
925
  });
926
+ describe('McpClient transport resolution', () => {
927
+ beforeEach(() => {
928
+ vi.clearAllMocks();
929
+ });
930
+ it('constructs StreamableHTTPClientTransport when url is provided', () => {
931
+ new McpClient({ url: 'https://mcp.example.com' });
932
+ expect(StreamableHTTPClientTransport).toHaveBeenCalledWith(new URL('https://mcp.example.com'), undefined);
933
+ });
934
+ it('constructs ClientCredentialsProvider when auth is provided', () => {
935
+ new McpClient({ url: 'https://mcp.example.com', auth: { clientId: 'id', clientSecret: 'secret' } });
936
+ expect(ClientCredentialsProvider).toHaveBeenCalledWith({ clientId: 'id', clientSecret: 'secret' });
937
+ expect(StreamableHTTPClientTransport).toHaveBeenCalledWith(new URL('https://mcp.example.com'), {
938
+ authProvider: expect.anything(),
939
+ });
940
+ });
941
+ it('passes scopes as space-separated string', () => {
942
+ new McpClient({
943
+ url: 'https://mcp.example.com',
944
+ auth: { clientId: 'id', clientSecret: 'secret', scopes: ['read', 'write'] },
945
+ });
946
+ expect(ClientCredentialsProvider).toHaveBeenCalledWith({
947
+ clientId: 'id',
948
+ clientSecret: 'secret',
949
+ scope: 'read write',
950
+ });
951
+ });
952
+ it('passes custom authProvider to transport', () => {
953
+ const customProvider = { redirectUrl: undefined, clientMetadata: {} };
954
+ new McpClient({ url: 'https://mcp.example.com', authProvider: customProvider });
955
+ expect(StreamableHTTPClientTransport).toHaveBeenCalledWith(new URL('https://mcp.example.com'), {
956
+ authProvider: customProvider,
957
+ });
958
+ });
959
+ it('throws when both transport and url are provided', () => {
960
+ expect(() => new McpClient({ transport: mockTransport, url: 'https://mcp.example.com' })).toThrow('provide either "transport" or "url", not both');
961
+ });
962
+ it('throws when neither transport nor url is provided', () => {
963
+ expect(() => new McpClient({})).toThrow('either "transport" or "url" must be provided');
964
+ });
965
+ it('throws when auth is provided with transport', () => {
966
+ expect(() => new McpClient({ transport: mockTransport, auth: { clientId: 'x', clientSecret: 'y' } })).toThrow('"auth", "authProvider", and "headers" require "url"');
967
+ });
968
+ it('throws when both auth and authProvider are provided', () => {
969
+ const customProvider = {};
970
+ expect(() => new McpClient({
971
+ url: 'https://mcp.example.com',
972
+ auth: { clientId: 'x', clientSecret: 'y' },
973
+ authProvider: customProvider,
974
+ })).toThrow('provide either "auth" or "authProvider", not both');
975
+ });
976
+ it('accepts URL instance for url field', () => {
977
+ const url = new URL('https://mcp.example.com/path');
978
+ new McpClient({ url });
979
+ expect(StreamableHTTPClientTransport).toHaveBeenCalledWith(url, undefined);
980
+ });
981
+ it('passes headers as requestInit to transport', () => {
982
+ new McpClient({ url: 'https://mcp.example.com', headers: { 'X-Api-Key': 'abc' } });
983
+ expect(StreamableHTTPClientTransport).toHaveBeenCalledWith(new URL('https://mcp.example.com'), {
984
+ requestInit: { headers: { 'X-Api-Key': 'abc' } },
985
+ });
986
+ });
987
+ it('passes both auth and headers to transport', () => {
988
+ new McpClient({
989
+ url: 'https://mcp.example.com',
990
+ auth: { clientId: 'id', clientSecret: 'secret' },
991
+ headers: { 'X-Trace': '123' },
992
+ });
993
+ expect(ClientCredentialsProvider).toHaveBeenCalledWith({ clientId: 'id', clientSecret: 'secret' });
994
+ expect(StreamableHTTPClientTransport).toHaveBeenCalledWith(new URL('https://mcp.example.com'), {
995
+ authProvider: expect.anything(),
996
+ requestInit: { headers: { 'X-Trace': '123' } },
997
+ });
998
+ });
999
+ it('throws when headers is provided with transport', () => {
1000
+ expect(() => new McpClient({ transport: mockTransport, headers: { 'X-Foo': 'bar' } })).toThrow('"auth", "authProvider", and "headers" require "url"');
1001
+ });
1002
+ });
789
1003
  //# sourceMappingURL=mcp.test.js.map