@strands-agents/sdk 1.0.0-rc.4 → 1.0.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 (265) hide show
  1. package/README.md +8 -15
  2. package/dist/src/__fixtures__/agent-helpers.d.ts +6 -0
  3. package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
  4. package/dist/src/__fixtures__/agent-helpers.js +3 -1
  5. package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
  6. package/dist/src/__fixtures__/mock-plugin.d.ts.map +1 -1
  7. package/dist/src/__fixtures__/mock-plugin.js +3 -1
  8. package/dist/src/__fixtures__/mock-plugin.js.map +1 -1
  9. package/dist/src/__fixtures__/tool-helpers.d.ts +3 -1
  10. package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
  11. package/dist/src/__fixtures__/tool-helpers.js +3 -1
  12. package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
  13. package/dist/src/__tests__/mcp.test.js +274 -1
  14. package/dist/src/__tests__/mcp.test.js.map +1 -1
  15. package/dist/src/a2a/__tests__/events.test.js +2 -0
  16. package/dist/src/a2a/__tests__/events.test.js.map +1 -1
  17. package/dist/src/a2a/__tests__/executor.test.js +16 -5
  18. package/dist/src/a2a/__tests__/executor.test.js.map +1 -1
  19. package/dist/src/a2a/a2a-agent.d.ts +8 -3
  20. package/dist/src/a2a/a2a-agent.d.ts.map +1 -1
  21. package/dist/src/a2a/a2a-agent.js +12 -6
  22. package/dist/src/a2a/a2a-agent.js.map +1 -1
  23. package/dist/src/a2a/executor.d.ts +13 -0
  24. package/dist/src/a2a/executor.d.ts.map +1 -1
  25. package/dist/src/a2a/executor.js +19 -1
  26. package/dist/src/a2a/executor.js.map +1 -1
  27. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts +2 -0
  28. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts.map +1 -0
  29. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js +23 -0
  30. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js.map +1 -0
  31. package/dist/src/agent/__tests__/agent.cancel.test.js +1 -1
  32. package/dist/src/agent/__tests__/agent.cancel.test.js.map +1 -1
  33. package/dist/src/agent/__tests__/agent.concurrent.test.d.ts +2 -0
  34. package/dist/src/agent/__tests__/agent.concurrent.test.d.ts.map +1 -0
  35. package/dist/src/agent/__tests__/agent.concurrent.test.js +488 -0
  36. package/dist/src/agent/__tests__/agent.concurrent.test.js.map +1 -0
  37. package/dist/src/agent/__tests__/agent.hook.test.js +174 -12
  38. package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
  39. package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts +2 -0
  40. package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts.map +1 -0
  41. package/dist/src/agent/__tests__/agent.invocation-state.test.js +219 -0
  42. package/dist/src/agent/__tests__/agent.invocation-state.test.js.map +1 -0
  43. package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts +2 -0
  44. package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts.map +1 -0
  45. package/dist/src/agent/__tests__/agent.stateful-model.test.js +169 -0
  46. package/dist/src/agent/__tests__/agent.stateful-model.test.js.map +1 -0
  47. package/dist/src/agent/__tests__/agent.test.js +99 -2
  48. package/dist/src/agent/__tests__/agent.test.js.map +1 -1
  49. package/dist/src/agent/__tests__/agent.tracer.test.node.js +39 -0
  50. package/dist/src/agent/__tests__/agent.tracer.test.node.js.map +1 -1
  51. package/dist/src/agent/__tests__/snapshot.test.js +5 -4
  52. package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
  53. package/dist/src/agent/agent-as-tool.d.ts.map +1 -1
  54. package/dist/src/agent/agent-as-tool.js +4 -2
  55. package/dist/src/agent/agent-as-tool.js.map +1 -1
  56. package/dist/src/agent/agent.d.ts +75 -1
  57. package/dist/src/agent/agent.d.ts.map +1 -1
  58. package/dist/src/agent/agent.js +323 -83
  59. package/dist/src/agent/agent.js.map +1 -1
  60. package/dist/src/agent/snapshot.d.ts +2 -2
  61. package/dist/src/agent/snapshot.d.ts.map +1 -1
  62. package/dist/src/agent/snapshot.js +8 -2
  63. package/dist/src/agent/snapshot.js.map +1 -1
  64. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +4 -4
  65. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +1 -1
  66. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +2 -2
  67. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js.map +1 -1
  68. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +8 -3
  69. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
  70. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js +1 -0
  71. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +1 -1
  72. package/dist/src/errors.d.ts +11 -0
  73. package/dist/src/errors.d.ts.map +1 -1
  74. package/dist/src/errors.js +12 -0
  75. package/dist/src/errors.js.map +1 -1
  76. package/dist/src/hooks/__tests__/events.test.js +177 -70
  77. package/dist/src/hooks/__tests__/events.test.js.map +1 -1
  78. package/dist/src/hooks/__tests__/registry.test.js +16 -16
  79. package/dist/src/hooks/__tests__/registry.test.js.map +1 -1
  80. package/dist/src/hooks/events.d.ts +95 -25
  81. package/dist/src/hooks/events.d.ts.map +1 -1
  82. package/dist/src/hooks/events.js +98 -23
  83. package/dist/src/hooks/events.js.map +1 -1
  84. package/dist/src/index.d.ts +6 -5
  85. package/dist/src/index.d.ts.map +1 -1
  86. package/dist/src/index.js.map +1 -1
  87. package/dist/src/logging/__tests__/warn-once.test.d.ts +2 -0
  88. package/dist/src/logging/__tests__/warn-once.test.d.ts.map +1 -0
  89. package/dist/src/logging/__tests__/warn-once.test.js +30 -0
  90. package/dist/src/logging/__tests__/warn-once.test.js.map +1 -0
  91. package/dist/src/logging/warn-once.d.ts +13 -0
  92. package/dist/src/logging/warn-once.d.ts.map +1 -0
  93. package/dist/src/logging/warn-once.js +18 -0
  94. package/dist/src/logging/warn-once.js.map +1 -0
  95. package/dist/src/mcp.d.ts +20 -1
  96. package/dist/src/mcp.d.ts.map +1 -1
  97. package/dist/src/mcp.js +10 -1
  98. package/dist/src/mcp.js.map +1 -1
  99. package/dist/src/mime.d.ts +2 -1
  100. package/dist/src/mime.d.ts.map +1 -1
  101. package/dist/src/mime.js +1 -0
  102. package/dist/src/mime.js.map +1 -1
  103. package/dist/src/models/__tests__/anthropic.test.js +99 -1
  104. package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
  105. package/dist/src/models/__tests__/bedrock.test.js +123 -2
  106. package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
  107. package/dist/src/models/__tests__/google.test.js +88 -0
  108. package/dist/src/models/__tests__/google.test.js.map +1 -1
  109. package/dist/src/models/__tests__/model.test.js +149 -1
  110. package/dist/src/models/__tests__/model.test.js.map +1 -1
  111. package/dist/src/models/anthropic.d.ts +18 -1
  112. package/dist/src/models/anthropic.d.ts.map +1 -1
  113. package/dist/src/models/anthropic.js +40 -6
  114. package/dist/src/models/anthropic.js.map +1 -1
  115. package/dist/src/models/bedrock.d.ts +12 -1
  116. package/dist/src/models/bedrock.d.ts.map +1 -1
  117. package/dist/src/models/bedrock.js +45 -11
  118. package/dist/src/models/bedrock.js.map +1 -1
  119. package/dist/src/models/defaults.d.ts +37 -0
  120. package/dist/src/models/defaults.d.ts.map +1 -0
  121. package/dist/src/models/defaults.js +41 -0
  122. package/dist/src/models/defaults.js.map +1 -0
  123. package/dist/src/models/google/model.d.ts +14 -1
  124. package/dist/src/models/google/model.d.ts.map +1 -1
  125. package/dist/src/models/google/model.js +50 -6
  126. package/dist/src/models/google/model.js.map +1 -1
  127. package/dist/src/models/model.d.ts +56 -0
  128. package/dist/src/models/model.d.ts.map +1 -1
  129. package/dist/src/models/model.js +120 -0
  130. package/dist/src/models/model.js.map +1 -1
  131. package/dist/src/models/openai/__tests__/chat.test.d.ts +2 -0
  132. package/dist/src/models/openai/__tests__/chat.test.d.ts.map +1 -0
  133. package/dist/src/models/{__tests__/openai.test.js → openai/__tests__/chat.test.js} +84 -7
  134. package/dist/src/models/openai/__tests__/chat.test.js.map +1 -0
  135. package/dist/src/models/openai/__tests__/responses.test.d.ts +2 -0
  136. package/dist/src/models/openai/__tests__/responses.test.d.ts.map +1 -0
  137. package/dist/src/models/openai/__tests__/responses.test.js +668 -0
  138. package/dist/src/models/openai/__tests__/responses.test.js.map +1 -0
  139. package/dist/src/models/openai/chat-adapter.d.ts +33 -0
  140. package/dist/src/models/openai/chat-adapter.d.ts.map +1 -0
  141. package/dist/src/models/openai/chat-adapter.js +383 -0
  142. package/dist/src/models/openai/chat-adapter.js.map +1 -0
  143. package/dist/src/models/openai/errors.d.ts +16 -0
  144. package/dist/src/models/openai/errors.d.ts.map +1 -0
  145. package/dist/src/models/openai/errors.js +40 -0
  146. package/dist/src/models/openai/errors.js.map +1 -0
  147. package/dist/src/models/openai/formatting.d.ts +18 -0
  148. package/dist/src/models/openai/formatting.d.ts.map +1 -0
  149. package/dist/src/models/openai/formatting.js +38 -0
  150. package/dist/src/models/openai/formatting.js.map +1 -0
  151. package/dist/src/models/openai/index.d.ts +19 -0
  152. package/dist/src/models/openai/index.d.ts.map +1 -0
  153. package/dist/src/models/openai/index.js +18 -0
  154. package/dist/src/models/openai/index.js.map +1 -0
  155. package/dist/src/models/openai/model.d.ts +77 -0
  156. package/dist/src/models/openai/model.d.ts.map +1 -0
  157. package/dist/src/models/openai/model.js +211 -0
  158. package/dist/src/models/openai/model.js.map +1 -0
  159. package/dist/src/models/openai/responses-adapter.d.ts +78 -0
  160. package/dist/src/models/openai/responses-adapter.d.ts.map +1 -0
  161. package/dist/src/models/openai/responses-adapter.js +467 -0
  162. package/dist/src/models/openai/responses-adapter.js.map +1 -0
  163. package/dist/src/models/openai/types.d.ts +131 -0
  164. package/dist/src/models/openai/types.d.ts.map +1 -0
  165. package/dist/src/models/openai/types.js +5 -0
  166. package/dist/src/models/openai/types.js.map +1 -0
  167. package/dist/src/multiagent/__tests__/events.test.js +122 -28
  168. package/dist/src/multiagent/__tests__/events.test.js.map +1 -1
  169. package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts +2 -0
  170. package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts.map +1 -0
  171. package/dist/src/multiagent/__tests__/graph.invocation-state.test.js +95 -0
  172. package/dist/src/multiagent/__tests__/graph.invocation-state.test.js.map +1 -0
  173. package/dist/src/multiagent/__tests__/nodes.test.js +5 -2
  174. package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
  175. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts +2 -0
  176. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts.map +1 -0
  177. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js +56 -0
  178. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js.map +1 -0
  179. package/dist/src/multiagent/events.d.ts +19 -1
  180. package/dist/src/multiagent/events.d.ts.map +1 -1
  181. package/dist/src/multiagent/events.js +18 -0
  182. package/dist/src/multiagent/events.js.map +1 -1
  183. package/dist/src/multiagent/graph.d.ts +5 -3
  184. package/dist/src/multiagent/graph.d.ts.map +1 -1
  185. package/dist/src/multiagent/graph.js +22 -15
  186. package/dist/src/multiagent/graph.js.map +1 -1
  187. package/dist/src/multiagent/index.d.ts +1 -1
  188. package/dist/src/multiagent/index.d.ts.map +1 -1
  189. package/dist/src/multiagent/multiagent.d.ts +16 -3
  190. package/dist/src/multiagent/multiagent.d.ts.map +1 -1
  191. package/dist/src/multiagent/nodes.d.ts +10 -3
  192. package/dist/src/multiagent/nodes.d.ts.map +1 -1
  193. package/dist/src/multiagent/nodes.js +28 -6
  194. package/dist/src/multiagent/nodes.js.map +1 -1
  195. package/dist/src/multiagent/swarm.d.ts +5 -3
  196. package/dist/src/multiagent/swarm.d.ts.map +1 -1
  197. package/dist/src/multiagent/swarm.js +22 -16
  198. package/dist/src/multiagent/swarm.js.map +1 -1
  199. package/dist/src/plugins/__tests__/registry.test.js +1 -1
  200. package/dist/src/plugins/__tests__/registry.test.js.map +1 -1
  201. package/dist/src/plugins/model-plugin.d.ts +20 -0
  202. package/dist/src/plugins/model-plugin.d.ts.map +1 -0
  203. package/dist/src/plugins/model-plugin.js +29 -0
  204. package/dist/src/plugins/model-plugin.js.map +1 -0
  205. package/dist/src/session/__tests__/session-manager.test.js +13 -11
  206. package/dist/src/session/__tests__/session-manager.test.js.map +1 -1
  207. package/dist/src/session/session-manager.d.ts.map +1 -1
  208. package/dist/src/session/session-manager.js +9 -0
  209. package/dist/src/session/session-manager.js.map +1 -1
  210. package/dist/src/telemetry/__tests__/config.test.js +6 -6
  211. package/dist/src/telemetry/__tests__/config.test.js.map +1 -1
  212. package/dist/src/telemetry/__tests__/config.test.node.js +16 -11
  213. package/dist/src/telemetry/__tests__/config.test.node.js.map +1 -1
  214. package/dist/src/telemetry/__tests__/meter.test.js +23 -0
  215. package/dist/src/telemetry/__tests__/meter.test.js.map +1 -1
  216. package/dist/src/telemetry/config.d.ts +9 -3
  217. package/dist/src/telemetry/config.d.ts.map +1 -1
  218. package/dist/src/telemetry/config.js +44 -69
  219. package/dist/src/telemetry/config.js.map +1 -1
  220. package/dist/src/telemetry/meter.d.ts +15 -0
  221. package/dist/src/telemetry/meter.d.ts.map +1 -1
  222. package/dist/src/telemetry/meter.js +14 -0
  223. package/dist/src/telemetry/meter.js.map +1 -1
  224. package/dist/src/tools/mcp-tool.d.ts +24 -3
  225. package/dist/src/tools/mcp-tool.d.ts.map +1 -1
  226. package/dist/src/tools/mcp-tool.js +105 -14
  227. package/dist/src/tools/mcp-tool.js.map +1 -1
  228. package/dist/src/tools/tool.d.ts +11 -1
  229. package/dist/src/tools/tool.d.ts.map +1 -1
  230. package/dist/src/tools/tool.js.map +1 -1
  231. package/dist/src/tsconfig.tsbuildinfo +1 -1
  232. package/dist/src/types/__tests__/agent.test.js +48 -0
  233. package/dist/src/types/__tests__/agent.test.js.map +1 -1
  234. package/dist/src/types/agent.d.ts +55 -6
  235. package/dist/src/types/agent.d.ts.map +1 -1
  236. package/dist/src/types/agent.js +22 -6
  237. package/dist/src/types/agent.js.map +1 -1
  238. package/dist/src/types/elicitation.d.ts +15 -0
  239. package/dist/src/types/elicitation.d.ts.map +1 -0
  240. package/dist/src/types/elicitation.js +2 -0
  241. package/dist/src/types/elicitation.js.map +1 -0
  242. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js +37 -33
  243. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js.map +1 -1
  244. package/dist/src/vended-plugins/skills/agent-skills.d.ts +8 -8
  245. package/dist/src/vended-plugins/skills/agent-skills.d.ts.map +1 -1
  246. package/dist/src/vended-plugins/skills/agent-skills.js +5 -5
  247. package/dist/src/vended-plugins/skills/agent-skills.js.map +1 -1
  248. package/dist/src/vended-plugins/skills/index.d.ts +5 -5
  249. package/dist/src/vended-plugins/skills/index.d.ts.map +1 -1
  250. package/dist/src/vended-plugins/skills/index.js +4 -4
  251. package/dist/src/vended-plugins/skills/index.js.map +1 -1
  252. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +1 -0
  253. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
  254. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js +1 -0
  255. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +1 -1
  256. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +1 -0
  257. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
  258. package/package.json +28 -26
  259. package/dist/src/models/__tests__/openai.test.d.ts +0 -2
  260. package/dist/src/models/__tests__/openai.test.d.ts.map +0 -1
  261. package/dist/src/models/__tests__/openai.test.js.map +0 -1
  262. package/dist/src/models/openai.d.ts +0 -312
  263. package/dist/src/models/openai.d.ts.map +0 -1
  264. package/dist/src/models/openai.js +0 -789
  265. package/dist/src/models/openai.js.map +0 -1
