@strands-agents/sdk 1.0.0-rc.5 → 1.1.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 (380) hide show
  1. package/LICENSE +175 -0
  2. package/README.md +340 -0
  3. package/dist/src/__fixtures__/agent-helpers.d.ts +22 -1
  4. package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
  5. package/dist/src/__fixtures__/agent-helpers.js +45 -1
  6. package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
  7. package/dist/src/__fixtures__/mock-plugin.d.ts.map +1 -1
  8. package/dist/src/__fixtures__/mock-plugin.js +3 -1
  9. package/dist/src/__fixtures__/mock-plugin.js.map +1 -1
  10. package/dist/src/__fixtures__/tool-helpers.d.ts +5 -2
  11. package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
  12. package/dist/src/__fixtures__/tool-helpers.js +23 -4
  13. package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
  14. package/dist/src/__tests__/interrupt.test.d.ts +2 -0
  15. package/dist/src/__tests__/interrupt.test.d.ts.map +1 -0
  16. package/dist/src/__tests__/interrupt.test.js +259 -0
  17. package/dist/src/__tests__/interrupt.test.js.map +1 -0
  18. package/dist/src/__tests__/mcp.test.js +448 -2
  19. package/dist/src/__tests__/mcp.test.js.map +1 -1
  20. package/dist/src/a2a/__tests__/events.test.js +2 -0
  21. package/dist/src/a2a/__tests__/events.test.js.map +1 -1
  22. package/dist/src/a2a/__tests__/executor.test.js +16 -5
  23. package/dist/src/a2a/__tests__/executor.test.js.map +1 -1
  24. package/dist/src/a2a/a2a-agent.d.ts +8 -3
  25. package/dist/src/a2a/a2a-agent.d.ts.map +1 -1
  26. package/dist/src/a2a/a2a-agent.js +12 -6
  27. package/dist/src/a2a/a2a-agent.js.map +1 -1
  28. package/dist/src/a2a/executor.d.ts +13 -0
  29. package/dist/src/a2a/executor.d.ts.map +1 -1
  30. package/dist/src/a2a/executor.js +19 -1
  31. package/dist/src/a2a/executor.js.map +1 -1
  32. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts +2 -0
  33. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts.map +1 -0
  34. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js +23 -0
  35. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js.map +1 -0
  36. package/dist/src/agent/__tests__/agent.cancel.test.js +1 -1
  37. package/dist/src/agent/__tests__/agent.cancel.test.js.map +1 -1
  38. package/dist/src/agent/__tests__/agent.concurrent.test.d.ts +2 -0
  39. package/dist/src/agent/__tests__/agent.concurrent.test.d.ts.map +1 -0
  40. package/dist/src/agent/__tests__/agent.concurrent.test.js +488 -0
  41. package/dist/src/agent/__tests__/agent.concurrent.test.js.map +1 -0
  42. package/dist/src/agent/__tests__/agent.hook.test.js +724 -12
  43. package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
  44. package/dist/src/agent/__tests__/agent.interrupt.test.d.ts +2 -0
  45. package/dist/src/agent/__tests__/agent.interrupt.test.d.ts.map +1 -0
  46. package/dist/src/agent/__tests__/agent.interrupt.test.js +730 -0
  47. package/dist/src/agent/__tests__/agent.interrupt.test.js.map +1 -0
  48. package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts +2 -0
  49. package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts.map +1 -0
  50. package/dist/src/agent/__tests__/agent.invocation-state.test.js +219 -0
  51. package/dist/src/agent/__tests__/agent.invocation-state.test.js.map +1 -0
  52. package/dist/src/agent/__tests__/agent.model-retry.test.d.ts +2 -0
  53. package/dist/src/agent/__tests__/agent.model-retry.test.d.ts.map +1 -0
  54. package/dist/src/agent/__tests__/agent.model-retry.test.js +161 -0
  55. package/dist/src/agent/__tests__/agent.model-retry.test.js.map +1 -0
  56. package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts +2 -0
  57. package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts.map +1 -0
  58. package/dist/src/agent/__tests__/agent.stateful-model.test.js +169 -0
  59. package/dist/src/agent/__tests__/agent.stateful-model.test.js.map +1 -0
  60. package/dist/src/agent/__tests__/agent.test.js +217 -2
  61. package/dist/src/agent/__tests__/agent.test.js.map +1 -1
  62. package/dist/src/agent/__tests__/agent.tracer.test.node.js +39 -0
  63. package/dist/src/agent/__tests__/agent.tracer.test.node.js.map +1 -1
  64. package/dist/src/agent/__tests__/snapshot.test.js +51 -4
  65. package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
  66. package/dist/src/agent/agent-as-tool.d.ts.map +1 -1
  67. package/dist/src/agent/agent-as-tool.js +4 -2
  68. package/dist/src/agent/agent-as-tool.js.map +1 -1
  69. package/dist/src/agent/agent.d.ts +109 -4
  70. package/dist/src/agent/agent.d.ts.map +1 -1
  71. package/dist/src/agent/agent.js +790 -224
  72. package/dist/src/agent/agent.js.map +1 -1
  73. package/dist/src/agent/snapshot.d.ts +2 -2
  74. package/dist/src/agent/snapshot.d.ts.map +1 -1
  75. package/dist/src/agent/snapshot.js +20 -2
  76. package/dist/src/agent/snapshot.js.map +1 -1
  77. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +230 -9
  78. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +1 -1
  79. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +19 -6
  80. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js.map +1 -1
  81. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +58 -4
  82. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
  83. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js +76 -1
  84. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +1 -1
  85. package/dist/src/conversation-manager/conversation-manager.d.ts +67 -22
  86. package/dist/src/conversation-manager/conversation-manager.d.ts.map +1 -1
  87. package/dist/src/conversation-manager/conversation-manager.js +65 -13
  88. package/dist/src/conversation-manager/conversation-manager.js.map +1 -1
  89. package/dist/src/conversation-manager/index.d.ts +1 -1
  90. package/dist/src/conversation-manager/index.d.ts.map +1 -1
  91. package/dist/src/conversation-manager/index.js +1 -1
  92. package/dist/src/conversation-manager/index.js.map +1 -1
  93. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +17 -3
  94. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
  95. package/dist/src/conversation-manager/sliding-window-conversation-manager.js +10 -4
  96. package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
  97. package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts +23 -1
  98. package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts.map +1 -1
  99. package/dist/src/conversation-manager/summarizing-conversation-manager.js +39 -17
  100. package/dist/src/conversation-manager/summarizing-conversation-manager.js.map +1 -1
  101. package/dist/src/errors.d.ts +11 -0
  102. package/dist/src/errors.d.ts.map +1 -1
  103. package/dist/src/errors.js +12 -0
  104. package/dist/src/errors.js.map +1 -1
  105. package/dist/src/hooks/__tests__/events.test.js +267 -73
  106. package/dist/src/hooks/__tests__/events.test.js.map +1 -1
  107. package/dist/src/hooks/__tests__/registry.test.js +182 -18
  108. package/dist/src/hooks/__tests__/registry.test.js.map +1 -1
  109. package/dist/src/hooks/events.d.ts +193 -51
  110. package/dist/src/hooks/events.d.ts.map +1 -1
  111. package/dist/src/hooks/events.js +182 -26
  112. package/dist/src/hooks/events.js.map +1 -1
  113. package/dist/src/hooks/index.d.ts +3 -2
  114. package/dist/src/hooks/index.d.ts.map +1 -1
  115. package/dist/src/hooks/index.js +1 -0
  116. package/dist/src/hooks/index.js.map +1 -1
  117. package/dist/src/hooks/registry.d.ts +12 -12
  118. package/dist/src/hooks/registry.d.ts.map +1 -1
  119. package/dist/src/hooks/registry.js +55 -15
  120. package/dist/src/hooks/registry.js.map +1 -1
  121. package/dist/src/hooks/types.d.ts +23 -0
  122. package/dist/src/hooks/types.d.ts.map +1 -1
  123. package/dist/src/hooks/types.js +17 -1
  124. package/dist/src/hooks/types.js.map +1 -1
  125. package/dist/src/index.d.ts +12 -7
  126. package/dist/src/index.d.ts.map +1 -1
  127. package/dist/src/index.js +4 -1
  128. package/dist/src/index.js.map +1 -1
  129. package/dist/src/interrupt.d.ts +220 -0
  130. package/dist/src/interrupt.d.ts.map +1 -0
  131. package/dist/src/interrupt.js +274 -0
  132. package/dist/src/interrupt.js.map +1 -0
  133. package/dist/src/logging/__tests__/warn-once.test.d.ts +2 -0
  134. package/dist/src/logging/__tests__/warn-once.test.d.ts.map +1 -0
  135. package/dist/src/logging/__tests__/warn-once.test.js +30 -0
  136. package/dist/src/logging/__tests__/warn-once.test.js.map +1 -0
  137. package/dist/src/logging/warn-once.d.ts +13 -0
  138. package/dist/src/logging/warn-once.d.ts.map +1 -0
  139. package/dist/src/logging/warn-once.js +18 -0
  140. package/dist/src/logging/warn-once.js.map +1 -0
  141. package/dist/src/mcp.d.ts +43 -3
  142. package/dist/src/mcp.d.ts.map +1 -1
  143. package/dist/src/mcp.js +85 -17
  144. package/dist/src/mcp.js.map +1 -1
  145. package/dist/src/mime.d.ts +2 -1
  146. package/dist/src/mime.d.ts.map +1 -1
  147. package/dist/src/mime.js +1 -0
  148. package/dist/src/mime.js.map +1 -1
  149. package/dist/src/models/__tests__/anthropic.test.js +147 -3
  150. package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
  151. package/dist/src/models/__tests__/bedrock.test.js +228 -2
  152. package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
  153. package/dist/src/models/__tests__/defaults.test.d.ts +2 -0
  154. package/dist/src/models/__tests__/defaults.test.d.ts.map +1 -0
  155. package/dist/src/models/__tests__/defaults.test.js +36 -0
  156. package/dist/src/models/__tests__/defaults.test.js.map +1 -0
  157. package/dist/src/models/__tests__/google.test.js +135 -0
  158. package/dist/src/models/__tests__/google.test.js.map +1 -1
  159. package/dist/src/models/__tests__/model.test.js +149 -1
  160. package/dist/src/models/__tests__/model.test.js.map +1 -1
  161. package/dist/src/models/anthropic.d.ts +20 -1
  162. package/dist/src/models/anthropic.d.ts.map +1 -1
  163. package/dist/src/models/anthropic.js +42 -8
  164. package/dist/src/models/anthropic.js.map +1 -1
  165. package/dist/src/models/bedrock.d.ts +27 -1
  166. package/dist/src/models/bedrock.d.ts.map +1 -1
  167. package/dist/src/models/bedrock.js +100 -12
  168. package/dist/src/models/bedrock.js.map +1 -1
  169. package/dist/src/models/defaults.d.ts +47 -0
  170. package/dist/src/models/defaults.d.ts.map +1 -0
  171. package/dist/src/models/defaults.js +170 -0
  172. package/dist/src/models/defaults.js.map +1 -0
  173. package/dist/src/models/google/model.d.ts +14 -1
  174. package/dist/src/models/google/model.d.ts.map +1 -1
  175. package/dist/src/models/google/model.js +54 -8
  176. package/dist/src/models/google/model.js.map +1 -1
  177. package/dist/src/models/google/types.d.ts +8 -0
  178. package/dist/src/models/google/types.d.ts.map +1 -1
  179. package/dist/src/models/model.d.ts +65 -0
  180. package/dist/src/models/model.d.ts.map +1 -1
  181. package/dist/src/models/model.js +138 -0
  182. package/dist/src/models/model.js.map +1 -1
  183. package/dist/src/models/openai/__tests__/chat.test.d.ts +2 -0
  184. package/dist/src/models/openai/__tests__/chat.test.d.ts.map +1 -0
  185. package/dist/src/models/{__tests__/openai.test.js → openai/__tests__/chat.test.js} +117 -7
  186. package/dist/src/models/openai/__tests__/chat.test.js.map +1 -0
  187. package/dist/src/models/openai/__tests__/responses.test.d.ts +2 -0
  188. package/dist/src/models/openai/__tests__/responses.test.d.ts.map +1 -0
  189. package/dist/src/models/openai/__tests__/responses.test.js +668 -0
  190. package/dist/src/models/openai/__tests__/responses.test.js.map +1 -0
  191. package/dist/src/models/openai/chat-adapter.d.ts +33 -0
  192. package/dist/src/models/openai/chat-adapter.d.ts.map +1 -0
  193. package/dist/src/models/openai/chat-adapter.js +383 -0
  194. package/dist/src/models/openai/chat-adapter.js.map +1 -0
  195. package/dist/src/models/openai/errors.d.ts +16 -0
  196. package/dist/src/models/openai/errors.d.ts.map +1 -0
  197. package/dist/src/models/openai/errors.js +40 -0
  198. package/dist/src/models/openai/errors.js.map +1 -0
  199. package/dist/src/models/openai/formatting.d.ts +18 -0
  200. package/dist/src/models/openai/formatting.d.ts.map +1 -0
  201. package/dist/src/models/openai/formatting.js +38 -0
  202. package/dist/src/models/openai/formatting.js.map +1 -0
  203. package/dist/src/models/openai/index.d.ts +19 -0
  204. package/dist/src/models/openai/index.d.ts.map +1 -0
  205. package/dist/src/models/openai/index.js +18 -0
  206. package/dist/src/models/openai/index.js.map +1 -0
  207. package/dist/src/models/openai/model.d.ts +77 -0
  208. package/dist/src/models/openai/model.d.ts.map +1 -0
  209. package/dist/src/models/openai/model.js +211 -0
  210. package/dist/src/models/openai/model.js.map +1 -0
  211. package/dist/src/models/openai/responses-adapter.d.ts +78 -0
  212. package/dist/src/models/openai/responses-adapter.d.ts.map +1 -0
  213. package/dist/src/models/openai/responses-adapter.js +467 -0
  214. package/dist/src/models/openai/responses-adapter.js.map +1 -0
  215. package/dist/src/models/openai/types.d.ts +131 -0
  216. package/dist/src/models/openai/types.d.ts.map +1 -0
  217. package/dist/src/models/openai/types.js +5 -0
  218. package/dist/src/models/openai/types.js.map +1 -0
  219. package/dist/src/multiagent/__tests__/events.test.js +122 -28
  220. package/dist/src/multiagent/__tests__/events.test.js.map +1 -1
  221. package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts +2 -0
  222. package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts.map +1 -0
  223. package/dist/src/multiagent/__tests__/graph.invocation-state.test.js +95 -0
  224. package/dist/src/multiagent/__tests__/graph.invocation-state.test.js.map +1 -0
  225. package/dist/src/multiagent/__tests__/graph.test.js +69 -0
  226. package/dist/src/multiagent/__tests__/graph.test.js.map +1 -1
  227. package/dist/src/multiagent/__tests__/nodes.test.js +18 -2
  228. package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
  229. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts +2 -0
  230. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts.map +1 -0
  231. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js +56 -0
  232. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js.map +1 -0
  233. package/dist/src/multiagent/__tests__/swarm.test.js +77 -0
  234. package/dist/src/multiagent/__tests__/swarm.test.js.map +1 -1
  235. package/dist/src/multiagent/events.d.ts +19 -1
  236. package/dist/src/multiagent/events.d.ts.map +1 -1
  237. package/dist/src/multiagent/events.js +18 -0
  238. package/dist/src/multiagent/events.js.map +1 -1
  239. package/dist/src/multiagent/graph.d.ts +27 -5
  240. package/dist/src/multiagent/graph.d.ts.map +1 -1
  241. package/dist/src/multiagent/graph.js +61 -15
  242. package/dist/src/multiagent/graph.js.map +1 -1
  243. package/dist/src/multiagent/index.d.ts +1 -1
  244. package/dist/src/multiagent/index.d.ts.map +1 -1
  245. package/dist/src/multiagent/multiagent.d.ts +21 -6
  246. package/dist/src/multiagent/multiagent.d.ts.map +1 -1
  247. package/dist/src/multiagent/nodes.d.ts +28 -3
  248. package/dist/src/multiagent/nodes.d.ts.map +1 -1
  249. package/dist/src/multiagent/nodes.js +42 -7
  250. package/dist/src/multiagent/nodes.js.map +1 -1
  251. package/dist/src/multiagent/swarm.d.ts +20 -4
  252. package/dist/src/multiagent/swarm.d.ts.map +1 -1
  253. package/dist/src/multiagent/swarm.js +65 -16
  254. package/dist/src/multiagent/swarm.js.map +1 -1
  255. package/dist/src/plugins/__tests__/registry.test.js +1 -1
  256. package/dist/src/plugins/__tests__/registry.test.js.map +1 -1
  257. package/dist/src/plugins/model-plugin.d.ts +20 -0
  258. package/dist/src/plugins/model-plugin.d.ts.map +1 -0
  259. package/dist/src/plugins/model-plugin.js +29 -0
  260. package/dist/src/plugins/model-plugin.js.map +1 -0
  261. package/dist/src/registry/__tests__/tool-registry.test.js +11 -0
  262. package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -1
  263. package/dist/src/registry/tool-registry.d.ts +4 -0
  264. package/dist/src/registry/tool-registry.d.ts.map +1 -1
  265. package/dist/src/registry/tool-registry.js +6 -0
  266. package/dist/src/registry/tool-registry.js.map +1 -1
  267. package/dist/src/retry/__tests__/backoff-strategy.test.d.ts +2 -0
  268. package/dist/src/retry/__tests__/backoff-strategy.test.d.ts.map +1 -0
  269. package/dist/src/retry/__tests__/backoff-strategy.test.js +116 -0
  270. package/dist/src/retry/__tests__/backoff-strategy.test.js.map +1 -0
  271. package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts +2 -0
  272. package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts.map +1 -0
  273. package/dist/src/retry/__tests__/default-model-retry-strategy.test.js +225 -0
  274. package/dist/src/retry/__tests__/default-model-retry-strategy.test.js.map +1 -0
  275. package/dist/src/retry/backoff-strategy.d.ts +108 -0
  276. package/dist/src/retry/backoff-strategy.d.ts.map +1 -0
  277. package/dist/src/retry/backoff-strategy.js +86 -0
  278. package/dist/src/retry/backoff-strategy.js.map +1 -0
  279. package/dist/src/retry/default-model-retry-strategy.d.ts +76 -0
  280. package/dist/src/retry/default-model-retry-strategy.d.ts.map +1 -0
  281. package/dist/src/retry/default-model-retry-strategy.js +104 -0
  282. package/dist/src/retry/default-model-retry-strategy.js.map +1 -0
  283. package/dist/src/retry/index.d.ts +8 -0
  284. package/dist/src/retry/index.d.ts.map +1 -0
  285. package/dist/src/retry/index.js +7 -0
  286. package/dist/src/retry/index.js.map +1 -0
  287. package/dist/src/retry/model-retry-strategy.d.ts +80 -0
  288. package/dist/src/retry/model-retry-strategy.d.ts.map +1 -0
  289. package/dist/src/retry/model-retry-strategy.js +85 -0
  290. package/dist/src/retry/model-retry-strategy.js.map +1 -0
  291. package/dist/src/retry/retry-strategy.d.ts +34 -0
  292. package/dist/src/retry/retry-strategy.d.ts.map +1 -0
  293. package/dist/src/retry/retry-strategy.js +25 -0
  294. package/dist/src/retry/retry-strategy.js.map +1 -0
  295. package/dist/src/session/__tests__/session-manager.test.js +52 -11
  296. package/dist/src/session/__tests__/session-manager.test.js.map +1 -1
  297. package/dist/src/session/session-manager.d.ts +6 -0
  298. package/dist/src/session/session-manager.d.ts.map +1 -1
  299. package/dist/src/session/session-manager.js +17 -0
  300. package/dist/src/session/session-manager.js.map +1 -1
  301. package/dist/src/telemetry/__tests__/meter.test.js +23 -0
  302. package/dist/src/telemetry/__tests__/meter.test.js.map +1 -1
  303. package/dist/src/telemetry/meter.d.ts +15 -0
  304. package/dist/src/telemetry/meter.d.ts.map +1 -1
  305. package/dist/src/telemetry/meter.js +14 -0
  306. package/dist/src/telemetry/meter.js.map +1 -1
  307. package/dist/src/tools/__tests__/tool.test.js +24 -1
  308. package/dist/src/tools/__tests__/tool.test.js.map +1 -1
  309. package/dist/src/tools/function-tool.d.ts.map +1 -1
  310. package/dist/src/tools/function-tool.js +6 -1
  311. package/dist/src/tools/function-tool.js.map +1 -1
  312. package/dist/src/tools/mcp-tool.d.ts +24 -3
  313. package/dist/src/tools/mcp-tool.d.ts.map +1 -1
  314. package/dist/src/tools/mcp-tool.js +103 -31
  315. package/dist/src/tools/mcp-tool.js.map +1 -1
  316. package/dist/src/tools/tool.d.ts +21 -2
  317. package/dist/src/tools/tool.d.ts.map +1 -1
  318. package/dist/src/tools/tool.js +12 -0
  319. package/dist/src/tools/tool.js.map +1 -1
  320. package/dist/src/tsconfig.tsbuildinfo +1 -1
  321. package/dist/src/types/__tests__/agent.test.js +48 -0
  322. package/dist/src/types/__tests__/agent.test.js.map +1 -1
  323. package/dist/src/types/agent.d.ts +77 -9
  324. package/dist/src/types/agent.d.ts.map +1 -1
  325. package/dist/src/types/agent.js +30 -6
  326. package/dist/src/types/agent.js.map +1 -1
  327. package/dist/src/types/elicitation.d.ts +15 -0
  328. package/dist/src/types/elicitation.d.ts.map +1 -0
  329. package/dist/src/types/elicitation.js +2 -0
  330. package/dist/src/types/elicitation.js.map +1 -0
  331. package/dist/src/types/interrupt.d.ts +103 -0
  332. package/dist/src/types/interrupt.d.ts.map +1 -0
  333. package/dist/src/types/interrupt.js +63 -0
  334. package/dist/src/types/interrupt.js.map +1 -0
  335. package/dist/src/types/messages.d.ts +2 -1
  336. package/dist/src/types/messages.d.ts.map +1 -1
  337. package/dist/src/types/messages.js.map +1 -1
  338. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts +2 -0
  339. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts.map +1 -0
  340. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +292 -0
  341. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +1 -0
  342. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts +2 -0
  343. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts.map +1 -0
  344. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js +148 -0
  345. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js.map +1 -0
  346. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts +2 -0
  347. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts.map +1 -0
  348. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js +78 -0
  349. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js.map +1 -0
  350. package/dist/src/vended-plugins/context-offloader/index.d.ts +23 -0
  351. package/dist/src/vended-plugins/context-offloader/index.d.ts.map +1 -0
  352. package/dist/src/vended-plugins/context-offloader/index.js +21 -0
  353. package/dist/src/vended-plugins/context-offloader/index.js.map +1 -0
  354. package/dist/src/vended-plugins/context-offloader/plugin.d.ts +48 -0
  355. package/dist/src/vended-plugins/context-offloader/plugin.d.ts.map +1 -0
  356. package/dist/src/vended-plugins/context-offloader/plugin.js +244 -0
  357. package/dist/src/vended-plugins/context-offloader/plugin.js.map +1 -0
  358. package/dist/src/vended-plugins/context-offloader/storage.d.ts +114 -0
  359. package/dist/src/vended-plugins/context-offloader/storage.d.ts.map +1 -0
  360. package/dist/src/vended-plugins/context-offloader/storage.js +204 -0
  361. package/dist/src/vended-plugins/context-offloader/storage.js.map +1 -0
  362. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js +21 -5
  363. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js.map +1 -1
  364. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +4 -0
  365. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
  366. package/dist/src/vended-tools/bash/bash.d.ts.map +1 -1
  367. package/dist/src/vended-tools/bash/bash.js +0 -3
  368. package/dist/src/vended-tools/bash/bash.js.map +1 -1
  369. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js +4 -0
  370. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +1 -1
  371. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +4 -0
  372. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
  373. package/package.json +17 -9
  374. package/dist/src/models/__tests__/openai.test.d.ts +0 -2
  375. package/dist/src/models/__tests__/openai.test.d.ts.map +0 -1
  376. package/dist/src/models/__tests__/openai.test.js.map +0 -1
  377. package/dist/src/models/openai.d.ts +0 -312
  378. package/dist/src/models/openai.d.ts.map +0 -1
  379. package/dist/src/models/openai.js +0 -789
  380. package/dist/src/models/openai.js.map +0 -1
