@strands-agents/sdk 1.1.0 → 1.3.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 (199) 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__/printer.test.js +58 -18
  11. package/dist/src/agent/__tests__/printer.test.js.map +1 -1
  12. package/dist/src/agent/__tests__/snapshot.test.js +98 -0
  13. package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
  14. package/dist/src/agent/agent-as-tool.d.ts.map +1 -1
  15. package/dist/src/agent/agent-as-tool.js +2 -3
  16. package/dist/src/agent/agent-as-tool.js.map +1 -1
  17. package/dist/src/agent/agent.d.ts +65 -0
  18. package/dist/src/agent/agent.d.ts.map +1 -1
  19. package/dist/src/agent/agent.js +89 -10
  20. package/dist/src/agent/agent.js.map +1 -1
  21. package/dist/src/agent/printer.d.ts +14 -1
  22. package/dist/src/agent/printer.d.ts.map +1 -1
  23. package/dist/src/agent/printer.js +33 -5
  24. package/dist/src/agent/printer.js.map +1 -1
  25. package/dist/src/agent/snapshot.d.ts +9 -17
  26. package/dist/src/agent/snapshot.d.ts.map +1 -1
  27. package/dist/src/agent/snapshot.js +9 -17
  28. package/dist/src/agent/snapshot.js.map +1 -1
  29. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +371 -39
  30. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
  31. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +26 -7
  32. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
  33. package/dist/src/conversation-manager/sliding-window-conversation-manager.js +192 -41
  34. package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
  35. package/dist/src/hooks/events.d.ts +24 -3
  36. package/dist/src/hooks/events.d.ts.map +1 -1
  37. package/dist/src/hooks/events.js +26 -4
  38. package/dist/src/hooks/events.js.map +1 -1
  39. package/dist/src/hooks/index.d.ts +1 -1
  40. package/dist/src/hooks/index.d.ts.map +1 -1
  41. package/dist/src/hooks/index.js +1 -1
  42. package/dist/src/hooks/index.js.map +1 -1
  43. package/dist/src/hooks/types.d.ts +2 -0
  44. package/dist/src/hooks/types.d.ts.map +1 -1
  45. package/dist/src/hooks/types.js +2 -0
  46. package/dist/src/hooks/types.js.map +1 -1
  47. package/dist/src/index.d.ts +8 -4
  48. package/dist/src/index.d.ts.map +1 -1
  49. package/dist/src/index.js +6 -2
  50. package/dist/src/index.js.map +1 -1
  51. package/dist/src/interrupt.d.ts +29 -2
  52. package/dist/src/interrupt.d.ts.map +1 -1
  53. package/dist/src/interrupt.js +45 -3
  54. package/dist/src/interrupt.js.map +1 -1
  55. package/dist/src/interventions/__tests__/handler.test.d.ts +2 -0
  56. package/dist/src/interventions/__tests__/handler.test.d.ts.map +1 -0
  57. package/dist/src/interventions/__tests__/handler.test.js +35 -0
  58. package/dist/src/interventions/__tests__/handler.test.js.map +1 -0
  59. package/dist/src/interventions/__tests__/registry.test.d.ts +2 -0
  60. package/dist/src/interventions/__tests__/registry.test.d.ts.map +1 -0
  61. package/dist/src/interventions/__tests__/registry.test.js +692 -0
  62. package/dist/src/interventions/__tests__/registry.test.js.map +1 -0
  63. package/dist/src/interventions/actions.d.ts +186 -0
  64. package/dist/src/interventions/actions.d.ts.map +1 -0
  65. package/dist/src/interventions/actions.js +56 -0
  66. package/dist/src/interventions/actions.js.map +1 -0
  67. package/dist/src/interventions/handler.d.ts +44 -0
  68. package/dist/src/interventions/handler.d.ts.map +1 -0
  69. package/dist/src/interventions/handler.js +41 -0
  70. package/dist/src/interventions/handler.js.map +1 -0
  71. package/dist/src/interventions/index.d.ts +12 -0
  72. package/dist/src/interventions/index.d.ts.map +1 -0
  73. package/dist/src/interventions/index.js +4 -0
  74. package/dist/src/interventions/index.js.map +1 -0
  75. package/dist/src/interventions/registry.d.ts +34 -0
  76. package/dist/src/interventions/registry.d.ts.map +1 -0
  77. package/dist/src/interventions/registry.js +248 -0
  78. package/dist/src/interventions/registry.js.map +1 -0
  79. package/dist/src/mcp.d.ts +38 -2
  80. package/dist/src/mcp.d.ts.map +1 -1
  81. package/dist/src/mcp.js +84 -7
  82. package/dist/src/mcp.js.map +1 -1
  83. package/dist/src/models/__tests__/anthropic.test.js +74 -10
  84. package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
  85. package/dist/src/models/__tests__/bedrock.test.js +43 -20
  86. package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
  87. package/dist/src/models/__tests__/google.test.js +14 -6
  88. package/dist/src/models/__tests__/google.test.js.map +1 -1
  89. package/dist/src/models/anthropic.d.ts +15 -3
  90. package/dist/src/models/anthropic.d.ts.map +1 -1
  91. package/dist/src/models/anthropic.js +30 -9
  92. package/dist/src/models/anthropic.js.map +1 -1
  93. package/dist/src/models/bedrock.d.ts +6 -7
  94. package/dist/src/models/bedrock.d.ts.map +1 -1
  95. package/dist/src/models/bedrock.js +31 -18
  96. package/dist/src/models/bedrock.js.map +1 -1
  97. package/dist/src/models/google/model.js +1 -1
  98. package/dist/src/models/google/model.js.map +1 -1
  99. package/dist/src/models/google/types.d.ts +5 -3
  100. package/dist/src/models/google/types.d.ts.map +1 -1
  101. package/dist/src/models/openai/__tests__/chat.test.js +10 -2
  102. package/dist/src/models/openai/__tests__/chat.test.js.map +1 -1
  103. package/dist/src/models/openai/__tests__/mantle.test.d.ts +2 -0
  104. package/dist/src/models/openai/__tests__/mantle.test.d.ts.map +1 -0
  105. package/dist/src/models/openai/__tests__/mantle.test.js +189 -0
  106. package/dist/src/models/openai/__tests__/mantle.test.js.map +1 -0
  107. package/dist/src/models/openai/__tests__/responses.test.js +19 -0
  108. package/dist/src/models/openai/__tests__/responses.test.js.map +1 -1
  109. package/dist/src/models/openai/errors.d.ts.map +1 -1
  110. package/dist/src/models/openai/errors.js +7 -4
  111. package/dist/src/models/openai/errors.js.map +1 -1
  112. package/dist/src/models/openai/index.d.ts +1 -0
  113. package/dist/src/models/openai/index.d.ts.map +1 -1
  114. package/dist/src/models/openai/mantle.d.ts +77 -0
  115. package/dist/src/models/openai/mantle.d.ts.map +1 -0
  116. package/dist/src/models/openai/mantle.js +83 -0
  117. package/dist/src/models/openai/mantle.js.map +1 -0
  118. package/dist/src/models/openai/model.d.ts.map +1 -1
  119. package/dist/src/models/openai/model.js +29 -1
  120. package/dist/src/models/openai/model.js.map +1 -1
  121. package/dist/src/models/openai/types.d.ts +11 -0
  122. package/dist/src/models/openai/types.d.ts.map +1 -1
  123. package/dist/src/multiagent/__tests__/graph.tracer.test.js +14 -0
  124. package/dist/src/multiagent/__tests__/graph.tracer.test.js.map +1 -1
  125. package/dist/src/multiagent/__tests__/interrupts.test.d.ts +2 -0
  126. package/dist/src/multiagent/__tests__/interrupts.test.d.ts.map +1 -0
  127. package/dist/src/multiagent/__tests__/interrupts.test.js +390 -0
  128. package/dist/src/multiagent/__tests__/interrupts.test.js.map +1 -0
  129. package/dist/src/multiagent/__tests__/state.test.js +139 -1
  130. package/dist/src/multiagent/__tests__/state.test.js.map +1 -1
  131. package/dist/src/multiagent/events.d.ts +15 -1
  132. package/dist/src/multiagent/events.d.ts.map +1 -1
  133. package/dist/src/multiagent/events.js +18 -0
  134. package/dist/src/multiagent/events.js.map +1 -1
  135. package/dist/src/multiagent/graph.d.ts +37 -1
  136. package/dist/src/multiagent/graph.d.ts.map +1 -1
  137. package/dist/src/multiagent/graph.js +171 -43
  138. package/dist/src/multiagent/graph.js.map +1 -1
  139. package/dist/src/multiagent/multiagent.d.ts +78 -6
  140. package/dist/src/multiagent/multiagent.d.ts.map +1 -1
  141. package/dist/src/multiagent/multiagent.js +115 -1
  142. package/dist/src/multiagent/multiagent.js.map +1 -1
  143. package/dist/src/multiagent/nodes.d.ts.map +1 -1
  144. package/dist/src/multiagent/nodes.js +55 -21
  145. package/dist/src/multiagent/nodes.js.map +1 -1
  146. package/dist/src/multiagent/state.d.ts +39 -3
  147. package/dist/src/multiagent/state.d.ts.map +1 -1
  148. package/dist/src/multiagent/state.js +80 -1
  149. package/dist/src/multiagent/state.js.map +1 -1
  150. package/dist/src/multiagent/swarm.d.ts +15 -0
  151. package/dist/src/multiagent/swarm.d.ts.map +1 -1
  152. package/dist/src/multiagent/swarm.js +127 -37
  153. package/dist/src/multiagent/swarm.js.map +1 -1
  154. package/dist/src/registry/__tests__/tool-registry.test.js +26 -0
  155. package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -1
  156. package/dist/src/registry/tool-registry.d.ts +9 -7
  157. package/dist/src/registry/tool-registry.d.ts.map +1 -1
  158. package/dist/src/registry/tool-registry.js +29 -10
  159. package/dist/src/registry/tool-registry.js.map +1 -1
  160. package/dist/src/session/__tests__/session-manager.test.js +45 -3
  161. package/dist/src/session/__tests__/session-manager.test.js.map +1 -1
  162. package/dist/src/session/session-manager.d.ts +5 -2
  163. package/dist/src/session/session-manager.d.ts.map +1 -1
  164. package/dist/src/session/session-manager.js +9 -6
  165. package/dist/src/session/session-manager.js.map +1 -1
  166. package/dist/src/telemetry/__tests__/meter.test.js +5 -27
  167. package/dist/src/telemetry/__tests__/meter.test.js.map +1 -1
  168. package/dist/src/telemetry/meter.d.ts +12 -4
  169. package/dist/src/telemetry/meter.d.ts.map +1 -1
  170. package/dist/src/telemetry/meter.js +13 -8
  171. package/dist/src/telemetry/meter.js.map +1 -1
  172. package/dist/src/tools/mcp-tool.d.ts.map +1 -1
  173. package/dist/src/tools/mcp-tool.js +3 -2
  174. package/dist/src/tools/mcp-tool.js.map +1 -1
  175. package/dist/src/tsconfig.tsbuildinfo +1 -1
  176. package/dist/src/types/__tests__/agent.test.js +97 -0
  177. package/dist/src/types/__tests__/agent.test.js.map +1 -1
  178. package/dist/src/types/agent.d.ts +26 -5
  179. package/dist/src/types/agent.d.ts.map +1 -1
  180. package/dist/src/types/agent.js +20 -3
  181. package/dist/src/types/agent.js.map +1 -1
  182. package/dist/src/types/messages.d.ts +3 -1
  183. package/dist/src/types/messages.d.ts.map +1 -1
  184. package/dist/src/types/messages.js.map +1 -1
  185. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +208 -0
  186. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +1 -1
  187. package/dist/src/vended-plugins/context-offloader/__tests__/search.test.d.ts +2 -0
  188. package/dist/src/vended-plugins/context-offloader/__tests__/search.test.d.ts.map +1 -0
  189. package/dist/src/vended-plugins/context-offloader/__tests__/search.test.js +149 -0
  190. package/dist/src/vended-plugins/context-offloader/__tests__/search.test.js.map +1 -0
  191. package/dist/src/vended-plugins/context-offloader/plugin.d.ts.map +1 -1
  192. package/dist/src/vended-plugins/context-offloader/plugin.js +57 -10
  193. package/dist/src/vended-plugins/context-offloader/plugin.js.map +1 -1
  194. package/dist/src/vended-plugins/context-offloader/search.d.ts +25 -0
  195. package/dist/src/vended-plugins/context-offloader/search.d.ts.map +1 -0
  196. package/dist/src/vended-plugins/context-offloader/search.js +120 -0
  197. package/dist/src/vended-plugins/context-offloader/search.js.map +1 -0
  198. package/dist/src/vended-tools/notebook/notebook.d.ts +1 -1
  199. package/package.json +11 -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