@@ -0,0 +1,488 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { Agent } from '../agent.js';
3
+ import { AfterToolCallEvent, AfterToolsEvent, BeforeToolCallEvent, BeforeToolsEvent, ToolResultEvent, ToolStreamUpdateEvent, } from '../../hooks/index.js';
4
+ import { MockMessageModel } from '../../__fixtures__/mock-message-model.js';
5
+ import { MockPlugin } from '../../__fixtures__/mock-plugin.js';
6
+ import { Message, TextBlock, ToolResultBlock } from '../../types/messages.js';
7
+ import { Tool, ToolStreamEvent } from '../../tools/tool.js';
8
+ /**
9
+ * A tool whose `stream()` suspends until `release()` is called. Lets tests
10
+ * drive concurrency deterministically without wall-clock sleeps.
11
+ *
12
+ * `started` resolves as soon as the agent enters the tool's `stream()`, so
13
+ * tests can await "both tools in flight" without polling. The tool also
14
+ * honors `ctx.agent.cancelSignal`: aborting the signal resolves the gate and
15
+ * marks `observations.cancelled = true`.
16
+ */
17
+ class GatedTool extends Tool {
18
+ name;
19
+ description;
20
+ toolSpec;
21
+ started;
22
+ observations = { started: false, cancelled: false, completed: false };
23
+ _signalStarted;
24
+ _releaser;
25
+ _release;
26
+ constructor(name) {
27
+ super();
28
+ this.name = name;
29
+ this.description = `Gated tool ${name}`;
30
+ this.toolSpec = { name, description: this.description, inputSchema: { type: 'object', properties: {} } };
31
+ this.started = new Promise((resolve) => (this._signalStarted = resolve));
32
+ this._releaser = new Promise((resolve) => (this._release = resolve));
33
+ }
34
+ release() {
35
+ this._release();
36
+ }
37
+ // eslint-disable-next-line require-yield
38
+ async *stream(ctx) {
39
+ this.observations.started = true;
40
+ this._signalStarted();
41
+ await new Promise((resolve) => {
42
+ void this._releaser.then(resolve);
43
+ ctx.agent.cancelSignal.addEventListener('abort', () => {
44
+ this.observations.cancelled = true;
45
+ resolve();
46
+ }, { once: true });
47
+ });
48
+ this.observations.completed = true;
49
+ return new ToolResultBlock({
50
+ toolUseId: ctx.toolUse.toolUseId,
51
+ status: 'success',
52
+ content: [new TextBlock(`${this.name} done`)],
53
+ });
54
+ }
55
+ }
56
+ /**
57
+ * A streaming tool whose `emit(data)` yields a `ToolStreamEvent` and resolves
58
+ * only after the agent has fully dispatched it; `complete()` terminates the
59
+ * stream. Tests can drive exact interleaving between tools without timers.
60
+ */
61
+ class GatedStreamingTool extends Tool {
62
+ name;
63
+ description;
64
+ toolSpec;
65
+ _queue = [];
66
+ _notify = null;
67
+ constructor(name) {
68
+ super();
69
+ this.name = name;
70
+ this.description = `Gated streaming tool ${name}`;
71
+ this.toolSpec = { name, description: this.description, inputSchema: { type: 'object', properties: {} } };
72
+ }
73
+ async emit(data) {
74
+ return this._send({ type: 'emit', data });
75
+ }
76
+ async complete() {
77
+ return this._send({ type: 'complete' });
78
+ }
79
+ _send(cmd) {
80
+ return new Promise((ack) => {
81
+ this._queue.push({ cmd, ack });
82
+ this._notify?.();
83
+ this._notify = null;
84
+ });
85
+ }
86
+ async *stream(ctx) {
87
+ while (true) {
88
+ while (this._queue.length === 0) {
89
+ await new Promise((resolve) => (this._notify = resolve));
90
+ }
91
+ const { cmd, ack } = this._queue.shift();
92
+ if (cmd.type === 'complete') {
93
+ ack();
94
+ return new ToolResultBlock({
95
+ toolUseId: ctx.toolUse.toolUseId,
96
+ status: 'success',
97
+ content: [new TextBlock(`${this.name} done`)],
98
+ });
99
+ }
100
+ yield new ToolStreamEvent({ data: cmd.data });
101
+ ack();
102
+ }
103
+ }
104
+ }
105
+ function twoToolTurn() {
106
+ return new MockMessageModel()
107
+ .addTurn([
108
+ { type: 'toolUseBlock', name: 'toolA', toolUseId: 'a', input: {} },
109
+ { type: 'toolUseBlock', name: 'toolB', toolUseId: 'b', input: {} },
110
+ ])
111
+ .addTurn({ type: 'textBlock', text: 'Done' });
112
+ }
113
+ describe('Agent concurrent tool execution', () => {
114
+ it('runs tools concurrently by default', async () => {
115
+ const toolA = new GatedTool('toolA');
116
+ const toolB = new GatedTool('toolB');
117
+ const agent = new Agent({
118
+ model: twoToolTurn(),
119
+ tools: [toolA, toolB],
120
+ // no toolExecutor — relies on the concurrent default
121
+ printer: false,
122
+ });
123
+ const invocation = agent.invoke('Go');
124
+ // Both tools reach their stream() before either is released — proves
125
+ // concurrency without relying on wall-clock overlap.
126
+ await Promise.all([toolA.started, toolB.started]);
127
+ expect(toolA.observations.completed).toBe(false);
128
+ expect(toolB.observations.completed).toBe(false);
129
+ toolA.release();
130
+ toolB.release();
131
+ await invocation;
132
+ expect(toolA.observations.completed).toBe(true);
133
+ expect(toolB.observations.completed).toBe(true);
134
+ });
135
+ it('runs tools sequentially when toolExecutor is sequential', async () => {
136
+ const toolA = new GatedTool('toolA');
137
+ const toolB = new GatedTool('toolB');
138
+ const agent = new Agent({
139
+ model: twoToolTurn(),
140
+ tools: [toolA, toolB],
141
+ toolExecutor: 'sequential',
142
+ printer: false,
143
+ });
144
+ const invocation = agent.invoke('Go');
145
+ await toolA.started;
146
+ // B has not started — sequential executor is still blocked on A.
147
+ expect(toolB.observations.started).toBe(false);
148
+ toolA.release();
149
+ await toolB.started;
150
+ toolB.release();
151
+ await invocation;
152
+ });
153
+ it('preserves per-tool event ordering while interleaving across tools', async () => {
154
+ const toolA = new GatedStreamingTool('toolA');
155
+ const toolB = new GatedStreamingTool('toolB');
156
+ const plugin = new MockPlugin();
157
+ const agent = new Agent({
158
+ model: twoToolTurn(),
159
+ tools: [toolA, toolB],
160
+ toolExecutor: 'concurrent',
161
+ printer: false,
162
+ plugins: [plugin],
163
+ });
164
+ const invocation = agent.invoke('Go');
165
+ // Drive explicit A,B,A,B,A,B interleaving.
166
+ await toolA.emit({ tool: 'toolA', step: 0 });
167
+ await toolB.emit({ tool: 'toolB', step: 0 });
168
+ await toolA.emit({ tool: 'toolA', step: 1 });
169
+ await toolB.emit({ tool: 'toolB', step: 1 });
170
+ await toolA.emit({ tool: 'toolA', step: 2 });
171
+ await toolB.emit({ tool: 'toolB', step: 2 });
172
+ await toolA.complete();
173
+ await toolB.complete();
174
+ await invocation;
175
+ const events = plugin.invocations
176
+ .map((e) => {
177
+ if (e instanceof BeforeToolCallEvent)
178
+ return { kind: 'before', toolUseId: e.toolUse.toolUseId };
179
+ if (e instanceof AfterToolCallEvent)
180
+ return { kind: 'after', toolUseId: e.toolUse.toolUseId };
181
+ if (e instanceof ToolResultEvent)
182
+ return { kind: 'result', toolUseId: e.result.toolUseId };
183
+ if (e instanceof ToolStreamUpdateEvent) {
184
+ const data = e.event.data;
185
+ return data?.tool !== undefined ? { kind: 'stream', tool: data.tool } : { kind: 'stream' };
186
+ }
187
+ return null;
188
+ })
189
+ .filter((e) => e !== null);
190
+ // Per-tool subsequence shape: [before, stream*, after, result].
191
+ for (const toolUseId of ['a', 'b']) {
192
+ const subseq = events.filter((e) => e.toolUseId === toolUseId || (e.kind === 'stream' && e.tool === (toolUseId === 'a' ? 'toolA' : 'toolB')));
193
+ const kinds = subseq.map((e) => e.kind);
194
+ expect(kinds[0]).toBe('before');
195
+ expect(kinds.slice(-2)).toEqual(['after', 'result']);
196
+ for (const k of kinds.slice(1, -2)) {
197
+ expect(k).toBe('stream');
198
+ }
199
+ }
200
+ // Cross-tool interleaving: collapse consecutive same-tool stream events
201
+ // into runs. Strictly sequential execution produces 2 runs (A,A,A,B,B,B);
202
+ // anything > 2 means the stream alternated at least once.
203
+ const streamTools = events.filter((e) => e.kind === 'stream').map((e) => e.tool);
204
+ const runs = streamTools.reduce((acc, t) => {
205
+ if (acc.length === 0 || acc[acc.length - 1] !== t)
206
+ acc.push(t);
207
+ return acc;
208
+ }, []);
209
+ expect(runs.length).toBeGreaterThan(2);
210
+ });
211
+ it('retries one tool independently from the other', async () => {
212
+ let retriesA = 0;
213
+ const toolA = new GatedTool('toolA');
214
+ const toolB = new GatedTool('toolB');
215
+ const agent = new Agent({
216
+ model: twoToolTurn(),
217
+ tools: [toolA, toolB],
218
+ toolExecutor: 'concurrent',
219
+ printer: false,
220
+ });
221
+ const beforeCalls = [];
222
+ agent.addHook(BeforeToolCallEvent, (e) => void beforeCalls.push(e.toolUse.name));
223
+ agent.addHook(AfterToolCallEvent, (e) => {
224
+ if (e.toolUse.name === 'toolA' && retriesA === 0) {
225
+ retriesA++;
226
+ e.retry = true;
227
+ }
228
+ });
229
+ const invocation = agent.invoke('Go');
230
+ // Release both gates; on retry A re-enters with an already-resolved
231
+ // releaser and completes immediately.
232
+ await Promise.all([toolA.started, toolB.started]);
233
+ toolA.release();
234
+ toolB.release();
235
+ await invocation;
236
+ expect(beforeCalls.filter((n) => n === 'toolA')).toHaveLength(2);
237
+ expect(beforeCalls.filter((n) => n === 'toolB')).toHaveLength(1);
238
+ });
239
+ it('cancels all tools when BeforeToolsEvent.cancel is set (concurrent mode)', async () => {
240
+ const toolA = new GatedTool('toolA');
241
+ const toolB = new GatedTool('toolB');
242
+ const agent = new Agent({
243
+ model: twoToolTurn(),
244
+ tools: [toolA, toolB],
245
+ toolExecutor: 'concurrent',
246
+ printer: false,
247
+ });
248
+ agent.addHook(BeforeToolsEvent, (e) => {
249
+ e.cancel = 'hook cancelled';
250
+ });
251
+ let afterMessage;
252
+ agent.addHook(AfterToolsEvent, (e) => {
253
+ afterMessage = e.message;
254
+ });
255
+ await agent.invoke('Go');
256
+ // No tool ever ran.
257
+ expect(toolA.observations.started).toBe(false);
258
+ expect(toolB.observations.started).toBe(false);
259
+ expect(afterMessage.content).toHaveLength(2);
260
+ const r0 = afterMessage.content[0];
261
+ const r1 = afterMessage.content[1];
262
+ expect(r0.status).toBe('error');
263
+ expect(r1.status).toBe('error');
264
+ expect(r0.toolUseId).toBe('a');
265
+ expect(r1.toolUseId).toBe('b');
266
+ });
267
+ it('cancels all tools when agent is cancelled before launch (concurrent mode)', async () => {
268
+ const toolA = new GatedTool('toolA');
269
+ const toolB = new GatedTool('toolB');
270
+ const agent = new Agent({
271
+ model: twoToolTurn(),
272
+ tools: [toolA, toolB],
273
+ toolExecutor: 'concurrent',
274
+ printer: false,
275
+ });
276
+ agent.addHook(BeforeToolsEvent, () => {
277
+ agent.cancel();
278
+ });
279
+ await agent.invoke('Go');
280
+ expect(toolA.observations.started).toBe(false);
281
+ expect(toolB.observations.started).toBe(false);
282
+ });
283
+ it('cooperative mid-flight cancel — tools honor cancelSignal and exit', async () => {
284
+ const toolA = new GatedTool('toolA');
285
+ const toolB = new GatedTool('toolB');
286
+ const agent = new Agent({
287
+ model: twoToolTurn(),
288
+ tools: [toolA, toolB],
289
+ toolExecutor: 'concurrent',
290
+ printer: false,
291
+ });
292
+ // Cancel deterministically once both tools have entered their gates.
293
+ void Promise.all([toolA.started, toolB.started]).then(() => agent.cancel());
294
+ await agent.invoke('Go');
295
+ expect(toolA.observations.cancelled).toBe(true);
296
+ expect(toolB.observations.cancelled).toBe(true);
297
+ });
298
+ it('handles a throwing tool without affecting siblings', async () => {
299
+ const toolA = new GatedTool('toolA');
300
+ const toolB = new GatedTool('toolB');
301
+ const agent = new Agent({
302
+ model: twoToolTurn(),
303
+ tools: [toolA, toolB],
304
+ toolExecutor: 'concurrent',
305
+ printer: false,
306
+ });
307
+ // A throwing tool.stream is caught by executeTool's own try/catch and
308
+ // normalized to an error ToolResultBlock, so the race loop never sees the
309
+ // rejection. This test verifies that normalization path keeps the sibling
310
+ // unaffected in concurrent mode. The race loop's `kind: 'throw'` fallback
311
+ // is a defensive backstop for generator-level rejections that escape
312
+ // executeTool entirely — not expected in normal operation and not exercised
313
+ // here.
314
+ const results = [];
315
+ agent.addHook(AfterToolsEvent, (e) => {
316
+ for (const b of e.message.content) {
317
+ if (b.type === 'toolResultBlock')
318
+ results.push(b);
319
+ }
320
+ });
321
+ // eslint-disable-next-line require-yield
322
+ toolA.stream = async function* () {
323
+ throw new Error('boom');
324
+ };
325
+ const invocation = agent.invoke('Go');
326
+ await toolB.started;
327
+ toolB.release();
328
+ await invocation;
329
+ const [a, b] = results.sort((x, y) => x.toolUseId.localeCompare(y.toolUseId));
330
+ expect(a.status).toBe('error');
331
+ expect(b.status).toBe('success');
332
+ });
333
+ it('handles a hallucinated tool name in a batch without affecting siblings', async () => {
334
+ const toolA = new GatedTool('toolA');
335
+ const agent = new Agent({
336
+ model: new MockMessageModel()
337
+ .addTurn([
338
+ { type: 'toolUseBlock', name: 'toolA', toolUseId: 'a', input: {} },
339
+ { type: 'toolUseBlock', name: 'unknownTool', toolUseId: 'b', input: {} },
340
+ ])
341
+ .addTurn({ type: 'textBlock', text: 'Done' }),
342
+ tools: [toolA],
343
+ toolExecutor: 'concurrent',
344
+ printer: false,
345
+ });
346
+ let afterMessage;
347
+ agent.addHook(AfterToolsEvent, (e) => {
348
+ afterMessage = e.message;
349
+ });
350
+ const invocation = agent.invoke('Go');
351
+ await toolA.started;
352
+ toolA.release();
353
+ await invocation;
354
+ expect(afterMessage.content).toHaveLength(2);
355
+ const blocks = afterMessage.content;
356
+ expect(blocks.find((r) => r.toolUseId === 'a').status).toBe('success');
357
+ expect(blocks.find((r) => r.toolUseId === 'b').status).toBe('error');
358
+ });
359
+ it('preserves source order of tool results in AfterToolsEvent.message', async () => {
360
+ const toolA = new GatedTool('toolA');
361
+ const toolB = new GatedTool('toolB');
362
+ const agent = new Agent({
363
+ model: twoToolTurn(),
364
+ tools: [toolA, toolB],
365
+ toolExecutor: 'concurrent',
366
+ printer: false,
367
+ });
368
+ // Deterministically complete B before A.
369
+ let resolveBDone = () => { };
370
+ const bDone = new Promise((resolve) => (resolveBDone = resolve));
371
+ agent.addHook(ToolResultEvent, (e) => {
372
+ if (e.result.toolUseId === 'b')
373
+ resolveBDone();
374
+ });
375
+ let afterMessage;
376
+ agent.addHook(AfterToolsEvent, (e) => {
377
+ afterMessage = e.message;
378
+ });
379
+ const invocation = agent.invoke('Go');
380
+ await Promise.all([toolA.started, toolB.started]);
381
+ toolB.release();
382
+ await bDone;
383
+ toolA.release();
384
+ await invocation;
385
+ const blocks = afterMessage.content;
386
+ expect(blocks.map((b) => b.toolUseId)).toEqual(['a', 'b']);
387
+ });
388
+ it('AfterToolsEvent.message contains completed results when consumer breaks mid-stream', async () => {
389
+ const toolA = new GatedTool('toolA');
390
+ const toolB = new GatedTool('toolB'); // never released
391
+ const agent = new Agent({
392
+ model: twoToolTurn(),
393
+ tools: [toolA, toolB],
394
+ toolExecutor: 'concurrent',
395
+ printer: false,
396
+ });
397
+ agent.addHook(BeforeToolCallEvent, (e) => {
398
+ if (e.toolUse.name === 'toolA')
399
+ toolA.release();
400
+ });
401
+ let afterToolsMessage;
402
+ agent.addHook(AfterToolsEvent, (e) => {
403
+ afterToolsMessage = e.message;
404
+ });
405
+ let toolResultsSeen = 0;
406
+ for await (const event of agent.stream('Go')) {
407
+ if (event.type === 'toolResultEvent') {
408
+ toolResultsSeen++;
409
+ if (toolResultsSeen === 1) {
410
+ // Cancel so toolB (still parked on its gate) observes cancelSignal
411
+ // and exits cooperatively — otherwise gen.return() stays blocked on
412
+ // a suspended await.
413
+ agent.cancel();
414
+ break;
415
+ }
416
+ }
417
+ }
418
+ expect(afterToolsMessage).toBeDefined();
419
+ const blocks = afterToolsMessage.content.filter((b) => b.type === 'toolResultBlock');
420
+ expect(blocks.length).toBeGreaterThanOrEqual(1);
421
+ expect(blocks.some((b) => b.toolUseId === 'a')).toBe(true);
422
+ });
423
+ it('pre-launch agent.cancel() during BeforeToolsEvent produces "Tool execution cancelled" (concurrent)', async () => {
424
+ const toolA = new GatedTool('toolA');
425
+ const toolB = new GatedTool('toolB');
426
+ const agent = new Agent({
427
+ model: twoToolTurn(),
428
+ tools: [toolA, toolB],
429
+ toolExecutor: 'concurrent',
430
+ printer: false,
431
+ });
432
+ agent.addHook(BeforeToolsEvent, () => {
433
+ agent.cancel();
434
+ });
435
+ let afterMessage;
436
+ agent.addHook(AfterToolsEvent, (e) => {
437
+ afterMessage = e.message;
438
+ });
439
+ await agent.invoke('Go');
440
+ expect(toolA.observations.started).toBe(false);
441
+ expect(toolB.observations.started).toBe(false);
442
+ const blocks = afterMessage.content;
443
+ expect(blocks).toHaveLength(2);
444
+ for (const b of blocks) {
445
+ expect(b.content[0].text).toBe('Tool execution cancelled');
446
+ }
447
+ });
448
+ it('closes in-flight generators and includes fallback results when consumer breaks', async () => {
449
+ const toolA = new GatedTool('toolA');
450
+ const toolB = new GatedTool('toolB'); // never released
451
+ const agent = new Agent({
452
+ model: twoToolTurn(),
453
+ tools: [toolA, toolB],
454
+ toolExecutor: 'concurrent',
455
+ printer: false,
456
+ });
457
+ agent.addHook(BeforeToolCallEvent, (e) => {
458
+ if (e.toolUse.name === 'toolA')
459
+ toolA.release();
460
+ });
461
+ let afterToolsMessage;
462
+ agent.addHook(AfterToolsEvent, (e) => {
463
+ afterToolsMessage = e.message;
464
+ });
465
+ let toolResultsSeen = 0;
466
+ for await (const event of agent.stream('Go')) {
467
+ if (event.type === 'toolResultEvent') {
468
+ toolResultsSeen++;
469
+ if (toolResultsSeen === 1) {
470
+ // Cancel so toolB (still parked on its gate) observes cancelSignal
471
+ // and exits cooperatively — otherwise gen.return() stays blocked on
472
+ // a suspended await.
473
+ agent.cancel();
474
+ break;
475
+ }
476
+ }
477
+ }
478
+ // AfterToolsEvent.message should have entries for both tools:
479
+ // toolA completed normally, toolB gets a fallback "interrupted" result.
480
+ expect(afterToolsMessage).toBeDefined();
481
+ const blocks = afterToolsMessage.content;
482
+ expect(blocks).toHaveLength(2);
483
+ expect(blocks.map((b) => b.toolUseId)).toEqual(['a', 'b']);
484
+ expect(blocks.find((b) => b.toolUseId === 'a').status).toBe('success');
485
+ expect(blocks.find((b) => b.toolUseId === 'b').status).toBe('error');
486
+ });
487
+ });
488
+ //# sourceMappingURL=agent.concurrent.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.concurrent.test.js","sourceRoot":"","sources":["../../../../src/agent/__tests__/agent.concurrent.test.ts"],"names":[],"mappings":"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"}