@@ -26,46 +26,71 @@ describe('InitializedEvent', () => {
26
26
  describe('BeforeInvocationEvent', () => {
27
27
  it('creates instance with correct properties', () => {
28
28
  const agent = new Agent();
29
- const event = new BeforeInvocationEvent({ agent });
29
+ const event = new BeforeInvocationEvent({ agent, invocationState: {} });
30
30
  expect(event).toEqual({
31
31
  type: 'beforeInvocationEvent',
32
32
  agent: agent,
33
+ cancel: false,
34
+ invocationState: {},
33
35
  });
34
36
  // @ts-expect-error verifying that property is readonly
35
37
  event.agent = new Agent();
36
38
  });
37
39
  it('returns false for _shouldReverseCallbacks', () => {
38
40
  const agent = new Agent();
39
- const event = new BeforeInvocationEvent({ agent });
41
+ const event = new BeforeInvocationEvent({ agent, invocationState: {} });
40
42
  expect(event._shouldReverseCallbacks()).toBe(false);
41
43
  });
44
+ it('allows cancel to be set to true', () => {
45
+ const agent = new Agent();
46
+ const event = new BeforeInvocationEvent({ agent, invocationState: {} });
47
+ expect(event.cancel).toBe(false);
48
+ event.cancel = true;
49
+ expect(event.cancel).toBe(true);
50
+ });
51
+ it('allows cancel to be set to a string message', () => {
52
+ const agent = new Agent();
53
+ const event = new BeforeInvocationEvent({ agent, invocationState: {} });
54
+ event.cancel = 'unauthorized';
55
+ expect(event.cancel).toBe('unauthorized');
56
+ });
42
57
  });
43
58
  describe('AfterInvocationEvent', () => {
44
59
  it('creates instance with correct properties', () => {
45
60
  const agent = new Agent();
46
- const event = new AfterInvocationEvent({ agent });
61
+ const event = new AfterInvocationEvent({ agent, invocationState: {} });
47
62
  expect(event).toEqual({
48
63
  type: 'afterInvocationEvent',
49
64
  agent: agent,
65
+ invocationState: {},
66
+ resume: undefined,
50
67
  });
51
68
  // @ts-expect-error verifying that property is readonly
52
69
  event.agent = new Agent();
53
70
  });
54
71
  it('returns true for _shouldReverseCallbacks', () => {
55
72
  const agent = new Agent();
56
- const event = new AfterInvocationEvent({ agent });
73
+ const event = new AfterInvocationEvent({ agent, invocationState: {} });
57
74
  expect(event._shouldReverseCallbacks()).toBe(true);
58
75
  });
76
+ it('allows resume to be set to new input', () => {
77
+ const agent = new Agent();
78
+ const event = new AfterInvocationEvent({ agent, invocationState: {} });
79
+ expect(event.resume).toBeUndefined();
80
+ event.resume = 'follow-up prompt';
81
+ expect(event.resume).toBe('follow-up prompt');
82
+ });
59
83
  });
60
84
  describe('MessageAddedEvent', () => {
61
85
  it('creates instance with correct properties', () => {
62
86
  const agent = new Agent();
63
87
  const message = new Message({ role: 'assistant', content: [new TextBlock('Hello')] });
64
- const event = new MessageAddedEvent({ agent, message });
88
+ const event = new MessageAddedEvent({ agent, message, invocationState: {} });
65
89
  expect(event).toEqual({
66
90
  type: 'messageAddedEvent',
67
91
  agent: agent,
68
92
  message: message,
93
+ invocationState: {},
69
94
  });
70
95
  // @ts-expect-error verifying that property is readonly
71
96
  event.agent = new Agent();
@@ -75,7 +100,7 @@ describe('MessageAddedEvent', () => {
75
100
  it('returns false for _shouldReverseCallbacks', () => {
76
101
  const agent = new Agent();
77
102
  const message = new Message({ role: 'assistant', content: [] });
78
- const event = new MessageAddedEvent({ agent, message });
103
+ const event = new MessageAddedEvent({ agent, message, invocationState: {} });
79
104
  expect(event._shouldReverseCallbacks()).toBe(false);
80
105
  });
81
106
  });
@@ -93,19 +118,19 @@ describe('BeforeToolCallEvent', () => {
93
118
  toolUseId: 'test-id',
94
119
  input: { arg: 'value' },
95
120
  };
96
- const event = new BeforeToolCallEvent({ agent, toolUse, tool });
121
+ const event = new BeforeToolCallEvent({ agent, toolUse, tool, invocationState: {} });
97
122
  expect(event).toEqual({
98
123
  type: 'beforeToolCallEvent',
99
124
  agent: agent,
100
125
  toolUse: toolUse,
101
126
  tool: tool,
102
127
  cancel: false,
128
+ invocationState: {},
129
+ selectedTool: undefined,
103
130
  });
104
131
  // @ts-expect-error verifying that property is readonly
105
132
  event.agent = new Agent();
106
133
  // @ts-expect-error verifying that property is readonly
107
- event.toolUse = toolUse;
108
- // @ts-expect-error verifying that property is readonly
109
134
  event.tool = tool;
110
135
  });
111
136
  it('creates instance with undefined tool when tool is not found', () => {
@@ -115,25 +140,27 @@ describe('BeforeToolCallEvent', () => {
115
140
  toolUseId: 'test-id',
116
141
  input: {},
117
142
  };
118
- const event = new BeforeToolCallEvent({ agent, toolUse, tool: undefined });
143
+ const event = new BeforeToolCallEvent({ agent, toolUse, tool: undefined, invocationState: {} });
119
144
  expect(event).toEqual({
120
145
  type: 'beforeToolCallEvent',
121
146
  agent: agent,
122
147
  toolUse: toolUse,
123
148
  tool: undefined,
124
149
  cancel: false,
150
+ invocationState: {},
151
+ selectedTool: undefined,
125
152
  });
126
153
  });
127
154
  it('returns false for _shouldReverseCallbacks', () => {
128
155
  const agent = new Agent();
129
156
  const toolUse = { name: 'test', toolUseId: 'id', input: {} };
130
- const event = new BeforeToolCallEvent({ agent, toolUse, tool: undefined });
157
+ const event = new BeforeToolCallEvent({ agent, toolUse, tool: undefined, invocationState: {} });
131
158
  expect(event._shouldReverseCallbacks()).toBe(false);
132
159
  });
133
160
  it('allows cancel to be set to true', () => {
134
161
  const agent = new Agent();
135
162
  const toolUse = { name: 'test', toolUseId: 'id', input: {} };
136
- const event = new BeforeToolCallEvent({ agent, toolUse, tool: undefined });
163
+ const event = new BeforeToolCallEvent({ agent, toolUse, tool: undefined, invocationState: {} });
137
164
  expect(event.cancel).toBe(false);
138
165
  event.cancel = true;
139
166
  expect(event.cancel).toBe(true);
@@ -141,10 +168,39 @@ describe('BeforeToolCallEvent', () => {
141
168
  it('allows cancel to be set to a string message', () => {
142
169
  const agent = new Agent();
143
170
  const toolUse = { name: 'test', toolUseId: 'id', input: {} };
144
- const event = new BeforeToolCallEvent({ agent, toolUse, tool: undefined });
171
+ const event = new BeforeToolCallEvent({ agent, toolUse, tool: undefined, invocationState: {} });
145
172
  event.cancel = 'tool not allowed';
146
173
  expect(event.cancel).toBe('tool not allowed');
147
174
  });
175
+ it('allows selectedTool to be set to a replacement tool', () => {
176
+ const agent = new Agent();
177
+ const toolUse = { name: 'test', toolUseId: 'id', input: {} };
178
+ const event = new BeforeToolCallEvent({ agent, toolUse, tool: undefined, invocationState: {} });
179
+ expect(event.selectedTool).toBeUndefined();
180
+ const replacement = new FunctionTool({
181
+ name: 'replacement',
182
+ description: 'Replacement',
183
+ inputSchema: {},
184
+ callback: () => 'ok',
185
+ });
186
+ event.selectedTool = replacement;
187
+ expect(event.selectedTool).toBe(replacement);
188
+ });
189
+ it('allows mutating toolUse fields in-place', () => {
190
+ const agent = new Agent();
191
+ const toolUse = { name: 'orig', toolUseId: 'id', input: { a: 1 } };
192
+ const event = new BeforeToolCallEvent({ agent, toolUse, tool: undefined, invocationState: {} });
193
+ event.toolUse.input = { a: 2, b: 3 };
194
+ event.toolUse.name = 'renamed';
195
+ expect(event.toolUse).toEqual({ name: 'renamed', toolUseId: 'id', input: { a: 2, b: 3 } });
196
+ });
197
+ it('allows reassigning toolUse to a new object', () => {
198
+ const agent = new Agent();
199
+ const toolUse = { name: 'orig', toolUseId: 'id', input: {} };
200
+ const event = new BeforeToolCallEvent({ agent, toolUse, tool: undefined, invocationState: {} });
201
+ event.toolUse = { name: 'new', toolUseId: 'new-id', input: { x: 1 } };
202
+ expect(event.toolUse).toEqual({ name: 'new', toolUseId: 'new-id', input: { x: 1 } });
203
+ });
148
204
  });
149
205
  describe('AfterToolCallEvent', () => {
150
206
  it('creates instance with correct properties on success', () => {
@@ -165,7 +221,7 @@ describe('AfterToolCallEvent', () => {
165
221
  status: 'success',
166
222
  content: [new TextBlock('Success')],
167
223
  });
168
- const event = new AfterToolCallEvent({ agent, toolUse, tool, result });
224
+ const event = new AfterToolCallEvent({ agent, toolUse, tool, result, invocationState: {} });
169
225
  expect(event).toEqual({
170
226
  type: 'afterToolCallEvent',
171
227
  agent: agent,
@@ -173,6 +229,7 @@ describe('AfterToolCallEvent', () => {
173
229
  tool: tool,
174
230
  result: result,
175
231
  error: undefined,
232
+ invocationState: {},
176
233
  });
177
234
  // @ts-expect-error verifying that property is readonly
178
235
  event.agent = new Agent();
@@ -180,8 +237,19 @@ describe('AfterToolCallEvent', () => {
180
237
  event.toolUse = toolUse;
181
238
  // @ts-expect-error verifying that property is readonly
182
239
  event.tool = tool;
183
- // @ts-expect-error verifying that property is readonly
184
- event.result = result;
240
+ });
241
+ it('allows result to be replaced', () => {
242
+ const agent = new Agent();
243
+ const toolUse = { name: 'test', toolUseId: 'id', input: {} };
244
+ const result = new ToolResultBlock({ toolUseId: 'id', status: 'success', content: [new TextBlock('original')] });
245
+ const event = new AfterToolCallEvent({ agent, toolUse, tool: undefined, result, invocationState: {} });
246
+ const replacedResult = new ToolResultBlock({
247
+ toolUseId: 'id',
248
+ status: 'success',
249
+ content: [new TextBlock('replaced')],
250
+ });
251
+ event.result = replacedResult;
252
+ expect(event.result).toBe(replacedResult);
185
253
  });
186
254
  it('creates instance with error property when tool execution fails', () => {
187
255
  const agent = new Agent();
@@ -192,7 +260,7 @@ describe('AfterToolCallEvent', () => {
192
260
  content: [new TextBlock('Error')],
193
261
  });
194
262
  const error = new Error('Tool failed');
195
- const event = new AfterToolCallEvent({ agent, toolUse, tool: undefined, result, error });
263
+ const event = new AfterToolCallEvent({ agent, toolUse, tool: undefined, result, error, invocationState: {} });
196
264
  expect(event).toEqual({
197
265
  type: 'afterToolCallEvent',
198
266
  agent: agent,
@@ -200,6 +268,7 @@ describe('AfterToolCallEvent', () => {
200
268
  tool: undefined,
201
269
  result: result,
202
270
  error: error,
271
+ invocationState: {},
203
272
  });
204
273
  });
205
274
  it('returns true for _shouldReverseCallbacks', () => {
@@ -210,7 +279,7 @@ describe('AfterToolCallEvent', () => {
210
279
  status: 'success',
211
280
  content: [],
212
281
  });
213
- const event = new AfterToolCallEvent({ agent, toolUse, tool: undefined, result });
282
+ const event = new AfterToolCallEvent({ agent, toolUse, tool: undefined, result, invocationState: {} });
214
283
  expect(event._shouldReverseCallbacks()).toBe(true);
215
284
  });
216
285
  it('allows retry to be set when error is present', () => {
@@ -222,7 +291,7 @@ describe('AfterToolCallEvent', () => {
222
291
  content: [new TextBlock('Error')],
223
292
  });
224
293
  const error = new Error('Tool failed');
225
- const event = new AfterToolCallEvent({ agent, toolUse, tool: undefined, result, error });
294
+ const event = new AfterToolCallEvent({ agent, toolUse, tool: undefined, result, error, invocationState: {} });
226
295
  expect(event.retry).toBeUndefined();
227
296
  event.retry = true;
228
297
  expect(event.retry).toBe(true);
@@ -237,7 +306,7 @@ describe('AfterToolCallEvent', () => {
237
306
  status: 'success',
238
307
  content: [new TextBlock('Success')],
239
308
  });
240
- const event = new AfterToolCallEvent({ agent, toolUse, tool: undefined, result });
309
+ const event = new AfterToolCallEvent({ agent, toolUse, tool: undefined, result, invocationState: {} });
241
310
  expect(event.retry).toBeUndefined();
242
311
  event.retry = true;
243
312
  expect(event.retry).toBe(true);
@@ -246,20 +315,62 @@ describe('AfterToolCallEvent', () => {
246
315
  describe('BeforeModelCallEvent', () => {
247
316
  it('creates instance with correct properties', () => {
248
317
  const agent = new Agent();
249
- const event = new BeforeModelCallEvent({ agent, model: agent.model });
318
+ const event = new BeforeModelCallEvent({ agent, model: agent.model, invocationState: {} });
250
319
  expect(event).toEqual({
251
320
  type: 'beforeModelCallEvent',
252
321
  agent: agent,
253
322
  model: agent.model,
323
+ cancel: false,
324
+ invocationState: {},
254
325
  });
255
326
  // @ts-expect-error verifying that property is readonly
256
327
  event.agent = new Agent();
257
328
  });
329
+ it('includes projectedInputTokens when provided', () => {
330
+ const agent = new Agent();
331
+ const event = new BeforeModelCallEvent({
332
+ agent,
333
+ model: agent.model,
334
+ invocationState: {},
335
+ projectedInputTokens: 500,
336
+ });
337
+ expect(event).toEqual({
338
+ type: 'beforeModelCallEvent',
339
+ agent,
340
+ model: agent.model,
341
+ cancel: false,
342
+ invocationState: {},
343
+ projectedInputTokens: 500,
344
+ });
345
+ expect(event.toJSON()).toStrictEqual({
346
+ type: 'beforeModelCallEvent',
347
+ projectedInputTokens: 500,
348
+ });
349
+ });
350
+ it('excludes projectedInputTokens from toJSON when not provided', () => {
351
+ const agent = new Agent();
352
+ const event = new BeforeModelCallEvent({ agent, model: agent.model, invocationState: {} });
353
+ expect(event.projectedInputTokens).toBeUndefined();
354
+ expect(event.toJSON()).toStrictEqual({ type: 'beforeModelCallEvent' });
355
+ });
258
356
  it('returns false for _shouldReverseCallbacks', () => {
259
357
  const agent = new Agent();
260
- const event = new BeforeModelCallEvent({ agent, model: agent.model });
358
+ const event = new BeforeModelCallEvent({ agent, model: agent.model, invocationState: {} });
261
359
  expect(event._shouldReverseCallbacks()).toBe(false);
262
360
  });
361
+ it('allows cancel to be set to true', () => {
362
+ const agent = new Agent();
363
+ const event = new BeforeModelCallEvent({ agent, model: agent.model, invocationState: {} });
364
+ expect(event.cancel).toBe(false);
365
+ event.cancel = true;
366
+ expect(event.cancel).toBe(true);
367
+ });
368
+ it('allows cancel to be set to a string message', () => {
369
+ const agent = new Agent();
370
+ const event = new BeforeModelCallEvent({ agent, model: agent.model, invocationState: {} });
371
+ event.cancel = 'rate limited';
372
+ expect(event.cancel).toBe('rate limited');
373
+ });
263
374
  });
264
375
  describe('AfterModelCallEvent', () => {
265
376
  it('creates instance with correct properties on success', () => {
@@ -267,13 +378,21 @@ describe('AfterModelCallEvent', () => {
267
378
  const message = new Message({ role: 'assistant', content: [new TextBlock('Response')] });
268
379
  const stopReason = 'endTurn';
269
380
  const response = { message, stopReason };
270
- const event = new AfterModelCallEvent({ agent, model: agent.model, stopData: response });
381
+ const event = new AfterModelCallEvent({
382
+ agent,
383
+ model: agent.model,
384
+ attemptCount: 1,
385
+ stopData: response,
386
+ invocationState: {},
387
+ });
271
388
  expect(event).toEqual({
272
389
  type: 'afterModelCallEvent',
273
390
  agent: agent,
274
391
  model: agent.model,
392
+ attemptCount: 1,
275
393
  stopData: response,
276
394
  error: undefined,
395
+ invocationState: {},
277
396
  });
278
397
  // @ts-expect-error verifying that property is readonly
279
398
  event.agent = new Agent();
@@ -285,26 +404,41 @@ describe('AfterModelCallEvent', () => {
285
404
  const message = new Message({ role: 'assistant', content: [] });
286
405
  const error = new Error('Model failed');
287
406
  const response = { message, stopReason: 'error' };
288
- const event = new AfterModelCallEvent({ agent, model: agent.model, stopData: response, error });
407
+ const event = new AfterModelCallEvent({
408
+ agent,
409
+ model: agent.model,
410
+ attemptCount: 1,
411
+ stopData: response,
412
+ error,
413
+ invocationState: {},
414
+ });
289
415
  expect(event).toEqual({
290
416
  type: 'afterModelCallEvent',
291
417
  agent: agent,
292
418
  model: agent.model,
419
+ attemptCount: 1,
293
420
  stopData: response,
294
421
  error: error,
422
+ invocationState: {},
295
423
  });
296
424
  });
297
425
  it('returns true for _shouldReverseCallbacks', () => {
298
426
  const agent = new Agent();
299
427
  const message = new Message({ role: 'assistant', content: [] });
300
428
  const response = { message, stopReason: 'endTurn' };
301
- const event = new AfterModelCallEvent({ agent, model: agent.model, stopData: response });
429
+ const event = new AfterModelCallEvent({
430
+ agent,
431
+ model: agent.model,
432
+ attemptCount: 1,
433
+ stopData: response,
434
+ invocationState: {},
435
+ });
302
436
  expect(event._shouldReverseCallbacks()).toBe(true);
303
437
  });
304
438
  it('allows retry to be set when error is present', () => {
305
439
  const agent = new Agent();
306
440
  const error = new Error('Model failed');
307
- const event = new AfterModelCallEvent({ agent, model: agent.model, error });
441
+ const event = new AfterModelCallEvent({ agent, model: agent.model, attemptCount: 1, error, invocationState: {} });
308
442
  // Initially undefined
309
443
  expect(event.retry).toBeUndefined();
310
444
  // Can be set to true
@@ -317,7 +451,7 @@ describe('AfterModelCallEvent', () => {
317
451
  it('retry is optional and defaults to undefined', () => {
318
452
  const agent = new Agent();
319
453
  const error = new Error('Model failed');
320
- const event = new AfterModelCallEvent({ agent, model: agent.model, error });
454
+ const event = new AfterModelCallEvent({ agent, model: agent.model, attemptCount: 1, error, invocationState: {} });
321
455
  expect(event.retry).toBeUndefined();
322
456
  });
323
457
  });
@@ -328,11 +462,12 @@ describe('ModelStreamUpdateEvent', () => {
328
462
  type: 'modelMessageStartEvent',
329
463
  role: 'assistant',
330
464
  };
331
- const hookEvent = new ModelStreamUpdateEvent({ agent, event: streamEvent });
465
+ const hookEvent = new ModelStreamUpdateEvent({ agent, event: streamEvent, invocationState: {} });
332
466
  expect(hookEvent).toEqual({
333
467
  type: 'modelStreamUpdateEvent',
334
468
  agent: agent,
335
469
  event: streamEvent,
470
+ invocationState: {},
336
471
  });
337
472
  // @ts-expect-error verifying that property is readonly
338
473
  hookEvent.agent = new Agent();
@@ -344,11 +479,12 @@ describe('ContentBlockEvent', () => {
344
479
  it('creates instance with correct properties', () => {
345
480
  const agent = new Agent();
346
481
  const contentBlock = new TextBlock('Hello');
347
- const event = new ContentBlockEvent({ agent, contentBlock });
482
+ const event = new ContentBlockEvent({ agent, contentBlock, invocationState: {} });
348
483
  expect(event).toEqual({
349
484
  type: 'contentBlockEvent',
350
485
  agent: agent,
351
486
  contentBlock: contentBlock,
487
+ invocationState: {},
352
488
  });
353
489
  // @ts-expect-error verifying that property is readonly
354
490
  event.agent = new Agent();
@@ -360,12 +496,13 @@ describe('ModelMessageEvent', () => {
360
496
  it('creates instance with correct properties', () => {
361
497
  const agent = new Agent();
362
498
  const message = new Message({ role: 'assistant', content: [new TextBlock('Hello')] });
363
- const event = new ModelMessageEvent({ agent, message, stopReason: 'endTurn' });
499
+ const event = new ModelMessageEvent({ agent, message, stopReason: 'endTurn', invocationState: {} });
364
500
  expect(event).toEqual({
365
501
  type: 'modelMessageEvent',
366
502
  agent: agent,
367
503
  message: message,
368
504
  stopReason: 'endTurn',
505
+ invocationState: {},
369
506
  });
370
507
  // @ts-expect-error verifying that property is readonly
371
508
  event.agent = new Agent();
@@ -383,11 +520,12 @@ describe('ToolResultEvent', () => {
383
520
  status: 'success',
384
521
  content: [new TextBlock('Result')],
385
522
  });
386
- const event = new ToolResultEvent({ agent, result: toolResult });
523
+ const event = new ToolResultEvent({ agent, result: toolResult, invocationState: {} });
387
524
  expect(event).toEqual({
388
525
  type: 'toolResultEvent',
389
526
  agent: agent,
390
527
  result: toolResult,
528
+ invocationState: {},
391
529
  });
392
530
  // @ts-expect-error verifying that property is readonly
393
531
  event.agent = new Agent();
@@ -399,11 +537,12 @@ describe('ToolStreamUpdateEvent', () => {
399
537
  it('creates instance with correct properties', () => {
400
538
  const agent = new Agent();
401
539
  const toolStreamEvent = new ToolStreamEvent({ data: 'progress' });
402
- const event = new ToolStreamUpdateEvent({ agent, event: toolStreamEvent });
540
+ const event = new ToolStreamUpdateEvent({ agent, event: toolStreamEvent, invocationState: {} });
403
541
  expect(event).toEqual({
404
542
  type: 'toolStreamUpdateEvent',
405
543
  agent: agent,
406
544
  event: toolStreamEvent,
545
+ invocationState: {},
407
546
  });
408
547
  // @ts-expect-error verifying that property is readonly
409
548
  event.agent = new Agent();
@@ -418,12 +557,14 @@ describe('AgentResultEvent', () => {
418
557
  stopReason: 'endTurn',
419
558
  lastMessage: new Message({ role: 'assistant', content: [new TextBlock('Done')] }),
420
559
  metrics: new AgentMetrics(),
560
+ invocationState: {},
421
561
  });
422
- const event = new AgentResultEvent({ agent, result });
562
+ const event = new AgentResultEvent({ agent, result, invocationState: {} });
423
563
  expect(event).toEqual({
424
564
  type: 'agentResultEvent',
425
565
  agent: agent,
426
566
  result: result,
567
+ invocationState: {},
427
568
  });
428
569
  // @ts-expect-error verifying that property is readonly
429
570
  event.agent = new Agent();
@@ -444,12 +585,13 @@ describe('BeforeToolsEvent', () => {
444
585
  }),
445
586
  ],
446
587
  });
447
- const event = new BeforeToolsEvent({ agent, message });
588
+ const event = new BeforeToolsEvent({ agent, message, invocationState: {} });
448
589
  expect(event).toEqual({
449
590
  type: 'beforeToolsEvent',
450
591
  agent: agent,
451
592
  message: message,
452
593
  cancel: false,
594
+ invocationState: {},
453
595
  });
454
596
  // @ts-expect-error verifying that property is readonly
455
597
  event.agent = new Agent();
@@ -459,13 +601,13 @@ describe('BeforeToolsEvent', () => {
459
601
  it('returns false for _shouldReverseCallbacks', () => {
460
602
  const agent = new Agent();
461
603
  const message = new Message({ role: 'assistant', content: [] });
462
- const event = new BeforeToolsEvent({ agent, message });
604
+ const event = new BeforeToolsEvent({ agent, message, invocationState: {} });
463
605
  expect(event._shouldReverseCallbacks()).toBe(false);
464
606
  });
465
607
  it('allows cancel to be set to true', () => {
466
608
  const agent = new Agent();
467
609
  const message = new Message({ role: 'assistant', content: [] });
468
- const event = new BeforeToolsEvent({ agent, message });
610
+ const event = new BeforeToolsEvent({ agent, message, invocationState: {} });
469
611
  expect(event.cancel).toBe(false);
470
612
  event.cancel = true;
471
613
  expect(event.cancel).toBe(true);
@@ -473,7 +615,7 @@ describe('BeforeToolsEvent', () => {
473
615
  it('allows cancel to be set to a string message', () => {
474
616
  const agent = new Agent();
475
617
  const message = new Message({ role: 'assistant', content: [] });
476
- const event = new BeforeToolsEvent({ agent, message });
618
+ const event = new BeforeToolsEvent({ agent, message, invocationState: {} });
477
619
  event.cancel = 'tools not allowed';
478
620
  expect(event.cancel).toBe('tools not allowed');
479
621
  });
@@ -491,11 +633,13 @@ describe('AfterToolsEvent', () => {
491
633
  }),
492
634
  ],
493
635
  });
494
- const event = new AfterToolsEvent({ agent, message });
636
+ const event = new AfterToolsEvent({ agent, message, invocationState: {} });
495
637
  expect(event).toEqual({
496
638
  type: 'afterToolsEvent',
497
639
  agent: agent,
498
640
  message: message,
641
+ invocationState: {},
642
+ endTurn: false,
499
643
  });
500
644
  // @ts-expect-error verifying that property is readonly
501
645
  event.agent = new Agent();
@@ -505,9 +649,19 @@ describe('AfterToolsEvent', () => {
505
649
  it('returns true for _shouldReverseCallbacks', () => {
506
650
  const agent = new Agent();
507
651
  const message = new Message({ role: 'user', content: [] });
508
- const event = new AfterToolsEvent({ agent, message });
652
+ const event = new AfterToolsEvent({ agent, message, invocationState: {} });
509
653
  expect(event._shouldReverseCallbacks()).toBe(true);
510
654
  });
655
+ it('defaults endTurn to false and accepts boolean or string', () => {
656
+ const agent = new Agent();
657
+ const message = new Message({ role: 'user', content: [] });
658
+ const event = new AfterToolsEvent({ agent, message, invocationState: {} });
659
+ expect(event.endTurn).toBe(false);
660
+ event.endTurn = true;
661
+ expect(event.endTurn).toBe(true);
662
+ event.endTurn = 'enough information gathered';
663
+ expect(event.endTurn).toBe('enough information gathered');
664
+ });
511
665
  });
512
666
  // ===================== toJSON serialization tests =====================
513
667
  describe('toJSON serialization', () => {
@@ -522,7 +676,7 @@ describe('toJSON serialization', () => {
522
676
  describe('BeforeInvocationEvent', () => {
523
677
  it('excludes agent and returns only type', () => {
524
678
  const agent = new Agent();
525
- const event = new BeforeInvocationEvent({ agent });
679
+ const event = new BeforeInvocationEvent({ agent, invocationState: {} });
526
680
  const json = JSON.parse(JSON.stringify(event));
527
681
  expect(json).toStrictEqual({ type: 'beforeInvocationEvent' });
528
682
  });
@@ -530,7 +684,7 @@ describe('toJSON serialization', () => {
530
684
  describe('AfterInvocationEvent', () => {
531
685
  it('excludes agent and returns only type', () => {
532
686
  const agent = new Agent();
533
- const event = new AfterInvocationEvent({ agent });
687
+ const event = new AfterInvocationEvent({ agent, invocationState: {} });
534
688
  const json = JSON.parse(JSON.stringify(event));
535
689
  expect(json).toStrictEqual({ type: 'afterInvocationEvent' });
536
690
  });
@@ -538,7 +692,7 @@ describe('toJSON serialization', () => {
538
692
  describe('BeforeModelCallEvent', () => {
539
693
  it('excludes agent and model and returns only type', () => {
540
694
  const agent = new Agent();
541
- const event = new BeforeModelCallEvent({ agent, model: agent.model });
695
+ const event = new BeforeModelCallEvent({ agent, model: agent.model, invocationState: {} });
542
696
  const json = JSON.parse(JSON.stringify(event));
543
697
  expect(json).toStrictEqual({ type: 'beforeModelCallEvent' });
544
698
  });
@@ -547,7 +701,7 @@ describe('toJSON serialization', () => {
547
701
  it('includes message and excludes agent', () => {
548
702
  const agent = new Agent();
549
703
  const message = new Message({ role: 'assistant', content: [new TextBlock('Hello')] });
550
- const event = new MessageAddedEvent({ agent, message });
704
+ const event = new MessageAddedEvent({ agent, message, invocationState: {} });
551
705
  const json = JSON.parse(JSON.stringify(event));
552
706
  expect(json).toStrictEqual({
553
707
  type: 'messageAddedEvent',
@@ -562,7 +716,7 @@ describe('toJSON serialization', () => {
562
716
  type: 'modelContentBlockDeltaEvent',
563
717
  delta: { type: 'textDelta', text: 'Hi' },
564
718
  };
565
- const event = new ModelStreamUpdateEvent({ agent, event: streamEvent });
719
+ const event = new ModelStreamUpdateEvent({ agent, event: streamEvent, invocationState: {} });
566
720
  const json = JSON.parse(JSON.stringify(event));
567
721
  expect(json).toStrictEqual({
568
722
  type: 'modelStreamUpdateEvent',
@@ -574,7 +728,7 @@ describe('toJSON serialization', () => {
574
728
  it('includes content block and excludes agent', () => {
575
729
  const agent = new Agent();
576
730
  const contentBlock = new TextBlock('Hello world');
577
- const event = new ContentBlockEvent({ agent, contentBlock });
731
+ const event = new ContentBlockEvent({ agent, contentBlock, invocationState: {} });
578
732
  const json = JSON.parse(JSON.stringify(event));
579
733
  expect(json).toStrictEqual({
580
734
  type: 'contentBlockEvent',
@@ -586,7 +740,7 @@ describe('toJSON serialization', () => {
586
740
  it('includes message and stopReason, excludes agent', () => {
587
741
  const agent = new Agent();
588
742
  const message = new Message({ role: 'assistant', content: [new TextBlock('Done')] });
589
- const event = new ModelMessageEvent({ agent, message, stopReason: 'endTurn' });
743
+ const event = new ModelMessageEvent({ agent, message, stopReason: 'endTurn', invocationState: {} });
590
744
  const json = JSON.parse(JSON.stringify(event));
591
745
  expect(json).toStrictEqual({
592
746
  type: 'modelMessageEvent',
@@ -603,7 +757,7 @@ describe('toJSON serialization', () => {
603
757
  status: 'success',
604
758
  content: [new TextBlock('42')],
605
759
  });
606
- const event = new ToolResultEvent({ agent, result });
760
+ const event = new ToolResultEvent({ agent, result, invocationState: {} });
607
761
  const json = JSON.parse(JSON.stringify(event));
608
762
  expect(json).toStrictEqual({
609
763
  type: 'toolResultEvent',
@@ -615,7 +769,7 @@ describe('toJSON serialization', () => {
615
769
  it('includes tool stream event and excludes agent', () => {
616
770
  const agent = new Agent();
617
771
  const toolStreamEvent = new ToolStreamEvent({ data: { progress: 50 } });
618
- const event = new ToolStreamUpdateEvent({ agent, event: toolStreamEvent });
772
+ const event = new ToolStreamUpdateEvent({ agent, event: toolStreamEvent, invocationState: {} });
619
773
  const json = JSON.parse(JSON.stringify(event));
620
774
  expect(json).toStrictEqual({
621
775
  type: 'toolStreamUpdateEvent',
@@ -630,8 +784,9 @@ describe('toJSON serialization', () => {
630
784
  stopReason: 'endTurn',
631
785
  lastMessage: new Message({ role: 'assistant', content: [new TextBlock('Done')] }),
632
786
  metrics: new AgentMetrics(),
787
+ invocationState: {},
633
788
  });
634
- const event = new AgentResultEvent({ agent, result });
789
+ const event = new AgentResultEvent({ agent, result, invocationState: {} });
635
790
  const json = JSON.parse(JSON.stringify(event));
636
791
  expect(json).toStrictEqual({
637
792
  type: 'agentResultEvent',
@@ -653,7 +808,7 @@ describe('toJSON serialization', () => {
653
808
  callback: () => 'result',
654
809
  });
655
810
  const toolUse = { name: 'testTool', toolUseId: 'id-1', input: { query: 'hello' } };
656
- const event = new BeforeToolCallEvent({ agent, toolUse, tool });
811
+ const event = new BeforeToolCallEvent({ agent, toolUse, tool, invocationState: {} });
657
812
  const json = JSON.parse(JSON.stringify(event));
658
813
  expect(json).toStrictEqual({
659
814
  type: 'beforeToolCallEvent',
@@ -670,7 +825,7 @@ describe('toJSON serialization', () => {
670
825
  status: 'success',
671
826
  content: [new TextBlock('42')],
672
827
  });
673
- const event = new AfterToolCallEvent({ agent, toolUse, tool: undefined, result });
828
+ const event = new AfterToolCallEvent({ agent, toolUse, tool: undefined, result, invocationState: {} });
674
829
  const json = JSON.parse(JSON.stringify(event));
675
830
  expect(json).toStrictEqual({
676
831
  type: 'afterToolCallEvent',
@@ -687,7 +842,7 @@ describe('toJSON serialization', () => {
687
842
  content: [new TextBlock('Error')],
688
843
  });
689
844
  const error = new Error('Tool crashed');
690
- const event = new AfterToolCallEvent({ agent, toolUse, tool: undefined, result, error });
845
+ const event = new AfterToolCallEvent({ agent, toolUse, tool: undefined, result, error, invocationState: {} });
691
846
  event.retry = true;
692
847
  const json = JSON.parse(JSON.stringify(event));
693
848
  expect(json).toStrictEqual({
@@ -699,14 +854,21 @@ describe('toJSON serialization', () => {
699
854
  });
700
855
  });
701
856
  describe('AfterModelCallEvent', () => {
702
- it('includes stopData and excludes agent and model on success', () => {
857
+ it('includes stopData and attemptCount and excludes agent and model on success', () => {
703
858
  const agent = new Agent();
704
859
  const message = new Message({ role: 'assistant', content: [new TextBlock('Hi')] });
705
860
  const stopData = { message, stopReason: 'endTurn' };
706
- const event = new AfterModelCallEvent({ agent, model: agent.model, stopData });
861
+ const event = new AfterModelCallEvent({
862
+ agent,
863
+ model: agent.model,
864
+ attemptCount: 2,
865
+ stopData,
866
+ invocationState: {},
867
+ });
707
868
  const json = JSON.parse(JSON.stringify(event));
708
869
  expect(json).toStrictEqual({
709
870
  type: 'afterModelCallEvent',
871
+ attemptCount: 2,
710
872
  stopData: {
711
873
  message: { role: 'assistant', content: [{ text: 'Hi' }] },
712
874
  stopReason: 'endTurn',
@@ -716,11 +878,12 @@ describe('toJSON serialization', () => {
716
878
  it('converts error to message string and excludes retry', () => {
717
879
  const agent = new Agent();
718
880
  const error = new Error('Model failed');
719
- const event = new AfterModelCallEvent({ agent, model: agent.model, error });
881
+ const event = new AfterModelCallEvent({ agent, model: agent.model, attemptCount: 1, error, invocationState: {} });
720
882
  event.retry = true;
721
883
  const json = JSON.parse(JSON.stringify(event));
722
884
  expect(json).toStrictEqual({
723
885
  type: 'afterModelCallEvent',
886
+ attemptCount: 1,
724
887
  error: { message: 'Model failed' },
725
888
  });
726
889
  });
@@ -732,7 +895,7 @@ describe('toJSON serialization', () => {
732
895
  role: 'assistant',
733
896
  content: [new ToolUseBlock({ name: 'calc', toolUseId: 'id-1', input: {} })],
734
897
  });
735
- const event = new BeforeToolsEvent({ agent, message });
898
+ const event = new BeforeToolsEvent({ agent, message, invocationState: {} });
736
899
  event.cancel = 'not allowed';
737
900
  const json = JSON.parse(JSON.stringify(event));
738
901
  expect(json).toStrictEqual({
@@ -754,7 +917,7 @@ describe('toJSON serialization', () => {
754
917
  }),
755
918
  ],
756
919
  });
757
- const event = new AfterToolsEvent({ agent, message });
920
+ const event = new AfterToolsEvent({ agent, message, invocationState: {} });
758
921
  const json = JSON.parse(JSON.stringify(event));
759
922
  expect(json).toStrictEqual({
760
923
  type: 'afterToolsEvent',
@@ -773,6 +936,7 @@ describe('toJSON serialization', () => {
773
936
  const event = new ModelStreamUpdateEvent({
774
937
  agent,
775
938
  event: { type: 'modelContentBlockDeltaEvent', delta: { type: 'textDelta', text: 'Hi' } },
939
+ invocationState: {},
776
940
  });
777
941
  const json = JSON.stringify(event);
778
942
  // Should be small (no agent serialized)
@@ -792,7 +956,17 @@ describe('toJSON serialization completeness', () => {
792
956
  * If you add a new field to an event and it should be excluded from wire serialization,
793
957
  * add it here. Otherwise, add it to toJSON() so it gets serialized.
794
958
  */
795
- const EXCLUDED_FIELDS = new Set(['agent', 'model', 'tool', 'cancel', 'retry']);
959
+ const EXCLUDED_FIELDS = new Set([
960
+ 'agent',
961
+ 'model',
962
+ 'tool',
963
+ 'cancel',
964
+ 'retry',
965
+ 'invocationState',
966
+ 'selectedTool',
967
+ 'resume',
968
+ 'endTurn',
969
+ ]);
796
970
  /**
797
971
  * Fields where toJSON() transforms the value (e.g., Error to message object).
798
972
  * These appear in both instance and JSON but with different shapes.
@@ -817,30 +991,50 @@ describe('toJSON serialization completeness', () => {
817
991
  stopReason: 'endTurn',
818
992
  lastMessage: message,
819
993
  metrics: new AgentMetrics(),
994
+ invocationState: {},
820
995
  });
821
996
  return [
822
997
  { name: 'InitializedEvent', event: new InitializedEvent({ agent }) },
823
- { name: 'BeforeInvocationEvent', event: new BeforeInvocationEvent({ agent }) },
824
- { name: 'AfterInvocationEvent', event: new AfterInvocationEvent({ agent }) },
825
- { name: 'BeforeModelCallEvent', event: new BeforeModelCallEvent({ agent, model: agent.model }) },
998
+ { name: 'BeforeInvocationEvent', event: new BeforeInvocationEvent({ agent, invocationState: {} }) },
999
+ { name: 'AfterInvocationEvent', event: new AfterInvocationEvent({ agent, invocationState: {} }) },
1000
+ {
1001
+ name: 'BeforeModelCallEvent',
1002
+ event: new BeforeModelCallEvent({
1003
+ agent,
1004
+ model: agent.model,
1005
+ invocationState: {},
1006
+ projectedInputTokens: 100,
1007
+ }),
1008
+ },
826
1009
  {
827
1010
  name: 'AfterModelCallEvent',
828
- event: Object.assign(new AfterModelCallEvent({ agent, model: agent.model, stopData, error }), { retry: true }),
1011
+ event: Object.assign(new AfterModelCallEvent({ agent, model: agent.model, attemptCount: 1, stopData, error, invocationState: {} }), { retry: true }),
829
1012
  },
830
- { name: 'MessageAddedEvent', event: new MessageAddedEvent({ agent, message }) },
831
- { name: 'ModelStreamUpdateEvent', event: new ModelStreamUpdateEvent({ agent, event: streamEvent }) },
832
- { name: 'ContentBlockEvent', event: new ContentBlockEvent({ agent, contentBlock }) },
833
- { name: 'ModelMessageEvent', event: new ModelMessageEvent({ agent, message, stopReason: 'endTurn' }) },
834
- { name: 'ToolResultEvent', event: new ToolResultEvent({ agent, result }) },
835
- { name: 'ToolStreamUpdateEvent', event: new ToolStreamUpdateEvent({ agent, event: toolStreamEvent }) },
836
- { name: 'AgentResultEvent', event: new AgentResultEvent({ agent, result: agentResult }) },
837
- { name: 'BeforeToolCallEvent', event: new BeforeToolCallEvent({ agent, toolUse, tool }) },
1013
+ { name: 'MessageAddedEvent', event: new MessageAddedEvent({ agent, message, invocationState: {} }) },
1014
+ {
1015
+ name: 'ModelStreamUpdateEvent',
1016
+ event: new ModelStreamUpdateEvent({ agent, event: streamEvent, invocationState: {} }),
1017
+ },
1018
+ { name: 'ContentBlockEvent', event: new ContentBlockEvent({ agent, contentBlock, invocationState: {} }) },
1019
+ {
1020
+ name: 'ModelMessageEvent',
1021
+ event: new ModelMessageEvent({ agent, message, stopReason: 'endTurn', invocationState: {} }),
1022
+ },
1023
+ { name: 'ToolResultEvent', event: new ToolResultEvent({ agent, result, invocationState: {} }) },
1024
+ {
1025
+ name: 'ToolStreamUpdateEvent',
1026
+ event: new ToolStreamUpdateEvent({ agent, event: toolStreamEvent, invocationState: {} }),
1027
+ },
1028
+ { name: 'AgentResultEvent', event: new AgentResultEvent({ agent, result: agentResult, invocationState: {} }) },
1029
+ { name: 'BeforeToolCallEvent', event: new BeforeToolCallEvent({ agent, toolUse, tool, invocationState: {} }) },
838
1030
  {
839
1031
  name: 'AfterToolCallEvent',
840
- event: Object.assign(new AfterToolCallEvent({ agent, toolUse, tool, result, error }), { retry: true }),
1032
+ event: Object.assign(new AfterToolCallEvent({ agent, toolUse, tool, result, error, invocationState: {} }), {
1033
+ retry: true,
1034
+ }),
841
1035
  },
842
- { name: 'BeforeToolsEvent', event: new BeforeToolsEvent({ agent, message }) },
843
- { name: 'AfterToolsEvent', event: new AfterToolsEvent({ agent, message }) },
1036
+ { name: 'BeforeToolsEvent', event: new BeforeToolsEvent({ agent, message, invocationState: {} }) },
1037
+ { name: 'AfterToolsEvent', event: new AfterToolsEvent({ agent, message, invocationState: {} }) },
844
1038
  ];
845
1039
  }
846
1040
  const eventInstances = createEventInstances();